This commit is contained in:
IlyaShurupov 2024-04-13 12:28:46 +03:00
parent e161fffc0c
commit 2160dfca34
22 changed files with 339 additions and 157 deletions

View file

@ -1,7 +1,7 @@
project(GeometryEditor2D) project(3DEditor)
### ---------------------- Externals --------------------- ### ### ---------------------- Externals --------------------- ###
set(BINDINGS_INCLUDE ../Externals/glfw/include) set(BINDINGS_INCLUDE ../Externals/glfw/include ../Externals)
set(BINDINGS_LIBS glfw Imgui) set(BINDINGS_LIBS glfw Imgui)
### ---------------------- Static Library --------------------- ### ### ---------------------- Static Library --------------------- ###
@ -15,8 +15,8 @@ target_link_libraries(${PROJECT_NAME} PUBLIC Graphics Connection Widgets Math Ra
target_link_libraries(${PROJECT_NAME} PUBLIC ${BINDINGS_LIBS}) target_link_libraries(${PROJECT_NAME} PUBLIC ${BINDINGS_LIBS})
### -------------------------- Applications -------------------------- ### ### -------------------------- Applications -------------------------- ###
add_executable(geomEdit2d ./applications/Entry.cpp) add_executable(edit3d ./applications/Entry.cpp ./applications/SceneLoad.cpp)
target_link_libraries(geomEdit2d ${PROJECT_NAME}) target_link_libraries(edit3d ${PROJECT_NAME} Lua ImageIO)
file(COPY "rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") file(COPY "rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/")
file(COPY "rsc/Font.ttf" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") file(COPY "rsc/Font.ttf" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/")

View file

@ -5,13 +5,18 @@
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, &geometry, renderResolution);
//
loadMeshes(geometry, "rsc/scene.obj");
geometry.mCamera.lookAtPoint({ 0, 0, 0 }, { 3, 3, 2 }, { 0, 0, 1 });
} }
~EditorGUI() override { delete mGui; } ~EditorGUI() override { delete mGui; }
@ -24,7 +29,7 @@ public:
void drawFrame(Canvas* canvas) override { mGui->draw(*canvas); } void drawFrame(Canvas* canvas) override { mGui->draw(*canvas); }
private: private:
Geometry geometry; Scene geometry;
EditorWidget<EventHandler, Canvas>* mGui; EditorWidget<EventHandler, Canvas>* mGui;
}; };

View file

@ -0,0 +1,41 @@
#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) {
uint idx1 = (int) curMesh.Indices[j];
uint idx2 = (int) curMesh.Indices[j + 1];
uint 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();
}

110
3DEditor/private/Render.cpp Normal file
View file

@ -0,0 +1,110 @@
#include "Render.hpp"
#include "GraphicsApi.hpp"
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) :
mRenderBuffer(renderResolution) {
mDefaultShader.load("rsc/shaders/default.vert", nullptr, "rsc/shaders/default.frag", true);
}
Render::~Render() {}
uint4 Render::getRenderBuffer() { return mRenderBuffer.texId(); }
Vec2F Render::getBufferSize() { return mRenderBuffer.getSize(); }
void Render::render(const Scene& geometry, Vec2F size) {
for (auto object : geometry.mObjects) {
if (!object->mBuffers) {
object->mBuffers = std::make_shared<ObjectBuffers>(&object.data());
}
}
mRenderBuffer.mClearCol = { 0.0f, 0.0f, 0.0f, 0.f };
mRenderBuffer.beginDraw();
mRenderBuffer.clear();
mDefaultShader.bind();
Mat4F cameraMat = geometry.mCamera.calculateTransformationMatrix();
glEnable(GL_DEPTH_TEST);
for (auto object : geometry.mObjects) {
static auto origin = (GLint) mDefaultShader.getu("Origin");
static auto basis = (GLint) mDefaultShader.getu("Basis");
static auto camera = (GLint) mDefaultShader.getu("Camera");
Mat4F basisMat;
Vec4F originPoint;
glUniform4fv(origin, 1, &originPoint[0]);
glUniformMatrix4fv(basis, 1, false, &basisMat[0][0]);
glUniformMatrix4fv(camera, 1, true, &cameraMat[0][0]);
object->mBuffers->drawCall();
}
mDefaultShader.unbind();
mRenderBuffer.endDraw();
}

