nuclear@0: #include nuclear@0: #include "mesh.h" nuclear@0: nuclear@0: nuclear@0: /*static ID3D11InputLayout *vertex_layout; nuclear@0: nuclear@0: static ID3D11InputLayout *create_vertex_layout() nuclear@0: { nuclear@0: static const D3D11_INPUT_ELEMENT_DESC elem_desc[] = { nuclear@0: {"position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, pos), D3D11_INPUT_PER_VERTEX_DATA, 0}, nuclear@0: {"normal", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, normal), D3D11_INPUT_PER_VERTEX_DATA, 0}, nuclear@0: {"texcoord", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(Vertex, texcoord), D3D11_INPUT_PER_VERTEX_DATA, 0} nuclear@0: }; nuclear@0: static const int num_elem = sizeof elem_desc / sizeof *elem_desc; nuclear@0: nuclear@0: if(d3dut_dev->CreateInputLayout(elem_desc, num_elem, nuclear@0: }*/ nuclear@0: nuclear@0: nuclear@0: Mesh::Mesh() nuclear@0: { nuclear@0: vbuf = 0; nuclear@0: cur_norm = Vector3(0, 1, 0); nuclear@0: } nuclear@0: nuclear@0: Mesh::~Mesh() nuclear@0: { nuclear@0: if(vbuf) { nuclear@0: vbuf->Release(); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void Mesh::clear() nuclear@0: { nuclear@0: invalidate_vbuffer(); nuclear@0: verts.clear(); nuclear@0: } nuclear@0: nuclear@0: void Mesh::normal(float x, float y, float z) nuclear@0: { nuclear@0: cur_norm.x = x; nuclear@0: cur_norm.y = y; nuclear@0: cur_norm.z = z; nuclear@0: } nuclear@0: nuclear@0: void Mesh::texcoord(float u, float v) nuclear@0: { nuclear@0: cur_texcoord.x = u; nuclear@0: cur_texcoord.y = v; nuclear@0: } nuclear@0: nuclear@0: void Mesh::vertex(float x, float y, float z) nuclear@0: { nuclear@0: Vertex v; nuclear@0: v.pos = Vector3(x, y, z); nuclear@0: v.normal = cur_norm; nuclear@0: v.texcoord = cur_texcoord; nuclear@0: verts.push_back(v); nuclear@0: nuclear@0: invalidate_vbuffer(); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void Mesh::draw() const nuclear@0: { nuclear@0: ((Mesh*)this)->update_vbuffer(); nuclear@0: nuclear@0: unsigned int stride = sizeof(Vertex); nuclear@0: unsigned int offset = 0; nuclear@0: d3dut_ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset); nuclear@0: d3dut_ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); nuclear@0: nuclear@0: d3dut_ctx->Draw(verts.size(), 0); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: bool Mesh::update_vbuffer() nuclear@0: { nuclear@0: if(vbuf) { nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: if(verts.empty()) { nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: D3D11_BUFFER_DESC bufdesc; nuclear@0: memset(&bufdesc, 0, sizeof bufdesc); nuclear@0: bufdesc.Usage = D3D11_USAGE_DEFAULT; nuclear@0: bufdesc.ByteWidth = verts.size() * sizeof(Vertex); nuclear@0: bufdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; nuclear@0: nuclear@0: D3D11_SUBRESOURCE_DATA subres; nuclear@0: memset(&subres, 0, sizeof subres); nuclear@0: subres.pSysMem = &verts[0]; nuclear@0: nuclear@0: if(d3dut_dev->CreateBuffer(&bufdesc, &subres, &vbuf) != 0) { nuclear@0: fprintf(stderr, "failed to create vertex buffer\n"); nuclear@0: return false; nuclear@0: } nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: void Mesh::invalidate_vbuffer() nuclear@0: { nuclear@0: if(vbuf) { nuclear@0: vbuf->Release(); nuclear@0: vbuf = 0; nuclear@0: } nuclear@0: }