Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions engine/includes/editor/viewport/cameracontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,6 @@ class ENGINE_EXPORT CameraController : public QObject {

void setFree(bool flag) { m_cameraFree = flag; }

void setTransferSpeed(float speed) { m_transferSpeed = speed; }

bool isMovementBlocked() const { return m_blockMove; }
void blockMovement(bool flag) { m_blockMove = flag; }

Expand All @@ -81,7 +79,7 @@ class ENGINE_EXPORT CameraController : public QObject {
void setZoomLimits(const Vector2 &limit);

void doRotation(const Vector3 &vector);
void activateCamera(int index);
void activateCamera(int index, bool force = false);

void resetCamera();

Expand All @@ -105,8 +103,6 @@ public slots:
protected:
std::vector<CameraData> m_cameras;

CameraData m_targetCamera;

Vector2 m_screenSize;
Vector2 m_mouseSaved;
Vector2 m_mouseDelta;
Expand Down
106 changes: 63 additions & 43 deletions engine/src/editor/viewport/cameracontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ CameraController::CameraController() :
m_gridAxis(Axis::X),
m_transferProgress(1.0f),
m_transferSpeed(2.0f),
m_currentCamera(-1),
m_currentCamera(0),
m_zoomLimit(0.001f, 10000.0f),
m_blockMove(false),
m_blockMoveOnTransfer(false),
Expand Down Expand Up @@ -160,10 +160,10 @@ void CameraController::move() {
m_transferProgress = CLAMP(m_transferProgress + m_transferSpeed * Timer::deltaTime(), 0.0f, 1.0f);

if(!m_blockMoveOnTransfer) {
t->setPosition(MIX(t->position(), m_targetCamera.position, m_transferProgress));
t->setPosition(MIX(t->position(), m_cameras[m_currentCamera].position, m_transferProgress));
}

Vector3 euler(MIX(t->rotation(), m_targetCamera.rotation, m_transferProgress));
Vector3 euler(MIX(t->rotation(), m_cameras[m_currentCamera].rotation, m_transferProgress));

if(!m_cameraFree || m_blockMoveOnTransfer) {
Vector3 forward(0.0f, 0.0f, m_activeCamera->focalDistance());
Expand All @@ -173,8 +173,8 @@ void CameraController::move() {
}
t->setRotation(euler);

m_activeCamera->setOrthoSize(MIX(m_activeCamera->orthoSize(), m_targetCamera.orthoSize, m_transferProgress));
m_activeCamera->setFocalDistance(MIX(m_activeCamera->focalDistance(), m_targetCamera.focalDistance, m_transferProgress));
m_activeCamera->setOrthoSize(MIX(m_activeCamera->orthoSize(), m_cameras[m_currentCamera].orthoSize, m_transferProgress));
m_activeCamera->setFocalDistance(MIX(m_activeCamera->focalDistance(), m_cameras[m_currentCamera].focalDistance, m_transferProgress));

if(m_transferProgress >= 1.0f) {
m_blockMoveOnTransfer = false;
Expand Down Expand Up @@ -205,30 +205,42 @@ void CameraController::onOrthographic(bool flag) {
}

void CameraController::doRotation(const Vector3 &rotation) {
m_targetCamera.rotation = rotation;
m_targetCamera.focalDistance = m_activeCamera->focalDistance();
m_targetCamera.orthoSize = m_activeCamera->orthoSize();
CameraData &data = m_cameras[m_currentCamera];
data.rotation = rotation;
data.focalDistance = m_activeCamera->focalDistance();
data.orthoSize = m_activeCamera->orthoSize();

m_blockMoveOnTransfer = true;
m_transferProgress = 0.0f;
}

void CameraController::activateCamera(int index) {
void CameraController::activateCamera(int index, bool force) {
if(index < m_cameras.size()) {
if(m_currentCamera >= 0) {
m_cameras[m_currentCamera].ortho = m_activeCamera->orthographic();
m_cameras[m_currentCamera].orthoSize = m_activeCamera->orthoSize();
m_cameras[m_currentCamera].focalDistance = m_activeCamera->focalDistance();
if(m_currentCamera >= 0 && !force) {
CameraData &data = m_cameras[m_currentCamera];
data.ortho = m_activeCamera->orthographic();
data.orthoSize = m_activeCamera->orthoSize();
data.focalDistance = m_activeCamera->focalDistance();

Transform *t = m_activeCamera->transform();
m_cameras[m_currentCamera].position = t->position();
m_cameras[m_currentCamera].rotation = t->rotation();
data.position = t->position();
data.rotation = t->rotation();
}

m_currentCamera = index;
m_targetCamera = m_cameras[m_currentCamera];
m_transferProgress = 0.0f;
if(!force) {
m_transferProgress = 0.0f;
} else {
Transform *t = m_activeCamera->transform();
t->setPosition(m_cameras[m_currentCamera].position);
t->setRotation(m_cameras[m_currentCamera].rotation);

onOrthographic(m_targetCamera.ortho);
m_activeCamera->setFocalDistance(m_cameras[m_currentCamera].focalDistance);
m_activeCamera->setOrthoSize(m_cameras[m_currentCamera].orthoSize);
m_activeCamera->setOrthographic(m_cameras[m_currentCamera].ortho);
}

onOrthographic(m_cameras[m_currentCamera].ortho);
}
}

Expand All @@ -241,16 +253,18 @@ void CameraController::resetCamera() {
Vector3 position(Quaternion(rotation) * forward);

m_cameras.clear();
m_cameras.push_back({rotation, position, dist, false});
m_cameras.push_back({Vector3(), Vector3(0.0f, 0.0f, -10.0f), dist, true});
m_cameras.push_back({rotation, position, dist, 0.0f, false});
m_cameras.push_back({Vector3(), Vector3(0.0f, 0.0f, -10.0f), 0.0f, dist, true});

m_currentCamera = 0;

Transform *t = m_activeCamera->transform();
t->setPosition(m_cameras[0].position);
t->setRotation(m_cameras[0].rotation);
t->setPosition(m_cameras[m_currentCamera].position);
t->setRotation(m_cameras[m_currentCamera].rotation);

m_activeCamera->setFocalDistance(m_cameras[0].focalDistance);
m_activeCamera->setOrthoSize(m_cameras[0].orthoSize);
m_activeCamera->setOrthographic(m_cameras[0].ortho);
m_activeCamera->setFocalDistance(m_cameras[m_currentCamera].focalDistance);
m_activeCamera->setOrthoSize(m_cameras[m_currentCamera].orthoSize);
m_activeCamera->setOrthographic(m_cameras[m_currentCamera].ortho);
}

void CameraController::setFocusOn(Actor *actor, float &bottom) {
Expand Down Expand Up @@ -280,10 +294,11 @@ void CameraController::setFocusOn(Actor *actor, float &bottom) {
radius = CLAMP(radius, FLT_EPSILON, FLT_MAX);

Transform *camera = m_activeCamera->transform();
m_targetCamera.position = center + camera->quaternion() * Vector3(0.0f, 0.0f, radius);
m_targetCamera.rotation = camera->rotation();
m_targetCamera.focalDistance = radius;
m_targetCamera.orthoSize = radius;
CameraData &data = m_cameras[m_currentCamera];
data.position = center + camera->quaternion() * Vector3(0.0f, 0.0f, radius);
data.rotation = camera->rotation();
data.focalDistance = radius;
data.orthoSize = radius;

m_transferProgress = 0.0f;
}
Expand All @@ -292,20 +307,22 @@ void CameraController::setFocusOn(Actor *actor, float &bottom) {
void CameraController::cameraZoom(float delta) {
if(m_activeCamera) {
if(m_activeCamera->orthographic()) {
float size = m_activeCamera->orthoSize();
float scale = size / m_screenSize.x;
scale = CLAMP(size - (delta * scale), m_zoomLimit.x, m_zoomLimit.y);
float size = m_cameras[m_currentCamera].orthoSize;
m_cameras[m_currentCamera].orthoSize = size / m_screenSize.x;
m_cameras[m_currentCamera].orthoSize = CLAMP(size - (delta * m_cameras[m_currentCamera].orthoSize), m_zoomLimit.x, m_zoomLimit.y);

m_activeCamera->setOrthoSize(scale);
m_activeCamera->setOrthoSize(m_cameras[m_currentCamera].orthoSize);
} else {
float scale = delta * 0.01f;
float focal = m_activeCamera->focalDistance() - scale;
float focal = m_cameras[m_currentCamera].focalDistance - scale;

if(focal > m_zoomLimit.x && focal < m_zoomLimit.y) {
m_activeCamera->setFocalDistance(focal);
m_cameras[m_currentCamera].focalDistance = focal;
m_activeCamera->setFocalDistance(m_cameras[m_currentCamera].focalDistance);

Transform *t = m_activeCamera->transform();
t->setPosition(t->position() - t->quaternion() * Vector3(0.0f, 0.0f, scale));
m_cameras[m_currentCamera].position = t->position() - t->quaternion() * Vector3(0.0f, 0.0f, scale);
t->setPosition(m_cameras[m_currentCamera].position);
}
}
}
Expand All @@ -318,7 +335,9 @@ void CameraController::cameraRotate(const Vector3 &delta) {
if(!m_cameraFree || Input::isKey(Input::KEY_LEFT_ALT) || m_transferProgress < 1.0f) {
Vector3 forward(0.0f, 0.0f, m_activeCamera->focalDistance());
Vector3 dir = t->position() - t->quaternion() * forward;
t->setPosition(dir + Quaternion(euler) * forward);

m_cameras[m_currentCamera].position = dir + Quaternion(euler) * forward;
t->setPosition(m_cameras[m_currentCamera].position);
}
t->setRotation(euler);
}
Expand Down Expand Up @@ -393,7 +412,7 @@ void CameraController::restoreState(const VariantMap &state) {
currentCamera = (*it).second.toInt();
}

activateCamera(currentCamera);
activateCamera(currentCamera, true);
}
}

Expand All @@ -405,11 +424,12 @@ VariantMap CameraController::saveState() {

if(m_currentCamera >= 0) {
Transform *t = m_activeCamera->transform();
m_cameras[m_currentCamera].rotation = t->rotation();
m_cameras[m_currentCamera].position = t->position();
m_cameras[m_currentCamera].ortho = m_activeCamera->orthographic();
m_cameras[m_currentCamera].orthoSize = m_activeCamera->orthoSize();
m_cameras[m_currentCamera].focalDistance = m_activeCamera->focalDistance();
CameraData &data = m_cameras[m_currentCamera];
data.rotation = t->rotation();
data.position = t->position();
data.ortho = m_activeCamera->orthographic();
data.orthoSize = m_activeCamera->orthoSize();
data.focalDistance = m_activeCamera->focalDistance();
}

VariantList cameras;
Expand Down
3 changes: 1 addition & 2 deletions modules/editor/grapheditor/editor/graph/graphview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,9 @@ GraphView::GraphView(QWidget *editor) :
m_updateLinks(false) {

m_controller = new GraphController(this);
m_controller->doRotation(Vector3());
m_controller->activateCamera(1, true);
m_controller->setGridAxis(CameraController::Axis::Z);
m_controller->blockRotations(true);
m_controller->setTransferSpeed(100.0f);

static bool firtCall = true;
if(firtCall) {
Expand Down
2 changes: 1 addition & 1 deletion modules/editor/texturetools/editor/spriteedit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ SpriteEdit::SpriteEdit() :

m_proxy->setEditor(this);

m_controller->doRotation(Vector3());
m_controller->activateCamera(1, true);
m_controller->setGridAxis(CameraController::Axis::Z);
m_controller->blockRotations(true);

Expand Down
Loading