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 } |