public ICollideGeometricElement Clone(CollideMeshObject mesh) { CollideMeshElement sm = (CollideMeshElement)MemberwiseClone(); sm.mesh = mesh; sm.Reset(); return(sm); }
public static CollideMeshObject Read(EndianBinaryReader reader, PhysicalObject po, Pointer offset) { MapLoader l = MapLoader.Loader; CollideMeshObject m = new CollideMeshObject(po, offset); if (l.mode != MapLoader.Mode.Rayman2PC) { m.num_vertices = reader.ReadUInt16(); m.num_subblocks = reader.ReadUInt16(); reader.ReadUInt32(); } m.off_vertices = Pointer.Read(reader); if (l.mode == MapLoader.Mode.Rayman2PC) { m.off_normals = Pointer.Read(reader); Pointer.Read(reader); reader.ReadInt32(); } m.off_subblock_types = Pointer.Read(reader); m.off_subblocks = Pointer.Read(reader); Pointer.Read(reader); if (l.mode == MapLoader.Mode.Rayman2PC) { reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); m.num_vertices = reader.ReadUInt16(); m.num_subblocks = reader.ReadUInt16(); } reader.ReadInt32(); reader.ReadSingle(); reader.ReadSingle(); reader.ReadSingle(); reader.ReadSingle(); if (l.mode == MapLoader.Mode.Rayman2PC) { reader.ReadUInt32(); } // Vertices Pointer off_current = Pointer.Goto(ref reader, m.off_vertices); m.vertices = new Vector3[m.num_vertices]; for (int i = 0; i < m.num_vertices; i++) { float x = reader.ReadSingle(); float z = reader.ReadSingle(); float y = reader.ReadSingle(); m.vertices[i] = new Vector3(x, y, z); } // Normals if (m.off_normals != null) { off_current = Pointer.Goto(ref reader, m.off_normals); m.normals = new Vector3[m.num_vertices]; for (int i = 0; i < m.num_vertices; i++) { float x = reader.ReadSingle(); float z = reader.ReadSingle(); float y = reader.ReadSingle(); m.normals[i] = new Vector3(x, y, z); } } // Read subblock types & initialize arrays Pointer.Goto(ref reader, m.off_subblock_types); m.subblock_types = new ushort[m.num_subblocks]; m.subblocks = new ICollideGeometricElement[m.num_subblocks]; for (uint i = 0; i < m.num_subblocks; i++) { m.subblock_types[i] = reader.ReadUInt16(); } m.gao = new GameObject("Collide Set @ " + offset); m.gao.tag = "Collide"; for (uint i = 0; i < m.num_subblocks; i++) { Pointer.Goto(ref reader, m.off_subblocks + (i * 4)); Pointer block_offset = Pointer.Read(reader); Pointer.Goto(ref reader, block_offset); switch (m.subblock_types[i]) { case 1: // Collide submesh m.subblocks[i] = CollideMeshElement.Read(reader, block_offset, m); //material_i++; break; default: m.subblocks[i] = null; l.print("Unknown collide geometric element type " + m.subblock_types[i] + " at offset " + block_offset); break; } } for (uint i = 0; i < m.num_subblocks; i++) { if (m.subblocks[i] != null) { if (m.subblocks[i] is CollideMeshElement) { GameObject child = ((CollideMeshElement)m.subblocks[i]).Gao; child.transform.SetParent(m.gao.transform); child.transform.localPosition = Vector3.zero; } } } m.gao.SetActive(false); // Invisible by default return(m); }
public static CollideMeshElement Read(EndianBinaryReader reader, Pointer offset, CollideMeshObject m) { MapLoader l = MapLoader.Loader; CollideMeshElement sm = new CollideMeshElement(offset, m); sm.off_material = Pointer.Read(reader); if (l.mode == MapLoader.Mode.Rayman2PC) { sm.num_triangles = reader.ReadUInt16(); reader.ReadUInt16(); sm.off_triangles = Pointer.Read(reader); Pointer.Read(reader); sm.off_normals = Pointer.Read(reader); Pointer.Read(reader); } else { sm.off_triangles = Pointer.Read(reader); sm.off_normals = Pointer.Read(reader); sm.num_triangles = reader.ReadUInt16(); reader.ReadUInt16(); reader.ReadUInt32(); sm.off_mapping = Pointer.Read(reader); sm.off_unk = Pointer.Read(reader); sm.off_unk2 = Pointer.Read(reader); sm.num_mapping_entries = reader.ReadUInt16(); reader.ReadUInt16(); } Pointer.Goto(ref reader, sm.off_triangles); sm.vertex_indices = new int[sm.num_triangles * 3]; for (int j = 0; j < sm.num_triangles; j++) { sm.vertex_indices[(j * 3) + 0] = reader.ReadInt16(); sm.vertex_indices[(j * 3) + 1] = reader.ReadInt16(); sm.vertex_indices[(j * 3) + 2] = reader.ReadInt16(); } Pointer.Goto(ref reader, sm.off_normals); sm.normals = new Vector3[sm.num_triangles]; for (int j = 0; j < sm.num_triangles; j++) { float x = reader.ReadSingle(); float z = reader.ReadSingle(); float y = reader.ReadSingle(); sm.normals[j] = new Vector3(x, y, z); } /*R3Pointer.Goto(ref reader, sm.off_mapping); * sm.mapping = new int[sm.num_triangles * 3]; * for (int j = 0; j < sm.num_triangles; j++) { * sm.mapping[(j * 3) + 0] = reader.ReadInt16(); * sm.mapping[(j * 3) + 1] = reader.ReadInt16(); * sm.mapping[(j * 3) + 2] = reader.ReadInt16(); * } * R3Pointer.Goto(ref reader, sm.off_unk); * sm.normals = new Vector3[sm.num_mapping_entries]; * for (int j = 0; j < sm.num_mapping_entries; j++) { * float x = reader.ReadSingle(); * float z = reader.ReadSingle(); * float y = reader.ReadSingle(); * sm.normals[j] = new Vector3(x, y, z); * }*/ return(sm); }