示例#1
0
 private BspCollisionGeometry.CollisionGeometry CullCollisionGeometry(BspCollisionGeometry.CollisionGeometry collisionGeometry)
 {
     return(collisionGeometry);
 }
示例#2
0
        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);
        }