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)); }
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; }
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; }
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); }