浏览代码

Optimize memory management of MMDPhysics

Takahiro 8 年之前
父节点
当前提交
3c7dec22d5
共有 1 个文件被更改,包括 40 次插入23 次删除
  1. 40 23
      examples/js/animation/MMDPhysics.js

+ 40 - 23
examples/js/animation/MMDPhysics.js

@@ -57,9 +57,14 @@ THREE.MMDPhysics.prototype = {
 
 		}
 
-		var currentPosition = mesh.position.clone();
-		var currentRotation = mesh.rotation.clone();
-		var currentScale = mesh.scale.clone();
+		var helper = this.helper;
+		var currentPosition = helper.allocThreeVector3();
+		var currentRotation = helper.allocThreeVector3();
+		var currentScale = helper.allocThreeVector3();
+
+		currentPosition.copy( mesh.position );
+		currentRotation.copy( mesh.rotation );
+		currentScale.copy( mesh.scale );
 
 		mesh.position.set( 0, 0, 0 );
 		mesh.rotation.set( 0, 0, 0 );
@@ -85,6 +90,10 @@ THREE.MMDPhysics.prototype = {
 
 		this.reset();
 
+		helper.freeThreeVector3( currentPosition );
+		helper.freeThreeVector3( currentRotation );
+		helper.freeThreeVector3( currentScale );
+
 	},
 
 	initWorld: function () {
@@ -374,34 +383,35 @@ THREE.MMDPhysics.ResourceHelper.prototype = {
 
 	},
 
+	setOriginFromThreeVector3: function ( t, v ) {
+
+		t.getOrigin().setValue( v.x, v.y, v.z );
+
+	},
+
 	setBasisFromArray3: function ( t, a ) {
 
 		var thQ = this.allocThreeQuaternion();
 		var thE = this.allocThreeEuler();
 		thE.set( a[ 0 ], a[ 1 ], a[ 2 ] );
-		this.setBasisFromArray4( t, thQ.setFromEuler( thE ).toArray() );
+		this.setBasisFromThreeQuaternion( t, thQ.setFromEuler( thE ) );
 
 		this.freeThreeEuler( thE );
 		this.freeThreeQuaternion( thQ );
 
 	},
 
-	setBasisFromArray4: function ( t, a ) {
+	setBasisFromThreeQuaternion: function ( t, a ) {
 
-		var q = this.array4ToQuaternion( a );
-		this.setBasis( t, q );
-		this.freeQuaternion( q );
-
-	},
+		var q = this.allocQuaternion();
 
-	array4ToQuaternion: function( a ) {
+		q.setX( a.x );
+		q.setY( a.y );
+		q.setZ( a.z );
+		q.setW( a.w );
+		this.setBasis( t, q );
 
-		var q = this.allocQuaternion();
-		q.setX( a[ 0 ] );
-		q.setY( a[ 1 ] );
-		q.setZ( a[ 2 ] );
-		q.setW( a[ 3 ] );
-		return q;
+		this.freeQuaternion( q );
 
 	},
 
@@ -707,9 +717,10 @@ THREE.MMDPhysics.RigidBody.prototype = {
 		helper.setOriginFromArray3( boneOffsetForm, params.position );
 		helper.setBasisFromArray3( boneOffsetForm, params.rotation );
 
+		var vector = helper.allocThreeVector3();
 		var boneForm = helper.allocTransform();
 		helper.setIdentity( boneForm );
-		helper.setOriginFromArray3( boneForm, bone.getWorldPosition().toArray() );
+		helper.setOriginFromThreeVector3( boneForm, bone.getWorldPosition( vector ) );
 
 		var form = helper.multiplyTransforms( boneForm, boneOffsetForm );
 		var state = new Ammo.btDefaultMotionState( form );
@@ -746,6 +757,7 @@ THREE.MMDPhysics.RigidBody.prototype = {
 		helper.freeVector3( localInertia );
 		helper.freeTransform( form );
 		helper.freeTransform( boneForm );
+		helper.freeThreeVector3( vector );
 
 	},
 
@@ -800,16 +812,21 @@ THREE.MMDPhysics.RigidBody.prototype = {
 	getBoneTransform: function () {
 
 		var helper = this.helper;
-		var p = this.bone.getWorldPosition();
-		var q = this.bone.getWorldQuaternion();
+		var p = helper.allocThreeVector3();
+		var q = helper.allocThreeQuaternion();
+
+		this.bone.getWorldPosition( p );
+		this.bone.getWorldQuaternion( q );
 
 		var tr = helper.allocTransform();
-		helper.setOriginFromArray3( tr, p.toArray() );
-		helper.setBasisFromArray4( tr, q.toArray() );
+		helper.setOriginFromThreeVector3( tr, p );
+		helper.setBasisFromThreeQuaternion( tr, q );
 
 		var form = helper.multiplyTransforms( tr, this.boneOffsetForm );
 
 		helper.freeTransform( tr );
+		helper.freeThreeQuaternion( q );
+		helper.freeThreeVector3( p );
 
 		return form;
 
@@ -1114,7 +1131,7 @@ THREE.MMDPhysicsHelper.prototype._init = function () {
 				return new THREE.SphereBufferGeometry( param.width, 16, 8 );
 
 			case 1:
-				return new THREE.BoxBufferGeometry( param.width * 2, param.height * 2, param.depth * 2, 8, 8, 8);
+				return new THREE.BoxBufferGeometry( param.width * 2, param.height * 2, param.depth * 2, 8, 8, 8 );
 
 			case 2:
 				return new createCapsuleGeometry( param.width, param.height, 16, 8 );