You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.0 KiB
JavaScript

import Matrix4 from "../Core/Matrix4.js";
/**
* A model node with a transform for user-defined animations. A glTF asset can
* contain animations that target a node's transform. This class allows
* changing a node's transform externally so animation can be driven by another
* source, not just an animation in the glTF asset.
* <p>
* Use {@link Model#getNode} to create an instance.
* </p>
*
* @alias ModelNode
* @internalConstructor
* @class
*
* @example
* var node = model.getNode('LOD3sp');
* node.matrix = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(5.0, 1.0, 1.0), node.matrix);
*
* @see Model#getNode
*/
function ModelNode(model, node, runtimeNode, id, matrix) {
this._model = model;
this._runtimeNode = runtimeNode;
this._name = node.name;
this._id = id;
/**
* @private
*/
this.useMatrix = false;
this._show = true;
this._matrix = Matrix4.clone(matrix);
this._originalMatrix = Matrix4.clone(matrix);
}
Object.defineProperties(ModelNode.prototype, {
/**
* The value of the <code>name</code> property of this node.
*
* @memberof ModelNode.prototype
*
* @type {String}
* @readonly
*/
name: {
get: function () {
return this._name;
},
},
/**
* The index of the node.
*
* @memberof ModelNode.prototype
*
* @type {String}
* @readonly
*/
id: {
get: function () {
return this._id;
},
},
/**
* Determines if this node and its children will be shown.
*
* @memberof ModelNode.prototype
* @type {Boolean}
*
* @default true
*/
show: {
get: function () {
return this._show;
},
set: function (value) {
if (this._show !== value) {
this._show = value;
this._model._perNodeShowDirty = true;
}
},
},
/**
* The node's 4x4 matrix transform from its local coordinates to
* its parent's.
* <p>
* For changes to take effect, this property must be assigned to;
* setting individual elements of the matrix will not work.
* </p>
*
* @memberof ModelNode.prototype
* @type {Matrix4}
*/
matrix: {
get: function () {
return this._matrix;
},
set: function (value) {
this._matrix = Matrix4.clone(value, this._matrix);
this.useMatrix = true;
var model = this._model;
model._cesiumAnimationsDirty = true;
this._runtimeNode.dirtyNumber = model._maxDirtyNumber;
},
},
/**
* Gets the node's original 4x4 matrix transform from its local coordinates to
* its parent's, without any node transformations or articulations applied.
*
* @memberof ModelNode.prototype
* @type {Matrix4}
*/
originalMatrix: {
get: function () {
return this._originalMatrix;
},
},
});
/**
* @private
*/
ModelNode.prototype.setMatrix = function (matrix) {
// Update matrix but do not set the dirty flag since this is used internally
// to keep the matrix in-sync during a glTF animation.
Matrix4.clone(matrix, this._matrix);
};
export default ModelNode;