Esempio n. 1
0
	const Matrix4f& Node::GetTransformMatrix() const
	{
		if (!m_transformMatrixUpdated)
			UpdateTransformMatrix();

		return m_transformMatrix;
	}
Esempio n. 2
0
	void Joint::UpdateSkinningMatrix() const
	{
		if (!m_transformMatrixUpdated)
			UpdateTransformMatrix();

		m_skinningMatrix.Set(m_inverseBindMatrix);
		m_skinningMatrix.ConcatenateAffine(m_transformMatrix);
		m_skinningMatrixUpdated = true;
	}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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();
}
Esempio n. 5
0
	void Node::EnsureTransformMatrixUpdate() const
	{
		if (!m_transformMatrixUpdated)
			UpdateTransformMatrix();
	}
Esempio n. 6
0
//-----------------------------------------------------------------------------
// 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;
}