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; } }
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; } }
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:"); } }
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:"); } }