Пример #1
0
            public void BuildBasicCollision(Lod model)
            {
                nxs  = Convert.ToString(22239310);
                mesh = Convert.ToString(1213416781);

                ver   = 1;
                flags = MeshSerialFlags.MSF_MATERIALS;
                convexEdgeThreshold = 0.001f;
                maxVertices         = 255;
                num4       = 0;
                nPoints    = model.Vertices.Length;
                nTriangles = model.Indices.Length / 3;
                points     = new Vector3[nPoints];
                indices    = new uint[model.Indices.Length];
                materials  = new CollisionMaterials[model.Indices.Length];

                int idx = 0;

                for (int i = 0; i != model.Parts.Length; i++)
                {
                    ModelPart part = model.Parts[i];
                    for (int x = (int)part.StartIndex; x < part.StartIndex + part.NumFaces * 3; x++)
                    {
                        indices[x] = model.Indices[x];
                        Enum.TryParse(model.Parts[i].Material, true, out materials[x]);
                    }
                }

                for (int i = 0; i != points.Length; i++)
                {
                    points[i] = model.Vertices[i].Position;
                }

                numConvexParts = 0;
                numFlatParts   = 0;

                convexParts = new short[nTriangles];
                flatParts   = new short[nTriangles];

                opcHbmData = new HBMOPCDataClass();
                opcHbmData.BuildBasicOPCHBM();

                boundingBox = new BoundingBox();
                unkFloats   = new float[14];

                //sort out bounding box/sphere
                List <Vertex[]> data = new List <Vertex[]>();

                data.Add(model.Vertices);
                boundingBox    = new BoundingBox();
                boundingSphere = new BoundingSphere();
                boundingBox    = BoundingBoxExtenders.CalculateBounds(data);
                boundingSphere = BoundingSphereExtenders.CalculateFromBBox(boundingBox);

                unkSize     = nTriangles;
                unkSizeData = new byte[unkSize];
                for (int i = 0; i != unkSizeData.Length; i++)
                {
                    unkSizeData[i] = 0;
                }
            }
Пример #2
0
            public void ReadFromFile(BinaryReader reader)
            {
                nxs   = new string(reader.ReadChars(4));
                mesh  = new string(reader.ReadChars(4));
                ver   = reader.ReadInt32();
                flags = (MeshSerialFlags)reader.ReadInt32();
                convexEdgeThreshold = reader.ReadSingle();
                maxVertices         = reader.ReadInt32();
                num4 = reader.ReadInt32();

                nPoints    = reader.ReadInt32();
                nTriangles = reader.ReadInt32();

                points    = new Vector3[nPoints];
                indices   = new uint[nTriangles * 3];
                materials = new CollisionMaterials[nTriangles];

                for (int i = 0; i != points.Length; i++)
                {
                    points[i] = Vector3Extenders.ReadFromFile(reader);
                }

                if (flags.HasFlag(MeshSerialFlags.MSF_8BIT_INDICES))
                {
                    for (int i = 0; i != indices.Length; i++)
                    {
                        indices[i] = reader.ReadByte();
                    }
                }
                else if (flags.HasFlag(MeshSerialFlags.MSF_16BIT_INDICES))
                {
                    for (int i = 0; i != indices.Length; i++)
                    {
                        indices[i] = reader.ReadUInt16();
                    }
                }
                else
                {
                    for (int i = 0; i != indices.Length; i++)
                    {
                        indices[i] = reader.ReadUInt32();
                    }
                }

                if (flags.HasFlag(MeshSerialFlags.MSF_MATERIALS))
                {
                    for (int i = 0; i != materials.Length; i++)
                    {
                        materials[i] = (CollisionMaterials)reader.ReadInt16();
                    }
                }

                if (flags.HasFlag(MeshSerialFlags.MSF_FACE_REMAP))
                {
                    max       = reader.ReadInt32();
                    remapData = new int[nTriangles];

                    for (int i = 0; i < nTriangles; i++)
                    {
                        if (max > 0xFFFF)
                        {
                            remapData[i] = reader.ReadInt32();
                        }
                        else if (max > 0xFF)
                        {
                            remapData[i] = reader.ReadInt16();
                        }
                        else
                        {
                            remapData[i] = reader.ReadByte();
                        }
                    }
                }

                numConvexParts = reader.ReadInt32();
                numFlatParts   = reader.ReadInt32();

                if (numConvexParts > 0)
                {
                    convexParts = new short[nTriangles];
                    for (int i = 0; i != nTriangles; i++)
                    {
                        convexParts[i] = reader.ReadInt16();
                    }
                }
                if (numFlatParts > 0)
                {
                    if (numFlatParts < 256)
                    {
                        flatParts = new short[nTriangles];
                        for (int i = 0; i != nTriangles; i++)
                        {
                            flatParts[i] = reader.ReadByte();
                        }
                    }
                    else
                    {
                        flatParts = new short[nTriangles];
                        for (int i = 0; i != nTriangles; i++)
                        {
                            flatParts[i] = reader.ReadInt16();
                        }
                    }
                }

                opcHbmData = new HBMOPCDataClass(reader);

                unkFloats    = new float[14];
                unkFloats[0] = reader.ReadSingle();

                boundingSphere = BoundingSphereExtenders.ReadFromFile(reader);
                boundingBox    = BoundingBoxExtenders.ReadFromFile(reader);

                for (int i = 1; i != unkFloats.Length; i++)
                {
                    unkFloats[i] = reader.ReadSingle();
                }

                unkSize     = reader.ReadInt32();
                unkSizeData = reader.ReadBytes(unkSize);

                if (unkSize != nTriangles)
                {
                    throw new FormatException("UnkSize does not equal nTriangles:");
                }
            }