Panda3D

vertexElementArray.cxx

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 
 All Classes Functions Variables Enumerations