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
2 changes: 0 additions & 2 deletions engine/includes/editor/viewport/cameracontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,6 @@ public slots:
Vector2 m_delta;
Vector2 m_saved;

Actor *m_camera;

Camera *m_activeCamera;

Object *m_activeRootObject;
Expand Down
2 changes: 1 addition & 1 deletion engine/includes/editor/viewport/viewport.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class ENGINE_EXPORT Viewport : public QWidget {

PipelineContext *pipelineContext() const;

float gridCell();
int gridCell();

bool isGamePaused() const;
void setGamePaused(bool pause);
Expand Down
32 changes: 19 additions & 13 deletions engine/src/components/transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,12 @@ Vector3 Transform::rotation() const {
Changes the rotation of the Transform in local space by provided Euler \a angles in degrees.
*/
void Transform::setRotation(const Vector3 angles) {
std::unique_lock<std::mutex> locker(m_mutex);
m_rotation = angles;
m_quaternion = Quaternion(m_rotation);
setDirty();
if(m_rotation != angles) {
std::unique_lock<std::mutex> locker(m_mutex);
m_rotation = angles;
m_quaternion = Quaternion(m_rotation);
setDirty();
}
}
/*!
Returns current rotation of the Transform in local space as Quaternion.
Expand All @@ -96,12 +98,14 @@ Quaternion Transform::quaternion() const {
Changes the rotation \a quaternion of the Transform in local space by provided Quaternion.
*/
void Transform::setQuaternion(const Quaternion quaternion) {
std::unique_lock<std::mutex> locker(m_mutex);
m_quaternion = quaternion;
#ifdef SHARED_DEFINE
//m_rotation = m_quaternion.euler();
#endif
setDirty();
if(m_quaternion != quaternion) {
std::unique_lock<std::mutex> locker(m_mutex);
m_quaternion = quaternion;
#ifdef SHARED_DEFINE
//m_rotation = m_quaternion.euler();
#endif
setDirty();
}
}
/*!
Returns current scale of the Transform in local space.
Expand All @@ -113,9 +117,11 @@ Vector3 Transform::scale() const {
Changes the \a scale of the Transform in local space.
*/
void Transform::setScale(const Vector3 scale) {
std::unique_lock<std::mutex> locker(m_mutex);
m_scale = scale;
setDirty();
if(m_scale != scale) {
std::unique_lock<std::mutex> locker(m_mutex);
m_scale = scale;
setDirty();
}
}
/*!
Marks transform as dirty.
Expand Down
39 changes: 19 additions & 20 deletions engine/src/editor/viewport/cameracontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,18 @@ CameraController::CameraController() :
m_orthoWidthTarget(-1.0f),
m_focalLengthTarget(-1.0f),
m_transferProgress(1.0f),
m_camera(nullptr),
m_activeCamera(nullptr),
m_activeRootObject(nullptr),
m_zoomLimit(0.001f, 10000.0f) {

m_camera = Engine::composeActor(gCamera, gCamera, nullptr);
m_activeCamera = static_cast<Camera *>(m_camera->component(gCamera));
Actor *actor = Engine::composeActor(gCamera, gCamera, nullptr);
m_activeCamera = static_cast<Camera *>(actor->component(gCamera));
m_activeCamera->setFocal(10.0f);
m_activeCamera->setOrthoSize(10.0f);

m_activeCamera->setColor(Vector4(0.2f, 0.2f, 0.2f, 0.0));
m_activeCamera->setColor(Vector4(0.2f, 0.2f, 0.2f, 0.0f));

m_camera->transform()->setPosition(Vector3(0.0, 0.0, 10.0));
m_activeCamera->transform()->setPosition(Vector3(0.0f, 0.0f, 10.0f));
}

void CameraController::drawHandles() {
Expand Down Expand Up @@ -118,7 +117,7 @@ void CameraController::update() {
if(Input::isMouseButton(Input::MOUSE_RIGHT)) {
if(m_activeCamera->orthographic()) {
if(!m_blockMove) {
Transform *t = m_camera->transform();
Transform *t = m_activeCamera->transform();
cameraMove(t->quaternion() * p);

Vector2 p(pos.x, pos.y);
Expand All @@ -133,7 +132,7 @@ void CameraController::update() {
m_saved = Vector2(pos.x, pos.y);
}
} else if(Input::isMouseButton(Input::MOUSE_MIDDLE) && !m_blockMove) {
Transform *t = m_camera->transform();
Transform *t = m_activeCamera->transform();
float mult = m_activeCamera->orthographic() ? 1.0f : m_activeCamera->focal() * 0.1f;
cameraMove((t->quaternion() * p) * mult);
m_saved = Vector2(pos.x, pos.y);
Expand All @@ -149,7 +148,7 @@ void CameraController::update() {
void CameraController::move() {
// Linear movements
if(m_activeCamera) {
Transform *t = m_camera->transform();
Transform *t = m_activeCamera->transform();
if(m_transferProgress < 1.0f) {
if(m_rotationTransfer) {
cameraRotate(t->rotation() - MIX(t->rotation(), m_rotation, m_transferProgress));
Expand Down Expand Up @@ -206,7 +205,7 @@ void CameraController::onOrthographic(bool flag) {
if(m_activeCamera->orthographic() != flag) {
m_activeCamera->setOrthographic(flag);
if(flag) {
m_rotation = m_camera->transform()->rotation();
m_rotation = m_activeCamera->transform()->rotation();
frontSide();
} else {
doRotation(m_rotation);
Expand All @@ -233,8 +232,8 @@ void CameraController::setFocusOn(Actor *actor, float &bottom) {

m_focalLengthTarget = radius;
m_orthoWidthTarget = radius;
Transform *camera = m_camera->transform();
m_positionTarget = bb.center + camera->quaternion() * Vector3(0.0, 0.0, radius);
Transform *camera = m_activeCamera->transform();
m_positionTarget = bb.center + camera->quaternion() * Vector3(0.0f, 0.0f, radius);
m_transferProgress = 0.0f;
m_rotationTransfer = false;
}
Expand Down Expand Up @@ -284,7 +283,7 @@ void CameraController::bottomSide() {

void CameraController::doRotation(const Vector3 &vector) {
m_rotation = vector;
m_positionTarget = m_camera->transform()->position();
m_positionTarget = m_activeCamera->transform()->position();

m_cameraFreeSaved = m_cameraFree;
m_cameraFree = false;
Expand All @@ -293,36 +292,36 @@ void CameraController::doRotation(const Vector3 &vector) {
}

void CameraController::cameraZoom(float delta) {
if(m_activeCamera && m_camera) {
if(m_activeCamera) {
if(m_activeCamera->orthographic()) {
float scale = m_activeCamera->orthoSize() * 0.001f;
m_activeCamera->setOrthoSize(CLAMP(m_activeCamera->orthoSize() - delta * scale, m_zoomLimit.x, m_zoomLimit.y));
m_activeCamera->setOrthoSize(CLAMP(m_activeCamera->orthoSize() - delta, m_zoomLimit.x, m_zoomLimit.y));
} else {
float scale = delta * 0.01f;
float focal = CLAMP(m_activeCamera->focal() - scale, m_zoomLimit.x, m_zoomLimit.y);
if(focal > 0.0f) {
m_activeCamera->setFocal(focal);

Transform *t = m_camera->transform();
t->setPosition(t->position() - t->quaternion() * Vector3(0.0, 0.0, scale));
Transform *t = m_activeCamera->transform();
t->setPosition(t->position() - t->quaternion() * Vector3(0.0f, 0.0f, scale));
}
}
}
}

void CameraController::cameraRotate(const Vector3 &delta) {
Transform *t = m_camera->transform();
Transform *t = m_activeCamera->transform();
Vector3 euler = t->rotation() - delta;

if(!m_cameraFree) {
Vector3 dir = t->position() - t->quaternion() * Vector3(0.0, 0.0, m_activeCamera->focal());
t->setPosition(dir + Quaternion(euler) * Vector3(0.0, 0.0, m_activeCamera->focal()));
Vector3 dir = t->position() - t->quaternion() * Vector3(0.0f, 0.0f, m_activeCamera->focal());
t->setPosition(dir + Quaternion(euler) * Vector3(0.0f, 0.0f, m_activeCamera->focal()));
}
t->setRotation(euler);
}

void CameraController::cameraMove(const Vector3 &delta) {
Transform *t = m_camera->transform();
Transform *t = m_activeCamera->transform();
t->setPosition(t->position() - delta * ((m_activeCamera->orthographic()) ? m_activeCamera->orthoSize() : m_activeCamera->focal()));
}

Expand Down
77 changes: 43 additions & 34 deletions engine/src/editor/viewport/viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ class GridRender : public PipelineTask {
}
}

float scale() const {
int scale() const {
return m_scale;
}

Expand All @@ -203,22 +203,36 @@ class GridRender : public PipelineTask {

Quaternion rot;

m_scale = 1.0f;
float width = 0.5f;
Vector3 planeScale(1.0f);

enum OreintationTypes {
XZ,
XY,
ZY
};

int orientation = XZ;

float zoom = 0.0f;

Vector4 gridColor(m_gridColor);

bool ortho = camera->orthographic();
if(ortho) {
float length = camera->orthoSize() * 10.0f;
float height = camera->orthoSize();

m_scale = 0.01f;
while(m_scale < length) {
m_scale *= 10.0f;
m_scale = 1;
while(m_scale < height * 0.01f) {
m_scale *= 10;
}

width = length / m_scale;
float scale = m_scale * 0.1f;
zoom = height / (float)m_height;
float i;
gridColor.w = modf(height / (float)m_scale, &i);

planeScale = Vector3(height * camera->ratio(), height, 1.0f);

float depth = camera->farPlane() - (camera->nearPlane() * 2.0f);
float depth = camera->farPlane() * 0.5f;
CameraController::ViewSide side = CameraController::ViewSide::VIEW_FRONT;
if(m_controller) {
side = m_controller->viewSide();
Expand All @@ -229,25 +243,19 @@ class GridRender : public PipelineTask {
case CameraController::ViewSide::VIEW_BACK: {
rot = Quaternion();
pos = Vector3(cam.x, cam.y, cam.z + ((side == CameraController::ViewSide::VIEW_FRONT) ? -depth : depth));
pos = Vector3(scale * int32_t(pos.x / scale),
scale * int32_t(pos.y / scale),
pos.z);
orientation = XY;
} break;
case CameraController::ViewSide::VIEW_LEFT:
case CameraController::ViewSide::VIEW_RIGHT: {
rot = Quaternion(Vector3(0, 1, 0), 90.0f);
pos = Vector3(cam.x + ((side == CameraController::ViewSide::VIEW_LEFT) ? depth : -depth), cam.y, cam.z);
pos = Vector3(pos.x,
scale * int32_t(pos.y / scale),
scale * int32_t(pos.z / scale));
orientation = ZY;
} break;
case CameraController::ViewSide::VIEW_TOP:
case CameraController::ViewSide::VIEW_BOTTOM: {
rot = Quaternion(Vector3(1, 0, 0), 90.0f);
pos = Vector3(cam.x, cam.y + ((side == CameraController::ViewSide::VIEW_TOP) ? -depth : depth), cam.z);
pos = Vector3(scale * int32_t(pos.x / scale),
pos.y,
scale * int32_t(pos.z / scale));
orientation = XZ;
} break;
default: break;
}
Expand All @@ -257,27 +265,28 @@ class GridRender : public PipelineTask {
Ray::Hit hit;
ray.intersect(Plane(Vector3(0, 0, 0), Vector3(1, 0, 0), Vector3(0, 0, 1)), &hit, true);

float length = MIN(hit.distance, camera->farPlane()) * 10.0f;
float length = MIN(hit.distance, camera->farPlane()) * 0.01f;

m_scale = 10.0f;
m_scale = 1;
while(m_scale < length) {
m_scale *= 10.0f;
m_scale *= 10;
}

width = length / m_scale;
float scale = m_scale * 0.1f;
pos = Vector3(scale * int32_t(pos.x / scale),
0.0f,
scale * int32_t(pos.z / scale));
zoom = m_scale * 0.01f;

planeScale = m_scale * 1000.0f;

pos.y = 0.0f;

rot = Quaternion(Vector3(1, 0, 0), 90.0f);
}

m_grid->setTransform(Matrix4(pos, rot, m_scale));
m_grid->setTransform(Matrix4(pos, rot, planeScale));
m_grid->setBool("ortho", &ortho);
m_grid->setFloat("scale", &m_scale);
m_grid->setFloat("width", &width);
m_grid->setVector4("gridColor", &m_gridColor);
m_grid->setInteger("scale", &m_scale);
m_grid->setFloat("width", &zoom);
m_grid->setInteger("orientation", &orientation);
m_grid->setVector4("gridColor", &gridColor);

CommandBuffer *buffer = context.buffer();

Expand All @@ -300,7 +309,7 @@ class GridRender : public PipelineTask {

MaterialInstance *m_grid;

float m_scale;
int m_scale;

};

Expand Down Expand Up @@ -642,8 +651,8 @@ PipelineContext *Viewport::pipelineContext() const {
return m_renderSystem->pipelineContext();
}

float Viewport::gridCell() {
return m_gridRender->scale() * 0.001f;
int Viewport::gridCell() {
return m_gridRender->scale();
}

bool Viewport::isGamePaused() const {
Expand Down
Loading