diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.cxx b/panda/src/dxgsg/dxGraphicsStateGuardian.cxx index b05cbe9010..8545637073 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.cxx +++ b/panda/src/dxgsg/dxGraphicsStateGuardian.cxx @@ -509,6 +509,8 @@ dx_init( LPDIRECTDRAW7 context, //Color and alpha transform variables _color_transform_enabled = false; _alpha_transform_enabled = false; + _color_transform_required = _color_transform_enabled || _alpha_transform_enabled; + _current_color_mat = LMatrix4f::ident_mat(); _current_alpha_offset = 0; _current_alpha_scale = 1; @@ -520,7 +522,6 @@ dx_init( LPDIRECTDRAW7 context, _line_smooth_enabled = false; _d3dDevice->SetRenderState(D3DRENDERSTATE_EDGEANTIALIAS, false); - _color_material_enabled = false; _normals_enabled = false; @@ -1796,16 +1797,15 @@ draw_prim_setup(const Geom *geom) { assert(geom->get_binding(G_COORD) != G_OFF); #endif -#define GET_NEXT_VERTEX() { p_vertex = geom->get_next_vertex(vi); } +#define GET_NEXT_VERTEX(NEXTVERT) { NEXTVERT = geom->get_next_vertex(vi); } #define GET_NEXT_NORMAL() { p_normal = geom->get_next_normal(ni); } #define GET_NEXT_TEXCOORD() { p_texcoord = geom->get_next_texcoord(ti); } #define GET_NEXT_COLOR() { \ - if(_color_transform_enabled || _alpha_transform_enabled) { \ - Colorf tempcolor = geom->get_next_color(ci); \ - transform_color(tempcolor,_curD3Dcolor); \ + Colorf tempcolor = geom->get_next_color(ci); \ + if(!_color_transform_required) { \ + _curD3Dcolor = Colorf_to_D3DCOLOR(tempcolor); \ } else { \ - p_color = geom->get_next_color(ci); \ - _curD3Dcolor = Colorf_to_D3DCOLOR(p_color); \ + transform_color(tempcolor,_curD3Dcolor); \ }} //////// @@ -1904,11 +1904,15 @@ wants_colors() const { //////////////////////////////////////////////////////////////////// void DXGraphicsStateGuardian:: draw_prim_inner_loop(int nVerts, const Geom *geom, DWORD perFlags) { + + Vertexf NextVert; perFlags &= ~PER_COORD; // should always be set anyway for(;nVerts > 0;nVerts--) { - GET_NEXT_VERTEX(); // coord info will always be _perVertex + // coord info will always be _perVertex + GET_NEXT_VERTEX(NextVert); // need to optimize these + add_to_FVFBuf((void *)&NextVert, sizeof(D3DVECTOR)); if(perFlags==0xC) { // break out the common case first @@ -1934,8 +1938,6 @@ draw_prim_inner_loop(int nVerts, const Geom *geom, DWORD perFlags) { } } - add_to_FVFBuf((void *)&p_vertex, sizeof(D3DVECTOR)); - if (_curFVFflags & D3DFVF_NORMAL) add_to_FVFBuf((void *)&p_normal, sizeof(D3DVECTOR)); if (_curFVFflags & D3DFVF_DIFFUSE) @@ -2063,7 +2065,7 @@ draw_point(GeomPoint *geom, GeomContext *gc) { // BUGBUG: eventually this hack every-frame all-colors conversion needs // to be done only once as part of a vertex buffer - if(_color_transform_enabled || _alpha_transform_enabled) { + if(_color_transform_required) { for (int i=0;iget_color(); *pConvertedColorArray = Colorf_to_D3DCOLOR(colr); @@ -3370,7 +3372,7 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) { if (ColorBinding==G_PER_VERTEX) { NeededShadeMode = D3DSHADE_GOURAUD; - if(!(_color_transform_enabled || _alpha_transform_enabled)) { + if(!_color_transform_required) { for (uint i=0;iget_color(); *pConvertedColorArray = Colorf_to_D3DCOLOR(colr); @@ -4856,7 +4858,7 @@ issue_color(const ColorTransition *attrib) { if(bAttribOn && bIsReal) { _issued_color = attrib->get_color(); - if(_color_transform_enabled || _alpha_transform_enabled) { + if(_color_transform_required) { transform_color(_issued_color, _issued_color_D3DCOLOR); } else { _issued_color_D3DCOLOR = Colorf_to_D3DCOLOR(_issued_color); @@ -4887,6 +4889,7 @@ issue_color_transform(const ColorMatrixTransition *attrib) { transform_color(_issued_color, _issued_color_D3DCOLOR); } } + _color_transform_required = _color_transform_enabled || _alpha_transform_enabled; } //////////////////////////////////////////////////////////////////// @@ -4910,6 +4913,7 @@ issue_alpha_transform(const AlphaTransformTransition *attrib) { transform_color(_issued_color, _issued_color_D3DCOLOR); } } + _color_transform_required = _color_transform_enabled || _alpha_transform_enabled; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.h b/panda/src/dxgsg/dxGraphicsStateGuardian.h index 845f73f604..ad68392a88 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.h +++ b/panda/src/dxgsg/dxGraphicsStateGuardian.h @@ -318,9 +318,9 @@ protected: void report_texmgr_stats(); // for drawing primitives - Colorf p_color; - Normalf p_normal; - Vertexf p_vertex; + // Colorf p_color; bypassed by _curD3Dcolor; + // Vertexf p_vertex; + Normalf p_normal; // still used to hold G_OVERALL, G_PER_PRIM values TexCoordf p_texcoord; D3DCOLOR _curD3Dcolor; DWORD _curFVFflags; @@ -414,6 +414,7 @@ protected: // Color/Alpha Matrix Transition stuff INLINE void transform_color(Colorf &InColor,D3DCOLOR &OutColor); + bool _color_transform_required; // _color_transform_enabled || _alpha_transform_enabled bool _color_transform_enabled; bool _alpha_transform_enabled; LMatrix4f _current_color_mat;