From 6481cb76b191043e1e149c9c8a775c274e6ab962 Mon Sep 17 00:00:00 2001 From: aignacio_sf <> Date: Mon, 23 Jan 2006 19:06:37 +0000 Subject: [PATCH] Separated class VertexElementArray into its own file. --- panda/src/dxgsg9/Sources.pp | 4 +- panda/src/dxgsg9/dxGraphicsStateGuardian9.h | 60 +-- panda/src/dxgsg9/dxShaderContext9.cxx | 358 ------------------ panda/src/dxgsg9/dxShaderContext9.h | 1 - panda/src/dxgsg9/dxgsg9_composite1.cxx | 2 +- panda/src/dxgsg9/vertexElementArray.cxx | 381 ++++++++++++++++++++ panda/src/dxgsg9/vertexElementArray.h | 96 +++++ 7 files changed, 482 insertions(+), 420 deletions(-) create mode 100644 panda/src/dxgsg9/vertexElementArray.cxx create mode 100644 panda/src/dxgsg9/vertexElementArray.h diff --git a/panda/src/dxgsg9/Sources.pp b/panda/src/dxgsg9/Sources.pp index e4febe4e27..48ce5d54db 100755 --- a/panda/src/dxgsg9/Sources.pp +++ b/panda/src/dxgsg9/Sources.pp @@ -32,6 +32,7 @@ dxGraphicsDevice9.h \ dxShaderContext9.h \ ../display/lru.h \ + vertexElementArray.h #define INCLUDED_SOURCES \ config_dxgsg9.cxx \ @@ -43,6 +44,7 @@ wdxGraphicsPipe9.cxx \ wdxGraphicsWindow9.cxx \ wdxGraphicsBuffer9.cxx \ - dxShaderContext9.cxx + dxShaderContext9.cxx \ + vertexElementArray.cxx #end lib_target diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.h b/panda/src/dxgsg9/dxGraphicsStateGuardian9.h index cfe4404764..b6bf7153c0 100755 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.h +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.h @@ -39,6 +39,7 @@ typedef D3DVERTEXELEMENT9 DIRECT_3D_VERTEX_ELEMENT; typedef LPDIRECT3DDEVICE9 DIRECT_3D_DEVICE; typedef LPDIRECT3DVERTEXDECLARATION9 DIRECT_3D_VERTEX_DECLARATION; +#include "vertexElementArray.h" #include "dxShaderContext9.h" @@ -371,63 +372,4 @@ private: #include "dxGraphicsStateGuardian9.I" - -enum -{ - VS_END = 0, - - VS_POSITION_XYZ, - VS_POSITION_XYZW, - VS_NORMAL, - VS_DIFFUSE, - VS_SPECULAR, - VS_TEXTURE_U, - VS_TEXTURE_UV, - VS_TEXTURE_UVW, - VS_TANGENT, - VS_BINORMAL, - - VS_ERROR, - - VS_TOTAL_TYPES -}; - -typedef struct -{ - int id; // this is VS_XXXXX - int index; - int stream; - int offset; -} -VERTEX_ELEMENT_TYPE; - -class VertexElementArray -{ -public: - - VertexElementArray (int maximum_vertex_elements); - ~VertexElementArray ( ); - - int set_vertex_element_offset (int vertex_element_index, int offset); - - void add_position_xyz_vertex_element (int stream_index); - void add_position_xyzw_vertex_element (int stream_index); - void add_normal_vertex_element (int stream_index); - void add_binormal_vertex_element (int stream_index); - void add_tangent_vertex_element (int stream_index); - void add_diffuse_color_vertex_element (int stream_index); - void add_specular_color_vertex_element (int stream_index); - void add_u_vertex_element (int stream_index); - void add_uv_vertex_element (int stream_index); - void add_uvw_vertex_element (int stream_index); - int add_end_vertex_element (void); - - int offset; - int total_elements; - int maximum_vertex_elements; - int vertex_element_type_counter_array [VS_TOTAL_TYPES]; - DIRECT_3D_VERTEX_ELEMENT *vertex_element_array; - VERTEX_ELEMENT_TYPE *vertex_element_type_array; -}; - #endif diff --git a/panda/src/dxgsg9/dxShaderContext9.cxx b/panda/src/dxgsg9/dxShaderContext9.cxx index 2296c8130e..4585281b4a 100644 --- a/panda/src/dxgsg9/dxShaderContext9.cxx +++ b/panda/src/dxgsg9/dxShaderContext9.cxx @@ -21,364 +21,6 @@ TypeHandle CLP(ShaderContext)::_type_handle; -VertexElementArray::VertexElementArray (int maximum_vertex_elements) -{ - this -> offset = 0; - this -> total_elements = 0; - this -> maximum_vertex_elements = maximum_vertex_elements; - this -> vertex_element_array = new DIRECT_3D_VERTEX_ELEMENT [maximum_vertex_elements]; - this -> vertex_element_type_array = new VERTEX_ELEMENT_TYPE [maximum_vertex_elements]; - - memset (this -> vertex_element_type_counter_array, 0, VS_TOTAL_TYPES * sizeof (int)); -} - -VertexElementArray::~VertexElementArray ( ) -{ - delete this -> vertex_element_array; - delete this -> vertex_element_type_array; -} - -int VertexElementArray::set_vertex_element_offset (int vertex_element_index, int offset) -{ - int state; - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - - if (vertex_element_index >= 0 && vertex_element_index < this -> total_elements) - { - vertex_element = &this -> vertex_element_array [vertex_element_index]; - vertex_element -> Offset = offset; - state = true; - } - - return state; -} - -void VertexElementArray::add_position_xyz_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_POSITION_XYZ; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_FLOAT3; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_POSITION; - vertex_element -> UsageIndex = 0; - - this -> offset += 12; - this -> total_elements++; - } -} - -void VertexElementArray::add_position_xyzw_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_POSITION_XYZW; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_FLOAT4; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_POSITION; - vertex_element -> UsageIndex = 0; - - this -> offset += 16; - this -> total_elements++; - } -} - -void VertexElementArray::add_normal_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_NORMAL; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_FLOAT3; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_NORMAL; - vertex_element -> UsageIndex = 0; - - this -> offset += 12; - this -> total_elements++; - } -} - -void VertexElementArray::add_binormal_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_BINORMAL; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_FLOAT3; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_BINORMAL; - vertex_element -> UsageIndex = 0; - - this -> offset += 12; - this -> total_elements++; - } -} - -void VertexElementArray::add_tangent_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_TANGENT; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_FLOAT3; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_TANGENT; - vertex_element -> UsageIndex = 0; - - this -> offset += 12; - this -> total_elements++; - } -} - -void VertexElementArray::add_diffuse_color_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_DIFFUSE; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_D3DCOLOR; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_COLOR; - vertex_element -> UsageIndex = 0; - - this -> offset += 4; - this -> total_elements++; - } -} - -void VertexElementArray::add_specular_color_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_SPECULAR; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_D3DCOLOR; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_COLOR; - vertex_element -> UsageIndex = 1; - - this -> offset += 4; - this -> total_elements++; - } -} - -void VertexElementArray::add_u_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_TEXTURE_U; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_FLOAT1; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; - vertex_element -> UsageIndex = 0; - - this -> offset += 4; - this -> total_elements++; - } -} - -void VertexElementArray::add_uv_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_TEXTURE_UV; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_FLOAT2; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; - vertex_element -> UsageIndex = 0; - - this -> offset += 8; - this -> total_elements++; - } -} - -void VertexElementArray::add_uvw_vertex_element (int stream_index) -{ - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_TEXTURE_UVW; - vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; - vertex_element_type_counter_array [vertex_element_type -> id]++; - - vertex_element -> Stream = stream_index; - vertex_element -> Offset = this -> offset; - vertex_element -> Type = D3DDECLTYPE_FLOAT3; - vertex_element -> Method = D3DDECLMETHOD_DEFAULT; - - vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; - vertex_element -> UsageIndex = 0; - - this -> offset += 12; - this -> total_elements++; - } -} - -int VertexElementArray::add_end_vertex_element (void) -{ - int add; - DIRECT_3D_VERTEX_ELEMENT *vertex_element; - VERTEX_ELEMENT_TYPE *vertex_element_type; - - add = FALSE; - if (this -> total_elements < this -> maximum_vertex_elements) - { - vertex_element = &this -> vertex_element_array [this -> total_elements]; - memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); - - vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; - memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); - - vertex_element_type -> id = VS_END; - - vertex_element -> Stream = 0xFF; - vertex_element -> Type = D3DDECLTYPE_UNUSED; - - add = TRUE; - } - - return add; -} - //////////////////////////////////////////////////////////////////// // Function: DXShaderContext9::Constructor // Access: Public diff --git a/panda/src/dxgsg9/dxShaderContext9.h b/panda/src/dxgsg9/dxShaderContext9.h index cce7f4289e..56388aa113 100644 --- a/panda/src/dxgsg9/dxShaderContext9.h +++ b/panda/src/dxgsg9/dxShaderContext9.h @@ -20,7 +20,6 @@ #define DXSHADERCONTEXT9_H #include "dtool_config.h" -#include "dxGraphicsStateGuardian9.h" #include "pandabase.h" #ifdef HAVE_CGDX9 #include "Cg/cg.h" diff --git a/panda/src/dxgsg9/dxgsg9_composite1.cxx b/panda/src/dxgsg9/dxgsg9_composite1.cxx index 14d40da47f..a709a710d6 100755 --- a/panda/src/dxgsg9/dxgsg9_composite1.cxx +++ b/panda/src/dxgsg9/dxgsg9_composite1.cxx @@ -9,4 +9,4 @@ #include "wdxGraphicsWindow9.cxx" #include "dxGraphicsDevice9.cxx" #include "wdxGraphicsBuffer9.cxx" - +#include "vertexElementArray.cxx" diff --git a/panda/src/dxgsg9/vertexElementArray.cxx b/panda/src/dxgsg9/vertexElementArray.cxx new file mode 100644 index 0000000000..5f1c1719c5 --- /dev/null +++ b/panda/src/dxgsg9/vertexElementArray.cxx @@ -0,0 +1,381 @@ +// Filename: vertexElementArray.cxx +// Created by: aignacio (Jan06) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) 2001 - 2006, Disney Enterprises, Inc. All rights reserved +// +// All use of this software is subject to the terms of the Panda 3d +// Software license. You should have received a copy of this license +// along with this source code; you will also find a current copy of +// the license at http://etc.cmu.edu/panda3d/docs/license/ . +// +// To contact the maintainers of this program write to +// panda3d-general@lists.sourceforge.net . +// +//////////////////////////////////////////////////////////////////// + + +#include "dxGraphicsStateGuardian9.h" +#include "vertexElementArray.h" + + +VertexElementArray::VertexElementArray (int maximum_vertex_elements) +{ + this -> offset = 0; + this -> total_elements = 0; + this -> maximum_vertex_elements = maximum_vertex_elements; + this -> vertex_element_array = new DIRECT_3D_VERTEX_ELEMENT [maximum_vertex_elements]; + this -> vertex_element_type_array = new VERTEX_ELEMENT_TYPE [maximum_vertex_elements]; + + memset (this -> vertex_element_type_counter_array, 0, VS_TOTAL_TYPES * sizeof (int)); +} + +VertexElementArray::~VertexElementArray ( ) +{ + delete this -> vertex_element_array; + delete this -> vertex_element_type_array; +} + +int VertexElementArray::set_vertex_element_offset (int vertex_element_index, int offset) +{ + int state; + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + + if (vertex_element_index >= 0 && vertex_element_index < this -> total_elements) + { + vertex_element = &this -> vertex_element_array [vertex_element_index]; + vertex_element -> Offset = offset; + state = true; + } + + return state; +} + +void VertexElementArray::add_position_xyz_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_POSITION_XYZ; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_FLOAT3; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_POSITION; + vertex_element -> UsageIndex = 0; + + this -> offset += 12; + this -> total_elements++; + } +} + +void VertexElementArray::add_position_xyzw_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_POSITION_XYZW; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_FLOAT4; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_POSITION; + vertex_element -> UsageIndex = 0; + + this -> offset += 16; + this -> total_elements++; + } +} + +void VertexElementArray::add_normal_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_NORMAL; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_FLOAT3; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_NORMAL; + vertex_element -> UsageIndex = 0; + + this -> offset += 12; + this -> total_elements++; + } +} + +void VertexElementArray::add_binormal_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_BINORMAL; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_FLOAT3; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_BINORMAL; + vertex_element -> UsageIndex = 0; + + this -> offset += 12; + this -> total_elements++; + } +} + +void VertexElementArray::add_tangent_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_TANGENT; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_FLOAT3; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_TANGENT; + vertex_element -> UsageIndex = 0; + + this -> offset += 12; + this -> total_elements++; + } +} + +void VertexElementArray::add_diffuse_color_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_DIFFUSE; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_D3DCOLOR; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_COLOR; + vertex_element -> UsageIndex = 0; + + this -> offset += 4; + this -> total_elements++; + } +} + +void VertexElementArray::add_specular_color_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_SPECULAR; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_D3DCOLOR; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_COLOR; + vertex_element -> UsageIndex = 1; + + this -> offset += 4; + this -> total_elements++; + } +} + +void VertexElementArray::add_u_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_TEXTURE_U; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_FLOAT1; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; + vertex_element -> UsageIndex = 0; + + this -> offset += 4; + this -> total_elements++; + } +} + +void VertexElementArray::add_uv_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_TEXTURE_UV; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_FLOAT2; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; + vertex_element -> UsageIndex = 0; + + this -> offset += 8; + this -> total_elements++; + } +} + +void VertexElementArray::add_uvw_vertex_element (int stream_index) +{ + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_TEXTURE_UVW; + vertex_element_type -> index = vertex_element_type_counter_array [vertex_element_type -> id]; + vertex_element_type_counter_array [vertex_element_type -> id]++; + + vertex_element -> Stream = stream_index; + vertex_element -> Offset = this -> offset; + vertex_element -> Type = D3DDECLTYPE_FLOAT3; + vertex_element -> Method = D3DDECLMETHOD_DEFAULT; + + vertex_element -> Usage = D3DDECLUSAGE_TEXCOORD; + vertex_element -> UsageIndex = 0; + + this -> offset += 12; + this -> total_elements++; + } +} + +int VertexElementArray::add_end_vertex_element (void) +{ + int add; + DIRECT_3D_VERTEX_ELEMENT *vertex_element; + VERTEX_ELEMENT_TYPE *vertex_element_type; + + add = FALSE; + if (this -> total_elements < this -> maximum_vertex_elements) + { + vertex_element = &this -> vertex_element_array [this -> total_elements]; + memset (vertex_element, 0, sizeof (DIRECT_3D_VERTEX_ELEMENT)); + + vertex_element_type = &this -> vertex_element_type_array [this -> total_elements]; + memset (vertex_element_type, 0, sizeof (VERTEX_ELEMENT_TYPE)); + + vertex_element_type -> id = VS_END; + + vertex_element -> Stream = 0xFF; + vertex_element -> Type = D3DDECLTYPE_UNUSED; + + add = TRUE; + } + + return add; +} + diff --git a/panda/src/dxgsg9/vertexElementArray.h b/panda/src/dxgsg9/vertexElementArray.h new file mode 100644 index 0000000000..cc0a03140d --- /dev/null +++ b/panda/src/dxgsg9/vertexElementArray.h @@ -0,0 +1,96 @@ +// Filename: vertexElementArray.h +// Created by: aignacio (Jan06) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) 2001 - 2006, Disney Enterprises, Inc. All rights reserved +// +// All use of this software is subject to the terms of the Panda 3d +// Software license. You should have received a copy of this license +// along with this source code; you will also find a current copy of +// the license at http://etc.cmu.edu/panda3d/docs/license/ . +// +// To contact the maintainers of this program write to +// panda3d-general@lists.sourceforge.net . +// +//////////////////////////////////////////////////////////////////// + +#ifndef VERTEX_ELEMENT_ARRAY_H +#define VERTEX_ELEMENT_ARRAY_H + + +enum +{ + VS_END = 0, + + VS_POSITION_XYZ, + VS_POSITION_XYZW, + VS_NORMAL, + VS_DIFFUSE, + VS_SPECULAR, + VS_TEXTURE_U, + VS_TEXTURE_UV, + VS_TEXTURE_UVW, + VS_TANGENT, + VS_BINORMAL, + + VS_ERROR, + + VS_TOTAL_TYPES +}; + +typedef struct +{ + int id; // this is VS_XXXXX + int index; + int stream; + int offset; +} +VERTEX_ELEMENT_TYPE; + +//////////////////////////////////////////////////////////////////// +// Class : VertexElementArray +// Description : This class gives the ability for a user-friendly way +// of creating a vertex declaration for DirectX 9. +// Since a vertex shader has a fixed input, the vertex +// element array can be cached so that a new vertex +// declaration for different vertex buffers can be +// quickly created. Be sure to call +// add_end_vertex_element ( ) when finished creating a +// vertex element array. +// VERTEX_ELEMENT_TYPE is used for a simplified mapping +// of vertex buffer data to vertex shader inputs. +// This class is used with DXShaderContext9 and in +// conjunction with DXVertexBufferContext9. +//////////////////////////////////////////////////////////////////// +class VertexElementArray +{ +public: + + VertexElementArray (int maximum_vertex_elements); + ~VertexElementArray ( ); + + int set_vertex_element_offset (int vertex_element_index, int offset); + + void add_position_xyz_vertex_element (int stream_index); + void add_position_xyzw_vertex_element (int stream_index); + void add_normal_vertex_element (int stream_index); + void add_binormal_vertex_element (int stream_index); + void add_tangent_vertex_element (int stream_index); + void add_diffuse_color_vertex_element (int stream_index); + void add_specular_color_vertex_element (int stream_index); + void add_u_vertex_element (int stream_index); + void add_uv_vertex_element (int stream_index); + void add_uvw_vertex_element (int stream_index); + int add_end_vertex_element (void); + + int offset; + int total_elements; + int maximum_vertex_elements; + int vertex_element_type_counter_array [VS_TOTAL_TYPES]; + DIRECT_3D_VERTEX_ELEMENT *vertex_element_array; + VERTEX_ELEMENT_TYPE *vertex_element_type_array; +}; + +#endif