Exemplo n.º 1
0
PRIVATE void _OBJGetWrldMtx(hOBJ obj, D3DXMATRIX *pMtx)
{
	if(!D3DXMatrixIsIdentity(pMtx))
		D3DXMatrixMultiply(pMtx, pMtx, &obj->wrldMtx.mtxWrld);
	else
		*pMtx = obj->wrldMtx.mtxWrld;

	if(TESTFLAGS(obj->status, OBJ_CHILD))
	{
		hOBJ parentOBJ = OBJQuery(&obj->parentKey);

		if(parentOBJ)
		{
			_OBJGetWrldMtx(parentOBJ, pMtx);

			if(obj->parentJointInd != -1)
			{
				float loc[eMaxPt];
				OBJJointGetTranslate(parentOBJ, obj->parentJointInd, loc);

				pMtx->_41 += loc[eX];
				pMtx->_42 += loc[eY];
				pMtx->_43 += loc[eZ];

				/*D3DXMATRIX nMtx;

				D3DXMatrixTranslation(&nMtx, loc[eX], loc[eY], loc[eZ]);

				D3DXMatrixMultiply(pMtx, pMtx, &nMtx);*/
			}
		}
	}
}
Exemplo n.º 2
0
//------------------------------------------------------------------------------------------------
// Name:  render
// Desc:  Draws all of the sprites in this manager to the screen
//------------------------------------------------------------------------------------------------
bool SpriteManager::render()
{
    // Whether or not the sprite-rendering segment has been entered.  This little flag saves a
    // lot of state changing when there are no sprites!
    bool enteredSpriteRendering = false;

    // Render each of the layers in order
    for (int layer = 0; layer < (int)LAYER_COUNT; ++layer)
    {
        // Make sure that we've entered the rendering phase
        if (!enteredSpriteRendering && myLayers[layer].size() > 0)
        {
            // Set up the sprite for rendering
            HRESULT hr = mySpriteRenderer->Begin(D3DXSPRITE_ALPHABLEND|D3DXSPRITE_DO_NOT_ADDREF_TEXTURE);
            if (APP_WARNING(FAILED(hr))("Unable to initialize sprite manager for rendering"))
                return false;

            // Successfully initialized rendering
            enteredSpriteRendering = true;
        }

        // Render each of the sprites in this layer
        for (size_t spriteIndex = 0; spriteIndex < myLayers[layer].size(); ++spriteIndex)
        {
            // Get the sprite at this index
            Sprite* sprite = myLayers[layer].get(spriteIndex);

            // This pointer is to the transformation matrix that should be used to render the sprite
            D3DXMATRIX* transform = &sprite->transform;

            // If this layer has an offset, build the combined transform
            D3DXMATRIX combinedTransform;
            if (!D3DXMatrixIsIdentity(&myLayerOffsets[layer]))
            {
                // Multiply the matrices
                D3DXMatrixMultiply(&combinedTransform, &myLayerOffsets[layer], &sprite->transform);

                // Set the transformation matrix
                transform = &combinedTransform;
            }

            // Set the sprite's transformation matrix
            APP_WARNING(FAILED(mySpriteRenderer->SetTransform(transform)))("Couldn't set sprite's transform");

            // The source image region to use (NULL is everything)
            RECT* srcRect;

            // Whether or not we should use a source region
            if (sprite->srcRegion.right <= sprite->srcRegion.left ||
                sprite->srcRegion.bottom <= sprite->srcRegion.top)
                srcRect = 0;
            else
                srcRect = &sprite->srcRegion;

            // Render the sprite
            HRESULT hr = mySpriteRenderer->Draw(sprite->texture, srcRect, NULL, sprite->positionOffset, sprite->color);
            if (APP_WARNING(FAILED(hr))("Sprite rendering failed!"))
                break;
        }
    }

    // If we rendered things, the renderer should be closed
    if (enteredSpriteRendering)
        mySpriteRenderer->End();

    // Success
    return true;
}