Use scene module in editor
This commit is contained in:
parent
55f5537a67
commit
a0a40f1d04
7 changed files with 78 additions and 140 deletions
|
|
@ -11,11 +11,12 @@ file(GLOB HEADERS "./public/*.hpp" "./public/*/*.hpp")
|
||||||
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
|
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
|
||||||
|
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC ./public/ ${BINDINGS_INCLUDE} ./ext/)
|
target_include_directories(${PROJECT_NAME} PUBLIC ./public/ ${BINDINGS_INCLUDE} ./ext/)
|
||||||
target_link_libraries(${PROJECT_NAME} PUBLIC Graphics Connection Widgets Math RasterRender)
|
target_link_libraries(${PROJECT_NAME} PUBLIC Graphics Connection Widgets Math RasterRender 3DScene)
|
||||||
target_link_libraries(${PROJECT_NAME} PUBLIC ${BINDINGS_LIBS})
|
target_link_libraries(${PROJECT_NAME} PUBLIC ${BINDINGS_LIBS})
|
||||||
|
|
||||||
### -------------------------- Applications -------------------------- ###
|
### -------------------------- Applications -------------------------- ###
|
||||||
add_executable(3DEditorApp ./applications/Entry.cpp ./applications/SceneLoad.cpp)
|
file(GLOB APP_SOURCES "./applications/*.cpp")
|
||||||
|
add_executable(3DEditorApp ${APP_SOURCES})
|
||||||
target_link_libraries(3DEditorApp ${PROJECT_NAME} Lua ImageIO)
|
target_link_libraries(3DEditorApp ${PROJECT_NAME} Lua ImageIO)
|
||||||
|
|
||||||
file(COPY "rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/")
|
file(COPY "rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/")
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,17 @@
|
||||||
|
|
||||||
using namespace tp;
|
using namespace tp;
|
||||||
|
|
||||||
bool loadMeshes(tp::Scene& scene, const std::string& objetsPath);
|
|
||||||
|
|
||||||
class EditorGUI : public Application {
|
class EditorGUI : public Application {
|
||||||
public:
|
public:
|
||||||
EditorGUI() {
|
EditorGUI() {
|
||||||
Vec2F renderResolution = { 1000, 1000 };
|
Vec2F renderResolution = { 1000, 1000 };
|
||||||
auto canvas = this->mGraphics->getCanvas();
|
auto canvas = this->mGraphics->getCanvas();
|
||||||
mGui = new EditorWidget<EventHandler, Canvas>(canvas, &geometry, renderResolution);
|
mGui = new EditorWidget<EventHandler, Canvas>(canvas, &mScene, renderResolution);
|
||||||
|
|
||||||
loadMeshes(geometry, "rsc/scene.obj");
|
mScene.load("rsc/scene.obj");
|
||||||
|
|
||||||
geometry.mCamera.lookAtPoint({ 0, 0, 0 }, { 3, 3, 2 }, { 0, 0, 1 });
|
mScene.mCamera.lookAtPoint({ 0, 0, 0 }, { 3, 3, 2 }, { 0, 0, 1 });
|
||||||
}
|
}
|
||||||
|
|
||||||
~EditorGUI() override { delete mGui; }
|
~EditorGUI() override { delete mGui; }
|
||||||
|
|
@ -33,7 +32,7 @@ public:
|
||||||
void drawFrame(Canvas* canvas) override { mGui->drawWrapper(*canvas); }
|
void drawFrame(Canvas* canvas) override { mGui->drawWrapper(*canvas); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Scene geometry;
|
Scene mScene;
|
||||||
WidgetManager mWidgetManager;
|
WidgetManager mWidgetManager;
|
||||||
EditorWidget<EventHandler, Canvas>* mGui;
|
EditorWidget<EventHandler, Canvas>* mGui;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
#include "Scene.hpp"
|
|
||||||
|
|
||||||
#include "obj/OBJ_Loader.h"
|
|
||||||
#include <filesystem>
|
|
||||||
|
|
||||||
bool loadMeshes(tp::Scene& scene, const std::string& objetsPath) {
|
|
||||||
using namespace tp;
|
|
||||||
|
|
||||||
objl::Loader Loader;
|
|
||||||
|
|
||||||
if (!Loader.LoadFile(objetsPath.c_str())) {
|
|
||||||
std::cout << "Failed to Load File. May have failed to find it or it was not an .obj file.\n";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& curMesh : Loader.LoadedMeshes) {
|
|
||||||
scene.mObjects.append(Object());
|
|
||||||
|
|
||||||
auto object = &scene.mObjects.last();
|
|
||||||
|
|
||||||
for (auto& vertex : curMesh.Vertices) {
|
|
||||||
// printf("{ %f, %f, %f }, \n", vertex.Position.X, vertex.Position.Y, vertex.Position.Z);
|
|
||||||
object->mTopology.Points.append(Vec3F{ vertex.Position.X, vertex.Position.Y, vertex.Position.Z });
|
|
||||||
object->mTopology.Normals.append(Vec3F{ vertex.Normal.X, vertex.Normal.Y, vertex.Normal.Z });
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int j = 0; j < curMesh.Indices.size(); j += 3) {
|
|
||||||
uint4 idx1 = (int) curMesh.Indices[j];
|
|
||||||
uint4 idx2 = (int) curMesh.Indices[j + 1];
|
|
||||||
uint4 idx3 = (int) curMesh.Indices[j + 2];
|
|
||||||
// printf("{ %i, %i, %i },\n", idx1, idx2, idx3);
|
|
||||||
object->mTopology.Indexes.append({ idx1, idx2, idx3 });
|
|
||||||
}
|
|
||||||
|
|
||||||
if (object->mTopology.Normals.size() != object->mTopology.Points.size()) {
|
|
||||||
printf("Logic error loading normals\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return scene.mObjects.size();
|
|
||||||
}
|
|
||||||
61
3DEditor/private/GPUBuffers.hpp
Normal file
61
3DEditor/private/GPUBuffers.hpp
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Scene.hpp"
|
||||||
|
#include "GraphicsApi.hpp"
|
||||||
|
|
||||||
|
namespace tp {
|
||||||
|
|
||||||
|
class ObjectBuffers : public GPUBuffers {
|
||||||
|
public:
|
||||||
|
ObjectBuffers(Object* object) {
|
||||||
|
mObject = (object);
|
||||||
|
|
||||||
|
auto& buff = mObject->mTopology.Points;
|
||||||
|
auto& indices = mObject->mTopology.Indexes;
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &VAO);
|
||||||
|
glGenBuffers(1, &VBO);
|
||||||
|
glGenBuffers(1, &EBO);
|
||||||
|
|
||||||
|
glBindVertexArray(VAO);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(Vec3F) * buff.size(), buff.getBuff(), GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
|
||||||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Vec3<uhalni>) * indices.size(), indices.getBuff(), GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr);
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
|
||||||
|
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object* mObject = nullptr;
|
||||||
|
|
||||||
|
GLuint VAO = 0;
|
||||||
|
GLuint VBO = 0;
|
||||||
|
GLuint EBO = 0;
|
||||||
|
|
||||||
|
void drawCall() override {
|
||||||
|
auto& indices = mObject->mTopology.Indexes;
|
||||||
|
|
||||||
|
glBindVertexArray(VAO);
|
||||||
|
|
||||||
|
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
|
||||||
|
glDrawElements(GL_TRIANGLES, indices.size() * 3, GL_UNSIGNED_INT, nullptr);
|
||||||
|
|
||||||
|
// glDrawArrays(GL_TRIANGLES, 0, sizeof(buffer) / (2 * sizeof(float)));
|
||||||
|
|
||||||
|
// glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
~ObjectBuffers() {
|
||||||
|
glDeleteBuffers(1, &VBO);
|
||||||
|
glDeleteVertexArrays(1, &VAO);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,62 +1,8 @@
|
||||||
#include "Render.hpp"
|
#include "Render.hpp"
|
||||||
|
#include "GPUBuffers.hpp"
|
||||||
#include "GraphicsApi.hpp"
|
|
||||||
|
|
||||||
using namespace tp;
|
using namespace tp;
|
||||||
|
|
||||||
class ObjectBuffers {
|
|
||||||
public:
|
|
||||||
ObjectBuffers(Object* object) {
|
|
||||||
mObject = (object);
|
|
||||||
|
|
||||||
auto& buff = mObject->mTopology.Points;
|
|
||||||
auto& indices = mObject->mTopology.Indexes;
|
|
||||||
|
|
||||||
glGenVertexArrays(1, &VAO);
|
|
||||||
glGenBuffers(1, &VBO);
|
|
||||||
glGenBuffers(1, &EBO);
|
|
||||||
|
|
||||||
glBindVertexArray(VAO);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(Vec3F) * buff.size(), buff.getBuff(), GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
|
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Vec3<uhalni>) * indices.size(), indices.getBuff(), GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr);
|
|
||||||
glEnableVertexAttribArray(0);
|
|
||||||
|
|
||||||
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
glBindVertexArray(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
Object* mObject = nullptr;
|
|
||||||
|
|
||||||
GLuint VAO = 0;
|
|
||||||
GLuint VBO = 0;
|
|
||||||
GLuint EBO = 0;
|
|
||||||
|
|
||||||
void drawCall() {
|
|
||||||
auto& indices = mObject->mTopology.Indexes;
|
|
||||||
|
|
||||||
glBindVertexArray(VAO);
|
|
||||||
|
|
||||||
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
|
|
||||||
glDrawElements(GL_TRIANGLES, indices.size() * 3, GL_UNSIGNED_INT, nullptr);
|
|
||||||
|
|
||||||
// glDrawArrays(GL_TRIANGLES, 0, sizeof(buffer) / (2 * sizeof(float)));
|
|
||||||
|
|
||||||
// glBindVertexArray(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
~ObjectBuffers() {
|
|
||||||
glDeleteBuffers(1, &VBO);
|
|
||||||
glDeleteVertexArrays(1, &VAO);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Render::Render(Vec2F renderResolution) :
|
Render::Render(Vec2F renderResolution) :
|
||||||
mRenderBuffer(renderResolution) {
|
mRenderBuffer(renderResolution) {
|
||||||
|
|
||||||
|
|
@ -72,8 +18,8 @@ Vec2F Render::getBufferSize() { return mRenderBuffer.getSize(); }
|
||||||
void Render::render(const Scene& geometry, Vec2F size) {
|
void Render::render(const Scene& geometry, Vec2F size) {
|
||||||
|
|
||||||
for (auto object : geometry.mObjects) {
|
for (auto object : geometry.mObjects) {
|
||||||
if (!object->mBuffers) {
|
if (!object->mGUPBuffers) {
|
||||||
object->mBuffers = std::make_shared<ObjectBuffers>(&object.data());
|
object->mGUPBuffers = new ObjectBuffers(&object.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -101,7 +47,7 @@ void Render::render(const Scene& geometry, Vec2F size) {
|
||||||
glUniformMatrix4fv(basis, 1, false, &basisMat[0][0]);
|
glUniformMatrix4fv(basis, 1, false, &basisMat[0][0]);
|
||||||
glUniformMatrix4fv(camera, 1, true, &cameraMat[0][0]);
|
glUniformMatrix4fv(camera, 1, true, &cameraMat[0][0]);
|
||||||
|
|
||||||
object->mBuffers->drawCall();
|
object->mGUPBuffers->drawCall();
|
||||||
}
|
}
|
||||||
|
|
||||||
mDefaultShader.unbind();
|
mDefaultShader.unbind();
|
||||||
|
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Topology.hpp"
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
class ObjectBuffers;
|
|
||||||
|
|
||||||
namespace tp {
|
|
||||||
|
|
||||||
class Object {
|
|
||||||
public:
|
|
||||||
Object() = default;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Topology mTopology;
|
|
||||||
std::shared_ptr<ObjectBuffers> mBuffers;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PointLight {
|
|
||||||
Vec3F pos;
|
|
||||||
halnf fallOut = 1.f;
|
|
||||||
halnf intensity = 1.f;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Scene {
|
|
||||||
public:
|
|
||||||
Scene() = default;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Buffer<Object> mObjects;
|
|
||||||
Buffer<PointLight> mLights;
|
|
||||||
Camera mCamera;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -11,12 +11,18 @@ namespace tp {
|
||||||
public:
|
public:
|
||||||
GPUBuffers() = default;
|
GPUBuffers() = default;
|
||||||
virtual ~GPUBuffers() = default;
|
virtual ~GPUBuffers() = default;
|
||||||
|
|
||||||
|
virtual void drawCall() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Object {
|
class Object {
|
||||||
public:
|
public:
|
||||||
Object() = default;
|
Object() = default;
|
||||||
|
|
||||||
|
~Object() {
|
||||||
|
delete mGUPBuffers;
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Topology mTopology;
|
Topology mTopology;
|
||||||
TopologyCache mCache;
|
TopologyCache mCache;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue