Panda3D
|
00001 // Filename: vertexElementArray.cxx 00002 // Created by: aignacio (Jan06) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #include "dxGraphicsStateGuardian9.h" 00016 #include "vertexElementArray.h" 00017 00018 00019 VertexElementArray::VertexElementArray (int maximum_vertex_elements) { 00020 this -> offset = 0; 00021 this -> total_elements = 0; 00022 this -> maximum_vertex_elements = maximum_vertex_elements; 00023 this -> total_texture_coordinate_elements = 0; 00024 this -> vertex_element_array = new DIRECT_3D_VERTEX_ELEMENT [maximum_vertex_elements]; 00025 memset (this -> vertex_element_array, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT) * maximum_vertex_elements); 00026 this -> vertex_element_type_array = new VERTEX_ELEMENT_TYPE [maximum_vertex_elements]; 00027 memset (this -> vertex_element_type_array, 0, sizeof (VERTEX_ELEMENT_TYPE) * maximum_vertex_elements); 00028 00029 memset (this -> vertex_element_type_counter_array, 0, VS_TOTAL_TYPES * sizeof (int)); 00030 } 00031 00032 VertexElementArray::~VertexElementArray ( ) { 00033 delete this -> vertex_element_array; 00034 delete this -> vertex_element_type_array; 00035 } 00036 00037 int VertexElementArray::set_vertex_element_offset (int vertex_element_index, int offset) { 00038 int state; 00039 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00040 00041 if (vertex_element_index >= 0 && vertex_element_index < this -> total_elements) { 00042 vertex_element = &this -> vertex_element_array [vertex_element_index]; 00043 vertex_element -> Offset = offset; 00044 state = true; 00045 } 00046 00047 return state; 00048 } 00049 00050 void VertexElementArray::set_vs_input_type (int vs_input_type, VERTEX_ELEMENT_TYPE *vertex_element_type) { 00051 vertex_element_type -> vs_input_type = vs_input_type; 00052 vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> vs_input_type]; 00053 vertex_element_type_counter_array [vertex_element_type -> vs_input_type]++; 00054 } 00055 00056 void VertexElementArray::add_position_xyz_vertex_element (int stream_index) { 00057 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00058 VERTEX_ELEMENT_TYPE *vertex_element_type; 00059 00060 if (this -> total_elements < this -> maximum_vertex_elements) { 00061 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00062 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00063 00064 set_vs_input_type (VS_POSITION_XYZ, vertex_element_type); 00065 00066 vertex_element -> Stream = stream_index; 00067 vertex_element -> Offset = this -> offset; 00068 vertex_element -> Type = D3DDECLTYPE_FLOAT3; 00069 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00070 00071 vertex_element -> Usage = D3DDECLUSAGE_POSITION; 00072 vertex_element -> UsageIndex = 0; 00073 00074 this -> offset += 12; 00075 this -> total_elements++; 00076 } 00077 } 00078 00079 void VertexElementArray::add_position_xyzw_vertex_element (int stream_index) { 00080 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00081 VERTEX_ELEMENT_TYPE *vertex_element_type; 00082 00083 if (this -> total_elements < this -> maximum_vertex_elements) { 00084 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00085 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00086 00087 set_vs_input_type (VS_POSITION_XYZW, vertex_element_type); 00088 00089 vertex_element -> Stream = stream_index; 00090 vertex_element -> Offset = this -> offset; 00091 vertex_element -> Type = D3DDECLTYPE_FLOAT4; 00092 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00093 00094 vertex_element -> Usage = D3DDECLUSAGE_POSITION; 00095 vertex_element -> UsageIndex = 0; 00096 00097 this -> offset += 16; 00098 this -> total_elements++; 00099 } 00100 } 00101 00102 void VertexElementArray::add_normal_vertex_element (int stream_index) { 00103 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00104 VERTEX_ELEMENT_TYPE *vertex_element_type; 00105 00106 if (this -> total_elements < this -> maximum_vertex_elements) { 00107 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00108 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00109 00110 set_vs_input_type (VS_NORMAL, vertex_element_type); 00111 00112 vertex_element -> Stream = stream_index; 00113 vertex_element -> Offset = this -> offset; 00114 vertex_element -> Type = D3DDECLTYPE_FLOAT3; 00115 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00116 00117 vertex_element -> Usage = D3DDECLUSAGE_NORMAL; 00118 vertex_element -> UsageIndex = 0; 00119 00120 this -> offset += 12; 00121 this -> total_elements++; 00122 } 00123 } 00124 00125 void VertexElementArray::add_binormal_vertex_element (int stream_index) { 00126 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00127 VERTEX_ELEMENT_TYPE *vertex_element_type; 00128 00129 if (this -> total_elements < this -> maximum_vertex_elements) { 00130 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00131 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00132 00133 set_vs_input_type (VS_BINORMAL, vertex_element_type); 00134 00135 vertex_element -> Stream = stream_index; 00136 vertex_element -> Offset = this -> offset; 00137 vertex_element -> Type = D3DDECLTYPE_FLOAT3; 00138 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00139 00140 vertex_element -> Usage = D3DDECLUSAGE_BINORMAL; 00141 vertex_element -> UsageIndex = 0; 00142 00143 this -> offset += 12; 00144 this -> total_elements++; 00145 } 00146 } 00147 00148 void VertexElementArray::add_tangent_vertex_element (int stream_index) { 00149 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00150 VERTEX_ELEMENT_TYPE *vertex_element_type; 00151 00152 if (this -> total_elements < this -> maximum_vertex_elements) { 00153 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00154 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00155 00156 set_vs_input_type (VS_TANGENT, vertex_element_type); 00157 00158 vertex_element -> Stream = stream_index; 00159 vertex_element -> Offset = this -> offset; 00160 vertex_element -> Type = D3DDECLTYPE_FLOAT3; 00161 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00162 00163 vertex_element -> Usage = D3DDECLUSAGE_TANGENT; 00164 vertex_element -> UsageIndex = 0; 00165 00166 this -> offset += 12; 00167 this -> total_elements++; 00168 } 00169 } 00170 00171 void VertexElementArray::add_diffuse_color_vertex_element (int stream_index) { 00172 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00173 VERTEX_ELEMENT_TYPE *vertex_element_type; 00174 00175 if (this -> total_elements < this -> maximum_vertex_elements) { 00176 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00177 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00178 00179 set_vs_input_type (VS_DIFFUSE, vertex_element_type); 00180 00181 vertex_element -> Stream = stream_index; 00182 vertex_element -> Offset = this -> offset; 00183 vertex_element -> Type = D3DDECLTYPE_D3DCOLOR; 00184 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00185 00186 vertex_element -> Usage = D3DDECLUSAGE_COLOR; 00187 vertex_element -> UsageIndex = 0; 00188 00189 this -> offset += 4; 00190 this -> total_elements++; 00191 } 00192 } 00193 00194 void VertexElementArray::add_specular_color_vertex_element (int stream_index) { 00195 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00196 VERTEX_ELEMENT_TYPE *vertex_element_type; 00197 00198 if (this -> total_elements < this -> maximum_vertex_elements) { 00199 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00200 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00201 00202 set_vs_input_type (VS_SPECULAR, vertex_element_type); 00203 00204 vertex_element -> Stream = stream_index; 00205 vertex_element -> Offset = this -> offset; 00206 vertex_element -> Type = D3DDECLTYPE_D3DCOLOR; 00207 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00208 00209 vertex_element -> Usage = D3DDECLUSAGE_COLOR; 00210 vertex_element -> UsageIndex = 1; 00211 00212 this -> offset += 4; 00213 this -> total_elements++; 00214 } 00215 } 00216 00217 void VertexElementArray::add_u_vertex_element (int stream_index) { 00218 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00219 VERTEX_ELEMENT_TYPE *vertex_element_type; 00220 00221 if (this -> total_elements < this -> maximum_vertex_elements) { 00222 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00223 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00224 00225 set_vs_input_type (VS_TEXTURE_U, vertex_element_type); 00226 00227 vertex_element -> Stream = stream_index; 00228 vertex_element -> Offset = this -> offset; 00229 vertex_element -> Type = D3DDECLTYPE_FLOAT1; 00230 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00231 00232 vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; 00233 vertex_element -> UsageIndex = this -> total_texture_coordinate_elements; 00234 this -> total_texture_coordinate_elements++; 00235 00236 this -> offset += 4; 00237 this -> total_elements++; 00238 } 00239 } 00240 00241 void VertexElementArray::add_uv_vertex_element (int stream_index) { 00242 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00243 VERTEX_ELEMENT_TYPE *vertex_element_type; 00244 00245 if (this -> total_elements < this -> maximum_vertex_elements) { 00246 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00247 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00248 00249 set_vs_input_type (VS_TEXTURE_UV, vertex_element_type); 00250 00251 vertex_element -> Stream = stream_index; 00252 vertex_element -> Offset = this -> offset; 00253 vertex_element -> Type = D3DDECLTYPE_FLOAT2; 00254 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00255 00256 vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; 00257 vertex_element -> UsageIndex = this -> total_texture_coordinate_elements; 00258 this -> total_texture_coordinate_elements++; 00259 00260 this -> offset += 8; 00261 this -> total_elements++; 00262 } 00263 } 00264 00265 void VertexElementArray::add_uvw_vertex_element (int stream_index) { 00266 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00267 VERTEX_ELEMENT_TYPE *vertex_element_type; 00268 00269 if (this -> total_elements < this -> maximum_vertex_elements) { 00270 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00271 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00272 00273 set_vs_input_type (VS_TEXTURE_UVW, vertex_element_type); 00274 00275 vertex_element -> Stream = stream_index; 00276 vertex_element -> Offset = this -> offset; 00277 vertex_element -> Type = D3DDECLTYPE_FLOAT3; 00278 vertex_element -> Method = D3DDECLMETHOD_DEFAULT; 00279 00280 vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; 00281 vertex_element -> UsageIndex = this -> total_texture_coordinate_elements; 00282 this -> total_texture_coordinate_elements++; 00283 00284 this -> offset += 12; 00285 this -> total_elements++; 00286 } 00287 } 00288 00289 int VertexElementArray::add_end_vertex_element (void) { 00290 int add; 00291 DIRECT_3D_VERTEX_ELEMENT *vertex_element; 00292 VERTEX_ELEMENT_TYPE *vertex_element_type; 00293 00294 add = FALSE; 00295 if (this -> total_elements < this -> maximum_vertex_elements) { 00296 vertex_element = &this -> vertex_element_array [this -> total_elements]; 00297 vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; 00298 00299 vertex_element_type -> vs_input_type = VS_END; 00300 00301 vertex_element -> Stream = 0xFF; 00302 vertex_element -> Type = D3DDECLTYPE_UNUSED; 00303 00304 add = TRUE; 00305 } 00306 00307 return add; 00308 } 00309