示例#1
0
        /*
         * /// <summary>
         * /// Create a mesh from wavefront obj file format
         * /// </summary>
         * /// <param name="device">Device</param>
         * /// <param name="filename">Filename</param>
         * /// <returns>Mesh</returns>
         * public static SharpMesh CreateFromObj(string filename)
         * {
         *  SharpMesh mesh = new SharpMesh();
         *
         *  WaveFrontModel[] modelParts = WaveFrontModel.CreateFromObj(filename);
         *  mesh.SubSets = new List<SharpSubSet>();
         *
         *  List<StaticVertex> vertices = new List<StaticVertex>();
         *  List<int> indices = new List<int>();
         *
         *  int vcount = 0;
         *  int icount = 0;
         *  foreach (WaveFrontModel model in modelParts)
         *  {
         *      vertices.AddRange(model.VertexData);
         *      indices.AddRange(model.IndexData.Select(i => i + vcount));
         *
         *      var mate = model.MeshMaterial.First();
         *
         *
         *      ShaderResourceView tex = null;
         *      if (!string.IsNullOrEmpty(mate.DiffuseMap))
         *      {
         *          string textureFile = System.IO.Path.GetDirectoryName(filename) + "\\" + System.IO.Path.GetFileName(mate.DiffuseMap);
         *          tex = device.LoadTextureFromFile(textureFile);
         *      }
         *
         *      mesh.SubSets.Add(new SharpSubSet()
         *      {
         *          IndexCount = model.IndexData.Count,
         *          StartIndex = icount,
         *          DiffuseMap = tex
         *      });
         *
         *
         *
         *      vcount += model.VertexData.Count;
         *      icount += model.IndexData.Count;
         *  }
         *
         *  mesh.VertexBuffer = Buffer11.Create<StaticVertex>(RaymarchEngine.d3dDevice, BindFlags.VertexBuffer, vertices.ToArray());
         *  mesh.IndexBuffer = Buffer11.Create(RaymarchEngine.d3dDevice, BindFlags.IndexBuffer, indices.ToArray());
         *  mesh.VertexSize = SharpDX.Utilities.SizeOf<StaticVertex>();
         *
         *  return mesh;
         * }
         *
         *
         * /// <summary>
         * /// Create a mesh from wavefront obj file format using Tangent and Binormal vertex format
         * /// </summary>
         * /// <param name="device">Device</param>
         * /// <param name="filename">Filename</param>
         * /// <returns>Mesh</returns>
         * public static SharpMesh CreateNormalMappedFromObj(string filename)
         * {
         *  SharpMesh mesh = new SharpMesh();
         *
         *  WaveFrontModel[] modelParts = WaveFrontModel.CreateFromObj(filename);
         *  mesh.SubSets = new List<SharpSubSet>();
         *
         *  List<TangentVertex> vertices = new List<TangentVertex>();
         *  List<int> indices = new List<int>();
         *
         *  int vcount = 0;
         *  int icount = 0;
         *  foreach (WaveFrontModel model in modelParts)
         *  {
         *      vertices.AddRange(model.TangentData);
         *      indices.AddRange(model.IndexData.Select(i => i + vcount));
         *
         *      var mate = model.MeshMaterial.First();
         *
         *
         *      ShaderResourceView tex = null;
         *      ShaderResourceView ntex = null;
         *
         *      if (!string.IsNullOrEmpty(mate.DiffuseMap))
         *      {
         *          string textureFile = Path.GetDirectoryName(filename) + "\\" + Path.GetFileName(mate.DiffuseMap);
         *          tex = device.LoadTextureFromFile(textureFile);
         *
         *          string normalMap = Path.GetDirectoryName(textureFile) + "\\" + Path.GetFileNameWithoutExtension(textureFile) + "N" + Path.GetExtension(textureFile);
         *          ntex = device.LoadTextureFromFile(normalMap);
         *      }
         *
         *      mesh.SubSets.Add(new SharpSubSet()
         *      {
         *          IndexCount = model.IndexData.Count,
         *          StartIndex = icount,
         *          DiffuseMap = tex,
         *          NormalMap = ntex
         *      });
         *
         *      vcount += model.VertexData.Count;
         *      icount += model.IndexData.Count;
         *  }
         *
         *  mesh.VertexBuffer = Buffer11.Create<TangentVertex>(RaymarchEngine.d3dDevice, BindFlags.VertexBuffer, vertices.ToArray());
         *  mesh.IndexBuffer = Buffer11.Create(RaymarchEngine.d3dDevice, BindFlags.IndexBuffer, indices.ToArray());
         *  mesh.VertexSize = SharpDX.Utilities.SizeOf<TangentVertex>();
         *
         *  return mesh;
         * }*/

        /// <summary>
        /// Create a quad for Multiple Render Target
        /// </summary>
        /// <returns>Mesh</returns>
        public static Mesh CreateQuad()
        {
            RenderVertex[] vertices = new RenderVertex[]
            {
                new RenderVertex(new Vector4(0, 0, 1, 1), new Vector2(0, 1)),
                new RenderVertex(new Vector4(0, 0, 0, 1), new Vector2(0, 0)),
                new RenderVertex(new Vector4(1, 0, 1, 1), new Vector2(1, 1)),
                new RenderVertex(new Vector4(1, 0, 0, 1), new Vector2(1, 0))
            };

            int[] indices = new int[] { 0, 2, 1, 2, 3, 1 };

            Mesh mesh = new Mesh();

            mesh.VertexBuffer =
                Buffer.Create(Engine.RenderDevice.device, BindFlags.VertexBuffer, vertices.ToArray());
            mesh.IndexBuffer = Buffer.Create(Engine.RenderDevice.device, BindFlags.IndexBuffer, indices.ToArray());
            mesh.VertexSize  = Utilities.SizeOf <RenderVertex>();

            mesh.SubSets.Add(new Material()
            {
                DiffuseColor = new Vector4(1, 1, 1, 1),
                IndexCount   = indices.Count()
            });

            return(mesh);
        }
        public void pushVertex(ref RenderVertex v)
        {
            Vector3 v3;

            v3.x = v.position_.x;
            v3.y = v.position_.y;
            v3.z = v.position_.z;
            vertices_.Add(v3);

            Vector2 v2;

            v2.x = v.texCoords_[0][0];
            v2.y = v.texCoords_[0][1];
            uv_.Add(v2);

            Color c;

            c.a = ((float)((v.color_ & 0xff000000) >> 24)) / 255f;
            c.r = ((float)(v.color_ & 0x000000ff)) / 255f;
            c.g = ((float)((v.color_ & 0x0000ff00) >> 8)) / 255f;
            c.b = ((float)((v.color_ & 0x00ff0000) >> 16)) / 255f;
            colors_.Add(c);

            ++vertexCount_;
        }
