Pārlūkot izejas kodu

fixed skins selection

Nicolas Cannasse 4 gadi atpakaļ
vecāks
revīzija
a6d2579f49
1 mainītis faili ar 15 papildinājumiem un 5 dzēšanām
  1. 15 5
      hrt/prefab/Object3D.hx

+ 15 - 5
hrt/prefab/Object3D.hx

@@ -159,6 +159,7 @@ class Object3D extends Prefab {
 		var localBounds = [];
 		var totalSeparateBounds = 0.;
 		var visibleMeshes = [];
+		var hasSkin = false;
 
 		inline function getVolume(b:h3d.col.Bounds) {
 			var c = b.getSize();
@@ -180,6 +181,13 @@ class Object3D extends Prefab {
 			localMat.multiply(localMat, invRootMat);
 
 			if( mesh.primitive == null ) continue;
+			visibleMeshes.push(mesh);
+
+			if( Std.isOfType(mesh, h3d.scene.Skin) ) {
+				hasSkin = true;
+				continue;
+			}
+
 			var lb = mesh.primitive.getBounds().clone();
 			lb.transform(localMat);
 			bounds.add(lb);
@@ -191,17 +199,19 @@ class Object3D extends Prefab {
 				totalSeparateBounds -= getVolume(tmp);
 			}
 			localBounds.push(lb);
-
-			visibleMeshes.push(mesh);
 		}
 		if( visibleMeshes.length == 0 )
 			return null;
-		var meshCollider = new h3d.col.Collider.GroupCollider([for(m in visibleMeshes) {
+		var colliders = [for(m in visibleMeshes) {
 			var c : h3d.col.Collider = try m.getGlobalCollider() catch(e: Dynamic) null;
 			if(c != null) c;
-		}]);
+		}];
+		var meshCollider = colliders.length == 1 ? colliders[0] : new h3d.col.Collider.GroupCollider(colliders);
 		var collider : h3d.col.Collider = new h3d.col.ObjectCollider(local3d, bounds);
-		if( totalSeparateBounds / getVolume(bounds) < 0.5 ) {
+		if( hasSkin ) {
+			collider = meshCollider; // can't trust bounds
+			meshCollider = null;
+		} else if( totalSeparateBounds / getVolume(bounds) < 0.5 ) {
 			collider = new h3d.col.Collider.OptimizedCollider(collider, meshCollider);
 			meshCollider = null;
 		}