コード例 #1
0
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);
	}
}
コード例 #2
0
ファイル: d3d_state.cpp プロジェクト: PJayB/DOOM-3-BFG
//----------------------------------------------------------------------------
// 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;
}