const Matrix4f& Node::GetTransformMatrix() const { if (!m_transformMatrixUpdated) UpdateTransformMatrix(); return m_transformMatrix; }
void Joint::UpdateSkinningMatrix() const { if (!m_transformMatrixUpdated) UpdateTransformMatrix(); m_skinningMatrix.Set(m_inverseBindMatrix); m_skinningMatrix.ConcatenateAffine(m_transformMatrix); m_skinningMatrixUpdated = true; }
void Transform::TranslateByBasis(glm::vec3 distance) { UpdateTransformMatrix(); glm::vec3 const rightTranslation = m_rightVector * distance.x; glm::vec3 const upTranslation = m_upVector * distance.y; glm::vec3 const forwardTranslation = m_direction * distance.z; SetTranslation(GetTranslation() + rightTranslation + upTranslation + forwardTranslation); }
Transform::Transform() : m_rotation(0) , m_translation(0) , m_orientation(glm::vec3(0)) , m_scale(glm::vec3(1.f)) , m_worldX({ 1., 0.f, 0.f }) , m_worldY({ 0.f, 1.f, 0.f }) , m_worldZ({ 0.f, 0.f, -1.f }) , m_rightVector(m_worldX) , m_upVector(m_worldY) , m_direction(m_worldZ) , m_transformMatrix(1.f) , m_isDirty(true) { UpdateTransformMatrix(); }
void Node::EnsureTransformMatrixUpdate() const { if (!m_transformMatrixUpdated) UpdateTransformMatrix(); }
//----------------------------------------------------------------------------- // Purpose: // Input : ptWorld - point to update with in world coordinates // uConstraints - // dragSize - // Output : //----------------------------------------------------------------------------- bool Box3D::UpdateTranslation(const Vector &vUpdate, UINT uConstraints) { if (m_TranslateMode == modeNone) { return false; } else if ( m_TranslateMode == modeRotate ) { Vector vCenter; ProjectOnTranslationPlane( m_vTranslationFixPoint, vCenter ); Vector vStart; HandleToWorld( vStart, m_TranslateHandle ); Vector v1 = vStart-vCenter; VectorNormalize( v1 ); Vector v2 = (vStart+vUpdate)-vCenter; VectorNormalize( v2 ); float volume = DotProduct( m_vPlaneNormal, CrossProduct( v1, v2) ); float angle = RAD2DEG( acos( DotProduct( v1,v2) ) ); if (uConstraints & constrainSnap) { angle += 7.5; angle -= fmod(double(angle), double(15.0)); } else { angle += 0.25; angle -= fmod(double(angle), double(.5)); } if ( volume < 0 ) angle = -angle; if ( fabs(m_vPlaneNormal.x) == 1 ) m_vTranslation.z = (m_vPlaneNormal.x>0)?angle:-angle; else if ( fabs(m_vPlaneNormal.y) == 1 ) m_vTranslation.x = (m_vPlaneNormal.y>0)?angle:-angle; else if ( fabs(m_vPlaneNormal.z) == 1 ) m_vTranslation.y = (m_vPlaneNormal.z>0)?angle:-angle; } else { if ( vUpdate == m_vTranslation ) return false; // no change m_vTranslation = vUpdate; // restrict translation, snap to grid, prevent overlap etc // make sure reference point snaps if enabled if ( uConstraints ) { // project back on projection plane Vector pos; if ( m_TranslateMode == modeMove ) { // when moving opbject make sure reference point is on grid pos = m_vTranslationFixPoint; } else { // otherwise translated handle should be on grid HandleToWorld( pos, m_TranslateHandle); } ProjectOnTranslationPlane( pos + m_vTranslation, m_vTranslation, uConstraints ); m_vTranslation -= pos; } if ( m_TranslateMode == modeScale ) { for ( int i=0; i<3; i++ ) { float handle = m_TranslateHandle[i]; if ( handle > 0 ) { float newMaxs = bmaxs[i] + m_vTranslation[i]; if( m_bPreventOverlap && newMaxs <= bmins[i] ) { m_vTranslation[i] = bmins[i] - bmaxs[i] + 1; } } else if ( handle < 0 ) { float newMins = bmins[i] + m_vTranslation[i]; if( m_bPreventOverlap && newMins >= bmaxs[i] ) { m_vTranslation[i] = bmaxs[i] - bmins[i] - 1; } } } } } UpdateTransformMatrix(); m_pDocument->UpdateAllViews( MAPVIEW_UPDATE_TOOL ); return true; }