示例#1
0
        internal Engine_Mesh(Engine_MeshInfo _obj)
        {
            #region //Get Instance of DirectX
            m_d3d = Engine_Renderer.Instance;
            #endregion

            #region //Set Variables
            m_vertexCount  = _obj.vertices.Count();
            m_vertexStride = SharpDX.Utilities.SizeOf <Engine_Vertex>();

            m_indexCount  = _obj.indices.Count();
            m_indexStride = sizeof(int);
            #endregion

            #region //Create VertexBuffer
            unsafe
            {
                fixed(Engine_Vertex *p = _obj.vertices.ToArray())  //Array
                {
                    IntPtr ptr = (IntPtr)p;

                    m_vertexBuffer = new D3D11.Buffer(
                        m_d3d.m_device,
                        ptr,
                        new D3D11.BufferDescription(
                            m_vertexCount * m_vertexStride, //ByteWidth
                            D3D11.BindFlags.VertexBuffer,
                            D3D11.ResourceUsage.Default));
                }
            }
            #endregion

            #region //Create IndexBuffer
            unsafe
            {
                fixed(ushort *p = _obj.indices.ToArray())
                {
                    IntPtr ptr = (IntPtr)p;

                    m_indexBuffer = new D3D11.Buffer(
                        m_d3d.m_device,
                        ptr,
                        new D3D11.BufferDescription(
                            m_indexCount * m_indexStride,
                            D3D11.BindFlags.IndexBuffer,
                            D3D11.ResourceUsage.Default));
                }
            }
            #endregion
        }
        internal static Engine_MeshInfo LoadFilePro(string _fileName)
        {
            var a = new Assimp.AssimpContext();
            var s = a.ImportFile(_fileName);

            Engine_MeshInfo obj = new Engine_MeshInfo();

            obj.vertices = new List <Engine_Vertex>();
            obj.indices  = new List <ushort>();
            foreach (var mesh in s.Meshes)
            {
                for (int i = 0; i < mesh.VertexCount; i++)
                {
                    obj.vertices.Add(new Engine_Vertex(
                                         mesh.Vertices[i].X,
                                         mesh.Vertices[i].Y,
                                         mesh.Vertices[i].Z,
                                         mesh.TextureCoordinateChannels[0][i].X,
                                         mesh.TextureCoordinateChannels[0][i].Y,
                                         mesh.Normals[i].X,
                                         mesh.Normals[i].Y,
                                         mesh.Normals[i].Z));
                }

                foreach (var item in mesh.Faces)
                {
                    var rangeIndices = new ushort[] {
                        (ushort)(item.Indices[0]),
                        (ushort)(item.Indices[1]),
                        (ushort)(item.Indices[2])
                    };
                    obj.indices.AddRange(rangeIndices);
                    if (item.IndexCount == 4)
                    {
                        rangeIndices = new ushort[] {
                            (ushort)(item.Indices[0]),
                            (ushort)(item.Indices[2]),
                            (ushort)(item.Indices[3])
                        };
                        obj.indices.AddRange(rangeIndices);
                    }
                }
            }

            return(obj);
        }