UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

128 lines (122 loc) 4.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SkeletonHelper = void 0; var _LineSegments = require("../objects/LineSegments.js"); var _Matrix = require("../math/Matrix4.js"); var _LineBasicMaterial = require("../materials/LineBasicMaterial.js"); var _Color = require("../math/Color.js"); var _Vector = require("../math/Vector3.js"); var _BufferGeometry = require("../core/BufferGeometry.js"); var _BufferAttribute = require("../core/BufferAttribute.js"); const _vector = /*@__PURE__*/new _Vector.Vector3(); const _boneMatrix = /*@__PURE__*/new _Matrix.Matrix4(); const _matrixWorldInv = /*@__PURE__*/new _Matrix.Matrix4(); /** * A helper object to assist with visualizing a {@link Skeleton}. * * ```js * const helper = new THREE.SkeletonHelper( skinnedMesh ); * scene.add( helper ); * ``` * * @augments LineSegments */ class SkeletonHelper extends _LineSegments.LineSegments { /** * Constructs a new hemisphere light helper. * * @param {Object3D} object - Usually an instance of {@link SkinnedMesh}. However, any 3D object * can be used if it represents a hierarchy of bones (see {@link Bone}). */ constructor(object) { const bones = getBoneList(object); const geometry = new _BufferGeometry.BufferGeometry(); const vertices = []; const colors = []; const color1 = new _Color.Color(0, 0, 1); const color2 = new _Color.Color(0, 1, 0); for (let i = 0; i < bones.length; i++) { const bone = bones[i]; if (bone.parent && bone.parent.isBone) { vertices.push(0, 0, 0); vertices.push(0, 0, 0); colors.push(color1.r, color1.g, color1.b); colors.push(color2.r, color2.g, color2.b); } } geometry.setAttribute('position', new _BufferAttribute.Float32BufferAttribute(vertices, 3)); geometry.setAttribute('color', new _BufferAttribute.Float32BufferAttribute(colors, 3)); const material = new _LineBasicMaterial.LineBasicMaterial({ vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true }); super(geometry, material); /** * This flag can be used for type testing. * * @type {boolean} * @readonly * @default true */ this.isSkeletonHelper = true; this.type = 'SkeletonHelper'; /** * The object being visualized. * * @type {Object3D} */ this.root = object; /** * he list of bones that the helper visualizes. * * @type {Array<Bone>} */ this.bones = bones; this.matrix = object.matrixWorld; this.matrixAutoUpdate = false; } updateMatrixWorld(force) { const bones = this.bones; const geometry = this.geometry; const position = geometry.getAttribute('position'); _matrixWorldInv.copy(this.root.matrixWorld).invert(); for (let i = 0, j = 0; i < bones.length; i++) { const bone = bones[i]; if (bone.parent && bone.parent.isBone) { _boneMatrix.multiplyMatrices(_matrixWorldInv, bone.matrixWorld); _vector.setFromMatrixPosition(_boneMatrix); position.setXYZ(j, _vector.x, _vector.y, _vector.z); _boneMatrix.multiplyMatrices(_matrixWorldInv, bone.parent.matrixWorld); _vector.setFromMatrixPosition(_boneMatrix); position.setXYZ(j + 1, _vector.x, _vector.y, _vector.z); j += 2; } } geometry.getAttribute('position').needsUpdate = true; super.updateMatrixWorld(force); } /** * Frees the GPU-related resources allocated by this instance. Call this * method whenever this instance is no longer used in your app. */ dispose() { this.geometry.dispose(); this.material.dispose(); } } exports.SkeletonHelper = SkeletonHelper; function getBoneList(object) { const boneList = []; if (object.isBone === true) { boneList.push(object); } for (let i = 0; i < object.children.length; i++) { boneList.push(...getBoneList(object.children[i])); } return boneList; }