private BspCollisionGeometry.CollisionGeometry CullCollisionGeometry(BspCollisionGeometry.CollisionGeometry collisionGeometry) { return(collisionGeometry); }
private CollisionModel GenerateCollisionModel(CachedTag modelTag, int geometryIndex, bool iscluster) { var collisionModel = new CollisionModel(); collisionModel.Regions = new List <CollisionModel.Region>(); var permutation = new CollisionModel.Region.Permutation() { Name = DestCache.StringTable.GetStringId("default"), BspPhysics = new List <CollisionBspPhysicsDefinition>(), BspMoppCodes = new List <TagTool.Havok.TagHkpMoppCode>(), Bsps = new List <CollisionModel.Region.Permutation.Bsp>() }; collisionModel.Regions = new List <CollisionModel.Region>() { new CollisionModel.Region() { Name = DestCache.StringTable.GetStringId("default"), Permutations = new List <CollisionModel.Region.Permutation>() { permutation } } }; // copy over and fixup bsp physics blocks var newCollisionGeometry = new BspCollisionGeometry.CollisionGeometry(); //instanced geometry if (!iscluster) { //bsp physics var instancedGeometryInstance = StructureBsp.InstancedGeometryInstances[geometryIndex]; var instancedGeometryDef = StructureBspResources.InstancedGeometry[instancedGeometryInstance.MeshIndex]; foreach (var bspPhysics in instancedGeometryInstance.BspPhysics) { permutation.BspPhysics.Add(ConvertData(bspPhysics)); } //mopps foreach (var mopp in instancedGeometryDef.CollisionMoppCodes) { permutation.BspMoppCodes.Add(ConvertData(mopp)); } //collision geometry newCollisionGeometry = instancedGeometryDef.CollisionInfo.DeepClone(); } else { var cluster = StructureBsp.Clusters[geometryIndex]; // bsp physics & mopps foreach (var mopp in cluster.CollisionMoppCodes) { permutation.BspMoppCodes.Add(ConvertData(mopp)); var bspPhysics = new CollisionBspPhysicsDefinition { GeometryShape = new CollisionGeometryShape() { // need to double check this AABB_Min = new RealQuaternion(cluster.BoundsX.Lower, cluster.BoundsY.Lower, cluster.BoundsZ.Lower, 0), AABB_Max = new RealQuaternion(cluster.BoundsX.Upper, cluster.BoundsY.Upper, cluster.BoundsZ.Upper, 0), }, MoppBvTreeShape = new Havok.HkpBvMoppTreeShape() }; permutation.BspPhysics.Add(bspPhysics); } // collision geometry if (StructureBspResources.CollisionBsps.Count > 0) { newCollisionGeometry = StructureBspResources.CollisionBsps[0].DeepClone(); } //TODO: cull unnecessary parts of bsp collision } // fixup bsp fixups for collision model foreach (var bspPhysics in permutation.BspPhysics) { bspPhysics.GeometryShape.Model = modelTag; bspPhysics.GeometryShape.BspIndex = -1; bspPhysics.GeometryShape.CollisionGeometryShapeKey = 0xffff; bspPhysics.GeometryShape.CollisionGeometryShapeType = 0; } // fixup surfaces materials block // build a mapping of surface material indices to collision materials foreach (var surface in newCollisionGeometry.Surfaces) { if (surface.MaterialIndex == -1) { continue; } short modelMaterialIndex; if (!CollisionMaterialMapping.TryGetValue(surface.MaterialIndex, out modelMaterialIndex)) { CollisionMaterialMapping.Add(surface.MaterialIndex, modelMaterialIndex); } surface.MaterialIndex = modelMaterialIndex; } // add the collision geometry permutation.Bsps.Add(new CollisionModel.Region.Permutation.Bsp() { NodeIndex = 0, Geometry = newCollisionGeometry }); return(collisionModel); }