示例#3
0
        public OLIFile(BinaryReader reader)
        {
            CMOMagic      = Encoding.ASCII.GetString(reader.ReadBytes(4));
            ContentLength = reader.ReadUInt32();
            long CMOContentStart = reader.BaseStream.Position;

            COIMagic                    = Encoding.ASCII.GetString(reader.ReadBytes(4));
            COIGeometryLength           = reader.ReadUInt32();
            COIGeometryLength2          = reader.ReadUInt32();
            COIUnk01                    = reader.ReadUInt32();
            COIUnk02                    = reader.ReadUInt32();
            COIUnk03                    = reader.ReadUInt32();
            COIUnk04                    = reader.ReadUInt32();
            reader.BaseStream.Position += 26; // Lots of empty space. The headers often mention leaving space for padding / future features, maybe that's what this is.
            COIUnk05                    = reader.ReadUInt16();
            COIUnk06                    = reader.ReadUInt32();
            COIUnk07                    = reader.ReadUInt32();

            uint COIVertexCount   = reader.ReadUInt32();
            uint COITriangleCount = reader.ReadUInt32();

            AABBSize = reader.ReadVector3();
            for (int i = 0; i < COIVertexCount; i++)
            {
                COIVertices.Add(reader.ReadVector3());
            }
            for (int i = 0; i < COITriangleCount; i++)
            {
                COITriangles.Add(new OLITriangle(reader));
            }

            uint CountTimesSix = reader.ReadUInt32();                         // No idea why this is the number of triangles time six, maybe it's the number of bytes for the indices? but each triagle is 4 ushorts, not 3.

            byte[] MaterialIndices = reader.ReadBytes((int)COITriangleCount); // We don't care, this duplicates the material indices in the triangle (index) data

            byte[] Padding;                                                   // Usually 0x00, sometimes other stuff. Doesn't seem to mean anything though.
            if (reader.BaseStream.Position % 4 != 0)
            {
                Padding = reader.ReadBytes(4 - ((int)reader.BaseStream.Position % 4));
            }

            // HACK: Read vertices until TSM3
            string sentinel = Encoding.ASCII.GetString(reader.ReadBytes(4));

            while (sentinel != "TSM3")
            {
                reader.BaseStream.Position -= 4;
                RenderVertex v = new RenderVertex(reader);
                RenderVertices.Add(v);
                sentinel = Encoding.ASCII.GetString(reader.ReadBytes(4));
            }
        }
示例#4
0
        private static RenderVertex[] GetVertices(FileFormatWavefront.FileLoadResult <FileFormatWavefront.Model.Scene> result)
        {
            // TODO: Groups?
            var vertices = new RenderVertex[result.Model.UngroupedFaces.Count * 3];

            int i = 0;

            foreach (var face in result.Model.UngroupedFaces)
            {
                foreach (var index in face.Indices)
                {
                    vertices[i] = GetVertex(result, index);
                    i++;
                }
            }

            return(vertices);
        }