diff --git a/src/controls/include/controls/control.hpp b/src/controls/include/controls/control.hpp index d5ddda2b566ac835c57b1dedeb66baf121ea644e..b299522a32653628b6c9a1728f40c20f9d2da1fb 100644 --- a/src/controls/include/controls/control.hpp +++ b/src/controls/include/controls/control.hpp @@ -21,6 +21,7 @@ protected: public: Controller() = default; + frame_ptr getFrame() { return bound_frame; } void setFrame(frame_ptr frame) { bound_frame = frame; } void setup(float dt, frame_ptr frame); @@ -40,7 +41,9 @@ public: void setPos(float x, float y, float z) { bound_frame->setPosVec(glm::vec3(x, y, z)); } void setPosX(float coord) { bound_frame->setPosVec(glm::vec3(coord, bound_frame->getPosition().y, bound_frame->getPosition().z)); } void setPosY(float coord) { bound_frame->setPosVec(glm::vec3(bound_frame->getPosition().x, coord, bound_frame->getPosition().z)); } - void setPosZ(float coord) { bound_frame->setPosVec(glm::vec3(bound_frame->getPosition().x, bound_frame->getPosition().y, coord)); } + void setPosZ(float coord) { bound_frame->setPosVec(glm::vec3(bound_frame->getPosition().x, bound_frame->getPosition().y, coord)); } + + void translate(glm::vec3 direction) { bound_frame->translatePosVec(direction); } void keyboardMove(const std::unordered_set<std::string> &held_keys, const std::unordered_set<std::string> &pressed_keys); diff --git a/src/controls/src/control_hub.cpp b/src/controls/src/control_hub.cpp index 9c4d86ee66a322e873f1414113eafa802aa8cfee..761146c2a50facacae859370eb49df2a1edead05 100644 --- a/src/controls/src/control_hub.cpp +++ b/src/controls/src/control_hub.cpp @@ -31,7 +31,7 @@ void ControlHub::processInput(const scene_ptr &scene, const osi::Keyboard &keybo if (!window.has_keyboard_focus()) return; - if (keyboard.down().contains("O") && scene->getSelection()) + if (keyboard.down().contains("T") && scene->getSelection()) { for (auto &controller : obj_controls) { diff --git a/src/edit/include/edit/editor.hpp b/src/edit/include/edit/editor.hpp index 4b7ce927a481b5a9b225cc980f479b3fbbb09fa0..0d82a41d21c5f485a9365820c65d54434c5482c3 100644 --- a/src/edit/include/edit/editor.hpp +++ b/src/edit/include/edit/editor.hpp @@ -22,17 +22,19 @@ namespace edit class Level { - std::array<float, 3> axes = {0.0f, 0.0f, 0.0f}; + glm::vec3 axes = {0.0f, 0.0f, 0.0f}; std::uint8_t active = 2; public: + Level() = default; + Level(glm::vec3 _axes, std::uint8_t _active) : axes{_axes}, active{_active} {} std::uint8_t getActiveIndex() const { return active; } float getActive() const { return axes[active]; } float getX() { return axes[0]; } float getY() { return axes[1]; } float getZ() { return axes[2]; } - std::array<float, 3> getAll() const { return axes; } + glm::vec3 getAll() const { return axes; } void setActiveIndex(std::uint8_t index) { active = index; } void setActiveX() { active = 0; } @@ -41,6 +43,7 @@ public: Level& operator++() { ++axes[active]; return *this; } Level& operator--() { --axes[active]; return *this; } + glm::vec3 operator-(const Level &other) { return axes - other.axes; } }; @@ -78,9 +81,12 @@ public: void setPrevPlaneIntersect(glm::vec3 _prev_plane_intersect) { prev_plane_intersect = _prev_plane_intersect; } void doObjectAction(scene_ptr scene, ctrlhub_ptr controls); - void updateCamera(scene_ptr scene, ctrlhub_ptr controls); + void updateAxesCamera(scene_ptr scene, ctrlhub_ptr controls); void changeLevel(scene_ptr scene, ctrlhub_ptr controls); + void adjustGridPosition(scene_ptr scene, ctrlhub_ptr controls, glm::vec3 position); + void adjustGridRotation(scene_ptr scene, ctrlhub_ptr controls, glm::vec3 rotation); + void selectObject(scene_ptr scene, ctrlhub_ptr controls); void rotateObject(scene_ptr scene, ctrlhub_ptr controls); void moveObject(scene_ptr scene, ctrlhub_ptr controls); diff --git a/src/edit/include/edit/scene.hpp b/src/edit/include/edit/scene.hpp index 59695d428b920ab6e124b3b5208c605c807efde8..c3033841268ac35f51380d10ec7c62214bcbc54b 100644 --- a/src/edit/include/edit/scene.hpp +++ b/src/edit/include/edit/scene.hpp @@ -25,6 +25,8 @@ private: node_ptr selection_AABB; node_ptr pre_add_AABB; + node_ptr grid; + std::vector<light_ptr> lights; std::vector<camera_ptr> cameras; @@ -40,6 +42,8 @@ public: node_ptr getSelectionAABB() const { return selection_AABB; } node_ptr getPreAddAABB() const { return pre_add_AABB; } + node_ptr getGrid() const { return grid; } + std::vector<light_ptr>& getLights() { return lights; } std::vector<camera_ptr>& getCameras() { return cameras; } std::vector<camera_weak_ptr>& getActiveCameras() { return active_cameras; } diff --git a/src/edit/src/editor.cpp b/src/edit/src/editor.cpp index b79d270bb5384555a23ab18faac2a2d2092e2ef5..60cb236c6b62780c6af06190d835215fb9c6d665 100644 --- a/src/edit/src/editor.cpp +++ b/src/edit/src/editor.cpp @@ -24,17 +24,21 @@ void Editor::doObjectAction(scene_ptr scene, ctrlhub_ptr controls) } } -void Editor::updateCamera(scene_ptr scene, ctrlhub_ptr controls) +void Editor::updateAxesCamera(scene_ptr scene, ctrlhub_ptr controls) { if (!keyboard.just_pressed().contains("I") && !keyboard.just_pressed().contains("K") && !keyboard.just_pressed().contains("L") ) return; - std::array<float, 3> cam_levels = build_level.getAll(); + glm::vec3 cam_levels = build_level.getAll(); std::array<glm::vec3, 3> rotations = { glm::vec3(0.0f, -90.0f, 0.0f), // L(x-depth) - glm::vec3(-90.0f, 0.0f, 0.0f), // I (y-depth) // FIX - should be -90.0f + glm::vec3(-90.0f, 0.0f, 0.0f), // I (y-depth) // FIX - breaks things glm::vec3(0.0f, 180.0f, 0.0f) }; // K (z-depth) + + std::array<glm::vec3, 3> grid_rotations = { glm::vec3(-90.0f, -90.0f, 0.0f), // L(x-depth) + glm::vec3(0.0f, 0.0f, 0.0f), // I (y-depth) + glm::vec3(-90.0f, 0.0f, 0.0f) }; // K (z-depth) std::uint8_t new_active = 0; if (keyboard.just_pressed().contains("I")) @@ -50,15 +54,41 @@ void Editor::updateCamera(scene_ptr scene, ctrlhub_ptr controls) build_level.setActiveIndex(new_active); controls->getActiveCamCtrl()->setRotation(rotations[new_active]); controls->getActiveCamCtrl()->setPos(cam_levels[0], cam_levels[1], cam_levels[2]); + + // NOTE: grid could have its own controller ? + // scene->getGrid()->getFrame()->setRotationQuat(grid_rotations[new_active]); + adjustGridRotation(scene, controls, grid_rotations[new_active]); + } void Editor::changeLevel(scene_ptr scene, ctrlhub_ptr controls) { + auto prev_build_level = build_level; if (keyboard.just_pressed().contains("P")) ++build_level; if (keyboard.just_pressed().contains("O")) --build_level; + + adjustGridPosition(scene, controls, build_level - prev_build_level); +} + +void Editor::adjustGridPosition(scene_ptr scene, ctrlhub_ptr controls, glm::vec3 position) +{ + auto prev_active_object = controls->getActiveObjCtrl()->getFrame(); + controls->bindObject(scene->getGrid()->getFrame()); + controls->getActiveObjCtrl()->translate(position); + controls->bindObject(prev_active_object); +} + +void Editor::adjustGridRotation(scene_ptr scene, ctrlhub_ptr controls, glm::vec3 rotation) +{ + auto prev_active_object = controls->getActiveObjCtrl()->getFrame(); + controls->bindObject(scene->getGrid()->getFrame()); + controls->getActiveObjCtrl()->setRotation(rotation); + controls->bindObject(prev_active_object); + } + void Editor::selectObject(scene_ptr scene, ctrlhub_ptr controls) { if (!mouse.just_released().contains("MouseLeft")) diff --git a/src/edit/src/scene.cpp b/src/edit/src/scene.cpp index be535437fa1ab8ed2a07807289fd4ec8e7984f59..08da752354dc043df990d1c23b5fbb26a1198fd0 100644 --- a/src/edit/src/scene.cpp +++ b/src/edit/src/scene.cpp @@ -25,6 +25,13 @@ void Scene::createScene() addNode(glm::vec3(5, 1, -4)); addMesh(scene.back(), cube); + addNode(glm::vec3(2, 0, 1)); + addMesh(scene.back(), cube); + addNode(glm::vec3(2, 2, 1)); + addMesh(scene.back(), cube); + addNode(glm::vec3(2, 2, 2)); + addMesh(scene.back(), cube); + /* ADD AXIS OBJECT */ // Mesh axis(axis_obj_vertices, axis_obj_indices, axis_obj_normals); // axis.setShaderType("basic"); @@ -32,11 +39,10 @@ void Scene::createScene() // addMesh(scene.back(), axis); /* ADD TRIANGLE */ - Mesh triangle(triangle_vertices, triangle_indices); - triangle.setShaderType("basic"); - - addNode(glm::vec3(0, -0.5f, 0)); - addMesh(scene.back(), triangle); + // Mesh triangle(triangle_vertices, triangle_indices); + // triangle.setShaderType("basic"); + // addNode(glm::vec3(0, -0.5f, 0)); + // addMesh(scene.back(), triangle); /* ADD LIGHT CUBE AND ITS LIGHT */ Mesh light_cube(lit_cube_vertices, @@ -44,32 +50,33 @@ void Scene::createScene() std::vector<float>{}, glm::vec3(1.0f, 1.0f, 1.0f), "basic"); - addNode(glm::vec3(1.2f, 2.0f, 2.0f)); + addNode(glm::vec3(1.2f, 5.0f, 2.0f)); scene.back()->getFrame()->setScale(glm::vec3(0.1f, 0.1f, 0.1f)); addMesh(scene.back(), light_cube); addLight(scene.back(), glm::vec3(1.0f, 1.0f, 1.0f)); /* ADD GRID */ - mesh_ptr grid = std::make_shared<Mesh>(generate_grid_vertices(100), + mesh_ptr grid_mesh = std::make_shared<Mesh>(generate_grid_vertices(100), generate_grid_indices(100), std::vector<float>{}, glm::vec3(0.5f, 0.5f, 0.5f), "basic"); - grid->setDrawMode(GL_LINES); - grid->setSelectability(false); + grid_mesh->setDrawMode(GL_LINES); + grid_mesh->setSelectability(false); addNode(Frame{}); - addMesh(scene.back(), std::move(grid)); + addMesh(scene.back(), std::move(grid_mesh)); + grid = scene.back(); /* ADD DEER */ - addMeshNode("./data/models/deer.obj", glm::vec3(0, 2, 0)); - scene.back()->getFrame()->setScale(glm::vec3(0.01f, 0.01f, 0.01f)); + // addMeshNode("./data/models/deer.obj", glm::vec3(0, 2, 0)); + // scene.back()->getFrame()->setScale(glm::vec3(0.01f, 0.01f, 0.01f)); - /* ADD .OBJ CUBE */ - addMeshNode("./data/models/cube.obj", glm::vec3(-3, 2, 0)); + // /* ADD .OBJ CUBE */ + // addMeshNode("./data/models/cube.obj", glm::vec3(-3, 2, 0)); - /* ADD .OBJ VASE */ - addMeshNode("./data/models/smooth_vase.obj", glm::vec3(2, 1, -1)); + // /* ADD .OBJ VASE */ + // addMeshNode("./data/models/smooth_vase.obj", glm::vec3(2, 1, -1)); // /* ADD .OBJ GIRAFFE */ // addMeshNode("./data/models/final_giraffe.obj", glm::vec3(-5, 1, 3)); diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp index 2825e3955c4d62bba122aa08d9297b0ab62301bf..1d5936b0d45193a64ebc15c61515f4abd0b31ad6 100644 --- a/src/gfx/src/render.cpp +++ b/src/gfx/src/render.cpp @@ -19,17 +19,18 @@ std::vector<float> generate_grid_vertices(int span) { for(int j = 1; j >= -1; j -= 2) { - vertices.emplace_back((float)i); + vertices.emplace_back((float)i + 0.5f); vertices.emplace_back(0.0f); - vertices.emplace_back((float)(span * j)); + vertices.emplace_back((float)(span * j) + 0.5f); } for(int j = 1; j >= -1; j -= 2) { - vertices.emplace_back((float)(span * j)); + vertices.emplace_back((float)(span * j) + 0.5f); vertices.emplace_back(0.0f); - vertices.emplace_back((float)i); + vertices.emplace_back((float)i + 0.5f); } } + return vertices; } diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp index 49a338c17447331a49c52d3f3b8f84c637cb6496..32f19896c104f05981f7b1b21ef10c183d4c08c2 100644 --- a/src/studio/src/simulator.cpp +++ b/src/studio/src/simulator.cpp @@ -15,9 +15,9 @@ Simulator::Simulator() "./data/shaders/basicshader.frag")}} { /* ROTATE FIRST OBJECT */ - controls->bindObject(scene->getScene()[0]->getFrame()); - controls->rotate_obj(glm::vec3(0.0f, 50.0f, 0.0f)); - controls->rotate_obj(glm::vec3(45.0f, 0.0f, 0.0f)); + // controls->bindObject(scene->getScene()[0]->getFrame()); + // controls->rotate_obj(glm::vec3(0.0f, 50.0f, 0.0f)); + // controls->rotate_obj(glm::vec3(45.0f, 0.0f, 0.0f)); /* SET ACTIVE CAMERA AND CONTROLLER TYPE * ADD ACTIVE CAMERAS HERE. */ @@ -37,7 +37,7 @@ void Simulator::update() controls->processInput(scene, keyboard(), timer(), window()); controls->processMouse(mouse(), window(), editor->getEditorRunning()); - editor->updateCamera(scene, controls); + editor->updateAxesCamera(scene, controls); editor->doObjectAction(scene, controls); editor->changeLevel(scene, controls);