mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
More work in progress 2.
This commit is contained in:
parent
3e8cd1e273
commit
8851a4edde
@ -20,6 +20,240 @@
|
|||||||
|
|
||||||
TypeHandle CLP(ShaderContext)::_type_handle;
|
TypeHandle CLP(ShaderContext)::_type_handle;
|
||||||
|
|
||||||
|
class VertexElementArray
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
VertexElementArray (int maximum_vertex_elements);
|
||||||
|
~VertexElementArray ( );
|
||||||
|
|
||||||
|
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_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;
|
||||||
|
DIRECT_3D_VERTEX_ELEMENT *vertex_element_array;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
|
||||||
|
VertexElementArray::~VertexElementArray ( )
|
||||||
|
{
|
||||||
|
delete this -> vertex_element_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VertexElementArray::add_position_xyz_vertex_element (int stream_index)
|
||||||
|
{
|
||||||
|
DIRECT_3D_VERTEX_ELEMENT *vertex_element;
|
||||||
|
|
||||||
|
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 -> 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;
|
||||||
|
|
||||||
|
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 -> 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;
|
||||||
|
|
||||||
|
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 -> 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_diffuse_color_vertex_element (int stream_index)
|
||||||
|
{
|
||||||
|
DIRECT_3D_VERTEX_ELEMENT *vertex_element;
|
||||||
|
|
||||||
|
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 -> 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;
|
||||||
|
|
||||||
|
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 -> 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;
|
||||||
|
|
||||||
|
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 -> 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;
|
||||||
|
|
||||||
|
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 -> 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;
|
||||||
|
|
||||||
|
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 -> 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;
|
||||||
|
|
||||||
|
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 -> Stream = 0xFF;
|
||||||
|
vertex_element -> Type = D3DDECLTYPE_UNUSED;
|
||||||
|
|
||||||
|
add = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return add;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DXShaderContext9::Constructor
|
// Function: DXShaderContext9::Constructor
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -41,6 +275,9 @@ CLP(ShaderContext)(ShaderExpansion *s, GSG *gsg) : ShaderContext(s) {
|
|||||||
_cg_program[SHADER_type_vert] = (CGprogram)0;
|
_cg_program[SHADER_type_vert] = (CGprogram)0;
|
||||||
_cg_program[SHADER_type_frag] = (CGprogram)0;
|
_cg_program[SHADER_type_frag] = (CGprogram)0;
|
||||||
|
|
||||||
|
_vertex_size = 0;
|
||||||
|
_direct_3d_vertex_declaration = 0;
|
||||||
|
|
||||||
if (header == "//Cg") {
|
if (header == "//Cg") {
|
||||||
|
|
||||||
// CGcontext is created once during Reset ( )
|
// CGcontext is created once during Reset ( )
|
||||||
@ -83,7 +320,7 @@ if (false)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this -> _name = s->get_name ( );
|
this -> _name = s->get_name ( );
|
||||||
|
|
||||||
// Compile the program.
|
// Compile the program.
|
||||||
try_cg_compile(s, gsg);
|
try_cg_compile(s, gsg);
|
||||||
@ -309,6 +546,11 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
|
|||||||
CLP(ShaderContext)::
|
CLP(ShaderContext)::
|
||||||
~CLP(ShaderContext)() {
|
~CLP(ShaderContext)() {
|
||||||
release_resources();
|
release_resources();
|
||||||
|
|
||||||
|
if (_direct_3d_vertex_declaration) {
|
||||||
|
_direct_3d_vertex_declaration -> Release ( );
|
||||||
|
_direct_3d_vertex_declaration = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -841,8 +1083,7 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
|
|||||||
#ifdef HAVE_CGDX9
|
#ifdef HAVE_CGDX9
|
||||||
if (gsg -> _cg_context) {
|
if (gsg -> _cg_context) {
|
||||||
|
|
||||||
// RETURN
|
HRESULT hr;
|
||||||
//return;
|
|
||||||
|
|
||||||
/* ?????
|
/* ?????
|
||||||
#ifdef SUPPORT_IMMEDIATE_MODE
|
#ifdef SUPPORT_IMMEDIATE_MODE
|
||||||
@ -852,7 +1093,10 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
|
|||||||
#endif // SUPPORT_IMMEDIATE_MODE
|
#endif // SUPPORT_IMMEDIATE_MODE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{
|
if (_direct_3d_vertex_declaration == 0) {
|
||||||
|
|
||||||
|
VertexElementArray *vertex_element_array;
|
||||||
|
|
||||||
const GeomVertexArrayData *array_data;
|
const GeomVertexArrayData *array_data;
|
||||||
Geom::NumericType numeric_type;
|
Geom::NumericType numeric_type;
|
||||||
int start, stride, num_values;
|
int start, stride, num_values;
|
||||||
@ -860,6 +1104,8 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
|
|||||||
|
|
||||||
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays: nvarying " << nvarying << "\n"; DBG_E
|
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays: nvarying " << nvarying << "\n"; DBG_E
|
||||||
|
|
||||||
|
vertex_element_array = 0;
|
||||||
|
|
||||||
for (int i=0; i<nvarying; i++) {
|
for (int i=0; i<nvarying; i++) {
|
||||||
InternalName *name = _cg_varying[i].name;
|
InternalName *name = _cg_varying[i].name;
|
||||||
int texslot = _cg_varying[i].append_uv;
|
int texslot = _cg_varying[i].append_uv;
|
||||||
@ -879,7 +1125,6 @@ DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays: nvarying
|
|||||||
if (gsg->_vertex_data->get_array_info(name, array_data, num_values,
|
if (gsg->_vertex_data->get_array_info(name, array_data, num_values,
|
||||||
numeric_type, start, stride)) {
|
numeric_type, start, stride)) {
|
||||||
|
|
||||||
|
|
||||||
// ?????
|
// ?????
|
||||||
/*
|
/*
|
||||||
const unsigned char *client_pointer = gsg->setup_array_data(array_data);
|
const unsigned char *client_pointer = gsg->setup_array_data(array_data);
|
||||||
@ -888,17 +1133,7 @@ DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays: nvarying
|
|||||||
stride, client_pointer + start);
|
stride, client_pointer + start);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Set DirectX Vertex Declaration
|
|
||||||
/*
|
|
||||||
HRESULT hr;
|
|
||||||
IDirect3DVertexDeclaration9 *vertex_declaration;
|
|
||||||
|
|
||||||
|
|
||||||
vertex_declaration = 0;
|
|
||||||
*/
|
|
||||||
|
|
||||||
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays " << i << "\n"; DBG_E
|
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays " << i << "\n"; DBG_E
|
||||||
|
|
||||||
DBG_SH1 dxgsg9_cat.debug ( )
|
DBG_SH1 dxgsg9_cat.debug ( )
|
||||||
<< "\n name " << name -> get_name ( )
|
<< "\n name " << name -> get_name ( )
|
||||||
<< " num_values " << num_values
|
<< " num_values " << num_values
|
||||||
@ -907,24 +1142,44 @@ vertex_declaration = 0;
|
|||||||
<< " stride " << stride
|
<< " stride " << stride
|
||||||
<< "\n"; DBG_E
|
<< "\n"; DBG_E
|
||||||
|
|
||||||
/*
|
} else {
|
||||||
hr = gsg -> _d3d_device -> SetVertexDeclaration (vertex_declaration);
|
|
||||||
if (FAILED (hr)) {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vertex_element_array) {
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
hr = gsg -> _d3d_device ->CreateVertexDeclaration (vertex_element_array -> vertex_element_array, &_direct_3d_vertex_declaration);
|
||||||
|
if (FAILED (hr))
|
||||||
|
{
|
||||||
dxgsg9_cat.error()
|
dxgsg9_cat.error()
|
||||||
<< "SetVertexDeclaration failed "
|
<< "CreateVertexDeclaration failed"
|
||||||
<< D3DERRORSTRING(hr);
|
<< D3DERRORSTRING(hr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_vertex_size = vertex_element_array -> offset;
|
||||||
|
|
||||||
|
delete vertex_element_array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hr = gsg -> _d3d_device -> SetVertexDeclaration (_direct_3d_vertex_declaration);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
dxgsg9_cat.error()
|
||||||
|
<< "SetVertexDeclaration failed" << D3DERRORSTRING(hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
UINT stream_number;
|
UINT stream_number;
|
||||||
IDirect3DVertexBuffer9 *vertex_buffer;
|
IDirect3DVertexBuffer9 *vertex_buffer;
|
||||||
UINT offset;
|
UINT offset;
|
||||||
UINT stride;
|
UINT stride;
|
||||||
|
|
||||||
stream_number = 0;
|
stream_number = 0;
|
||||||
vertex_buffer = 0;
|
vertex_buffer = 0;
|
||||||
offset = 0;
|
offset = 0;
|
||||||
stride = 0;
|
stride = 0;
|
||||||
|
|
||||||
hr = gsg -> _d3d_device -> SetStreamSource (stream_number, vertex_buffer, offset, stride);
|
hr = gsg -> _d3d_device -> SetStreamSource (stream_number, vertex_buffer, offset, stride);
|
||||||
if (FAILED (hr)) {
|
if (FAILED (hr)) {
|
||||||
@ -934,11 +1189,6 @@ stride = 0;
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// ????? cgD3D9EnableClientState(_cg_varying[i].parameter);
|
|
||||||
} else {
|
|
||||||
// ????? cgD3D9DisableClientState(_cg_varying[i].parameter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // HAVE_CGDX9
|
#endif // HAVE_CGDX9
|
||||||
|
@ -23,9 +23,9 @@
|
|||||||
#include "dxGraphicsStateGuardian9.h"
|
#include "dxGraphicsStateGuardian9.h"
|
||||||
#include "pandabase.h"
|
#include "pandabase.h"
|
||||||
#ifdef HAVE_CGDX9
|
#ifdef HAVE_CGDX9
|
||||||
|
#include "Cg/cg.h"
|
||||||
#include "Cg/cgGL.h"
|
#include "Cg/cgGL.h"
|
||||||
#include "Cg/CgGL.h"
|
#include "Cg/cgD3D9.h"
|
||||||
#include "Cg/CgD3D9.h"
|
|
||||||
#endif
|
#endif
|
||||||
#include "string_utils.h"
|
#include "string_utils.h"
|
||||||
#include "internalName.h"
|
#include "internalName.h"
|
||||||
@ -35,8 +35,6 @@
|
|||||||
|
|
||||||
#define CLP(name) DX##name##9
|
#define CLP(name) DX##name##9
|
||||||
#define CLASSPREFIX_QUOTED "DX"
|
#define CLASSPREFIX_QUOTED "DX"
|
||||||
#define CONFIGOBJ config_dxgsg9
|
|
||||||
#define GLCAT dxgsg9_cat
|
|
||||||
|
|
||||||
|
|
||||||
class CLP(GraphicsStateGuardian);
|
class CLP(GraphicsStateGuardian);
|
||||||
@ -64,6 +62,9 @@ public:
|
|||||||
void disable_shader_texture_bindings(GSG *gsg);
|
void disable_shader_texture_bindings(GSG *gsg);
|
||||||
void update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg);
|
void update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg);
|
||||||
|
|
||||||
|
int _vertex_size;
|
||||||
|
DIRECT_3D_VERTEX_DECLARATION _direct_3d_vertex_declaration;
|
||||||
|
|
||||||
// FOR DEBUGGING
|
// FOR DEBUGGING
|
||||||
string _name;
|
string _name;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user