Ejemplo n.º 1
0
int MeshObj::Create(WCHAR* szfn, ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dContext)
{
	Release();

	TriangleMesh mesh;
	MeshObjReader::read(szfn, mesh);

	int N = mesh.num_vertices();
	m_vertices.resize(N);
	for(int i = 0; i < N; ++i)
	{
		m_vertices[i].pos = mesh.vertices_[i];
		m_vertices[i].norm = mesh.normals_[i];
	}
	
	D3D11_BUFFER_DESC bdesc;
	bdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
	bdesc.ByteWidth = mesh.num_vertices() * sizeof(D3DXVECTOR3) * 2;
	bdesc.CPUAccessFlags = 0;
	bdesc.MiscFlags = 0;
	bdesc.StructureByteStride = sizeof(D3DXVECTOR3) * 2;
	bdesc.Usage = D3D11_USAGE_DEFAULT;

	D3D11_SUBRESOURCE_DATA srd;
	srd.pSysMem = &m_vertices[0];
	srd.SysMemPitch = 0;
	srd.SysMemSlicePitch = 0;

	pd3dDevice->CreateBuffer(&bdesc, &srd, &m_pVertexBuffer);

	bdesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
	bdesc.ByteWidth = mesh.num_triangles() * sizeof(Tuple3ui);
	bdesc.CPUAccessFlags = 0;
	bdesc.MiscFlags = 0;
	bdesc.StructureByteStride = sizeof(unsigned);
	bdesc.Usage = D3D11_USAGE_DEFAULT;

	srd.pSysMem = &mesh.triangles_[0];
	srd.SysMemPitch = 0;
	srd.SysMemSlicePitch = 0;

	pd3dDevice->CreateBuffer(&bdesc, &srd, &m_pIndexBuffer);

	numVertices = mesh.num_vertices();
	numIndices = mesh.num_triangles() * 3;

	D3DXVECTOR3 bblow, bbhigh;
	mesh.bounding_box(bblow, bbhigh);
	m_bbox_center = (bblow + bbhigh) * 0.5f;
	m_bbox_extent = (bbhigh - bblow) * 0.5f;
	
	return 0;
}