|
@@ -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;
|
|
|
}
|