diff --git a/engine/includes/editor/viewport/cameracontroller.h b/engine/includes/editor/viewport/cameracontroller.h index 0524862f8..4f75da1b3 100644 --- a/engine/includes/editor/viewport/cameracontroller.h +++ b/engine/includes/editor/viewport/cameracontroller.h @@ -127,8 +127,6 @@ public slots: Vector2 m_delta; Vector2 m_saved; - Actor *m_camera; - Camera *m_activeCamera; Object *m_activeRootObject; diff --git a/engine/includes/editor/viewport/viewport.h b/engine/includes/editor/viewport/viewport.h index 2b346f15f..5bb687e3a 100644 --- a/engine/includes/editor/viewport/viewport.h +++ b/engine/includes/editor/viewport/viewport.h @@ -33,7 +33,7 @@ class ENGINE_EXPORT Viewport : public QWidget { PipelineContext *pipelineContext() const; - float gridCell(); + int gridCell(); bool isGamePaused() const; void setGamePaused(bool pause); diff --git a/engine/src/components/transform.cpp b/engine/src/components/transform.cpp index ebccd3b86..efaf14108 100644 --- a/engine/src/components/transform.cpp +++ b/engine/src/components/transform.cpp @@ -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 locker(m_mutex); - m_rotation = angles; - m_quaternion = Quaternion(m_rotation); - setDirty(); + if(m_rotation != angles) { + std::unique_lock locker(m_mutex); + m_rotation = angles; + m_quaternion = Quaternion(m_rotation); + setDirty(); + } } /*! Returns current rotation of the Transform in local space as Quaternion. @@ -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 locker(m_mutex); - m_quaternion = quaternion; -#ifdef SHARED_DEFINE - //m_rotation = m_quaternion.euler(); -#endif - setDirty(); + if(m_quaternion != quaternion) { + std::unique_lock 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. @@ -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 locker(m_mutex); - m_scale = scale; - setDirty(); + if(m_scale != scale) { + std::unique_lock locker(m_mutex); + m_scale = scale; + setDirty(); + } } /*! Marks transform as dirty. diff --git a/engine/src/editor/viewport/cameracontroller.cpp b/engine/src/editor/viewport/cameracontroller.cpp index a8e9e6995..98b5f5698 100644 --- a/engine/src/editor/viewport/cameracontroller.cpp +++ b/engine/src/editor/viewport/cameracontroller.cpp @@ -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(m_camera->component(gCamera)); + Actor *actor = Engine::composeActor(gCamera, gCamera, nullptr); + m_activeCamera = static_cast(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() { @@ -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); @@ -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); @@ -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)); @@ -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); @@ -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; } @@ -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; @@ -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())); } diff --git a/engine/src/editor/viewport/viewport.cpp b/engine/src/editor/viewport/viewport.cpp index ad48ae07a..3ffae6680 100644 --- a/engine/src/editor/viewport/viewport.cpp +++ b/engine/src/editor/viewport/viewport.cpp @@ -177,7 +177,7 @@ class GridRender : public PipelineTask { } } - float scale() const { + int scale() const { return m_scale; } @@ -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(); @@ -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; } @@ -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(); @@ -300,7 +309,7 @@ class GridRender : public PipelineTask { MaterialInstance *m_grid; - float m_scale; + int m_scale; }; @@ -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 { diff --git a/modules/editor/grapheditor/editor/graph/graphcontroller.cpp b/modules/editor/grapheditor/editor/graph/graphcontroller.cpp index ae4946218..7bdaa042b 100644 --- a/modules/editor/grapheditor/editor/graph/graphcontroller.cpp +++ b/modules/editor/grapheditor/editor/graph/graphcontroller.cpp @@ -13,8 +13,10 @@ GraphController::GraphController(GraphView *view) : m_focusedWidget(nullptr), m_graph(nullptr), m_view(view), + m_zoom(1), m_drag(false) { + m_activeCamera->setOrthographic(true); } NodeWidget *GraphController::focusNode() { @@ -57,8 +59,6 @@ void GraphController::composeLinks() { } void GraphController::update() { - Vector4 pos = Input::mousePosition(); - if((Input::isMouseButtonUp(Input::MOUSE_RIGHT) && !m_cameraInMove) || (Input::isMouseButtonUp(Input::MOUSE_LEFT) && m_view->isCreationLink())) { @@ -85,12 +85,14 @@ void GraphController::update() { emit unsetCursor(); } + Vector4 pos = Input::mousePosition(); RectTransform *parentRect = static_cast(m_view->view().transform()); Vector2 parentSize(parentRect->size()); - Vector3 localPos = parentRect->worldTransform().inverse() * Vector3(pos.x, pos.y, 0.0f); + Vector3 parentScale(parentRect->scale()); + Vector3 localPos(parentRect->worldTransform().inverse() * Vector3(pos.x, pos.y, 0.0f)); - float px = localPos.x - parentSize.x * 0.5f; - float py = localPos.y - parentSize.y * 0.5f; + float px = localPos.x - (parentSize.x / parentScale.x) * 0.5f; + float py = localPos.y - (parentSize.y / parentScale.y) * 0.5f; if(Input::isMouseButtonDown(Input::MOUSE_LEFT)) { if(m_focusedWidget == nullptr && @@ -171,35 +173,38 @@ void GraphController::update() { } if(Input::isMouseButtonUp(Input::MOUSE_LEFT)) { - std::list list; - for(auto it : qAsConst(m_selectedItems)) { - GraphNode *node = static_cast(it); - NodeWidget *widget = reinterpret_cast(node->widget()); - list.push_back(widget); - } - for(auto it : qAsConst(m_softSelectedItems)) { - GraphNode *node = static_cast(it); - NodeWidget *widget = reinterpret_cast(node->widget()); - list.push_back(widget); + if(m_drag) { + std::list list; + for(auto it : qAsConst(m_selectedItems)) { + GraphNode *node = static_cast(it); + NodeWidget *widget = reinterpret_cast(node->widget()); + list.push_back(widget); + } + for(auto it : qAsConst(m_softSelectedItems)) { + GraphNode *node = static_cast(it); + NodeWidget *widget = reinterpret_cast(node->widget()); + list.push_back(widget); + } + UndoManager::instance()->push(new MoveNodes(list, this)); + + m_drag = false; } - UndoManager::instance()->push(new MoveNodes(list, this)); m_focusedWidget = nullptr; - m_drag = false; } if(m_drag) { if(Input::isMouseButton(Input::MOUSE_LEFT)) { Vector3 newPos = m_originNodePos + Vector3(px, py, 0.0f) - m_originMousePos; - float snap = m_view->gridCell(); - for(int n = 0; n < 3; n++) { - newPos[n] = snap * int(newPos[n] / snap); - } - RectTransform *rect = reinterpret_cast(m_focusedWidget)->rectTransform(); Vector3 deltaPos = (newPos - Vector3(0.0f, rect->size().y, 0.0f)) - rect->position(); + int snap = m_view->gridCell(); + for(int n = 0; n < 3; n++) { + deltaPos[n] = snap * int(deltaPos[n] / (float)snap); + } + for(auto it : qAsConst(m_selectedItems)) { GraphNode *node = static_cast(it); RectTransform *rect = reinterpret_cast(node->widget())->rectTransform(); @@ -233,7 +238,7 @@ void GraphController::update() { m_drag = false; } } else { - if(m_focusedWidget && (Vector3(pos.x, pos.y, 0.0f) - m_originMousePos).length() > 5.0f) { // Drag sensor = 5.0f + if(m_focusedWidget && (Vector3(px, py, 0.0f) - m_originMousePos).length() > 5.0f) { // Drag sensor = 5.0f if(m_selectedItems.isEmpty() || !isSelected(m_focusedWidget)) { // Select on drag for(auto it : qAsConst(m_selectedItems)) { GraphNode *node = static_cast(it); @@ -267,13 +272,11 @@ void GraphController::update() { } } - if(m_focusedWidget) { - RectTransform *rect = m_focusedWidget->rectTransform(); - if(rect) { - m_originNodePos = rect->position() + Vector3(0.0f, rect->size().y, 0.0f); - } - m_drag = true; + RectTransform *rect = m_focusedWidget->rectTransform(); + if(rect) { + m_originNodePos = rect->position() + Vector3(0.0f, rect->size().y, 0.0f); } + m_drag = true; } } } @@ -302,13 +305,29 @@ void GraphController::cameraMove(const Vector3 &delta) { } void GraphController::cameraZoom(float delta) { - CameraController::cameraZoom(delta); + m_zoom += (delta > 0) ? -1 : 1; - Transform *t = m_view->view().transform(); + if(m_zoom >= 1 && m_zoom <= 10) { + RectTransform *t = static_cast(m_view->view().transform()); + Vector3 world(m_activeCamera->unproject(t->position())); + + float scale = 1.1f - ((float)m_zoom / 10.0f); + + m_activeCamera->setOrthoSize(m_screenSize.y / scale); + + t->setScale(Vector3(scale, scale, 1.0f)); + t->setPosition(Vector3(m_activeCamera->project(world), 0.0f)); + } else { + m_zoom = CLAMP(m_zoom, 1, 10); + } +} + +void GraphController::resize(int32_t width, int32_t height) { + CameraController::resize(width, height); - float scale = CLAMP(t->scale().x * 1000.0f + delta, m_zoomLimit.x, m_zoomLimit.y) * 0.001f; + float scale = 1.1f - ((float)m_zoom / 10.0f); - t->setScale(Vector3(scale, scale, 1.0f)); + m_activeCamera->setOrthoSize(height / scale); } bool GraphController::isSelected(NodeWidget *widget) const { @@ -337,7 +356,7 @@ MoveNodes::MoveNodes(const std::list &selection, GraphController * RectTransform *rect = it->rectTransform(); Vector3 pos(rect->position()); - m_points.push_back(Vector2(pos.x, -pos.y - rect->size().y)); + m_points.push_back(Vector2(pos.x, pos.y)); } } void MoveNodes::undo() { @@ -352,7 +371,7 @@ void MoveNodes::redo() { // Update widget position RectTransform *rect = reinterpret_cast(node->widget())->rectTransform(); - rect->setPosition(Vector3(node->position().x, -node->position().y - rect->size().y, 0.0f)); + rect->setPosition(Vector3(node->position().x, node->position().y, 0.0f)); } // Recalc links positions static_cast(m_controller)->composeLinks(); diff --git a/modules/editor/grapheditor/editor/graph/graphcontroller.h b/modules/editor/grapheditor/editor/graph/graphcontroller.h index 19cb41b45..116a2a1f1 100644 --- a/modules/editor/grapheditor/editor/graph/graphcontroller.h +++ b/modules/editor/grapheditor/editor/graph/graphcontroller.h @@ -30,6 +30,8 @@ class GraphController : public CameraController { void cameraZoom(float delta) override; + void resize(int32_t width, int32_t height) override; + bool isSelected(NodeWidget *widget) const; private: @@ -46,6 +48,8 @@ class GraphController : public CameraController { GraphView *m_view; + int m_zoom; + bool m_drag; }; diff --git a/modules/editor/grapheditor/editor/graph/graphnode.cpp b/modules/editor/grapheditor/editor/graph/graphnode.cpp index 74b87db02..c96e656df 100644 --- a/modules/editor/grapheditor/editor/graph/graphnode.cpp +++ b/modules/editor/grapheditor/editor/graph/graphnode.cpp @@ -79,7 +79,7 @@ Widget *GraphNode::widget() { if(m_nodeWidget == nullptr) { Actor *nodeActor = Engine::composeActor(gNodeWidget, qPrintable(objectName())); if(nodeActor) { - NodeWidget *nodeWidget = static_cast(nodeActor->component(gNodeWidget)); + NodeWidget *nodeWidget = nodeActor->getComponent(); nodeWidget->setGraphNode(this); nodeWidget->setBorderColor(Vector4(0.0f, 0.0f, 0.0f, 1.0f)); diff --git a/modules/editor/grapheditor/editor/graph/graphview.cpp b/modules/editor/grapheditor/editor/graph/graphview.cpp index 7869c4a36..017bcc516 100644 --- a/modules/editor/grapheditor/editor/graph/graphview.cpp +++ b/modules/editor/grapheditor/editor/graph/graphview.cpp @@ -92,13 +92,6 @@ GraphView::GraphView(QWidget *parent) : m_controller = new GraphController(this); m_controller->frontSide(); m_controller->blockRotations(true); - m_controller->setZoomLimits(Vector2(400, 2000)); - - Camera *camera = m_controller->camera(); - if(camera) { - camera->setOrthographic(true); - camera->setOrthoSize(500.0f); - } static bool firtCall = true; if(firtCall) { @@ -121,10 +114,10 @@ void GraphView::setWorld(World *scene) { m_view = Engine::composeActor("Widget", "View", m_scene); Actor *actor = Engine::composeActor(gLinksRender, gLinksRender, m_view); - m_linksRender = static_cast(actor->component(gLinksRender)); + m_linksRender = actor->getComponent(); actor = Engine::composeActor(gFrame, gFrame, m_view); - m_rubberBand = static_cast(actor->component(gFrame)); + m_rubberBand = actor->getComponent(); m_rubberBand->setColor(Vector4(0.376f, 0.376f, 0.376f, 0.3f)); m_rubberBand->setBorderColor(Vector4(0.6f, 0.6f, 0.6f, 1.0f)); diff --git a/modules/editor/grapheditor/editor/graph/graphwidgets/linksrender.cpp b/modules/editor/grapheditor/editor/graph/graphwidgets/linksrender.cpp index 10b7c053f..dfb94cd29 100644 --- a/modules/editor/grapheditor/editor/graph/graphwidgets/linksrender.cpp +++ b/modules/editor/grapheditor/editor/graph/graphwidgets/linksrender.cpp @@ -43,7 +43,12 @@ void LinksRender::draw(CommandBuffer &buffer) { } if(m_creationMesh && m_portWidget) { RectTransform *parentTransform = static_cast(static_cast(actor()->parent())->transform()); + Vector2 parentScale(parentTransform->scale()); Vector2 parentSize(parentTransform->size()); + + parentSize.x /= parentScale.x; + parentSize.y /= parentScale.y; + Matrix4 worlToView(parentTransform->worldTransform().inverse()); Vector3Vector vertices; @@ -119,7 +124,12 @@ void LinksRender::composeLinks() { IndexVector indices; RectTransform *parentTransform = static_cast(static_cast(actor()->parent())->transform()); + Vector2 parentScale(parentTransform->scale()); Vector2 parentSize(parentTransform->size()); + + parentSize.x /= parentScale.x; + parentSize.y /= parentScale.y; + Matrix4 worlToView(parentTransform->worldTransform().inverse()); uint32_t link = 0; diff --git a/modules/editor/grapheditor/editor/graph/statenode.cpp b/modules/editor/grapheditor/editor/graph/statenode.cpp index 7b74f1182..7df34d870 100644 --- a/modules/editor/grapheditor/editor/graph/statenode.cpp +++ b/modules/editor/grapheditor/editor/graph/statenode.cpp @@ -5,17 +5,19 @@ #include Widget *StateNode::widget() { - NodeWidget *result = static_cast(GraphNode::widget()); + if(m_nodeWidget == nullptr) { + NodeWidget *result = static_cast(GraphNode::widget()); - Frame *title = result->title(); - Vector4 corners(title->corners()); - corners.z = corners.w = corners.x; - title->setCorners(corners); + Frame *title = result->title(); + Vector4 corners(title->corners()); + corners.z = corners.w = corners.x; + title->setCorners(corners); - RectTransform *titleRect = title->rectTransform(); - titleRect->setSize(Vector2(0.0f)); - titleRect->setMargin(Vector4(5.0f)); - titleRect->setAnchors(Vector2(0.0f), Vector2(1.0f)); + RectTransform *titleRect = title->rectTransform(); + titleRect->setSize(Vector2(0.0f)); + titleRect->setMargin(Vector4(5.0f)); + titleRect->setAnchors(Vector2(0.0f), Vector2(1.0f)); + } - return result; + return m_nodeWidget; } diff --git a/modules/uikit/src/components/recttransform.cpp b/modules/uikit/src/components/recttransform.cpp index c54cdd993..d7f33f339 100644 --- a/modules/uikit/src/components/recttransform.cpp +++ b/modules/uikit/src/components/recttransform.cpp @@ -279,27 +279,27 @@ void RectTransform::cleanDirty() const { RectTransform *parentRect = dynamic_cast(m_parent); if(parentRect) { - Vector2 parentCenter(parentRect->m_size * (m_minAnchors + m_maxAnchors) * 0.5f); - Vector2 rectCenter(m_size * m_pivot); - - Vector3 parentScale(parentRect->worldScale()); + Vector2 anchors(m_minAnchors + m_maxAnchors); + Vector2 parentCenter(anchors * parentRect->m_size * 0.5f); float x; if(abs(m_minAnchors.x - m_maxAnchors.x) > EPSILON) { // fit to parent - x = parentRect->m_size.x * m_minAnchors.x + m_margin.w * parentScale.x; + x = parentRect->m_size.x * m_minAnchors.x + m_margin.w; } else { - x = parentScale.x * (parentCenter.x - rectCenter.x); + x = parentCenter.x / parentRect->m_scale.x - m_size.x * m_pivot.x; } float y; if(abs(m_minAnchors.y - m_maxAnchors.y) > EPSILON) { // fit to parent - y = parentRect->m_size.y * m_minAnchors.y + m_margin.z * parentScale.y; + y = parentRect->m_size.y * m_minAnchors.y + m_margin.z; } else { - y = parentScale.y * (parentCenter.y - rectCenter.y); + y = parentCenter.y / parentRect->m_scale.y - m_size.y * m_pivot.y; } - m_worldTransform[12] += x; - m_worldTransform[13] += y; + m_transform[12] += x; + m_transform[13] += y; + + m_worldTransform = parentRect->worldTransform() * m_transform; } } /*! diff --git a/worldeditor/bin/editor/materials/grid.shader b/worldeditor/bin/editor/materials/grid.shader index 6bb29d984..d2ceb480a 100644 --- a/worldeditor/bin/editor/materials/grid.shader +++ b/worldeditor/bin/editor/materials/grid.shader @@ -1,8 +1,9 @@ - + + 0.0f && offset.x < lineWidth) { + color = xColor; + } + + if(offset.y > 0.0f && offset.y < lineWidth) { + color = yColor; + } - vec2 offset = _uv0 * subItems * scale; - if(mod(offset.x, cell) < w || mod(offset.y, cell) < w) { - rgb = vec4(1.0, 0.0, 0.0, fog); - if(mod(offset.x, cell * subItems) < w || mod(offset.y, cell * subItems) < w) { - rgb = vec4(_color.xyz * mainColor.xyz, fog); + rgb = vec4(color, fog); } else { - rgb = vec4(_color.xyz * mainColor.xyz, fog * 0.5 * (1.0 - width)); + rgb = vec4(mainColor.xyz, fog * 0.4f); } } else { discard;