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( <M, &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(); }
void Frame::synchronizeFast(void) { _dirty = false; // synchronize this frame if( !pParentFrame ) LTM = TransformationMatrix; else dxMultiply( <M, &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(); }
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 ); } }