Ejemplo n.º 1
0
void Frame::synchronizeSafe(void)
{
    if( _dirty ) for( unsigned int i=0; i<Frame::_numDirtyFrames; i++ )
    {
        if( _dirtyFrames[i] == this )
        {
            _dirtyFrames[i] = NULL;
            break;
        }
    }

    _dirty = false;

    // check parent frame is dirty
    if( pParentFrame && pParentFrame->isDirtyHierarchy() )
    {
        getRoot()->synchronizeSafe();
        return;
    }

    // synchronize this frame
    if( !pParentFrame ) LTM = TransformationMatrix;
    else dxMultiply( &LTM, &TransformationMatrix, &pParentFrame->LTM );

    // synchronize its children
    Frame* child = static_cast<Frame*>( pFrameFirstChild );
    while( child )
    {
        child->synchronizeSafe();
        child = static_cast<Frame*>( child->pFrameSibling );
    }
    // update attached atomic
    if( pAttachedObject ) pAttachedObject->onUpdate();
}
Ejemplo n.º 2
0
void Frame::synchronizeFast(void)
{
    _dirty = false;

    // synchronize this frame
    if( !pParentFrame ) LTM = TransformationMatrix; 
    else dxMultiply( &LTM, &TransformationMatrix, &pParentFrame->LTM );
	
    // synchronize its children
    Frame* child = static_cast<Frame*>( pFrameFirstChild );
    while( child )
    {
        child->synchronizeFast();
        child = static_cast<Frame*>( child->pFrameSibling );
    }
    // update attached object
    if( pAttachedObject ) pAttachedObject->onUpdate();
}
Ejemplo n.º 3
0
static void convertMatrices(Frame* frame)
{
	// first, update children frames
	if( frame->pFrameFirstChild ) convertMatrices( static_cast<Frame*>( frame->pFrameFirstChild ) );

	// second, update sibling frames
	if( frame->pFrameSibling ) convertMatrices( static_cast<Frame*>( frame->pFrameSibling ) );

	// last, perform transformation matrix conversion	
	if( frame->pParentFrame == NULL )
	{
		frame->TransformationMatrix = frame->LTM;
	}
	else
	{
		// LTM = TM * pLTM
		// LTM * ipLTM = TM * pLTM * ipLTM
		Matrix pLTM = frame->pParentFrame->LTM;
		Matrix ipLTM;
		D3DXMatrixInverse( &ipLTM, NULL, &pLTM );
		dxMultiply( &frame->TransformationMatrix, &frame->LTM, &ipLTM );
	}
}