Skip to content

Commit

Permalink
Added selection of objects
Browse files Browse the repository at this point in the history
  • Loading branch information
Borf committed Jan 17, 2022
1 parent 844ba1b commit ee7b51c
Show file tree
Hide file tree
Showing 22 changed files with 319 additions and 91 deletions.
1 change: 1 addition & 0 deletions BrowEdit3.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="browedit\BrowEdit.h" />
<ClInclude Include="browedit\components\Collider.h" />
<ClInclude Include="browedit\components\Component.h" />
<ClInclude Include="browedit\components\Gnd.h" />
<ClInclude Include="browedit\components\GndRenderer.h" />
Expand Down
3 changes: 3 additions & 0 deletions BrowEdit3.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,9 @@
<ClInclude Include="browedit\components\ImguiProps.h">
<Filter>browedit\components</Filter>
</ClInclude>
<ClInclude Include="browedit\components\Collider.h">
<Filter>browedit\components</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="BrowEdit3.rc">
Expand Down
3 changes: 3 additions & 0 deletions Browedit3_Pause.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@echo off
BrowEdit3.exe
pause
62 changes: 33 additions & 29 deletions browedit/BrowEdit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,33 +35,8 @@ void BrowEdit::run()
std::cerr << "Error initializing imgui" << std::endl;
return;
}
json configJson;
std::ifstream configFile("config.json");
if (configFile.is_open())
{
configFile >> configJson;
configFile.close();
try {
config = configJson.get<Config>();
}
catch (...) {}
if (config.isValid() != "")
{
windowData.configVisible = true;
util::FileIO::begin();
util::FileIO::addDirectory(".\\");
util::FileIO::end();
}
else
config.setupFileIO();
}
else
{
windowData.configVisible = true;
util::FileIO::begin();
util::FileIO::addDirectory(".\\");
util::FileIO::end();
}
configBegin();


backgroundTexture = new gl::Texture("data\\background.png", false);
iconsTexture = new gl::Texture("data\\icons.png", false);
Expand Down Expand Up @@ -118,7 +93,36 @@ void BrowEdit::run()
glfwEnd();
}


void BrowEdit::configBegin()
{
json configJson;
std::ifstream configFile("config.json");
if (configFile.is_open())
{
configFile >> configJson;
configFile.close();
try {
config = configJson.get<Config>();
}
catch (...) {}
if (config.isValid() != "")
{
windowData.configVisible = true;
util::FileIO::begin();
util::FileIO::addDirectory(".\\");
util::FileIO::end();
}
else
config.setupFileIO();
}
else
{
windowData.configVisible = true;
util::FileIO::begin();
util::FileIO::addDirectory(".\\");
util::FileIO::end();
}
}

