leocad/common/view.cpp

224 lines
4.3 KiB
C++
Raw Normal View History

#include "lc_global.h"
2011-09-07 23:06:51 +02:00
#include <stdlib.h>
#include "project.h"
2012-08-20 06:05:56 +02:00
#include "camera.h"
2011-09-07 23:06:51 +02:00
#include "view.h"
#include "system.h"
2013-08-09 06:57:18 +02:00
View::View(Project *project)
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
m_Project = project;
2012-08-20 06:05:56 +02:00
mCamera = NULL;
2012-02-05 03:50:57 +01:00
m_OverlayScale = 1.0f;
2013-08-09 06:57:18 +02:00
if (project->GetActiveView())
SetCamera(project->GetActiveView()->mCamera, false);
else
SetDefaultCamera();
2011-09-07 23:06:51 +02:00
}
View::~View()
{
if (m_Project != NULL)
m_Project->RemoveView(this);
2012-08-22 03:13:32 +02:00
if (mCamera && mCamera->IsSimple())
delete mCamera;
2011-09-07 23:06:51 +02:00
}
2012-11-15 02:14:35 +01:00
void View::SetCamera(Camera* camera, bool ForceCopy)
2012-08-20 06:05:56 +02:00
{
2012-11-15 02:14:35 +01:00
if (camera->IsSimple() || ForceCopy)
2012-08-20 06:05:56 +02:00
{
if (!mCamera || !mCamera->IsSimple())
mCamera = new Camera(true);
mCamera->CopyPosition(camera);
}
else
{
if (mCamera && mCamera->IsSimple())
delete mCamera;
mCamera = camera;
}
}
void View::SetDefaultCamera()
{
if (!mCamera || !mCamera->IsSimple())
mCamera = new Camera(true);
2014-01-30 04:13:34 +01:00
mCamera->SetViewpoint(LC_VIEWPOINT_HOME, 1, false);
2012-08-20 06:05:56 +02:00
}
2014-05-03 03:22:24 +02:00
lcMatrix44 View::GetProjectionMatrix() const
{
float AspectRatio = (float)mWidth / (float)mHeight;
if (mCamera->IsOrtho())
{
// Compute the FOV/plane intersection radius.
// d d
// a = 2 atan(------) => ~ a = --- => d = af
// 2f f
float f = (mCamera->mPosition - mCamera->mOrthoTarget).Length();
float d = (mCamera->m_fovy * f) * (LC_PI / 180.0f);
float r = d / 2;
float right = r * AspectRatio;
return lcMatrix44Ortho(-right, right, -r, r, mCamera->m_zNear, mCamera->m_zFar * 4);
}
else
return lcMatrix44Perspective(mCamera->m_fovy, AspectRatio, mCamera->m_zNear, mCamera->m_zFar);
}
LC_CURSOR_TYPE View::GetCursor() const
2011-09-07 23:06:51 +02:00
{
// TODO: check if we're the focused window and return just the default arrow if we aren't.
switch (m_Project->GetAction())
{
case LC_TOOL_SELECT:
2013-08-09 06:57:18 +02:00
if (mInputState.Control)
2011-09-07 23:06:51 +02:00
return LC_CURSOR_SELECT_GROUP;
else
return LC_CURSOR_SELECT;
case LC_TOOL_INSERT:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_BRICK;
case LC_TOOL_LIGHT:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_LIGHT;
case LC_TOOL_SPOTLIGHT:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_SPOTLIGHT;
case LC_TOOL_CAMERA:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_CAMERA;
case LC_TOOL_MOVE:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_MOVE;
case LC_TOOL_ROTATE:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_ROTATE;
case LC_TOOL_ERASER:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_DELETE;
case LC_TOOL_PAINT:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_PAINT;
case LC_TOOL_ZOOM:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_ZOOM;
case LC_TOOL_ZOOM_REGION:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_ZOOM_REGION;
case LC_TOOL_PAN:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_PAN;
case LC_TOOL_ROTATE_VIEW:
2011-09-07 23:06:51 +02:00
switch (m_Project->GetOverlayMode())
{
case LC_OVERLAY_ROTATE_VIEW_X:
return LC_CURSOR_ROTATEX;
case LC_OVERLAY_ROTATE_VIEW_Y:
return LC_CURSOR_ROTATEY;
case LC_OVERLAY_ROTATE_VIEW_Z:
return LC_CURSOR_ROLL;
case LC_OVERLAY_ROTATE_VIEW_XYZ:
2011-09-07 23:06:51 +02:00
default:
return LC_CURSOR_ROTATE_VIEW;
2011-09-07 23:06:51 +02:00
}
case LC_TOOL_ROLL:
2011-09-07 23:06:51 +02:00
return LC_CURSOR_ROLL;
default:
LC_ASSERT_FALSE("Unknown cursor type.");
2012-06-23 02:14:09 +02:00
return LC_CURSOR_DEFAULT;
2011-09-07 23:06:51 +02:00
}
}
2013-12-17 03:43:16 +01:00
// Call this once before using a view during a callback in order
// to pick up any changes to the view or its camera.
const lcProjection& View::UpdateProjection()
{
mProjection.SetView(mCamera, mWidth, mHeight);
mCamera->LoadProjection(mProjection);
return mProjection;
}
void View::SetProjectionType(lcProjection::Type type)
{
2014-05-03 03:22:24 +02:00
if (type == lcProjection::Ortho)
mCamera->SetOrtho(true);
else if (type == lcProjection::Projection)
mCamera->SetOrtho(false);
else if (type == lcProjection::Cycle)
mCamera->SetOrtho(!mCamera->IsOrtho());
2013-12-17 03:43:16 +01:00
2014-05-03 03:22:24 +02:00
mProjection.calculateTransform();
2013-12-17 03:43:16 +01:00
}
2011-09-07 23:06:51 +02:00
void View::OnDraw()
{
m_Project->Render(this, false);
2011-09-07 23:06:51 +02:00
}
void View::OnInitialUpdate()
{
m_Project->AddView(this);
}
2013-08-09 06:57:18 +02:00
void View::OnUpdateCursor()
{
SetCursor(GetCursor());
}
void View::OnLeftButtonDown()
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
m_Project->OnLeftButtonDown(this);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
void View::OnLeftButtonUp()
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
m_Project->OnLeftButtonUp(this);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
void View::OnLeftButtonDoubleClick()
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
m_Project->OnLeftButtonDoubleClick(this);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
void View::OnMiddleButtonDown()
{
2013-08-09 06:57:18 +02:00
m_Project->OnMiddleButtonDown(this);
}
2013-08-09 06:57:18 +02:00
void View::OnMiddleButtonUp()
{
2013-08-09 06:57:18 +02:00
m_Project->OnMiddleButtonUp(this);
}
2013-08-09 06:57:18 +02:00
void View::OnRightButtonDown()
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
m_Project->OnRightButtonDown(this);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
void View::OnRightButtonUp()
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
m_Project->OnRightButtonUp(this);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
void View::OnMouseMove()
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
m_Project->OnMouseMove(this);
2013-01-28 20:57:33 +01:00
}
2013-08-09 06:57:18 +02:00
void View::OnMouseWheel(float Direction)
2013-01-28 20:57:33 +01:00
{
2013-08-09 06:57:18 +02:00
m_Project->OnMouseWheel(this, Direction);
2011-09-07 23:06:51 +02:00
}