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

                num1     = 1;
                num2     = 3;
                unkSmall = 0.001f;
                num3     = 255;
                num4     = 0;

                List <Int3> ltriangles = new List <Int3>();
                List <CollisionMaterials> lmatTypes = new List <CollisionMaterials>();

                for (int i = 0; i != model.Parts.Length; i++)
                {
                    model.Parts[i].Material = ConvertCollisionMats(model.Parts[i].Material).ToString();
                    for (int x = 0; x != model.Parts[i].Indices.Length; x++)
                    {
                        ltriangles.Add(new Int3(model.Parts[i].Indices[x]));
                        lmatTypes.Add((CollisionMaterials)Enum.Parse(typeof(CollisionMaterials), model.Parts[i].Material));
                    }
                }

                nPoints    = model.Vertices.Length;
                nTriangles = ltriangles.Count;

                if (num2 == 3)
                {
                    num5 = nTriangles - 1;
                    if (nTriangles <= 256)
                    {
                        UnkData = new byte[nTriangles];
                    }
                    else
                    {
                        unkBytes = new short[nTriangles];
                    }
                }

                points = new Vector3[nPoints];

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

                triangles = ltriangles.ToArray();
                unkShorts = lmatTypes.ToArray();

                unk0 = 1;
                unk1 = 1;

                unkShortSectorData = new short[nTriangles];
                unkByteSectorData  = new byte[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(new Vector3(0), 0);
                boundingBox.CalculateBounds(data);
                boundingSphere.CreateFromBoundingBox(boundingBox);

                unkSize     = nTriangles;
                unkSizeData = new byte[unkSize];
                for (int i = 0; i != unkSizeData.Length; i++)
                {
                    unkSizeData[i] = 0;
                }
            }
Пример #2
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;
                }
            }
Пример #3
0
            public void ReadFromFile(BinaryReader reader)
            {
                nxs      = new string(reader.ReadChars(4));
                mesh     = new string(reader.ReadChars(4));
                num1     = reader.ReadInt32();
                num2     = reader.ReadInt32();
                unkSmall = reader.ReadSingle();
                num3     = reader.ReadInt32();
                num4     = reader.ReadInt32();

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

                points    = new Vector3[nPoints];
                triangles = new Int3[nTriangles];
                unkShorts = new CollisionMaterials[nTriangles];

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

                for (int i = 0; i != triangles.Length; i++)
                {
                    triangles[i] = new Int3(reader);
                }

                for (int i = 0; i != unkShorts.Length; i++)
                {
                    unkShorts[i] = (CollisionMaterials)reader.ReadInt16();
                }

                //bool overTri1 = false;

                if (num2 == 3)
                {
                    num5 = reader.ReadInt32();

                    if (nTriangles <= 256)
                    {
                        unkData = new byte[nTriangles];
                        for (int i = 0; i != nTriangles; i++)
                        {
                            unkData[i] = reader.ReadByte();
                        }
                    }
                    else
                    {
                        unkBytes = new short[nTriangles];
                        for (int i = 0; i != nTriangles; i++)
                        {
                            unkBytes[i] = reader.ReadInt16();
                        }
                    }

                    //OLD METHOD::
                    //if (num5 != nTriangles - 1)
                    //{
                    //    overTri1 = true;
                    //}
                }


                unk0 = reader.ReadInt32();
                unk1 = reader.ReadInt32();
                long curPosition = reader.BaseStream.Position;

                unkShortSectorData = new short[nTriangles];

                for (int i = 0; i != nTriangles; i++)
                {
                    unkShortSectorData[i] = reader.ReadInt16();
                }

                unkByteSectorData = reader.ReadBytes(nTriangles);
                long finalPosition = reader.BaseStream.Position;

                int total = 0;

                //OLD METHOD:
                //if (overTri1)
                //{
                //    unkShortSectorData = new short[nTriangles];

                //    for (int i = 0; i != nTriangles; i++)
                //        unkShortSectorData[i] = reader.ReadInt16();

                //    unkByteSectorData = reader.ReadBytes(nTriangles);
                //}
                //else
                //{
                //    for (int i = 0; i != sections.Length; i++)
                //        sections[i].EdgeData = reader.ReadBytes(sections[i].NumEdges);
                //}

                opcHbmData = new HBMOPCDataClass(reader);

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

                boundingSphere = new BoundingSphere();
                boundingSphere.ReadToFile(reader);

                boundingBox = new BoundingBox();
                boundingBox.ReadToFile(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:");
                }
            }
Пример #4
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:");
                }
            }