void DxSprite::BuildSpriteQuad(const Sprite & sprite, SpriteVertex v[4])
{
    const CD3D11_RECT & dest = sprite.DestRect;
    const CD3D11_RECT & src  = sprite.SrcRect;

    v[0].Pos = PointToNdc( dest.left,  dest.bottom, sprite.Z );
    v[1].Pos = PointToNdc( dest.left,  dest.top,    sprite.Z );
    v[2].Pos = PointToNdc( dest.right, dest.top,    sprite.Z );
    v[3].Pos = PointToNdc( dest.right, dest.bottom, sprite.Z );

    v[0].Tex = XMFLOAT2( (float)src.left  / TexWidth, (float)src.bottom / TexHeight ); 
    v[1].Tex = XMFLOAT2( (float)src.left  / TexWidth, (float)src.top    / TexHeight ); 
    v[2].Tex = XMFLOAT2( (float)src.right / TexWidth, (float)src.top    / TexHeight ); 
    v[3].Tex = XMFLOAT2( (float)src.right / TexWidth, (float)src.bottom / TexHeight ); 

    v[0].Color = sprite.Color;
    v[1].Color = sprite.Color;
    v[2].Color = sprite.Color;
    v[3].Color = sprite.Color;

    float tx = 0.5f * ( v[0].Pos.x + v[3].Pos.x );
    float ty = 0.5f * ( v[0].Pos.y + v[1].Pos.y );

    XMVECTOR scaling     = XMVectorSet( sprite.Scale, sprite.Scale, 1.0f, 0.0f );
    XMVECTOR origin      = XMVectorSet( tx, ty, 0.0f, 0.0f );
    XMVECTOR translation = XMVectorSet( 0.0f, 0.0f, 0.0f, 0.0f );
    XMMATRIX T           = XMMatrixAffineTransformation2D( scaling, origin, sprite.Angle, translation );

    for( int i = 0; i < 4; ++i )
    {
        XMVECTOR p = XMLoadFloat3( &v[i].Pos );
        p = XMVector3TransformCoord(p, T );
        XMStoreFloat3( &v[i].Pos, p );
    }
}
示例#2
0
void DX11SpriteBatch::BuildSpriteQuad(const Sprite& sprite, MeshData::SpriteVertex v[4])
{
	const CD3D11_RECT& dest = sprite.DestRect;
	const CD3D11_RECT& src  = sprite.SrcRect;

	// Dest rect defines target in screen space.
	v[0].pos = PointToNdc(dest.left,  dest.bottom, sprite.Z);
	v[1].pos = PointToNdc(dest.left,  dest.top,    sprite.Z);
	v[2].pos = PointToNdc(dest.right, dest.top,    sprite.Z);
	v[3].pos = PointToNdc(dest.right, dest.bottom, sprite.Z);

	// Source rect defines subset of texture to use from sprite sheet.
	v[0].tex = Vector2((float)src.left  / mTexWidth, (float)src.bottom / mTexHeight); 
	v[1].tex = Vector2((float)src.left  / mTexWidth, (float)src.top    / mTexHeight); 
	v[2].tex = Vector2((float)src.right / mTexWidth, (float)src.top    / mTexHeight); 
	v[3].tex = Vector2((float)src.right / mTexWidth, (float)src.bottom / mTexHeight); 

	v[0].color = (u32)sprite.Color;
	v[1].color = (u32)sprite.Color;
	v[2].color = (u32)sprite.Color;
	v[3].color = (u32)sprite.Color;

	// Quad center point.
	float tx = 0.5f*(v[0].pos.x + v[3].pos.x);
	float ty = 0.5f*(v[0].pos.y + v[1].pos.y);

	XMVECTOR scaling     = XMVectorSet(sprite.Scale, sprite.Scale, 1.0f, 0.0f);
	XMVECTOR origin      = XMVectorSet(tx, ty, 0.0f, 0.0f);
	XMVECTOR translation = XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f);
	XMMATRIX T           = XMMatrixAffineTransformation2D(scaling, origin, sprite.Angle, translation);

	// Rotate and scale the quad in NDC space.
	for(int i = 0; i < 4; ++i)
	{
		XMFLOAT3 vec = v[i].pos;
		XMVECTOR p = XMLoadFloat3(&vec);
		p = XMVector3TransformCoord(p, T);
		XMStoreFloat3(&vec, p);
		v[i].pos.Set(vec.x, vec.y, vec.z);
	}
}
示例#3
0
文件: font.cpp 项目: Volkanite/Push
VOID
Font::BuildSpriteQuad( Sprite *sprite, SpriteVertex v[ 4 ] )
{
    FLOAT vertLeft = 2.0f * (float) sprite->DestRect.left / ScreenWidth - 1.0f;
    FLOAT vertRight = 2.0f * (float) sprite->DestRect.right / ScreenWidth - 1.0f;
    FLOAT vertTop = 1.0f - 2.0f * (float) sprite->DestRect.top / ScreenHeight;
    FLOAT vertBottom = 1.0f - 2.0f * (float) sprite->DestRect.bottom / ScreenHeight;
    float tx, ty;
    int i;
    XMVECTOR scaling, origin, translation;
    XMMATRIX T;

    v[ 0 ].x        = vertLeft;
    v[ 0 ].y        = vertBottom;
    v[ 0 ].z        = sprite->Z;
    v[ 0 ].Tex.x    = (float)sprite->SrcRect.left  / m_dwTexWidth;
    v[ 0 ].Tex.y    = (float)sprite->SrcRect.bottom / m_dwTexHeight;
    v[ 0 ].Color    = sprite->Color;

    v[ 1 ].x        = vertLeft;
    v[ 1 ].y        = vertTop;
    v[ 1 ].z        = sprite->Z;
    v[ 1 ].Tex.x    = (float)sprite->SrcRect.left  / m_dwTexWidth;
    v[ 1 ].Tex.y    = (float)sprite->SrcRect.top    / m_dwTexHeight;
    v[ 1 ].Color    = sprite->Color;

    v[ 2 ].x        = vertRight;
    v[ 2 ].y        = vertTop;
    v[ 2 ].z        = sprite->Z;
    v[ 2 ].Tex.x    = (float)sprite->SrcRect.right / m_dwTexWidth;
    v[ 2 ].Tex.y    = (float)sprite->SrcRect.top    / m_dwTexHeight;
    v[ 2 ].Color    = sprite->Color;

    v[ 3 ].x        = vertRight;
    v[ 3 ].y        = vertBottom;
    v[ 3 ].z        = sprite->Z;
    v[ 3 ].Tex.x    = (float)sprite->SrcRect.right / m_dwTexWidth;
    v[ 3 ].Tex.y    = (float)sprite->SrcRect.bottom / m_dwTexHeight;
    v[ 3 ].Color    = sprite->Color;

    tx = 0.5f * ( v[ 0 ].x + v[ 3 ].x );
    ty = 0.5f * ( v[ 0 ].y + v[ 1 ].y );

    scaling        = XMVectorSet( sprite->Scale, sprite->Scale, 1.0f, 0.0f );
    origin            = XMVectorSet( tx, ty, 0.0f, 0.0f );
    translation    = XMVectorSet( 0.0f, 0.0f, 0.0f, 0.0f );
    T = XMMatrixAffineTransformation2D( scaling, origin, sprite->Angle, translation );

    for( i = 0; i < 4; ++i )
    {
        XMFLOAT3 xmfloat;
        XMVECTOR p;

        xmfloat.x = v[ i ].x;
        xmfloat.y = v[ i ].y;
        xmfloat.z = v[ i ].z;

        p = XMLoadFloat3( &xmfloat );
        p = XMVector3TransformCoord( p, &T );
        XMStoreFloat3( &xmfloat, p );
        v[ i ].x = xmfloat.x;
        v[ i ].y = xmfloat.y;
        v[ i ].z = xmfloat.z;
    }
}