Пример #1
0
        public CollideMeshObject Clone()
        {
            CollideMeshObject m = (CollideMeshObject)MemberwiseClone();

            m.gao       = new GameObject("Collide Set");
            m.gao.tag   = "Collide";
            m.subblocks = new ICollideGeometricElement[num_subblocks];
            for (uint i = 0; i < m.num_subblocks; i++)
            {
                if (subblocks[i] != null)
                {
                    m.subblocks[i] = subblocks[i].Clone(m);
                }
            }
            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);
        }
Пример #2
0
        public ICollideGeometricElement Clone(CollideMeshObject mesh)
        {
            CollideMeshElement sm = (CollideMeshElement)MemberwiseClone();

            sm.mesh = mesh;
            sm.Reset();
            return(sm);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
 public CollideMeshElement(Pointer offset, CollideMeshObject mesh)
 {
     this.mesh   = mesh;
     this.offset = offset;
 }