stable..?
parent
0ae56d4f99
commit
deca83d5b8
|
@ -4,7 +4,7 @@
|
||||||
* @param weight float
|
* @param weight float
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
GameLib.D3.API.BoneWeight = function BoneWeight(
|
GameLib.D3.API.BoneWeight = function (
|
||||||
boneIndex,
|
boneIndex,
|
||||||
weight
|
weight
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -2,63 +2,61 @@
|
||||||
* Bone Superset
|
* Bone Superset
|
||||||
* @param id
|
* @param id
|
||||||
* @param name string
|
* @param name string
|
||||||
* @param boneId
|
|
||||||
* @param childBoneIds
|
* @param childBoneIds
|
||||||
* @param parentBoneId
|
* @param parentBoneIds
|
||||||
* @param quaternion
|
* @param quaternion GameLib.API.Quaternion
|
||||||
* @param position
|
* @param position GameLib.API.Vector3
|
||||||
* @param rotation
|
|
||||||
* @param scale GameLib.API.Vector3
|
* @param scale GameLib.API.Vector3
|
||||||
* @param up
|
* @param up GameLib.API.Vector3
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
GameLib.D3.API.Bone = function Bone(
|
GameLib.D3.API.Bone = function (
|
||||||
id,
|
id,
|
||||||
boneId,
|
|
||||||
name,
|
name,
|
||||||
childBoneIds,
|
childBoneIds,
|
||||||
parentBoneId,
|
parentBoneIds,
|
||||||
quaternion,
|
|
||||||
position,
|
position,
|
||||||
rotation,
|
quaternion,
|
||||||
scale,
|
scale,
|
||||||
up
|
up
|
||||||
) {
|
) {
|
||||||
this.id = id;
|
|
||||||
this.name = name;
|
|
||||||
this.boneId = boneId;
|
|
||||||
|
|
||||||
if (typeof childBoneIds == 'undefined') {
|
if (GameLib.Utils.UndefinedOrNull(id)) {
|
||||||
|
id = GameLib.Utils.RandomId();
|
||||||
|
}
|
||||||
|
this.id = id;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(name)) {
|
||||||
|
name = 'Bone (' + this.id + ')';
|
||||||
|
}
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(childBoneIds)) {
|
||||||
childBoneIds = [];
|
childBoneIds = [];
|
||||||
}
|
}
|
||||||
this.childBoneIds = childBoneIds;
|
this.childBoneIds = childBoneIds;
|
||||||
|
|
||||||
if (typeof parentBoneId == 'undefined') {
|
if (GameLib.Utils.UndefinedOrNull(parentBoneIds)) {
|
||||||
parentBoneId = null;
|
parentBoneIds = [];
|
||||||
}
|
}
|
||||||
this.parentBoneId = parentBoneId;
|
this.parentBoneIds = parentBoneIds;
|
||||||
|
|
||||||
if (typeof quaternion == 'undefined') {
|
if (GameLib.Utils.UndefinedOrNull(position)) {
|
||||||
|
position = new GameLib.API.Vector3();
|
||||||
|
}
|
||||||
|
this.position = position;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(quaternion)) {
|
||||||
quaternion = new GameLib.API.Quaternion();
|
quaternion = new GameLib.API.Quaternion();
|
||||||
}
|
}
|
||||||
this.quaternion = quaternion;
|
this.quaternion = quaternion;
|
||||||
|
|
||||||
if (typeof position == 'undefined') {
|
if (GameLib.Utils.UndefinedOrNull(scale)) {
|
||||||
position = new GameLib.API.Vector3(0,0,0);
|
|
||||||
}
|
|
||||||
this.position = position;
|
|
||||||
|
|
||||||
if (typeof rotation == 'undefined') {
|
|
||||||
rotation = new GameLib.API.Vector3(0,0,0);
|
|
||||||
}
|
|
||||||
this.rotation = rotation;
|
|
||||||
|
|
||||||
if (typeof scale == 'undefined') {
|
|
||||||
scale = new GameLib.API.Vector3(1,1,1);
|
scale = new GameLib.API.Vector3(1,1,1);
|
||||||
}
|
}
|
||||||
this.scale = scale;
|
this.scale = scale;
|
||||||
|
|
||||||
if (typeof up == 'undefined') {
|
if (GameLib.Utils.UndefinedOrNull(up)) {
|
||||||
up = new GameLib.API.Vector3(0,1,0);
|
up = new GameLib.API.Vector3(0,1,0);
|
||||||
}
|
}
|
||||||
this.up = up;
|
this.up = up;
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
/**
|
||||||
|
* API Skeleton
|
||||||
|
* @param id
|
||||||
|
* @param name
|
||||||
|
* @param bones GameLib.D3.API.Bone[]
|
||||||
|
* @param boneInverses GameLib.API.Matrix4[]
|
||||||
|
* @param useVertexTexture boolean
|
||||||
|
* @param boneTextureWidth Number
|
||||||
|
* @param boneTextureHeight Number
|
||||||
|
* @param boneMatrices GameLib.API.Matrix4[]
|
||||||
|
* @param boneTexture null (not implemented)
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
GameLib.D3.API.Skeleton = function (
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
bones,
|
||||||
|
boneInverses,
|
||||||
|
useVertexTexture,
|
||||||
|
boneTextureWidth,
|
||||||
|
boneTextureHeight,
|
||||||
|
boneMatrices,
|
||||||
|
boneTexture
|
||||||
|
) {
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(id)) {
|
||||||
|
id = GameLib.Utils.RandomId();
|
||||||
|
}
|
||||||
|
this.id = id;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(name)) {
|
||||||
|
name = 'Skeleton';
|
||||||
|
}
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(bones)) {
|
||||||
|
bones = [];
|
||||||
|
}
|
||||||
|
this.bones = bones;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An array of Matrix4s that represent the inverse of the matrixWorld of the individual bones.
|
||||||
|
*/
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(boneInverses)) {
|
||||||
|
boneInverses = [];
|
||||||
|
}
|
||||||
|
this.boneInverses = boneInverses;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use a vertex texture in the shader - allows for more than 4 bones per vertex, not supported by all devices
|
||||||
|
*/
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(useVertexTexture)) {
|
||||||
|
useVertexTexture = false;
|
||||||
|
}
|
||||||
|
this.useVertexTexture = useVertexTexture;
|
||||||
|
if (useVertexTexture) {
|
||||||
|
console.warn('support for vertex texture bones is not supported yet - something could break somewhere');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(boneTextureWidth)) {
|
||||||
|
boneTextureWidth = 0;
|
||||||
|
}
|
||||||
|
this.boneTextureWidth = boneTextureWidth;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(boneTextureHeight)) {
|
||||||
|
boneTextureHeight = 0;
|
||||||
|
}
|
||||||
|
this.boneTextureHeight = boneTextureHeight;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(boneMatrices)) {
|
||||||
|
boneMatrices = [];
|
||||||
|
}
|
||||||
|
this.boneMatrices = boneMatrices;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(boneTexture)) {
|
||||||
|
boneTexture = null;
|
||||||
|
}
|
||||||
|
this.boneTexture = boneTexture;
|
||||||
|
};
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* API Spline
|
* API Spline
|
||||||
* @param id String
|
* @param id String
|
||||||
* @param name String
|
* @param name String
|
||||||
* @param vertices GameLib.API.Vertex[]
|
* @param vertices GameLib.API.Vector3[]
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
GameLib.D3.API.Spline = function(
|
GameLib.D3.API.Spline = function(
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
/**
|
||||||
|
* BoneWeight Superset
|
||||||
|
* @constructor
|
||||||
|
* @param graphics GameLib.D3.Graphics
|
||||||
|
* @param apiBoneWeight GameLib.D3.API.BoneWeight
|
||||||
|
*/
|
||||||
|
GameLib.D3.BoneWeight = function RuntimeBoneWeight(
|
||||||
|
graphics,
|
||||||
|
apiBoneWeight
|
||||||
|
) {
|
||||||
|
this.graphics = graphics;
|
||||||
|
this.graphics.isNotThreeThrow();
|
||||||
|
|
||||||
|
GameLib.D3.API.BoneWeight.call(
|
||||||
|
this,
|
||||||
|
apiBoneWeight.boneIndex,
|
||||||
|
apiBoneWeight.weight
|
||||||
|
);
|
||||||
|
|
||||||
|
this.instance = this.createInstance();
|
||||||
|
};
|
||||||
|
|
||||||
|
GameLib.D3.BoneWeight.prototype = Object.create(GameLib.D3.API.BoneWeight.prototype);
|
||||||
|
GameLib.D3.BoneWeight.prototype.constructor = GameLib.D3.BoneWeight;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance boneWeight
|
||||||
|
* @param update boolean
|
||||||
|
*/
|
||||||
|
GameLib.D3.BoneWeight.prototype.createInstance = function(update) {
|
||||||
|
|
||||||
|
var instance = null;
|
||||||
|
|
||||||
|
if (update) {
|
||||||
|
//TODO - update instance with boneWeight info
|
||||||
|
instance = this.instance;
|
||||||
|
} else {
|
||||||
|
//TODO - fix this
|
||||||
|
instance = new THREE.Quaternion();
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the instance
|
||||||
|
*/
|
||||||
|
GameLib.D3.BoneWeight.prototype.updateInstance = function() {
|
||||||
|
this.instance = this.createInstance(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a GameLib.D3.BoneWeight to GameLib.D3.API.BoneWeight
|
||||||
|
* @returns {GameLib.D3.API.BoneWeight}
|
||||||
|
*/
|
||||||
|
GameLib.D3.BoneWeight.prototype.toApiBoneWeight = function() {
|
||||||
|
|
||||||
|
var apiBoneWeight = new GameLib.D3.API.BoneWeight(
|
||||||
|
this.boneIndex,
|
||||||
|
this.weight
|
||||||
|
);
|
||||||
|
|
||||||
|
return apiBoneWeight;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a GameLib.D3.BoneWeight from a boneWeight Object
|
||||||
|
* @param graphics GameLib.D3.Graphics
|
||||||
|
* @param objectBoneWeight Object
|
||||||
|
* @returns {GameLib.D3.BoneWeight}
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
GameLib.D3.BoneWeight.FromObjectBoneWeight = function(
|
||||||
|
graphics,
|
||||||
|
objectBoneWeight
|
||||||
|
) {
|
||||||
|
var apiBoneWeight = new GameLib.D3.API.BoneWeight(
|
||||||
|
objectBoneWeight.boneIndex,
|
||||||
|
objectBoneWeight.weight
|
||||||
|
);
|
||||||
|
|
||||||
|
var boneWeight = new GameLib.D3.BoneWeight(
|
||||||
|
graphics,
|
||||||
|
apiBoneWeight
|
||||||
|
);
|
||||||
|
|
||||||
|
return boneWeight;
|
||||||
|
};
|
|
@ -0,0 +1,171 @@
|
||||||
|
/**
|
||||||
|
* Bone Superset
|
||||||
|
* @constructor
|
||||||
|
* @param graphics GameLib.D3.Graphics
|
||||||
|
* @param apiBone GameLib.D3.API.Bone
|
||||||
|
*/
|
||||||
|
GameLib.D3.Bone = function RuntimeBone(
|
||||||
|
graphics,
|
||||||
|
apiBone
|
||||||
|
) {
|
||||||
|
this.graphics = graphics;
|
||||||
|
this.graphics.isNotThreeThrow();
|
||||||
|
|
||||||
|
GameLib.D3.API.Bone.call(
|
||||||
|
this,
|
||||||
|
apiBone.id,
|
||||||
|
apiBone.name,
|
||||||
|
apiBone.childBoneIds,
|
||||||
|
apiBone.parentBoneIds,
|
||||||
|
apiBone.position,
|
||||||
|
apiBone.quaternion,
|
||||||
|
apiBone.scale,
|
||||||
|
apiBone.up
|
||||||
|
);
|
||||||
|
|
||||||
|
this.position = new GameLib.Vector3(
|
||||||
|
graphics,
|
||||||
|
this,
|
||||||
|
this.position
|
||||||
|
);
|
||||||
|
|
||||||
|
this.quaternion = new GameLib.Quaternion(
|
||||||
|
graphics,
|
||||||
|
this,
|
||||||
|
this.quaternion
|
||||||
|
);
|
||||||
|
|
||||||
|
this.scale = new GameLib.Vector3(
|
||||||
|
graphics,
|
||||||
|
this,
|
||||||
|
this.scale
|
||||||
|
);
|
||||||
|
|
||||||
|
this.up = new GameLib.Vector3(
|
||||||
|
graphics,
|
||||||
|
this,
|
||||||
|
this.up
|
||||||
|
);
|
||||||
|
|
||||||
|
this.instance = this.createInstance();
|
||||||
|
};
|
||||||
|
|
||||||
|
GameLib.D3.Bone.prototype = Object.create(GameLib.D3.API.Bone.prototype);
|
||||||
|
GameLib.D3.Bone.prototype.constructor = GameLib.D3.Bone;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance bone
|
||||||
|
* @param update boolean
|
||||||
|
*/
|
||||||
|
GameLib.D3.Bone.prototype.createInstance = function(update) {
|
||||||
|
|
||||||
|
var instance = null;
|
||||||
|
|
||||||
|
if (update) {
|
||||||
|
instance = this.instance;
|
||||||
|
} else {
|
||||||
|
instance = new THREE.Bone();
|
||||||
|
}
|
||||||
|
|
||||||
|
instance.name = this.name;
|
||||||
|
|
||||||
|
instance.position.x = this.position.x;
|
||||||
|
instance.position.y = this.position.y;
|
||||||
|
instance.position.z = this.position.z;
|
||||||
|
|
||||||
|
instance.quaternion.x = this.quaternion.x;
|
||||||
|
instance.quaternion.y = this.quaternion.y;
|
||||||
|
instance.quaternion.z = this.quaternion.z;
|
||||||
|
instance.quaternion.w = this.quaternion.w;
|
||||||
|
|
||||||
|
instance.scale.x = this.scale.x;
|
||||||
|
instance.scale.y = this.scale.y;
|
||||||
|
instance.scale.z = this.scale.z;
|
||||||
|
|
||||||
|
instance.up.x = this.up.x;
|
||||||
|
instance.up.y = this.up.y;
|
||||||
|
instance.up.z = this.up.z;
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the instance
|
||||||
|
*/
|
||||||
|
GameLib.D3.Bone.prototype.updateInstance = function() {
|
||||||
|
this.instance = this.createInstance(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a GameLib.D3.Bone to GameLib.D3.API.Bone
|
||||||
|
* @returns {GameLib.D3.API.Bone}
|
||||||
|
*/
|
||||||
|
GameLib.D3.Bone.prototype.toApiBone = function() {
|
||||||
|
|
||||||
|
var apiBone = new GameLib.D3.API.Bone(
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.childBoneIds,
|
||||||
|
this.parentBoneIds,
|
||||||
|
this.position.toApiVector(),
|
||||||
|
this.quaternion.toApiQuaternion(),
|
||||||
|
this.scale.toApiVector(),
|
||||||
|
this.up.toApiVector()
|
||||||
|
);
|
||||||
|
|
||||||
|
return apiBone;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a GameLib.D3.Bone from a bone Object
|
||||||
|
* @param graphics GameLib.D3.Graphics
|
||||||
|
* @param objectBone Object
|
||||||
|
* @returns GameLib.D3.Bone
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
GameLib.D3.Bone.FromObjectBone = function(
|
||||||
|
graphics,
|
||||||
|
objectBone
|
||||||
|
) {
|
||||||
|
var apiBone = new GameLib.D3.API.Bone(
|
||||||
|
objectBone.id,
|
||||||
|
objectBone.name,
|
||||||
|
objectBone.childBoneIds,
|
||||||
|
objectBone.parentBoneIds,
|
||||||
|
new GameLib.API.Vector3(
|
||||||
|
objectBone.position.x,
|
||||||
|
objectBone.position.y,
|
||||||
|
objectBone.position.z
|
||||||
|
),
|
||||||
|
new GameLib.API.Quaternion(
|
||||||
|
objectBone.quaternion.x,
|
||||||
|
objectBone.quaternion.y,
|
||||||
|
objectBone.quaternion.z,
|
||||||
|
objectBone.quaternion.w,
|
||||||
|
new GameLib.API.Vector3(
|
||||||
|
objectBone.quaternion.axis.x,
|
||||||
|
objectBone.quaternion.axis.y,
|
||||||
|
objectBone.quaternion.axis.z
|
||||||
|
),
|
||||||
|
objectBone.quaternion.angle
|
||||||
|
),
|
||||||
|
new GameLib.API.Vector3(
|
||||||
|
objectBone.scale.x,
|
||||||
|
objectBone.scale.y,
|
||||||
|
objectBone.scale.z
|
||||||
|
),
|
||||||
|
new GameLib.API.Vector3(
|
||||||
|
objectBone.up.x,
|
||||||
|
objectBone.up.y,
|
||||||
|
objectBone.up.z
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
var bone = new GameLib.D3.Bone(
|
||||||
|
graphics,
|
||||||
|
apiBone
|
||||||
|
);
|
||||||
|
|
||||||
|
return bone;
|
||||||
|
};
|
|
@ -49,6 +49,7 @@ GameLib.D3.Helper.HELPER_TYPE_DIRECTIONAL_LIGHT = 'directional-light';
|
||||||
GameLib.D3.Helper.HELPER_TYPE_SPOT_LIGHT = 'spot-light';
|
GameLib.D3.Helper.HELPER_TYPE_SPOT_LIGHT = 'spot-light';
|
||||||
GameLib.D3.Helper.HELPER_TYPE_POINT_LIGHT = 'point-light';
|
GameLib.D3.Helper.HELPER_TYPE_POINT_LIGHT = 'point-light';
|
||||||
GameLib.D3.Helper.HELPER_TYPE_WIREFRAME = 'wireframe';
|
GameLib.D3.Helper.HELPER_TYPE_WIREFRAME = 'wireframe';
|
||||||
|
GameLib.D3.Helper.HELPER_TYPE_SKELETON = 'skeleton';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,23 +61,27 @@ GameLib.D3.Helper.prototype.createInstance = function(update) {
|
||||||
var instance = null;
|
var instance = null;
|
||||||
|
|
||||||
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_EDGES) {
|
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_EDGES) {
|
||||||
instance = new this.graphics.instance.EdgesHelper(this.object.instance, 0x007700);
|
instance = new THREE.EdgesHelper(this.object.instance, 0x007700);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_DIRECTIONAL_LIGHT) {
|
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_DIRECTIONAL_LIGHT) {
|
||||||
instance = new this.graphics.instance.DirectionalLightHelper(this.object.instance);
|
instance = new THREE.DirectionalLightHelper(this.object.instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_POINT_LIGHT) {
|
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_POINT_LIGHT) {
|
||||||
instance = new this.graphics.instance.PointLightHelper(this.object.instance, 1);
|
instance = new THREE.PointLightHelper(this.object.instance, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_SPOT_LIGHT) {
|
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_SPOT_LIGHT) {
|
||||||
instance = new this.graphics.instance.SpotLightHelper(this.object.instance);
|
instance = new THREE.SpotLightHelper(this.object.instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_WIREFRAME) {
|
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_WIREFRAME) {
|
||||||
instance = new this.graphics.instance.WireframeHelper(this.object.instance, 0x007700);
|
instance = new THREE.WireframeHelper(this.object.instance, 0x007700);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.helperType == GameLib.D3.Helper.HELPER_TYPE_SKELETON) {
|
||||||
|
instance = new THREE.SkeletonHelper(this.object.skeleton.instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!instance) {
|
if (!instance) {
|
||||||
|
|
|
@ -239,64 +239,21 @@ GameLib.D3.Mesh.prototype.createInstance = function(update) {
|
||||||
var instanceMaterial = this.materials[0].instance;
|
var instanceMaterial = this.materials[0].instance;
|
||||||
|
|
||||||
if (this.meshType == GameLib.D3.Mesh.TYPE_NORMAL) {
|
if (this.meshType == GameLib.D3.Mesh.TYPE_NORMAL) {
|
||||||
instance = new this.graphics.instance.Mesh(instanceGeometry, instanceMaterial);
|
instance = new THREE.Mesh(instanceGeometry, instanceMaterial);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.meshType == GameLib.D3.Mesh.TYPE_CURVE) {
|
if (this.meshType == GameLib.D3.Mesh.TYPE_CURVE) {
|
||||||
instance = new this.graphics.instance.Points(instanceGeometry, instanceMaterial);
|
instance = new THREE.Points(instanceGeometry, instanceMaterial);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.meshType == GameLib.D3.Mesh.TYPE_SKINNED) {
|
if (this.meshType == GameLib.D3.Mesh.TYPE_SKINNED) {
|
||||||
|
|
||||||
var bones = this.skeleton.bones;
|
|
||||||
|
|
||||||
var instanceBones = [];
|
|
||||||
|
|
||||||
for (var bi = 0; bi < bones.length; bi++) {
|
|
||||||
|
|
||||||
var bone = new this.graphics.instance.Bone();
|
|
||||||
|
|
||||||
bone.name = bones[bi].name;
|
|
||||||
|
|
||||||
bone.position.x = bones[bi].position.x;
|
|
||||||
bone.position.y = bones[bi].position.y;
|
|
||||||
bone.position.z = bones[bi].position.z;
|
|
||||||
|
|
||||||
bone.rotation.x = bones[bi].rotation.x;
|
|
||||||
bone.rotation.y = bones[bi].rotation.y;
|
|
||||||
bone.rotation.z = bones[bi].rotation.z;
|
|
||||||
|
|
||||||
bone.quaternion.x = bones[bi].quaternion.x;
|
|
||||||
bone.quaternion.y = bones[bi].quaternion.y;
|
|
||||||
bone.quaternion.z = bones[bi].quaternion.z;
|
|
||||||
bone.quaternion.w = bones[bi].quaternion.w;
|
|
||||||
|
|
||||||
bone.scale.x = bones[bi].scale.x;
|
|
||||||
bone.scale.y = bones[bi].scale.y;
|
|
||||||
bone.scale.z = bones[bi].scale.z;
|
|
||||||
|
|
||||||
bone.up.x = bones[bi].up.x;
|
|
||||||
bone.up.y = bones[bi].up.y;
|
|
||||||
bone.up.z = bones[bi].up.z;
|
|
||||||
|
|
||||||
instanceBones.push(bone);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup the bone relationships
|
|
||||||
*/
|
|
||||||
for (var br = 0; br < bones.length; br++) {
|
|
||||||
for (var cbi = 0; cbi < bones[br].childBoneIds.length; cbi++) {
|
|
||||||
instanceBones[br].add(instanceBones[bones[br].childBoneIds[cbi]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup bones (indexes)
|
* Setup bones (indexes)
|
||||||
*/
|
*/
|
||||||
for (var si = 0; si < this.skinIndices.length; si++) {
|
for (var si = 0; si < this.skinIndices.length; si++) {
|
||||||
instanceGeometry.skinIndices.push(
|
instanceGeometry.skinIndices.push(
|
||||||
new this.graphics.instance.Quaternion(
|
new THREE.Vector4(
|
||||||
this.skinIndices[si].x,
|
this.skinIndices[si].x,
|
||||||
this.skinIndices[si].y,
|
this.skinIndices[si].y,
|
||||||
this.skinIndices[si].z,
|
this.skinIndices[si].z,
|
||||||
|
@ -310,7 +267,7 @@ GameLib.D3.Mesh.prototype.createInstance = function(update) {
|
||||||
*/
|
*/
|
||||||
for (var sw = 0; sw < this.skinWeights.length; sw++) {
|
for (var sw = 0; sw < this.skinWeights.length; sw++) {
|
||||||
instanceGeometry.skinWeights.push(
|
instanceGeometry.skinWeights.push(
|
||||||
new this.graphics.instance.Quaternion(
|
new THREE.Vector4(
|
||||||
this.skinWeights[sw].x,
|
this.skinWeights[sw].x,
|
||||||
this.skinWeights[sw].y,
|
this.skinWeights[sw].y,
|
||||||
this.skinWeights[sw].z,
|
this.skinWeights[sw].z,
|
||||||
|
@ -319,25 +276,11 @@ GameLib.D3.Mesh.prototype.createInstance = function(update) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
instance = new this.graphics.instance.SkinnedMesh(instanceGeometry, instanceMaterial);
|
instance = new THREE.SkinnedMesh(instanceGeometry, instanceMaterial);
|
||||||
|
|
||||||
var skeleton = new this.graphics.instance.Skeleton(instanceBones);
|
instance.add(this.skeleton.rootBoneInstance);
|
||||||
|
|
||||||
skeleton.useVertexTexture = this.skeleton.useVertexTexture;
|
instance.bind(this.skeleton.instance);
|
||||||
|
|
||||||
for (var i = 0; i < bones.length; i++) {
|
|
||||||
if (bones[i].parentBoneId === null) {
|
|
||||||
instance.add(instanceBones[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
instance.bind(skeleton);
|
|
||||||
|
|
||||||
instance.pose();
|
|
||||||
|
|
||||||
instance.skeleton.skeletonHelper = new this.graphics.instance.SkeletonHelper(instance);
|
|
||||||
instance.skeleton.skeletonHelper.material.linewidth = 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
|
@ -426,6 +369,12 @@ GameLib.D3.Mesh.prototype.clone = function() {
|
||||||
*/
|
*/
|
||||||
GameLib.D3.Mesh.prototype.toApiMesh = function() {
|
GameLib.D3.Mesh.prototype.toApiMesh = function() {
|
||||||
|
|
||||||
|
var apiSkeleton = null;
|
||||||
|
|
||||||
|
if (this.skeleton) {
|
||||||
|
apiSkeleton = this.skeleton.toApiSkeleton();
|
||||||
|
}
|
||||||
|
|
||||||
return new GameLib.D3.API.Mesh(
|
return new GameLib.D3.API.Mesh(
|
||||||
this.id,
|
this.id,
|
||||||
this.meshType,
|
this.meshType,
|
||||||
|
@ -440,7 +389,7 @@ GameLib.D3.Mesh.prototype.toApiMesh = function() {
|
||||||
this.materials.map(function(material){return material.toApiMaterial()}),
|
this.materials.map(function(material){return material.toApiMaterial()}),
|
||||||
GameLib.Utils.IdOrNull(this.parentMesh),
|
GameLib.Utils.IdOrNull(this.parentMesh),
|
||||||
GameLib.Utils.IdOrNull(this.parentScene),
|
GameLib.Utils.IdOrNull(this.parentScene),
|
||||||
this.skeleton,
|
apiSkeleton,
|
||||||
this.skinIndices,
|
this.skinIndices,
|
||||||
this.skinWeights,
|
this.skinWeights,
|
||||||
this.position.toApiVector(),
|
this.position.toApiVector(),
|
||||||
|
@ -488,7 +437,10 @@ GameLib.D3.Mesh.FromObjectMesh = function(graphics, objectMesh, computeNormals,
|
||||||
),
|
),
|
||||||
objectMesh.parentMesh,
|
objectMesh.parentMesh,
|
||||||
objectMesh.parentScene,
|
objectMesh.parentScene,
|
||||||
objectMesh.skeleton,
|
GameLib.D3.Skeleton.FromObjectSkeleton(
|
||||||
|
graphics,
|
||||||
|
objectMesh.skeleton
|
||||||
|
),
|
||||||
objectMesh.skinIndices,
|
objectMesh.skinIndices,
|
||||||
objectMesh.skinWeights,
|
objectMesh.skinWeights,
|
||||||
new GameLib.API.Vector3(
|
new GameLib.API.Vector3(
|
||||||
|
|
|
@ -83,6 +83,18 @@ GameLib.D3.Scene = function Scene(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (var m = 0; m < this.meshes.length; m++) {
|
||||||
|
if (this.meshes[m].skeleton) {
|
||||||
|
this.meshes[m].skeleton.bones.map(
|
||||||
|
function (bone) {
|
||||||
|
this.idToObject[bone.id] = bone;
|
||||||
|
}.bind(this)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.idToObject[this.meshes[m].skeleton.id] = this.meshes[m].skeleton;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.entityManager.entities.map(
|
this.entityManager.entities.map(
|
||||||
function (entity) {
|
function (entity) {
|
||||||
this.idToObject[entity.id] = entity;
|
this.idToObject[entity.id] = entity;
|
||||||
|
@ -186,8 +198,7 @@ GameLib.D3.Scene.prototype.toApiScene = function() {
|
||||||
apiEntityManager,
|
apiEntityManager,
|
||||||
apiShapes,
|
apiShapes,
|
||||||
apiCameras,
|
apiCameras,
|
||||||
this.activeCameraIndex,
|
this.activeCameraIndex
|
||||||
apiSplines
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,69 +1,243 @@
|
||||||
/**
|
/**
|
||||||
* Skeleton Superset
|
* Skeleton Superset
|
||||||
* @param id
|
|
||||||
* @param bones GameLib.D3.API.Bone
|
|
||||||
* @param boneInverses
|
|
||||||
* @param useVertexTexture
|
|
||||||
* @param boneTextureWidth
|
|
||||||
* @param boneTextureHeight
|
|
||||||
* @param boneMatrices
|
|
||||||
* @param boneTexture
|
|
||||||
* @constructor
|
* @constructor
|
||||||
|
* @param graphics GameLib.D3.Graphics
|
||||||
|
* @param apiSkeleton GameLib.D3.API.Skeleton
|
||||||
*/
|
*/
|
||||||
GameLib.D3.Skeleton = function Skeleton(
|
GameLib.D3.Skeleton = function Skeleton(
|
||||||
id,
|
graphics,
|
||||||
bones,
|
apiSkeleton
|
||||||
boneInverses,
|
|
||||||
useVertexTexture,
|
|
||||||
boneTextureWidth,
|
|
||||||
boneTextureHeight,
|
|
||||||
boneMatrices,
|
|
||||||
boneTexture
|
|
||||||
) {
|
) {
|
||||||
this.id = id;
|
this.graphics = graphics;
|
||||||
|
this.graphics.isNotThreeThrow();
|
||||||
this.bones = bones;
|
|
||||||
|
GameLib.D3.API.Skeleton.call(
|
||||||
/**
|
this,
|
||||||
* An array of Matrix4s that represent the inverse of the matrixWorld of the individual bones.
|
apiSkeleton.id,
|
||||||
* @type GameLib.Matrix4[]
|
apiSkeleton.name,
|
||||||
*/
|
apiSkeleton.bones,
|
||||||
if (typeof boneInverses == 'undefined') {
|
apiSkeleton.boneInverses,
|
||||||
boneInverses = [];
|
apiSkeleton.useVertexTexture,
|
||||||
}
|
apiSkeleton.boneTextureWidth,
|
||||||
this.boneInverses = boneInverses;
|
apiSkeleton.boneTextureHeight,
|
||||||
|
apiSkeleton.boneMatrices,
|
||||||
/**
|
apiSkeleton.boneTexture
|
||||||
* Use a vertex texture in the shader - allows for more than 4 bones per vertex, not supported by all devices
|
);
|
||||||
* @type {boolean}
|
|
||||||
*/
|
this.instance = this.createInstance();
|
||||||
if (typeof useVertexTexture == 'undefined') {
|
|
||||||
useVertexTexture = false;
|
|
||||||
}
|
|
||||||
this.useVertexTexture = useVertexTexture;
|
|
||||||
|
|
||||||
if (this.useVertexTexture == true) {
|
|
||||||
console.warn('support for vertex texture bones is not supported yet - something could break somewhere');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof boneTextureWidth == 'undefined') {
|
|
||||||
boneTextureWidth = 0;
|
|
||||||
}
|
|
||||||
this.boneTextureWidth = boneTextureWidth;
|
|
||||||
|
|
||||||
if (typeof boneTextureHeight == 'undefined') {
|
|
||||||
boneTextureHeight = 0;
|
|
||||||
}
|
|
||||||
this.boneTextureHeight = boneTextureHeight;
|
|
||||||
|
|
||||||
if (typeof boneMatrices == 'undefined') {
|
|
||||||
boneMatrices = [];
|
|
||||||
}
|
|
||||||
this.boneMatrices = boneMatrices;
|
|
||||||
|
|
||||||
if (typeof boneTexture == 'undefined') {
|
|
||||||
boneTexture = [];
|
|
||||||
}
|
|
||||||
this.boneTexture = boneTexture;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GameLib.D3.Skeleton.prototype = Object.create(GameLib.D3.API.Skeleton.prototype);
|
||||||
|
GameLib.D3.Skeleton.prototype.constructor = GameLib.D3.Skeleton;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance skeleton
|
||||||
|
* @param update boolean
|
||||||
|
*/
|
||||||
|
GameLib.D3.Skeleton.prototype.createInstance = function(update) {
|
||||||
|
|
||||||
|
var instance = null;
|
||||||
|
|
||||||
|
if (update) {
|
||||||
|
//TODO - update instance with bone info
|
||||||
|
instance = this.instance;
|
||||||
|
} else {
|
||||||
|
instance = new THREE.Skeleton(
|
||||||
|
this.bones.map (
|
||||||
|
function (bone) {
|
||||||
|
return bone.instance;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
instance.useVertexTexture = this.useVertexTexture;
|
||||||
|
|
||||||
|
var parentBoneInstance = this.bones.reduce(
|
||||||
|
function (result, bone) {
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bone.parentBoneIds.length == 0) {
|
||||||
|
return bone.instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!parentBoneInstance) {
|
||||||
|
console.warn('Did not find the main parent bone - skeleton will be broken');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.rootBoneInstance = parentBoneInstance;
|
||||||
|
|
||||||
|
this.boneIdToBone = {};
|
||||||
|
|
||||||
|
this.bones.map(
|
||||||
|
function (bone) {
|
||||||
|
this.boneIdToBone[bone.id] = bone;
|
||||||
|
}.bind(this)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.bones.map(
|
||||||
|
function (__parentBoneInstance) {
|
||||||
|
return function(bone) {
|
||||||
|
bone.childBoneIds.map(
|
||||||
|
function (childBoneId) {
|
||||||
|
__parentBoneInstance.add(this.boneIdToBone[childBoneId].instance);
|
||||||
|
}.bind(this)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}(parentBoneInstance).bind(this)
|
||||||
|
);
|
||||||
|
|
||||||
|
instance.update();
|
||||||
|
|
||||||
|
instance.calculateInverses();
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the instance
|
||||||
|
*/
|
||||||
|
GameLib.D3.Skeleton.prototype.updateInstance = function() {
|
||||||
|
this.instance = this.createInstance(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a GameLib.D3.Skeleton to GameLib.D3.API.Skeleton
|
||||||
|
* @returns {GameLib.D3.API.Skeleton}
|
||||||
|
*/
|
||||||
|
GameLib.D3.Skeleton.prototype.toApiSkeleton = function() {
|
||||||
|
|
||||||
|
var apiSkeleton = new GameLib.D3.API.Skeleton(
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.bones.map(
|
||||||
|
function (bone) {
|
||||||
|
return bone.toApiBone();
|
||||||
|
}
|
||||||
|
),
|
||||||
|
this.boneInverses.map(
|
||||||
|
function (boneInverse) {
|
||||||
|
return boneInverse.toApiMatrix();
|
||||||
|
}
|
||||||
|
),
|
||||||
|
this.useVertexTexture,
|
||||||
|
this.boneTextureWidth,
|
||||||
|
this.boneTextureHeight,
|
||||||
|
this.boneMatrices.map(
|
||||||
|
function (boneMatrix) {
|
||||||
|
return boneMatrix.toApiMatrix();
|
||||||
|
}
|
||||||
|
),
|
||||||
|
this.boneTexture
|
||||||
|
);
|
||||||
|
|
||||||
|
return apiSkeleton;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a GameLib.D3.Skeleton from a skeleton Object
|
||||||
|
* @param graphics GameLib.D3.Graphics
|
||||||
|
* @param objectSkeleton Object
|
||||||
|
* @returns {GameLib.D3.Skeleton}
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
GameLib.D3.Skeleton.FromObjectSkeleton = function(
|
||||||
|
graphics,
|
||||||
|
objectSkeleton
|
||||||
|
) {
|
||||||
|
|
||||||
|
if (!objectSkeleton) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var apiSkeleton = new GameLib.D3.API.Skeleton(
|
||||||
|
objectSkeleton.id,
|
||||||
|
objectSkeleton.name,
|
||||||
|
objectSkeleton.bones.map(
|
||||||
|
function (objectBone) {
|
||||||
|
return GameLib.D3.Bone.FromObjectBone(graphics, objectBone);
|
||||||
|
}
|
||||||
|
),
|
||||||
|
objectSkeleton.boneInverses.map(
|
||||||
|
function (boneInverse) {
|
||||||
|
return new GameLib.D3.API.Matrix4(
|
||||||
|
new GameLib.D3.Vector4(
|
||||||
|
boneInverse[0],
|
||||||
|
boneInverse[1],
|
||||||
|
boneInverse[2],
|
||||||
|
boneInverse[3]
|
||||||
|
),
|
||||||
|
new GameLib.D3.Vector4(
|
||||||
|
boneInverse[4],
|
||||||
|
boneInverse[5],
|
||||||
|
boneInverse[6],
|
||||||
|
boneInverse[7]
|
||||||
|
),
|
||||||
|
new GameLib.D3.Vector4(
|
||||||
|
boneInverse[8],
|
||||||
|
boneInverse[9],
|
||||||
|
boneInverse[10],
|
||||||
|
boneInverse[11]
|
||||||
|
),
|
||||||
|
new GameLib.D3.Vector4(
|
||||||
|
boneInverse[12],
|
||||||
|
boneInverse[13],
|
||||||
|
boneInverse[14],
|
||||||
|
boneInverse[15]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
),
|
||||||
|
objectSkeleton.useVertexTexture,
|
||||||
|
objectSkeleton.boneTextureWidth,
|
||||||
|
objectSkeleton.boneTextureHeight,
|
||||||
|
objectSkeleton.boneMatrices.map(
|
||||||
|
function (boneMatrix) {
|
||||||
|
return new GameLib.D3.API.Matrix4(
|
||||||
|
new GameLib.D3.Vector4(
|
||||||
|
boneMatrix[0],
|
||||||
|
boneMatrix[1],
|
||||||
|
boneMatrix[2],
|
||||||
|
boneMatrix[3]
|
||||||
|
),
|
||||||
|
new GameLib.D3.Vector4(
|
||||||
|
boneMatrix[4],
|
||||||
|
boneMatrix[5],
|
||||||
|
boneMatrix[6],
|
||||||
|
boneMatrix[7]
|
||||||
|
),
|
||||||
|
new GameLib.D3.Vector4(
|
||||||
|
boneMatrix[8],
|
||||||
|
boneMatrix[9],
|
||||||
|
boneMatrix[10],
|
||||||
|
boneMatrix[11]
|
||||||
|
),
|
||||||
|
new GameLib.D3.Vector4(
|
||||||
|
boneMatrix[12],
|
||||||
|
boneMatrix[13],
|
||||||
|
boneMatrix[14],
|
||||||
|
boneMatrix[15]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
),
|
||||||
|
objectSkeleton.boneTexture
|
||||||
|
);
|
||||||
|
|
||||||
|
var skeleton = new GameLib.D3.Skeleton(
|
||||||
|
graphics,
|
||||||
|
apiSkeleton
|
||||||
|
);
|
||||||
|
|
||||||
|
return skeleton;
|
||||||
|
};
|
|
@ -18,6 +18,16 @@ GameLib.D3.Spline = function RuntimeSpline(
|
||||||
apiSpline.vertices
|
apiSpline.vertices
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.vertices = this.vertices.map(
|
||||||
|
function (vertex) {
|
||||||
|
return new GameLib.Vector3(
|
||||||
|
graphics,
|
||||||
|
this,
|
||||||
|
vertex
|
||||||
|
)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
this.instance = this.createInstance();
|
this.instance = this.createInstance();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -76,7 +86,7 @@ GameLib.D3.Spline.prototype.toApiComponent = function() {
|
||||||
this.name,
|
this.name,
|
||||||
this.vertices.map(
|
this.vertices.map(
|
||||||
function (vertex) {
|
function (vertex) {
|
||||||
return vertex.toApiVertex()
|
return vertex.toApiVector()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@ -87,7 +97,7 @@ GameLib.D3.Spline.prototype.toApiComponent = function() {
|
||||||
* Returns a GameLib.D3.Spline from a spline Object
|
* Returns a GameLib.D3.Spline from a spline Object
|
||||||
* @param graphics GameLib.D3.Graphics
|
* @param graphics GameLib.D3.Graphics
|
||||||
* @param objectComponent Object
|
* @param objectComponent Object
|
||||||
* @returns {GameLib.D3.Spline}
|
* @returns GameLib.D3.Spline
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
GameLib.D3.Spline.FromObjectComponent = function(
|
GameLib.D3.Spline.FromObjectComponent = function(
|
||||||
|
@ -99,7 +109,11 @@ GameLib.D3.Spline.FromObjectComponent = function(
|
||||||
objectComponent.name,
|
objectComponent.name,
|
||||||
objectComponent.vertices.map(
|
objectComponent.vertices.map(
|
||||||
function (objectVertex) {
|
function (objectVertex) {
|
||||||
return GameLib.D3.Vertex.FromObjectVertex(graphics, objectVertex);
|
return new GameLib.API.Vector3(
|
||||||
|
objectVertex.x,
|
||||||
|
objectVertex.y,
|
||||||
|
objectVertex.z
|
||||||
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -17,11 +17,11 @@ GameLib.D3.Vertex = function Vertex(
|
||||||
apiVertex.boneWeights
|
apiVertex.boneWeights
|
||||||
);
|
);
|
||||||
|
|
||||||
// this.position = new GameLib.Vector3(
|
this.position = new GameLib.Vector3(
|
||||||
// this.graphics,
|
this.graphics,
|
||||||
// null,
|
null,
|
||||||
// this.position
|
this.position
|
||||||
// );
|
);
|
||||||
|
|
||||||
//TODO: GameLib.D3.BoneWeight implementation
|
//TODO: GameLib.D3.BoneWeight implementation
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue