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 ); } }
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); } }
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; } }