View file

@ -5,8 +5,9 @@ namespace tp {
template <typename Events, typename Canvas> template <typename Events, typename Canvas>
class ViewportWidget : public Widget<Events, Canvas> { class ViewportWidget : public Widget<Events, Canvas> {
public: public:
explicit ViewportWidget(Canvas* canvas, Geometry* geometry, Vec2F renderResolution) : explicit ViewportWidget(Canvas* canvas, Scene* geometry, Vec2F renderResolution) :
mRender(renderResolution) { mRender(renderResolution) {
mGeometry = geometry;
this->createConfig("ViewportWidget"); this->createConfig("ViewportWidget");
mImage = canvas->createImageFromTextId(mRender.getRenderBuffer(), mRender.getBufferSize()); mImage = canvas->createImageFromTextId(mRender.getRenderBuffer(), mRender.getBufferSize());
mCanvas = canvas; mCanvas = canvas;
@ -19,18 +20,19 @@ namespace tp {
this->mVisible = areaParent.isOverlap(aArea); this->mVisible = areaParent.isOverlap(aArea);
if (!this->mVisible) return; if (!this->mVisible) return;
mRender.render(*mGeometry, this->mArea.size); mGeometry->mCamera.rotate(0.01f, 0.0);
} }
void draw(Canvas& canvas) override { void draw(Canvas& canvas) override {
if (!this->mVisible) return; if (!this->mVisible) return;
canvas.drawImage(this->mArea, &mImage); mRender.render(*mGeometry, this->mArea.size);
canvas.drawImage(this->mArea, &mImage, PI);
} }
public: public:
Render mRender; Render mRender;
Geometry* mGeometry = nullptr; Scene* mGeometry = nullptr;
Canvas* mCanvas = nullptr; Canvas* mCanvas = nullptr;
Canvas::ImageHandle mImage; Canvas::ImageHandle mImage;
}; };
@ -38,7 +40,7 @@ namespace tp {
template <typename Events, typename Canvas> template <typename Events, typename Canvas>
class EditorWidget : public Widget<Events, Canvas> { class EditorWidget : public Widget<Events, Canvas> {
public: public:
EditorWidget(Canvas* canvas, Geometry* geometry, Vec2F renderResolution) : EditorWidget(Canvas* canvas, Scene* geometry, Vec2F renderResolution) :
mViewport(canvas, geometry, renderResolution) { mViewport(canvas, geometry, renderResolution) {
this->createConfig("EditorWidget"); this->createConfig("EditorWidget");
this->addColor("Base", "Base"); this->addColor("Base", "Base");

View file

@ -1,6 +1,6 @@
#pragma once #pragma once
#include "Geometry.hpp" #include "Scene.hpp"
#include "Rect.hpp" #include "Rect.hpp"
#include "FrameBuffer.hpp" #include "FrameBuffer.hpp"
@ -12,7 +12,7 @@ namespace tp {
explicit Render(Vec2F renderResolution); explicit Render(Vec2F renderResolution);
~Render(); ~Render();
void render(const Geometry& geometry, Vec2F size); void render(const Scene& geometry, Vec2F size);
uint4 getRenderBuffer(); uint4 getRenderBuffer();
Vec2F getBufferSize(); Vec2F getBufferSize();

34
3DEditor/public/Scene.hpp Normal file
View file

@ -0,0 +1,34 @@
#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;
};
}

112
3DEditor/rsc/scene.obj Normal file
View file

@ -0,0 +1,112 @@
# Blender v3.0.1 OBJ File: 'scene.blend'
# www.blender.org
mtllib meshes.mtl
o Cube
v -1.039076 1.039076 1.792917
v -1.039076 1.039076 -1.285234
v 1.039076 1.039076 1.792917
v 1.039076 1.039076 -1.285234
v -1.039076 -1.039076 1.792917
v -1.039076 -1.039076 -1.285234
v 1.039076 -1.039076 1.792917
v 1.039076 -1.039076 -1.285234
vt 0.625000 0.500000
vt 0.625000 0.750000
vt 0.875000 0.750000
vt 0.875000 0.500000
vt 0.375000 0.750000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.375000 0.000000
vt 0.375000 0.250000
vt 0.625000 0.250000
vt 0.625000 0.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.375000 0.500000
vn 0.0000 0.0000 -1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 0.0000
usemtl Material
s off
f 1/1/1 3/2/1 7/3/1 5/4/1
f 4/5/2 8/6/2 7/7/2 3/2/2
f 8/8/3 6/9/3 5/10/3 7/11/3
f 6/12/4 8/13/4 4/5/4 2/14/4
f 6/9/5 2/14/5 1/1/5 5/10/5
o Cube.001
v 0.411013 -0.208216 -1.264212
v 0.411013 -0.208216 -0.612621
v -0.208216 -0.411013 -1.264212
v -0.208216 -0.411013 -0.612621
v 0.208216 0.411013 -1.264212
v 0.208216 0.411013 -0.612621
v -0.411013 0.208216 -1.264212
v -0.411013 0.208216 -0.612621
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.500000
vt 0.875000 0.750000
vn 0.3112 -0.9503 0.0000
vn -0.9503 -0.3112 0.0000
vn -0.3112 0.9503 0.0000
vn 0.9503 0.3112 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
usemtl None
s off
f 9/15/6 10/16/6 12/17/6 11/18/6
f 11/18/7 12/17/7 16/19/7 15/20/7
f 15/20/8 16/19/8 14/21/8 13/22/8
f 13/22/9 14/21/9 10/23/9 9/24/9
f 11/25/10 15/20/10 13/22/10 9/26/10
f 16/19/11 12/27/11 10/28/11 14/21/11
o Cube.002
v -0.351718 -0.467100 -0.602050
v -0.351718 -0.467100 0.049542
v -0.800825 0.004996 -0.602050
v -0.800825 0.004996 0.049542
v 0.120377 -0.017993 -0.602050
v 0.120377 -0.017993 0.049542
v -0.328730 0.454103 -0.602050
v -0.328730 0.454103 0.049542
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.500000
vt 0.875000 0.750000
vn -0.7245 -0.6892 0.0000
vn -0.6892 0.7245 0.0000
vn 0.7245 0.6892 0.0000
vn 0.6892 -0.7245 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
usemtl None
s off
f 17/29/12 18/30/12 20/31/12 19/32/12
f 19/32/13 20/31/13 24/33/13 23/34/13
f 23/34/14 24/33/14 22/35/14 21/36/14
f 21/36/15 22/35/15 18/37/15 17/38/15
f 19/39/16 23/34/16 21/36/16 17/40/16
f 24/33/17 20/41/17 18/42/17 22/35/17

View file

@ -0,0 +1,7 @@
#version 330 core
out vec4 FragColor;
void main() {
FragColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1.f);
}

View file

@ -0,0 +1,11 @@
#version 330 core
layout(location = 0) in vec3 Point;
uniform vec4 Origin;
uniform mat4 Basis;
uniform mat4 Camera;
void main() {
gl_Position = Camera * vec4(Point.xyz, 1.0);
}

View file

@ -24,4 +24,4 @@ add_subdirectory(Widgets)
add_subdirectory(LibraryViewer) add_subdirectory(LibraryViewer)
add_subdirectory(RasterRender) add_subdirectory(RasterRender)
add_subdirectory(Sketch3D) add_subdirectory(Sketch3D)
add_subdirectory(GeometryEditor2D) add_subdirectory(3DEditor)

View file

@ -1,100 +0,0 @@
#include "Render.hpp"
#include "GraphicsApi.hpp"
using namespace tp;
struct Shape {
float buffer[8] = {
1, 1, 1, 0, 0, 0, //
0, 1, // 1, 1, 0, 0,
};
unsigned int indices[6] = { 0, 1, 3, 1, 2, 3 };
GLuint VAO = 0;
GLuint VBO = 0;
GLuint EBO = 0;
Shape() {
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(buffer), buffer, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), nullptr);
glEnableVertexAttribArray(0);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
void drawCall() {
const auto numPoints = sizeof(buffer) / (2 * sizeof(float));
glBindVertexArray(VAO);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
auto num = sizeof(indices) / sizeof(indices[0]);
glDrawElements(GL_TRIANGLES, num, GL_UNSIGNED_INT, nullptr);
// glDrawArrays(GL_TRIANGLES, 0, sizeof(buffer) / (2 * sizeof(float)));
// glBindVertexArray(0);
}
~Shape() {
glDeleteBuffers(1, &VBO);
glDeleteVertexArrays(1, &VAO);
}
};
Render::Render(Vec2F renderResolution) :
mRenderBuffer(renderResolution) {
mDefaultShader.load("rsc/shaders/default.vert", nullptr, "rsc/shaders/default.frag", true);
}
Render::~Render() {}
uint4 Render::getRenderBuffer() { return mRenderBuffer.texId(); }
Vec2F Render::getBufferSize() { return mRenderBuffer.getSize(); }
void Render::render(const Geometry& geometry, Vec2F size) {
static Shape shape;
mRenderBuffer.mClearCol = { 0.1f, 0.1f, 0.1f, 1.f };
mRenderBuffer.beginDraw();
mRenderBuffer.clear();
{
mDefaultShader.bind();
static auto uniform_color = mDefaultShader.getu("Color");
static auto uniform_scale = mDefaultShader.getu("Viewport");
RGBA col = { 0, 0, 1.f, 1.f };
RectF viewport = { -1.0f, -1.0f, 3.f, 3.f };
viewport.w = viewport.z * (size.y / size.x);
glUniform4fv(uniform_color, 1, &col.r);
glUniform4fv(uniform_scale, 1, &viewport.x);
shape.drawCall();
mDefaultShader.unbind();
}
mRenderBuffer.endDraw();
}

View file

@ -1,8 +0,0 @@
#pragma once
namespace tp {
class Geometry {
public:
Geometry() = default;
};
}

View file

@ -1,9 +0,0 @@
#version 330 core
uniform vec4 Color;
out vec4 FragColor;
void main() {
FragColor = vec4(1.f);
}

View file

@ -1,22 +0,0 @@
#version 330 core
layout(location = 0) in vec2 point;
uniform vec4 Viewport;
void main() {
vec2 transformedPoint = point;
transformedPoint.x = transformedPoint.x - Viewport.x;
transformedPoint.y = transformedPoint.y - Viewport.y;
transformedPoint.x = transformedPoint.x / Viewport.z;
transformedPoint.y = transformedPoint.y / Viewport.w;
transformedPoint.y = -transformedPoint.y;
transformedPoint.y = transformedPoint.y * 2;
transformedPoint.x = transformedPoint.x * 2;
gl_Position = vec4(transformedPoint.x - 1, transformedPoint.y + 1, 1.0, 1.0);
}

View file

@ -34,7 +34,7 @@ namespace tp {
Buffer<Vec3F> Points; Buffer<Vec3F> Points;
Buffer<Vec3F> Normals; Buffer<Vec3F> Normals;
Buffer<Vec3I> Indexes; Buffer<Vec3<uhalni>> Indexes;
}; };
struct TopologyCache { struct TopologyCache {

View file

@ -4,7 +4,7 @@ project(RayTracer)
file(GLOB SOURCES "./private/*.cpp" "./private/*/*.cpp") file(GLOB SOURCES "./private/*.cpp" "./private/*/*.cpp")
file(GLOB HEADERS "./public/*.hpp" "./public/*/*.hpp" "./applications/*.hpp") file(GLOB HEADERS "./public/*.hpp" "./public/*/*.hpp" "./applications/*.hpp")
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS}) add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME} PUBLIC ./public/) target_include_directories(${PROJECT_NAME} PUBLIC ./public/ ../Externals/)
target_link_libraries(${PROJECT_NAME} PUBLIC Math Connection) target_link_libraries(${PROJECT_NAME} PUBLIC Math Connection)
### -------------------------- Applications -------------------------- ### ### -------------------------- Applications -------------------------- ###

View file

@ -6,7 +6,7 @@ extern "C" {
#include "lualib.h" #include "lualib.h"
} }
#include "OBJ_Loader.h" #include "obj/OBJ_Loader.h"
#include <filesystem> #include <filesystem>
@ -139,7 +139,6 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
// Remove the filename from the path // Remove the filename from the path
fs::path directoryPath = fullPath.remove_filename(); fs::path directoryPath = fullPath.remove_filename();
if (luaL_dofile(L, scenePath.c_str()) != 0) { if (luaL_dofile(L, scenePath.c_str()) != 0) {
lua_close(L); lua_close(L);
printf("Cant open scene script.\n"); printf("Cant open scene script.\n");