bool BrowEdit::toolBarToggleButton(const std::string_view &name, int icon, bool* status)
{
Expand Down Expand Up @@ -160,7 +164,7 @@ void BrowEdit::showMapWindow(MapView& mapView)


auto size = ImGui::GetContentRegionAvail();
mapView.update(this);
mapView.update(this, size);
mapView.render(size.x / (float)size.y, config.fov);
ImTextureID id = (ImTextureID)((long long)mapView.fbo->texid[0]); //TODO: remove cast for 32bit
ImGui::Image(id, size, ImVec2(0,1), ImVec2(1,0));
Expand Down
1 change: 1 addition & 0 deletions browedit/BrowEdit.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class BrowEdit
double scrollDelta = 0;
Config config;

void configBegin();

bool glfwBegin();
void glfwEnd();
Expand Down
40 changes: 35 additions & 5 deletions browedit/MapView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@

#include <browedit/gl/FBO.h>
#include <browedit/gl/Vertex.h>
#include <browedit/math/Ray.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

#include <imgui.h>
#include <GLFW/glfw3.h>
Expand All @@ -26,7 +28,7 @@ MapView::MapView(Map* map, const std::string &viewName) : map(map), viewName(vie
void MapView::render(float ratio, float fov)
{
fbo->bind();
glViewport(0, 0, 1920, 1080);
glViewport(0, 0, fbo->getWidth(), fbo->getHeight());
glClearColor(0.1f, 0.1f, 0.15f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Expand All @@ -48,14 +50,16 @@ void MapView::render(float ratio, float fov)
map->rootNode->getComponent<GndRenderer>()->viewColors = viewColors;
map->rootNode->getComponent<GndRenderer>()->viewLighting = viewLighting;

RsmRenderer::RsmRenderContext::getInstance()->viewLighting = viewLighting;


NodeRenderer::render(map->rootNode, nodeRenderContext);
fbo->unbind();
}



void MapView::update(BrowEdit* browEdit)
void MapView::update(BrowEdit* browEdit, const ImVec2 &size)
{
mouseState.position = glm::vec2(ImGui::GetMousePos().x - ImGui::GetCursorScreenPos().x, ImGui::GetMousePos().y - ImGui::GetCursorScreenPos().y);
mouseState.buttons = (ImGui::IsMouseDown(0) ? 0x01 : 0x00) |
Expand All @@ -73,18 +77,44 @@ void MapView::update(BrowEdit* browEdit)

if (ImGui::IsWindowHovered())
{
int Viewport[4];
glGetIntegerv(GL_VIEWPORT, Viewport);
glm::vec2 mousePosScreenSpace(mouseState.position);
mousePosScreenSpace *= glm::vec2((float)fbo->getWidth() / size.x, (float)fbo->getHeight() / size.y);
mousePosScreenSpace.y = (Viewport[3] - Viewport[1]) - mousePosScreenSpace.y;
glm::vec3 retNear = glm::unProject(glm::vec3(mousePosScreenSpace, 0.0f), nodeRenderContext.viewMatrix, nodeRenderContext.projectionMatrix, glm::vec4(Viewport[0], Viewport[1], Viewport[2], Viewport[3]));
glm::vec3 retFar = glm::unProject(glm::vec3(mousePosScreenSpace, 1.0f), nodeRenderContext.viewMatrix, nodeRenderContext.projectionMatrix, glm::vec4(Viewport[0], Viewport[1], Viewport[2], Viewport[3]));
math::Ray mouseRay(retNear, glm::normalize(retFar-retNear));

auto collisions = map->rootNode->getCollisions(mouseRay);

ImGui::SetNextWindowSize(ImVec2(300, 300));
ImGui::Begin("Debug");
ImGui::InputFloat2("mouseState.pos", glm::value_ptr(mouseState.position));
ImGui::InputFloat2("mousePosScreenSpace", glm::value_ptr(mousePosScreenSpace));
ImGui::InputFloat3("Origin", glm::value_ptr(mouseRay.origin));
ImGui::InputFloat3("Dir", glm::value_ptr(mouseRay.dir));
for (auto c : collisions)
{
c.first->getComponent<RsmRenderer>()->selected = true;
ImGui::Text(c.first->name.c_str());
}
ImGui::End();

if ((mouseState.buttons&4) != 0)
{
if (glfwGetKey(browEdit->window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS)
if (glfwGetKey(browEdit->window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) //can I do this with imgui?
{
cameraRotX += (mouseState.position.y - prevMouseState.position.y) * 0.25f * browEdit->config.cameraMouseSpeed;
cameraRotY += (mouseState.position.x - prevMouseState.position.x) * 0.25f * browEdit->config.cameraMouseSpeed;
cameraRotX = glm::clamp(cameraRotX, 0.0f, 90.0f);
}
else
{
cameraCenter.x -= (mouseState.position.x - prevMouseState.position.x) * browEdit->config.cameraMouseSpeed;
cameraCenter.y -= (mouseState.position.y - prevMouseState.position.y) * browEdit->config.cameraMouseSpeed;
cameraCenter -= glm::vec2(glm::vec4(
(mouseState.position.x - prevMouseState.position.x) * browEdit->config.cameraMouseSpeed,
(mouseState.position.y - prevMouseState.position.y) * browEdit->config.cameraMouseSpeed, 0, 0)
* glm::rotate(glm::mat4(1.0f), -glm::radians(cameraRotY), glm::vec3(0, 0, 1)));
}
}
cameraDistance *= (1 - (ImGui::GetIO().MouseWheel * 0.1f));
Expand Down
3 changes: 2 additions & 1 deletion browedit/MapView.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <browedit/NodeRenderer.h>
class BrowEdit;
class Map;
struct ImVec2;

namespace gl
{
Expand Down Expand Up @@ -47,7 +48,7 @@ class MapView
MapView() = delete;


void update(BrowEdit* browEdit);
void update(BrowEdit* browEdit, const ImVec2& size);
void render(float ratio, float fov);


Expand Down
18 changes: 18 additions & 0 deletions browedit/Node.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "Node.h"
#include "components/Component.h"
#include "components/Renderer.h"
#include "components/Collider.h"


Node::Node(const std::string& name, Node* parent) : name(name), parent(parent)
Expand Down Expand Up @@ -37,3 +38,20 @@ void Node::traverse(const std::function<void(Node*)>& callBack)
for (auto n : children)
n->traverse(callBack);
}


std::vector<std::pair<Node*, std::vector<glm::vec3>>> Node::getCollisions(const math::Ray& ray)
{
std::vector<std::pair<Node*, std::vector<glm::vec3>>> ret;
traverse([&](Node* n)
{
auto collider = n->getComponent<Collider>();
if (collider)
{
auto collisions = collider->getCollisions(ray);
if (collisions.size() > 0)
ret.push_back(std::pair < Node*, std::vector<glm::vec3>>(n, collisions));
}
});
return ret;
}
5 changes: 5 additions & 0 deletions browedit/Node.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
#include <vector>
#include <string>
#include <functional>
#include <glm/glm.hpp>

namespace math { class Ray; }
class Component;

class Node
Expand Down Expand Up @@ -31,4 +33,7 @@ class Node
return nullptr;
}
void traverse(const std::function<void(Node*)>& callBack);

//TODO: move this somewhere else?
std::vector<std::pair<Node*, std::vector<glm::vec3>>> getCollisions(const math::Ray& ray);
};
2 changes: 0 additions & 2 deletions browedit/NodeRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,7 @@ void NodeRenderer::render(Node* rootNode, NodeRenderContext& context)
{
r.first->preFrame(context.projectionMatrix, context.viewMatrix);
for (auto renderer : r.second)
{
renderer->render();
}
}


Expand Down
12 changes: 12 additions & 0 deletions browedit/components/Collider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once

#include "Component.h"
#include <vector>
#include <glm/glm.hpp>
namespace math { class Ray; }

class Collider : public Component
{
public:
virtual std::vector<glm::vec3> getCollisions(const math::Ray &ray) = 0;
};
17 changes: 9 additions & 8 deletions browedit/components/RsmRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,19 +53,19 @@ void RsmRenderer::render()
}
matrixCached = true;

/*if (rswModel)
if (rswModel)
{
std::vector<blib::VertexP3> verts = blib::Shapes::box(rswModel->realbbmin, rswModel->realbbmax);
std::vector<glm::vec3> verts = math::AABB::box(rsm->realbbmin, rsm->realbbmax);
for (size_t i = 0; i < verts.size(); i++)
verts[i].position = glm::vec3(model->matrixCache * glm::vec4(glm::vec3(1, -1, 1) * verts[i].position, 1.0f));
model->aabb.min = glm::vec3(99999999, 99999999, 99999999);
model->aabb.max = glm::vec3(-99999999, -99999999, -99999999);
verts[i] = glm::vec3(matrixCache * glm::vec4(glm::vec3(1, -1, 1) * verts[i], 1.0f));
rswModel->aabb.min = glm::vec3(99999999, 99999999, 99999999);
rswModel->aabb.max = glm::vec3(-99999999, -99999999, -99999999);
for (size_t i = 0; i < verts.size(); i++)
{
model->aabb.min = glm::min(model->aabb.min, verts[i].position);
model->aabb.max = glm::max(model->aabb.max, verts[i].position);
rswModel->aabb.min = glm::min(rswModel->aabb.min, verts[i]);
rswModel->aabb.max = glm::max(rswModel->aabb.max, verts[i]);
}
}*/
}
}
auto shader = dynamic_cast<RsmRenderContext*>(renderContext)->shader;
shader->setUniform(RsmShader::Uniforms::shadeType, (int)rsm->shadeType);
Expand Down Expand Up @@ -175,6 +175,7 @@ void RsmRenderer::RsmRenderContext::preFrame(const glm::mat4& projectionMatrix,
shader->use();
shader->setUniform(RsmShader::Uniforms::projectionMatrix, projectionMatrix);
shader->setUniform(RsmShader::Uniforms::cameraMatrix, viewMatrix);
shader->setUniform(RsmShader::Uniforms::lightToggle, viewLighting);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
Expand Down
8 changes: 6 additions & 2 deletions browedit/components/RsmRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class RsmRenderer : public Renderer
lightDirection,
selection,
shadeType,
lightToggle,
End
};
};
Expand All @@ -52,13 +53,16 @@ class RsmRenderer : public Renderer
bindUniform(Uniforms::lightDirection, "lightDirection");
bindUniform(Uniforms::selection, "selection");
bindUniform(Uniforms::shadeType, "shadeType");
bindUniform(Uniforms::lightToggle, "lightToggle");
}
};
public:
class RsmRenderContext : public Renderer::RenderContext, public util::Singleton<RsmRenderContext>
{
public:
RsmShader* shader = nullptr;
glm::mat4 viewMatrix = glm::mat4(1.0f);
bool viewLighting = true;

RsmRenderContext();
virtual void preFrame(const glm::mat4& projectionMatrix, const glm::mat4& viewMatrix) override;
Expand Down Expand Up @@ -95,15 +99,15 @@ class RsmRenderer : public Renderer

std::vector<gl::Texture*> textures; //should this be shared over all RsmRenderers with the same Rsm? static map<Rsm, std::vector<Texture*> ???
bool matrixCached = false;
glm::mat4 matrixCache;

public:
RsmRenderer();
virtual void render();
void initMeshInfo(Rsm::Mesh* mesh, const glm::mat4& matrix = glm::mat4(1.0f));
void renderMesh(Rsm::Mesh* mesh, const glm::mat4& matrix);



void setDirty() { this->matrixCached = false; }
bool selected = false;
glm::mat4 matrixCache;
};
Loading

0 comments on commit ee7b51c

Please sign in to comment.