void CqTransform::ConcatCurrentTransform( TqFloat time, const CqMatrix& matTrans ) { TqFloat det = matTrans.Determinant(); bool flip = ( !matTrans.fIdentity() && det < 0 ); SqTransformation ct; ct.m_matTransform = matTrans; ct.m_Handedness = (flip)? !m_Handedness : m_Handedness; // If we are actually in a motion block, and we already describe a moving transform, // concatenate this transform with the existing one at that time slot, // ConcatTimeSlot will take care of making sure that the matrix is initially set to the // static matrix, as long as we ensure that the default is kept up to date. if ( QGetRenderContext() ->pconCurrent() ->fMotionBlock() ) { ConcatTimeSlot( time, ct ); m_IsMoving = true; } else // else, if we are moving, apply this transform at all time slots, otherwise apply to static matrix. { if( m_IsMoving ) ConcatAllTimeSlots( ct ); else { m_StaticMatrix = m_StaticMatrix * matTrans; m_Handedness = (flip)? !m_Handedness : m_Handedness; ct.m_Handedness = m_Handedness; SetDefaultObject( ct ); } } }
void CqTransform::SetCurrentTransform( TqFloat time, const CqMatrix& matTrans ) { TqFloat det = matTrans.Determinant(); bool flip = ( !matTrans.fIdentity() && det < 0 ); SqTransformation ct; ct.m_matTransform = matTrans; ct.m_Handedness = !flip; if ( QGetRenderContext() ->pconCurrent() ->fMotionBlock() ) { AddTimeSlot( time, ct ); m_IsMoving = true; } else { if( m_IsMoving ) { AddTimeSlot( time, ct ); } else { m_StaticMatrix = matTrans; m_Handedness = (flip)? !m_Handedness : m_Handedness; //m_Handedness = flip; ct.m_Handedness = flip; SetDefaultObject( ct ); } } }
void CqTransform::SetTransform( TqFloat time, const CqMatrix& matTrans ) { TqFloat det = matTrans.Determinant(); bool flip = ( !matTrans.fIdentity() && det < 0 ); CqMatrix matCtoW; QGetRenderContext()->matSpaceToSpace("world", "camera", NULL, NULL, QGetRenderContext()->Time(), matCtoW); TqFloat camdet = matCtoW.Determinant(); bool camhand = ( !matCtoW.fIdentity() && camdet < 0 ); if ( QGetRenderContext() ->pconCurrent() ->fMotionBlock() ) { SqTransformation ct; ct.m_Handedness = (flip)? !camhand : camhand; ct.m_matTransform = matTrans; AddTimeSlot( time, ct ); m_IsMoving = true; } else { // If not in a motion block, but we are moving, apply the transform to all keys. if( m_IsMoving ) { CqMatrix mat0 = matObjectToWorld(Time(0)); SqTransformation ct; ct.m_Handedness = (flip)? !camhand : camhand; bool hand0 = ct.m_Handedness; ct.m_matTransform = matTrans; AddTimeSlot( Time(0), ct ); TqInt i; for(i=1; i<cTimes(); i++) { CqMatrix matOffset = mat0 * matObjectToWorld(Time(i)).Inverse(); ct.m_matTransform = matOffset * matTrans; bool flip2 = ( matOffset.Determinant() < 0 ); ct.m_Handedness = (flip2)? !hand0 : hand0; AddTimeSlot( Time(i), ct); } } else { m_StaticMatrix = matTrans; m_Handedness = (flip)? !camhand : camhand; } } }