Panda3D
vertexElementArray.cxx
1 // Filename: vertexElementArray.cxx
2 // Created by: aignacio (Jan06)
3 //
4 ////////////////////////////////////////////////////////////////////
5 //
6 // PANDA 3D SOFTWARE
7 // Copyright (c) Carnegie Mellon University. All rights reserved.
8 //
9 // All use of this software is subject to the terms of the revised BSD
10 // license. You should have received a copy of this license along
11 // with this source code in a file named "LICENSE."
12 //
13 ////////////////////////////////////////////////////////////////////
14 
15 #include "dxGraphicsStateGuardian9.h"
16 #include "vertexElementArray.h"
17 
18 
19 VertexElementArray::VertexElementArray(int maximum_vertex_elements) {
20  _total_elements = 0;
21  _maximum_vertex_elements = maximum_vertex_elements;
22 
23  _vertex_element_array = new D3DVERTEXELEMENT9[maximum_vertex_elements];
24  memset(_vertex_element_array, 0, sizeof(D3DVERTEXELEMENT9) * maximum_vertex_elements);
25 }
26 
27 VertexElementArray::~VertexElementArray() {
28  delete _vertex_element_array;
29 }
30 
31 void VertexElementArray::add_position_xyz_vertex_element(int stream_index, int offset) {
32  if (_total_elements >= _maximum_vertex_elements) {
33  return;
34  }
35 
36  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
37 
38  vertex_element->Stream = stream_index;
39  vertex_element->Offset = offset;
40  vertex_element->Type = D3DDECLTYPE_FLOAT3;
41  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
42 
43  vertex_element->Usage = D3DDECLUSAGE_POSITION;
44  vertex_element->UsageIndex = 0;
45 
46  _total_elements++;
47 }
48 
49 void VertexElementArray::add_position_xyzw_vertex_element(int stream_index, int offset) {
50  if (_total_elements >= _maximum_vertex_elements) {
51  return;
52  }
53 
54  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
55 
56  vertex_element->Stream = stream_index;
57  vertex_element->Offset = offset;
58  vertex_element->Type = D3DDECLTYPE_FLOAT4;
59  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
60 
61  vertex_element->Usage = D3DDECLUSAGE_POSITION;
62  vertex_element->UsageIndex = 0;
63 
64  _total_elements++;
65 }
66 
67 void VertexElementArray::add_normal_vertex_element(int stream_index, int offset) {
68  if (_total_elements >= _maximum_vertex_elements) {
69  return;
70  }
71 
72  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
73 
74  vertex_element->Stream = stream_index;
75  vertex_element->Offset = offset;
76  vertex_element->Type = D3DDECLTYPE_FLOAT3;
77  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
78 
79  vertex_element->Usage = D3DDECLUSAGE_NORMAL;
80  vertex_element->UsageIndex = 0;
81 
82  _total_elements++;
83 }
84 
85 void VertexElementArray::add_binormal_vertex_element(int stream_index, int offset) {
86  if (_total_elements >= _maximum_vertex_elements) {
87  return;
88  }
89 
90  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
91 
92  vertex_element->Stream = stream_index;
93  vertex_element->Offset = offset;
94  vertex_element->Type = D3DDECLTYPE_FLOAT3;
95  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
96 
97  vertex_element->Usage = D3DDECLUSAGE_BINORMAL;
98  vertex_element->UsageIndex = 0;
99 
100  _total_elements++;
101 }
102 
103 void VertexElementArray::add_tangent_vertex_element(int stream_index, int offset) {
104  if (_total_elements >= _maximum_vertex_elements) {
105  return;
106  }
107 
108  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
109 
110  vertex_element->Stream = stream_index;
111  vertex_element->Offset = offset;
112  vertex_element->Type = D3DDECLTYPE_FLOAT3;
113  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
114 
115  vertex_element->Usage = D3DDECLUSAGE_TANGENT;
116  vertex_element->UsageIndex = 0;
117 
118  _total_elements++;
119 }
120 
121 void VertexElementArray::add_diffuse_color_vertex_element(int stream_index, int offset) {
122  if (_total_elements >= _maximum_vertex_elements) {
123  return;
124  }
125 
126  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
127 
128  vertex_element->Stream = stream_index;
129  vertex_element->Offset = offset;
130  vertex_element->Type = D3DDECLTYPE_D3DCOLOR;
131  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
132 
133  vertex_element->Usage = D3DDECLUSAGE_COLOR;
134  vertex_element->UsageIndex = 0;
135 
136  _total_elements++;
137 }
138 
139 void VertexElementArray::add_specular_color_vertex_element(int stream_index, int offset) {
140  if (_total_elements >= _maximum_vertex_elements) {
141  return;
142  }
143 
144  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
145 
146  vertex_element->Stream = stream_index;
147  vertex_element->Offset = offset;
148  vertex_element->Type = D3DDECLTYPE_D3DCOLOR;
149  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
150 
151  vertex_element->Usage = D3DDECLUSAGE_COLOR;
152  vertex_element->UsageIndex = 1;
153 
154  _total_elements++;
155 }
156 
157 void VertexElementArray::add_u_vertex_element(int stream_index, int offset, int texture_stage) {
158  if (_total_elements >= _maximum_vertex_elements) {
159  return;
160  }
161 
162  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
163 
164  vertex_element->Stream = stream_index;
165  vertex_element->Offset = offset;
166  vertex_element->Type = D3DDECLTYPE_FLOAT1;
167  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
168 
169  vertex_element->Usage = D3DDECLUSAGE_TEXCOORD;
170  vertex_element->UsageIndex = texture_stage;
171 
172  _total_elements++;
173 }
174 
175 void VertexElementArray::add_uv_vertex_element(int stream_index, int offset, int texture_stage) {
176  if (_total_elements >= _maximum_vertex_elements) {
177  return;
178  }
179 
180  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
181 
182  vertex_element->Stream = stream_index;
183  vertex_element->Offset = offset;
184  vertex_element->Type = D3DDECLTYPE_FLOAT2;
185  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
186 
187  vertex_element->Usage = D3DDECLUSAGE_TEXCOORD;
188  vertex_element->UsageIndex = texture_stage;
189 
190  _total_elements++;
191 }
192 
193 void VertexElementArray::add_uvw_vertex_element(int stream_index, int offset, int texture_stage) {
194  if (_total_elements >= _maximum_vertex_elements) {
195  return;
196  }
197 
198  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
199 
200  vertex_element->Stream = stream_index;
201  vertex_element->Offset = offset;
202  vertex_element->Type = D3DDECLTYPE_FLOAT3;
203  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
204 
205  vertex_element->Usage = D3DDECLUSAGE_TEXCOORD;
206  vertex_element->UsageIndex = texture_stage;
207 
208  _total_elements++;
209 }
210 
211 void VertexElementArray::add_xyzw_vertex_element(int stream_index, int offset, int texture_stage) {
212  if (_total_elements >= _maximum_vertex_elements) {
213  return;
214  }
215 
216  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
217 
218  vertex_element->Stream = stream_index;
219  vertex_element->Offset = offset;
220  vertex_element->Type = D3DDECLTYPE_FLOAT4;
221  vertex_element->Method = D3DDECLMETHOD_DEFAULT;
222 
223  vertex_element->Usage = D3DDECLUSAGE_TEXCOORD;
224  vertex_element->UsageIndex = texture_stage;
225 
226  _total_elements++;
227 }
228 
229 bool VertexElementArray::add_end_vertex_element(void) {
230  if (_total_elements >= _maximum_vertex_elements) {
231  return false;
232  }
233 
234  LPD3DVERTEXELEMENT9 vertex_element = &_vertex_element_array[_total_elements];
235 
236  vertex_element->Stream = 0xFF;
237  vertex_element->Offset = 0;
238  vertex_element->Type = D3DDECLTYPE_UNUSED;
239  vertex_element->Method = 0;
240 
241  vertex_element->Usage = 0;
242  vertex_element->UsageIndex = 0;
243 
244  return true;
245 }
246