///Sets the tex attrib void setTexAttrib(GLint newAttrib) { bool oldState = isTexEnabled; setTexState(false); texAttrib = newAttrib; setTexState(oldState); bind(); vbos[3]->bind(GL_ARRAY_BUFFER); vao.setAttrib(texAttrib, 2, GL_FLOAT, false, 0, 0); unbind(); }
void gxScene::render(gxMesh* m, int first_vert, int vert_cnt, int first_tri, int tri_cnt) { m->render(first_vert, vert_cnt, first_tri, tri_cnt); tris_drawn += tri_cnt; if (n_texs <= tex_stages) return; setTSS(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); setTSS(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); if (tex_stages > 1) { setTSS(1, D3DTSS_COLOROP, D3DTOP_DISABLE); setTSS(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); } setRS(D3DRENDERSTATE_LIGHTING, false); setRS(D3DRENDERSTATE_ALPHABLENDENABLE, true); for (int k = tex_stages; k < n_texs; ++k) { const TexState& state = texstate[k]; switch (state.blend) { case BLEND_ALPHA: setRS(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA); setRS(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA); break; case BLEND_MULTIPLY: case BLEND_DOT3: setRS(D3DRENDERSTATE_SRCBLEND, D3DBLEND_DESTCOLOR); setRS(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO); break; case BLEND_ADD: setRS(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); setRS(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); break; } setTexState(0, state, false); m->render(first_vert, vert_cnt, first_tri, tri_cnt); tris_drawn += tri_cnt; } setRS(D3DRENDERSTATE_ALPHABLENDENABLE, false); setRS(D3DRENDERSTATE_LIGHTING, true); if (tex_stages > 1) setTexState(1, texstate[1], true); setTexState(0, texstate[0], true); }
void gxScene::setRenderState( const RenderState &rs ){ bool setmat=false; if( memcmp( rs.color,&material.diffuse.r,12 ) ){ memcpy( &material.diffuse.r,rs.color,12 ); memcpy( &material.ambient.r,rs.color,12 ); setmat=true; } if( rs.alpha!=material.diffuse.a ){ material.diffuse.a=rs.alpha; if( rs.fx&FX_ALPHATEST ){ int alpharef=(rs.fx&FX_VERTEXALPHA)?0:128*rs.alpha; setRS( D3DRENDERSTATE_ALPHAREF,alpharef ); } setmat=true; } if( rs.shininess!=shininess ){ shininess=rs.shininess; float t=shininess>0 ? (shininess<1 ? shininess : 1) : 0; material.specular.r=material.specular.g=material.specular.b=t; material.power=shininess*128; setRS( D3DRENDERSTATE_SPECULARENABLE,shininess>0 ? true : false ); setmat=true; } if( rs.blend!=blend ){ blend=rs.blend; switch( blend ){ case BLEND_REPLACE: setRS( D3DRENDERSTATE_ALPHABLENDENABLE,false ); break; case BLEND_ALPHA: setRS( D3DRENDERSTATE_ALPHABLENDENABLE,true ); setRS( D3DRENDERSTATE_SRCBLEND,D3DBLEND_SRCALPHA ); setRS( D3DRENDERSTATE_DESTBLEND,D3DBLEND_INVSRCALPHA ); break; case BLEND_MULTIPLY: setRS( D3DRENDERSTATE_ALPHABLENDENABLE,true ); setRS( D3DRENDERSTATE_SRCBLEND,D3DBLEND_DESTCOLOR ); setRS( D3DRENDERSTATE_DESTBLEND,D3DBLEND_ZERO ); break; case BLEND_ADD: setRS( D3DRENDERSTATE_ALPHABLENDENABLE,true ); setRS( D3DRENDERSTATE_SRCBLEND,D3DBLEND_SRCALPHA ); setRS( D3DRENDERSTATE_DESTBLEND,D3DBLEND_ONE ); break; } } if( rs.fx!=fx ){ int t=rs.fx^fx;fx=rs.fx; if( t & (FX_FULLBRIGHT|FX_CONDLIGHT) ){ setLights(); setAmbient(); } if( t&FX_VERTEXCOLOR ){ setRS( D3DRENDERSTATE_COLORVERTEX,fx & FX_VERTEXCOLOR ? true : false ); } if( t&FX_FLATSHADED ){ setRS( D3DRENDERSTATE_SHADEMODE,fx & FX_FLATSHADED ? D3DSHADE_FLAT : D3DSHADE_GOURAUD ); } if( t&FX_NOFOG ){ setFogMode(); } if( t&FX_DOUBLESIDED ){ setTriCull(); } if( t&FX_EMISSIVE ){ //Q3 Hack! int n=fx & FX_EMISSIVE; setRS( D3DRENDERSTATE_DIFFUSEMATERIALSOURCE,n ? D3DMCS_MATERIAL : D3DMCS_COLOR1 ); setRS( D3DRENDERSTATE_AMBIENTMATERIALSOURCE,n ? D3DMCS_MATERIAL : D3DMCS_COLOR1 ); setRS( D3DRENDERSTATE_EMISSIVEMATERIALSOURCE,n ? D3DMCS_COLOR1 : D3DMCS_MATERIAL ); setRS( D3DRENDERSTATE_COLORVERTEX,n ? true : false ); } if( t&FX_ALPHATEST ){ if( fx&FX_ALPHATEST ){ int alpharef=(rs.fx&FX_VERTEXALPHA)?0:128*rs.alpha; setRS( D3DRENDERSTATE_ALPHAREF,alpharef ); } setRS( D3DRENDERSTATE_ALPHATESTENABLE,fx & FX_ALPHATEST ? true : false ); } } if( setmat ){ dir3dDev->SetMaterial( &material ); } n_texs=0; TexState *hw=texstate; for( int k=0;k<MAX_TEXTURES;++k ){ const RenderState::TexState &ts=rs.tex_states[k]; if( !ts.canvas || !ts.blend ) continue; bool settex=false; ts.canvas->getTexSurface(); //force mipmap rebuild if( ts.canvas!=hw->canvas ){ hw->canvas=ts.canvas;settex=true; } if( ts.blend!=hw->blend ){ hw->blend=ts.blend;settex=true; } if( ts.flags!=hw->flags ){ hw->flags=ts.flags;settex=true; } if( ts.matrix || hw->mat_valid ){ if( ts.matrix ){ memcpy( &hw->matrix._11,ts.matrix->elements[0],12 ); memcpy( &hw->matrix._21,ts.matrix->elements[1],12 ); memcpy( &hw->matrix._31,ts.matrix->elements[2],12 ); memcpy( &hw->matrix._41,ts.matrix->elements[3],12 ); hw->mat_valid=true; }else{ hw->mat_valid=false; } settex=true; } if( settex && n_texs<tex_stages ){ setTexState( n_texs,*hw,true ); } ++hw;++n_texs; } if( n_texs<tex_stages && hw->canvas ){ hw->canvas=0; setTSS( n_texs,D3DTSS_COLOROP,D3DTOP_DISABLE ); setTSS( n_texs,D3DTSS_ALPHAOP,D3DTOP_DISABLE ); dir3dDev->SetTexture( n_texs,0 ); } }