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