Browse Source

BufferGeometry.setFromObject(): Support Skinning.

Mr.doob 10 years ago
parent
commit
18839c8a2b
3 changed files with 48 additions and 2 deletions
  1. 26 0
      src/core/BufferAttribute.js
  2. 18 1
      src/core/BufferGeometry.js
  3. 4 1
      src/core/DynamicGeometry.js

+ 26 - 0
src/core/BufferAttribute.js

@@ -136,6 +136,32 @@ THREE.BufferAttribute.prototype = {
 
 
 	},
 	},
 
 
+	copyVector4sArray: function ( vectors ) {
+
+		var array = this.array, offset = 0;
+
+		for ( var i = 0, l = vectors.length; i < l; i ++ ) {
+
+			var vector = vectors[ i ];
+
+			if ( vector === undefined ) {
+
+				console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );
+				vector = new THREE.Vector4();
+
+			}
+
+			array[ offset ++ ] = vector.x;
+			array[ offset ++ ] = vector.y;
+			array[ offset ++ ] = vector.z;
+			array[ offset ++ ] = vector.w;
+
+		}
+
+		return this;
+
+	},
+
 	set: function ( value, offset ) {
 	set: function ( value, offset ) {
 
 
 		if ( offset === undefined ) offset = 0;
 		if ( offset === undefined ) offset = 0;

+ 18 - 1
src/core/BufferGeometry.js

@@ -112,7 +112,7 @@ THREE.BufferGeometry.prototype = {
 
 
 	setFromObject: function ( object ) {
 	setFromObject: function ( object ) {
 
 
-		console.log( 'THREE.BufferGeometry.setFromObject(). Converting ', object, this );
+		console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );
 
 
 		var geometry = object.geometry;
 		var geometry = object.geometry;
 		var material = object.material;
 		var material = object.material;
@@ -128,6 +128,23 @@ THREE.BufferGeometry.prototype = {
 
 
 		} else if ( object instanceof THREE.Mesh ) {
 		} else if ( object instanceof THREE.Mesh ) {
 
 
+			if ( object instanceof THREE.SkinnedMesh ) {
+
+				if ( geometry instanceof THREE.Geometry ) {
+
+					console.log( 'THREE.BufferGeometry.setFromObject(): Converted THREE.Geometry to THREE.DynamicGeometry as required for THREE.SkinnedMesh.', geometry );
+					geometry = new THREE.DynamicGeometry().fromGeometry( geometry );
+
+				}
+
+				var skinIndices = new Float32Array( geometry.skinIndices.length * 4 );
+				var skinWeights = new Float32Array( geometry.skinWeights.length * 4 );
+
+				this.addAttribute( 'skinIndex', new THREE.BufferAttribute( skinIndices, 4 ).copyVector4sArray( geometry.skinIndices ) );
+				this.addAttribute( 'skinWeight', new THREE.BufferAttribute( skinWeights, 4 ).copyVector4sArray( geometry.skinWeights ) );
+
+			}
+
 			if ( geometry instanceof THREE.DynamicGeometry ) {
 			if ( geometry instanceof THREE.DynamicGeometry ) {
 
 
 				this.fromDynamicGeometry( geometry );
 				this.fromDynamicGeometry( geometry );

+ 4 - 1
src/core/DynamicGeometry.js

@@ -24,8 +24,8 @@ THREE.DynamicGeometry = function () {
 	this.morphColors = [];
 	this.morphColors = [];
 	this.morphNormals = [];
 	this.morphNormals = [];
 
 
-	this.skinWeights = [];
 	this.skinIndices = [];
 	this.skinIndices = [];
+	this.skinWeights = [];
 
 
 	this.lineDistances = [];
 	this.lineDistances = [];
 
 
@@ -101,6 +101,9 @@ THREE.DynamicGeometry.prototype = {
 
 
 		}
 		}
 
 
+		if ( geometry.skinIndices ) this.skinIndices = geometry.skinIndices.slice( 0 );
+		if ( geometry.skinWeights ) this.skinWeights = geometry.skinWeights.slice( 0 );
+
 		return this;
 		return this;
 
 
 	},
 	},