void OpenGLEngine::Draw (int x, int y, glm::vec4 const& color, std::string const& message) { if (message.length () > 0) { int vx, vy, vw, vh; GetViewport (vx, vy, vw, vh); m_ActiveFont->SetStringData (vw, vh, x, y, color, message); Update (m_ActiveFont->GetTextEffect () ->GetTranslate ()); Update (m_ActiveFont->GetTextEffect () ->GetColor ()); Update (m_ActiveFont->GetVertexBuffer ()); std::shared_ptr<BlendState> blendState = GetBlendState (); std::shared_ptr<DepthStencilState> depthState = GetDepthStencilState (); std::shared_ptr<RasterizerState> rasterizerState = GetRasterizerState (); SetDefaultBlendState (); SetDefaultDepthStencilState (); SetDefaultRasterizerState (); Draw (m_ActiveFont->GetVertexBuffer (), m_ActiveFont->GetIndexBuffer (), m_ActiveFont->GetTextEffect ()); SetBlendState (blendState); SetDepthStencilState (depthState); SetRasterizerState (rasterizerState); } }
//---------------------------------------------------------------------------- // Set the state based on the mask //---------------------------------------------------------------------------- void D3DDrv_SetState( uint64 stateBits ) { unsigned long diff = stateBits ^ g_RunState.stateMask; if ( !diff ) { return; } unsigned long newDepthStateMask = 0; if ( stateBits & GLS_DEPTHFUNC_BITS ) { switch ( stateBits & GLS_DEPTHFUNC_BITS ) { case GLS_DEPTHFUNC_EQUAL: newDepthStateMask |= DEPTHFUNC_EQUAL ; break; case GLS_DEPTHFUNC_ALWAYS: newDepthStateMask |= DEPTHFUNC_ALWAYS; break; case GLS_DEPTHFUNC_LESS: newDepthStateMask |= DEPTHFUNC_LEQUAL; break; case GLS_DEPTHFUNC_GREATER: newDepthStateMask |= DEPTHFUNC_GEQUAL; break; } } if ( stateBits & GLS_DEPTHMASK ) { newDepthStateMask |= DEPTHSTATE_FLAG_MASK; } if ( newDepthStateMask != g_RunState.depthStateMask ) { g_pImmediateContext->OMSetDepthStencilState( GetDepthState( newDepthStateMask ), 0 ); g_RunState.depthStateMask = newDepthStateMask; } bool requiresBlendStateRefresh = true; unsigned long colorMask = g_RunState.colorMask; int srcFactor = g_RunState.srcFactor; int dstFactor = g_RunState.dstFactor; if ( diff & (GLS_REDMASK|GLS_GREENMASK|GLS_BLUEMASK|GLS_ALPHAMASK) ) { colorMask = COLORMASK_ALL; if ( stateBits & GLS_REDMASK ) colorMask &= ~COLORMASK_RED; if ( stateBits & GLS_GREENMASK ) colorMask &= ~COLORMASK_GREEN; if ( stateBits & GLS_BLUEMASK ) colorMask &= ~COLORMASK_BLUE; if ( stateBits & GLS_ALPHAMASK ) colorMask &= ~COLORMASK_ALPHA; requiresBlendStateRefresh = true; } if ( diff & ( GLS_SRCBLEND_BITS | GLS_DSTBLEND_BITS ) ) { srcFactor = stateBits & GLS_SRCBLEND_BITS; dstFactor = stateBits & GLS_DSTBLEND_BITS; requiresBlendStateRefresh = true; } if ( requiresBlendStateRefresh ) { float blendFactor[4] = {0, 0, 0, 0}; g_pImmediateContext->OMSetBlendState( GetBlendState( colorMask, srcFactor, dstFactor ), blendFactor, ~0U ); g_RunState.colorMask = colorMask; g_RunState.srcFactor = srcFactor; g_RunState.dstFactor = dstFactor; } // // fill/line mode // if ( diff & GLS_POLYMODE_LINE ) { g_RunState.lineMode = ( stateBits & GLS_POLYMODE_LINE ) != 0; } // // polygon offset // if ( diff & GLS_POLYGON_OFFSET ) { g_RunState.polyOffsetEnabled = ( stateBits & GLS_POLYGON_OFFSET ) != 0; g_RunState.polyOffset[0] = backEnd.glState.polyOfsScale; g_RunState.polyOffset[1] = backEnd.glState.polyOfsBias; } // TODO: stencil g_RunState.stateMask = stateBits; }