3D Scene initial

This commit is contained in:
IlyaShurupov 2024-06-18 17:16:23 +03:00
parent 3fd3211f46
commit 55f5537a67
8 changed files with 117 additions and 77 deletions

13
3DScene/CMakeLists.txt Normal file
View file

@ -0,0 +1,13 @@
project(3DScene)
### ---------------------- Static Library --------------------- ###
file(GLOB SOURCES "./private/*.cpp")
file(GLOB HEADERS "./public/*.hpp")
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME} PUBLIC ./public/)
target_include_directories(${PROJECT_NAME} PRIVATE ../Externals/)
target_link_libraries(${PROJECT_NAME} PUBLIC Math)
target_link_libraries(${PROJECT_NAME} PUBLIC ${BINDINGS_LIBS})

View file

@ -0,0 +1,2 @@
#include "Scene.hpp"

View file

@ -0,0 +1,51 @@
#include "Scene.hpp"
extern "C" {
#include "lauxlib.h"
#include "lualib.h"
}
#include "obj/OBJ_Loader.h"
#include <filesystem>
bool tp::Scene::load(const std::string& objetsPath) {
using namespace tp;
objl::Loader Loader;
if (!Loader.LoadFile(objetsPath)) {
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) {
mObjects.append(Object());
auto object = &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) {
auto idx1 = (uhalni) curMesh.Indices[j];
auto idx2 = (uhalni) curMesh.Indices[j + 1];
auto idx3 = (uhalni) curMesh.Indices[j + 2];
// printf("{ %i, %i, %i },\n", idx1, idx2, idx3);
object->mTopology.Indexes.append(Vec3<uhalni>{ idx1, idx2, idx3 });
}
if (object->mTopology.Normals.size() != object->mTopology.Points.size()) {
printf("Logic error loading normals\n");
}
object->mCache.Source = &object->mTopology;
object->mCache.updateCache();
}
return mObjects.size();
}

43
3DScene/public/Scene.hpp Normal file
View file

@ -0,0 +1,43 @@
#pragma once
#include "Topology.hpp"
#include "Buffer2D.hpp"
#include "Camera.hpp"
#include <string>
namespace tp {
class GPUBuffers {
public:
GPUBuffers() = default;
virtual ~GPUBuffers() = default;
};
class Object {
public:
Object() = default;
public:
Topology mTopology;
TopologyCache mCache;
GPUBuffers* mGUPBuffers = nullptr;
};
struct PointLight {
Vec3F pos;
halnf fallOut = 1.f;
halnf intensity = 1.f;
};
class Scene {
public:
Scene() = default;
bool load(const std::string& scenePath);
public:
Buffer<Object> mObjects;
Buffer<PointLight> mLights;
Camera mCamera;
};
}

View file

@ -17,11 +17,12 @@ add_subdirectory(Math)
add_subdirectory(Externals) add_subdirectory(Externals)
add_subdirectory(Connection) add_subdirectory(Connection)
add_subdirectory(Graphics) add_subdirectory(Graphics)
add_subdirectory(RayTracer)
add_subdirectory(DataAnalysis) add_subdirectory(DataAnalysis)
add_subdirectory(Objects) add_subdirectory(Objects)
add_subdirectory(Widgets) add_subdirectory(Widgets)
add_subdirectory(LibraryViewer) add_subdirectory(LibraryViewer)
add_subdirectory(RasterRender) add_subdirectory(RasterRender)
add_subdirectory(3DScene)
add_subdirectory(RayTracer)
add_subdirectory(Sketch3D) add_subdirectory(Sketch3D)
add_subdirectory(3DEditor) add_subdirectory(3DEditor)

View file

@ -4,11 +4,12 @@ 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/ ../Externals/) target_include_directories(${PROJECT_NAME} PUBLIC ./public/)
target_link_libraries(${PROJECT_NAME} PUBLIC Math Connection) target_link_libraries(${PROJECT_NAME} PUBLIC 3DScene Connection)
### -------------------------- Applications -------------------------- ### ### -------------------------- Applications -------------------------- ###
add_executable(rayt ./applications/Rayt.cpp applications/SceneLoad.cpp applications/Rayt.hpp) file(GLOB APP_SOURCES "./applications/*.cpp")
add_executable(rayt ${APP_SOURCES})
target_link_libraries(rayt ${PROJECT_NAME} Lua ImageIO) target_link_libraries(rayt ${PROJECT_NAME} Lua ImageIO)
file(COPY "applications/rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") file(COPY "applications/rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/")

View file

@ -6,50 +6,8 @@ extern "C" {
#include "lualib.h" #include "lualib.h"
} }
#include "obj/OBJ_Loader.h"
#include <filesystem> #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) {
auto idx1 = (uhalni) curMesh.Indices[j];
auto idx2 = (uhalni) curMesh.Indices[j + 1];
auto idx3 = (uhalni) curMesh.Indices[j + 2];
// printf("{ %i, %i, %i },\n", idx1, idx2, idx3);
object->mTopology.Indexes.append(Vec3<uhalni>{ idx1, idx2, idx3 });
}
if (object->mTopology.Normals.size() != object->mTopology.Points.size()) {
printf("Logic error loading normals\n");
}
object->mCache.Source = &object->mTopology;
object->mCache.updateCache();
}
return scene.mObjects.size();
}
// Function to read a Lua table representing RenderSettings // Function to read a Lua table representing RenderSettings
int readRenderSettings(lua_State* L, tp::RayTracer::RenderSettings& settings) { int readRenderSettings(lua_State* L, tp::RayTracer::RenderSettings& settings) {
lua_getglobal(L, "RenderSettings"); lua_getglobal(L, "RenderSettings");
@ -152,7 +110,7 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
directoryPath /= meshesPath; directoryPath /= meshesPath;
if (!loadMeshes(scene, directoryPath.string())) { if (!scene.load(directoryPath.string())) {
printf("No 'meshes' loaded - check ur .obj path and validate content of .obj .\n"); printf("No 'meshes' loaded - check ur .obj path and validate content of .obj .\n");
return; return;
} }

View file

@ -1,42 +1,13 @@
#pragma once #pragma once
#include "Buffer2D.hpp" #include "Scene.hpp"
#include "Camera.hpp"
#include "Color.hpp" #include "Color.hpp"
#include "Module.hpp" #include "Module.hpp"
#include "Topology.hpp"
#include "Vec.hpp" #include "Vec.hpp"
namespace tp { namespace tp {
extern ModuleManifest gModuleRayTracer;
class Object {
public:
Object() = default;
public:
Topology mTopology;
TopologyCache mCache;
};
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;
};
class RayTracer { class RayTracer {
public: public:
typedef Buffer2D<RGBA> RenderBuffer; typedef Buffer2D<RGBA> RenderBuffer;