Przeglądaj źródła

DynamicBones: clean dt and posChanged

LeoVgr 7 miesięcy temu
rodzic
commit
df0b9aef6c
2 zmienionych plików z 12 dodań i 15 usunięć
  1. 2 3
      h3d/anim/Skin.hx
  2. 10 12
      h3d/scene/Skin.hx

+ 2 - 3
h3d/anim/Skin.hx

@@ -29,15 +29,14 @@ class Joint {
 }
 }
 
 
 class DynamicJoint extends Joint {
 class DynamicJoint extends Joint {
-	public static var STAMP : Float = 0.0;
 	public static var SLEEP_THRESHOLD : Float = 0.05;
 	public static var SLEEP_THRESHOLD : Float = 0.05;
 
 
-
 	public var absPos : h3d.Matrix; // Abs pos of the joint computed each frame
 	public var absPos : h3d.Matrix; // Abs pos of the joint computed each frame
 	public var relPos : h3d.Matrix; // Initial relative pos before joint get moved by animation / dynamic system
 	public var relPos : h3d.Matrix; // Initial relative pos before joint get moved by animation / dynamic system
 
 
-	// Parameters
 	public var speed : h3d.Vector;
 	public var speed : h3d.Vector;
+	
+	// Parameters
 	public var radius : Float = 0.0;
 	public var radius : Float = 0.0;
 	public var damping : Float = 0.4;
 	public var damping : Float = 0.4;
 	public var stiffness : Float = 0.5;
 	public var stiffness : Float = 0.5;

+ 10 - 12
h3d/scene/Skin.hx

@@ -80,6 +80,7 @@ class Skin extends MultiMaterial {
 	var jointsGraphics : Graphics;
 	var jointsGraphics : Graphics;
 	var additivePose : Array<h3d.Matrix>;
 	var additivePose : Array<h3d.Matrix>;
 	var g : Graphics;
 	var g : Graphics;
+	var dynUpdated : Bool = false;
 
 
 	public var showJoints : Bool;
 	public var showJoints : Bool;
 	public var enableRetargeting : Bool = true;
 	public var enableRetargeting : Bool = true;
@@ -252,7 +253,7 @@ class Skin extends MultiMaterial {
 	}
 	}
 
 
 	override function syncRec( ctx : RenderContext ) {
 	override function syncRec( ctx : RenderContext ) {
-		posChanged = true;
+		posChanged = posChanged || dynUpdated;
 		super.syncRec(ctx);
 		super.syncRec(ctx);
 	}
 	}
 
 
@@ -300,17 +301,12 @@ class Skin extends MultiMaterial {
 	}
 	}
 
 
 	function syncDynamicJoints() {
 	function syncDynamicJoints() {
-		var deltaTime = Timer.stamp() - DynamicJoint.STAMP;
-		DynamicJoint.STAMP = Timer.stamp();
-
 		// Update dynamic joints
 		// Update dynamic joints
-		var shouldUpdate = false;
 		for( j in skinData.allJoints ) {
 		for( j in skinData.allJoints ) {
 			if ( j.follow != null ) continue;
 			if ( j.follow != null ) continue;
 			var dynJoint = Std.downcast(j, h3d.anim.Skin.DynamicJoint);
 			var dynJoint = Std.downcast(j, h3d.anim.Skin.DynamicJoint);
 			if (dynJoint == null) continue;
 			if (dynJoint == null) continue;
-
-			shouldUpdate = true;
+		
 			var absPos = dynJoint.absPos == null ? currentAbsPose[dynJoint.index] : dynJoint.absPos;
 			var absPos = dynJoint.absPos == null ? currentAbsPose[dynJoint.index] : dynJoint.absPos;
 			var newWorldPos = absPos.getPosition().clone();
 			var newWorldPos = absPos.getPosition().clone();
 			var expectedPos = absPos.getPosition().clone();
 			var expectedPos = absPos.getPosition().clone();
@@ -321,9 +317,8 @@ class Skin extends MultiMaterial {
 
 
 			// Damping (inertia attenuation)
 			// Damping (inertia attenuation)
 			dynJoint.speed *= 1.0 - dynJoint.damping;
 			dynJoint.speed *= 1.0 - dynJoint.damping;
-			if (dynJoint.speed.lengthSq() > DynamicJoint.SLEEP_THRESHOLD) {
-				newWorldPos += dynJoint.speed * deltaTime;
-			}
+			if (dynJoint.speed.lengthSq() > DynamicJoint.SLEEP_THRESHOLD)
+				newWorldPos += dynJoint.speed * hxd.Timer.dt;
 
 
 			// Stiffness (shape keeper)
 			// Stiffness (shape keeper)
 			var parentMovement = currentAbsPose[j.parent.index].getPosition() - currentAbsPose[dynJoint.parent.index].getPosition();
 			var parentMovement = currentAbsPose[j.parent.index].getPosition() - currentAbsPose[dynJoint.parent.index].getPosition();
@@ -337,15 +332,18 @@ class Skin extends MultiMaterial {
 			newWorldPos.lerp(expectedPos, newWorldPos, dynJoint.slackness);
 			newWorldPos.lerp(expectedPos, newWorldPos, dynJoint.slackness);
 
 
 			// Apply computed position to joint
 			// Apply computed position to joint
-			dynJoint.speed = (dynJoint.speed + (newWorldPos - absPos.getPosition()) * (1.0 / deltaTime)) * 0.5;
+			dynJoint.speed = (dynJoint.speed + (newWorldPos - absPos.getPosition()) * (1.0 / hxd.Timer.dt)) * 0.5;
 			currentAbsPose[j.index].setPosition(newWorldPos);
 			currentAbsPose[j.index].setPosition(newWorldPos);
 			dynJoint.absPos = currentAbsPose[j.index];
 			dynJoint.absPos = currentAbsPose[j.index];
 
 
+			var offset = absPos.getPosition() - newWorldPos;
+			if (Math.abs(offset.length()) >= DynamicJoint.SLEEP_THRESHOLD)
+				dynUpdated = true;
+
 			if( dynJoint.bindIndex >= 0 )
 			if( dynJoint.bindIndex >= 0 )
 				currentPalette[dynJoint.bindIndex].multiply3x4inline(j.transPos, currentAbsPose[j.index]);
 				currentPalette[dynJoint.bindIndex].multiply3x4inline(j.transPos, currentAbsPose[j.index]);
 		}
 		}
 
 
-
 		// Update transforms
 		// Update transforms
 		function recomputeAbsPosFrom(dynJoint: DynamicJoint) {
 		function recomputeAbsPosFrom(dynJoint: DynamicJoint) {
 			currentAbsPose[dynJoint.index] = new Matrix();
 			currentAbsPose[dynJoint.index] = new Matrix();