Browse Source

DirectGeometry: Rescued skins.

Mr.doob 10 years ago
parent
commit
ca16519357
2 changed files with 39 additions and 19 deletions
  1. 14 14
      src/core/BufferGeometry.js
  2. 25 5
      src/core/DirectGeometry.js

+ 14 - 14
src/core/BufferGeometry.js

@@ -174,25 +174,13 @@ THREE.BufferGeometry.prototype = {
 
 				this.fromGeometry( geometry );
 
-				// skinning
-
-				if ( object instanceof THREE.SkinnedMesh ) {
-
-					/*
-					var skinIndices = new THREE.Float32Attribute( geometry.skinIndices.length * 4, 4 );
-					var skinWeights = new THREE.Float32Attribute( geometry.skinWeights.length * 4, 4 );
-
-					this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );
-					this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );
-					*/
-
-				}
+				var directgeometry = geometry.__directGeometry;
 
 				// morphs
 
 				if ( object.morphTargetInfluences !== undefined ) {
 
-					var morphTargets = geometry.__directGeometry.morphTargets;
+					var morphTargets = directgeometry.morphTargets;
 
 					for ( var i = 0, l = morphTargets.length; i < l; i ++ ) {
 
@@ -208,6 +196,18 @@ THREE.BufferGeometry.prototype = {
 
 				}
 
+				// skinning
+
+				if ( object instanceof THREE.SkinnedMesh ) {
+
+					var skinIndices = new THREE.Float32Attribute( directgeometry.skinIndices.length * 4, 4 );
+					var skinWeights = new THREE.Float32Attribute( directgeometry.skinWeights.length * 4, 4 );
+
+					this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( directgeometry.skinIndices ) );
+					this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( directgeometry.skinWeights ) );
+
+				}
+
 			}
 
 		}

+ 25 - 5
src/core/DirectGeometry.js

@@ -22,6 +22,9 @@ THREE.DirectGeometry = function () {
 	this.morphColors = [];
 	this.morphNormals = [];
 
+	this.skinWeights = [];
+	this.skinIndices = [];
+
 	// this.lineDistances = [];
 
 	this.boundingBox = null;
@@ -98,6 +101,14 @@ THREE.DirectGeometry.prototype = {
 
 		}
 
+		// skins
+
+		var skinIndices = geometry.skinIndices;
+		var skinWeights = geometry.skinWeights;
+
+		var hasSkinIndices = skinIndices.length === vertices.length;
+		var hasSkinWeights = skinWeights.length === vertices.length;
+
 		//
 
 		for ( var i = 0; i < faces.length; i ++ ) {
@@ -196,6 +207,20 @@ THREE.DirectGeometry.prototype = {
 
 			}
 
+			// skins
+
+			if ( hasSkinIndices ) {
+
+				this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );
+
+			}
+
+			if ( hasSkinWeights ) {
+
+				this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );
+
+			}
+
 		}
 
 		this.verticesNeedUpdate = geometry.verticesNeedUpdate;
@@ -205,11 +230,6 @@ THREE.DirectGeometry.prototype = {
 
 		return this;
 
-		/*
-		if ( geometry.skinIndices ) this.skinIndices = geometry.skinIndices.slice( 0 );
-		if ( geometry.skinWeights ) this.skinWeights = geometry.skinWeights.slice( 0 );
-		*/
-
 	},
 
 	dispose: function () {