dxtest2

annotate src/mesh.cc @ 0:6ed01ded71d8

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 23 Jun 2013 04:23:13 +0300
parents
children
rev   line source
nuclear@0 1 #include <d3dut.h>
nuclear@0 2 #include "mesh.h"
nuclear@0 3
nuclear@0 4
nuclear@0 5 /*static ID3D11InputLayout *vertex_layout;
nuclear@0 6
nuclear@0 7 static ID3D11InputLayout *create_vertex_layout()
nuclear@0 8 {
nuclear@0 9 static const D3D11_INPUT_ELEMENT_DESC elem_desc[] = {
nuclear@0 10 {"position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, pos), D3D11_INPUT_PER_VERTEX_DATA, 0},
nuclear@0 11 {"normal", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, normal), D3D11_INPUT_PER_VERTEX_DATA, 0},
nuclear@0 12 {"texcoord", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(Vertex, texcoord), D3D11_INPUT_PER_VERTEX_DATA, 0}
nuclear@0 13 };
nuclear@0 14 static const int num_elem = sizeof elem_desc / sizeof *elem_desc;
nuclear@0 15
nuclear@0 16 if(d3dut_dev->CreateInputLayout(elem_desc, num_elem,
nuclear@0 17 }*/
nuclear@0 18
nuclear@0 19
nuclear@0 20 Mesh::Mesh()
nuclear@0 21 {
nuclear@0 22 vbuf = 0;
nuclear@0 23 cur_norm = Vector3(0, 1, 0);
nuclear@0 24 }
nuclear@0 25
nuclear@0 26 Mesh::~Mesh()
nuclear@0 27 {
nuclear@0 28 if(vbuf) {
nuclear@0 29 vbuf->Release();
nuclear@0 30 }
nuclear@0 31 }
nuclear@0 32
nuclear@0 33 void Mesh::clear()
nuclear@0 34 {
nuclear@0 35 invalidate_vbuffer();
nuclear@0 36 verts.clear();
nuclear@0 37 }
nuclear@0 38
nuclear@0 39 void Mesh::normal(float x, float y, float z)
nuclear@0 40 {
nuclear@0 41 cur_norm.x = x;
nuclear@0 42 cur_norm.y = y;
nuclear@0 43 cur_norm.z = z;
nuclear@0 44 }
nuclear@0 45
nuclear@0 46 void Mesh::texcoord(float u, float v)
nuclear@0 47 {
nuclear@0 48 cur_texcoord.x = u;
nuclear@0 49 cur_texcoord.y = v;
nuclear@0 50 }
nuclear@0 51
nuclear@0 52 void Mesh::vertex(float x, float y, float z)
nuclear@0 53 {
nuclear@0 54 Vertex v;
nuclear@0 55 v.pos = Vector3(x, y, z);
nuclear@0 56 v.normal = cur_norm;
nuclear@0 57 v.texcoord = cur_texcoord;
nuclear@0 58 verts.push_back(v);
nuclear@0 59
nuclear@0 60 invalidate_vbuffer();
nuclear@0 61 }
nuclear@0 62
nuclear@0 63
nuclear@0 64 void Mesh::draw() const
nuclear@0 65 {
nuclear@0 66 ((Mesh*)this)->update_vbuffer();
nuclear@0 67
nuclear@0 68 unsigned int stride = sizeof(Vertex);
nuclear@0 69 unsigned int offset = 0;
nuclear@0 70 d3dut_ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset);
nuclear@0 71 d3dut_ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
nuclear@0 72
nuclear@0 73 d3dut_ctx->Draw(verts.size(), 0);
nuclear@0 74 }
nuclear@0 75
nuclear@0 76
nuclear@0 77 bool Mesh::update_vbuffer()
nuclear@0 78 {
nuclear@0 79 if(vbuf) {
nuclear@0 80 return true;
nuclear@0 81 }
nuclear@0 82
nuclear@0 83 if(verts.empty()) {
nuclear@0 84 return false;
nuclear@0 85 }
nuclear@0 86
nuclear@0 87 D3D11_BUFFER_DESC bufdesc;
nuclear@0 88 memset(&bufdesc, 0, sizeof bufdesc);
nuclear@0 89 bufdesc.Usage = D3D11_USAGE_DEFAULT;
nuclear@0 90 bufdesc.ByteWidth = verts.size() * sizeof(Vertex);
nuclear@0 91 bufdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
nuclear@0 92
nuclear@0 93 D3D11_SUBRESOURCE_DATA subres;
nuclear@0 94 memset(&subres, 0, sizeof subres);
nuclear@0 95 subres.pSysMem = &verts[0];
nuclear@0 96
nuclear@0 97 if(d3dut_dev->CreateBuffer(&bufdesc, &subres, &vbuf) != 0) {
nuclear@0 98 fprintf(stderr, "failed to create vertex buffer\n");
nuclear@0 99 return false;
nuclear@0 100 }
nuclear@0 101 return true;
nuclear@0 102 }
nuclear@0 103
nuclear@0 104 void Mesh::invalidate_vbuffer()
nuclear@0 105 {
nuclear@0 106 if(vbuf) {
nuclear@0 107 vbuf->Release();
nuclear@0 108 vbuf = 0;
nuclear@0 109 }
nuclear@0 110 }