Example #1
0
Matrix4x4 CLevelEntity::CalculateGlobalTransform(CLevelEntity* pThis)
{
	Matrix4x4 mLocal;

	tstring sLocalOrigin = pThis->GetParameterValue("Origin");
	if (sLocalOrigin.length() && CanUnserializeString_TVector(sLocalOrigin))
		mLocal.SetTranslation(UnserializeString_TVector(sLocalOrigin));

	tstring sLocalAngles = pThis->GetParameterValue("Angles");
	if (sLocalAngles.length() && CanUnserializeString_EAngle(sLocalAngles))
		mLocal.SetAngles(UnserializeString_EAngle(sLocalAngles));

	tstring sAABB = pThis->GetParameterValue("BoundingBox");
	if (CanUnserializeString_AABB(sAABB))
	{
		AABB aabbBounds = UnserializeString_AABB(sAABB, pThis->GetName(), pThis->m_sClass, "BoundingBox");

		// Center the entity around this bounding box.
		Vector vecGlobalOrigin = aabbBounds.Center();
		mLocal.SetTranslation(mLocal.GetTranslation() + vecGlobalOrigin);

		Vector vecNewOrigin = mLocal.GetTranslation();
		pThis->SetParameterValue("Origin", pretty_float(vecNewOrigin.x) + " " + pretty_float(vecNewOrigin.y) + " " + pretty_float(vecNewOrigin.z));

		aabbBounds.m_vecMins -= vecGlobalOrigin;
		aabbBounds.m_vecMaxs -= vecGlobalOrigin;
		pThis->SetParameterValue("BoundingBox",
			pretty_float(aabbBounds.m_vecMins.x) + " " + pretty_float(aabbBounds.m_vecMins.y) + " " + pretty_float(aabbBounds.m_vecMins.z) + " "
			+ pretty_float(aabbBounds.m_vecMaxs.x) + " " + pretty_float(aabbBounds.m_vecMaxs.y) + " " + pretty_float(aabbBounds.m_vecMaxs.z));
	}

	return mLocal;
}
void CRenderingContext::RenderText(const tstring& sText, unsigned iLength, FTFont* pFont)
{
	TAssert(m_pShader);
	if (!m_pShader)
		return;

	CRenderContext& oContext = GetContext();

	if (iLength == -1)
		iLength = sText.length();

	TAssert(m_pShader->m_iPositionAttribute >= 0);
	TAssert(m_pShader->m_aiTexCoordAttributes[0] >= 0);

	if (!oContext.m_bProjectionUpdated)
		SetUniform("mProjection", oContext.m_mProjection);

	if (!oContext.m_bViewUpdated)
		SetUniform("mView", oContext.m_mView);

	// Take the position out and let FTGL do it. It looks sharper that way.
	Matrix4x4 mTransformations = oContext.m_mTransformations;
	Vector vecPosition = mTransformations.GetTranslation();
	mTransformations.SetTranslation(Vector());
	SetUniform("mGlobal", mTransformations);

	oContext.m_bProjectionUpdated = oContext.m_bViewUpdated = oContext.m_bTransformUpdated = true;

	ftglSetAttributeLocations(m_pShader->m_iPositionAttribute, m_pShader->m_aiTexCoordAttributes[0]);

	pFont->Render(sText.c_str(), iLength, FTPoint(vecPosition.x, vecPosition.y, vecPosition.z));
}
Example #3
0
void CTransform::SetTransform( Matrix4x4& transform )
{
	m_Translation.Set( transform.GetTranslation() );
	m_Euler.SetFromMatrix( transform );
	m_Scale.Set( transform.GetScale() );
	m_Transform.SetFrom4x4( transform.m );

	m_DirtyMatrix = false;
	m_DirtyQuaternion = true;
}
Example #4
0
bool CManipulatorTool::MouseInput(int iButton, tinker_mouse_state_t iState)
{
	if (!IsActive())
		return false;

	if (!iState)
	{
		if (m_bTransforming)
		{
			m_bTransforming = false;

			m_trsTransform = GetNewTRS();

			m_pListener->ManipulatorUpdated(m_sListenerArguments);

			return true;
		}

		return false;
	}

	int x, y;
	Application()->GetMousePosition(x, y);

	Vector vecPosition = GameServer()->GetRenderer()->WorldPosition(Vector((float)x, (float)y, 1));
	Vector vecCamera = GameServer()->GetRenderer()->GetCameraPosition();

	float flClosest = -1;
	m_iLockedAxis = -1;

	Matrix4x4 mTransform = m_trsTransform.GetMatrix4x4(false, false);

	float flScale = (float)(Vector(GameServer()->GetCameraManager()->GetCameraPosition()) - mTransform.GetTranslation()).Length()/10.0f;
	Vector vecX = (Vector(1, 0, 0)*flScale);
	Vector vecY = (Vector(0, 1, 0)*flScale);
	Vector vecZ = (Vector(0, 0, 1)*flScale);

	if (DistanceToLine(m_trsTransform.m_vecTranslation, vecPosition, vecCamera) < 0.2f*flScale)
	{
		m_flOriginalDistance = (m_trsTransform.m_vecTranslation - vecCamera).Length();
		m_iLockedAxis = 0;
	}

	if (DistanceToLine(mTransform*vecX, vecPosition, vecCamera) < 0.1f*flScale)
	{
		float flDistance = (mTransform*vecX - vecCamera).Length();
		if (m_iLockedAxis < 0 || flDistance < m_flOriginalDistance)
		{
			m_flOriginalDistance = flDistance;
			m_iLockedAxis = (1<<1)|(1<<2);
		}
	}

	if (DistanceToLine(mTransform*vecY, vecPosition, vecCamera) < 0.1f*flScale)
	{
		float flDistance = (mTransform*vecY - vecCamera).Length();
		if (m_iLockedAxis < 0 || flDistance < m_flOriginalDistance)
		{
			m_flOriginalDistance = flDistance;
			m_iLockedAxis = (1<<0)|(1<<2);
		}
	}

	if (DistanceToLine(mTransform*vecZ, vecPosition, vecCamera) < 0.1f*flScale)
	{
		float flDistance = (mTransform*vecZ - vecCamera).Length();
		if (m_iLockedAxis < 0 || flDistance < m_flOriginalDistance)
		{
			m_flOriginalDistance = flDistance;
			m_iLockedAxis = (1<<0)|(1<<1);
		}
	}

	if (m_iLockedAxis >= 0)
	{
		m_flStartX = (float)x;
		m_flStartY = (float)y;
		m_bTransforming = true;

		if (m_pListener && Application()->IsShiftDown())
			m_pListener->DuplicateMove("");

		return true;
	}

	return false;
}
Example #5
0
void CManipulatorTool::Render()
{
	if (!IsActive())
		return;

	Matrix4x4 mTransform = GetTransform(false, false);

	float flScale = (float)(Vector(GameServer()->GetCameraManager()->GetCameraPosition()) - mTransform.GetTranslation()).Length()/10.0f;

	if (flScale < 0.001f)
		flScale = 0.001f;

	CGameRenderingContext c(GameServer()->GetRenderer(), true);

	c.ClearDepth();

	c.UseProgram("model");
	c.SetUniform("vecColor", Color(255, 255, 255, 255));
	c.SetUniform("bDiffuse", false);

	c.Transform(mTransform);
	c.Scale(flScale, flScale, flScale);

	Vector vecBox(0.1f, 0.1f, 0.1f);
	c.RenderWireBox(AABB(-vecBox, vecBox));

	c.BeginRenderLines();
		c.Vertex(Vector());
		c.Vertex(Vector(1, 0, 0));
		c.Vertex(Vector());
		c.Vertex(Vector(0, 1, 0));
		c.Vertex(Vector());
		c.Vertex(Vector(0, 0, 1));
	c.EndRender();

	Vector vecHandle(0.05f, 0.05f, 0.05f);
	c.Translate(Vector(1, 0, 0));
	c.SetUniform("vecColor", Color(255, 0, 0, 255));
	if (GetTransfromType() == MT_TRANSLATE)
		c.RenderWireBox(AABB(-vecHandle * Vector(2, 1, 1), vecHandle * Vector(2, 1, 1)));
	else if (GetTransfromType() == MT_ROTATE)
		c.RenderWireBox(AABB(-vecHandle * Vector(1, 1, 2), vecHandle * Vector(1, 1, 2)));
	else if (GetTransfromType() == MT_SCALE)
		c.RenderWireBox(AABB(-vecHandle, vecHandle));

	c.Translate(Vector(-1, 1, 0));
	c.SetUniform("vecColor", Color(0, 255, 0, 255));
	if (GetTransfromType() == MT_TRANSLATE)
		c.RenderWireBox(AABB(-vecHandle * Vector(1, 2, 1), vecHandle * Vector(1, 2, 1)));
	else if (GetTransfromType() == MT_ROTATE)
		c.RenderWireBox(AABB(-vecHandle * Vector(2, 1, 1), vecHandle * Vector(2, 1, 1)));
	else if (GetTransfromType() == MT_SCALE)
		c.RenderWireBox(AABB(-vecHandle, vecHandle));

	c.Translate(Vector(0, -1, 1));
	c.SetUniform("vecColor", Color(0, 0, 255, 255));
	if (GetTransfromType() == MT_TRANSLATE)
		c.RenderWireBox(AABB(-vecHandle * Vector(1, 1, 2), vecHandle * Vector(1, 1, 2)));
	else if (GetTransfromType() == MT_ROTATE)
		c.RenderWireBox(AABB(-vecHandle * Vector(1, 2, 1), vecHandle * Vector(1, 2, 1)));
	else if (GetTransfromType() == MT_SCALE)
		c.RenderWireBox(AABB(-vecHandle, vecHandle));

	c.SetUniform("vecColor", Color(255, 255, 255, 255));
	c.SetUniform("bDiffuse", true);
}