Esempio n. 1
0
        /*
         * void unpackModel(RW4Model model, string outputFileName)
         * {
         *  var meshes = model.GetObjects(RW4Mesh.type_code);
         *  if (meshes.Count != 1) throw new NotSupportedException("Only exactly one mesh supported.");
         *  var mesh = meshes[0] as RW4Mesh;
         *
         *  if (mesh.vertices == null) throw new NotSupportedException("Only models with a vertex buffer can be unpacked.");
         *
         *  new OgreXmlWriter(mesh.vertices.vertices.ToArray(),
         *                    mesh.triangles.triangles.ToArray(),
         *                    outputFileName);
         *  type = "mesh";
         * }
         * */

        void unpackTexture(RW4Model model, string outputFileName)
        {
            var textures = model.GetObjects(Texture.type_code);
            //  if (textures.Count != 1)
            //       throw new NotSupportedException("Only exactly one texture supported in a texture rw4.");
            int j = 0;

            foreach (Texture texture in textures)
            {
                using (var stream = File.Create(outputFileName + j.ToString() + ".dds"))
                {
                    stream.WriteU32(0x20534444); // 'DDS '
                    stream.WriteU32(0x7C);       // header size
                    stream.WriteU32(0xA1007);    // flags:
                    stream.WriteU32(texture.height);
                    stream.WriteU32(texture.width);
                    stream.WriteU32((uint)texture.height * (uint)texture.width);  // size of top mipmap level... at least in DXT5 for >4x4
                    stream.WriteU32(0);
                    stream.WriteU32(texture.mipmapInfo / 0x100);
                    for (int i = 0; i < 11; i++)
                    {
                        stream.WriteU32(0);
                    }

                    // pixel format
                    stream.WriteU32(32);
                    stream.WriteU32(4);  // DDPF_FOURCC?
                    stream.WriteU32(texture.textureType);
                    stream.WriteU32(32);
                    stream.WriteU32(0xff0000);
                    stream.WriteU32(0x00ff00);
                    stream.WriteU32(0x0000ff);
                    stream.WriteU32(0xff000000);
                    stream.WriteU32(0);  // 0x41008
                    for (int i = 0; i < 4; i++)
                    {
                        stream.WriteU32(0);
                    }

                    stream.Write(texture.texData.blob, 0, texture.texData.blob.Length);
                    j++;
                }
                type = "texture";
            }
        }
Esempio n. 2
0
        void unpackModel(RW4Model model, string outputFileName)
        {
            var meshes = model.GetObjects(RW4Mesh.type_code);

            if (meshes.Count != 1)
            {
                throw new NotSupportedException("Only exactly one mesh supported.");
            }
            var mesh = meshes[0] as RW4Mesh;

            if (mesh.vertices == null)
            {
                throw new NotSupportedException("Only models with a vertex buffer can be unpacked.");
            }

            new OgreXmlWriter(mesh.vertices.vertices.ToArray(),
                              mesh.triangles.triangles.ToArray(),
                              outputFileName);
            type = "mesh";
        }