3D scene stable
This commit is contained in:
parent
938616d989
commit
e32e5e77d1
14 changed files with 96 additions and 45 deletions
|
|
@ -13,7 +13,7 @@ public:
|
|||
auto canvas = this->mGraphics->getCanvas();
|
||||
mGui = new EditorWidget<EventHandler, Canvas>(canvas, &mScene, renderResolution);
|
||||
|
||||
mScene.load("rsc/scene.obj");
|
||||
mScene.load("rsc/scene/script.lua");
|
||||
|
||||
mScene.mCamera.lookAtPoint({ 0, 0, 0 }, { 3, 3, 2 }, { 0, 0, 1 });
|
||||
}
|
||||
|
|
|
|||
20
3DEditor/rsc/scene/meshes.mtl
Normal file
20
3DEditor/rsc/scene/meshes.mtl
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# Blender MTL File: 'scene.blend'
|
||||
# Material Count: 2
|
||||
|
||||
newmtl Material
|
||||
Ns 323.999994
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.800000 0.800000 0.800000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
|
||||
newmtl None
|
||||
Ns 500
|
||||
Ka 0.8 0.8 0.8
|
||||
Kd 0.8 0.8 0.8
|
||||
Ks 0.8 0.8 0.8
|
||||
d 1
|
||||
illum 2
|
||||
25
3DEditor/rsc/scene/script.lua
Normal file
25
3DEditor/rsc/scene/script.lua
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
Meshes = "meshes.obj"
|
||||
|
||||
Camera = {
|
||||
pos = { 0.5, 4.5, 0.2 },
|
||||
size_x = 600,
|
||||
size_y = 800,
|
||||
}
|
||||
|
||||
Lights = {
|
||||
{
|
||||
pos = { -0.5, 3.5, 1 },
|
||||
intensity = 1
|
||||
},
|
||||
{
|
||||
pos = { 0, 0, 1 },
|
||||
intensity = 0.5
|
||||
},
|
||||
}
|
||||
|
||||
RenderSettings = {
|
||||
depth = 1,
|
||||
spray = 3,
|
||||
multisampling = 16,
|
||||
}
|
||||
|
|
@ -10,4 +10,4 @@ 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})
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE Lua)
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
#include "Rayt.hpp"
|
||||
#include "Scene.hpp"
|
||||
|
||||
extern "C" {
|
||||
#include "lauxlib.h"
|
||||
|
|
@ -9,7 +9,7 @@ extern "C" {
|
|||
#include <filesystem>
|
||||
|
||||
// Function to read a Lua table representing RenderSettings
|
||||
int readRenderSettings(lua_State* L, tp::RayTracer::RenderSettings& settings) {
|
||||
int readRenderSettings(lua_State* L, tp::RenderSettings& settings) {
|
||||
lua_getglobal(L, "RenderSettings");
|
||||
if (!lua_istable(L, -1)) {
|
||||
printf("RenderSettings is not a table.\n");
|
||||
|
|
@ -83,7 +83,7 @@ int readLight(lua_State* L, tp::PointLight* light) {
|
|||
return 1; // Success
|
||||
}
|
||||
|
||||
void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::RenderSettings& settings) {
|
||||
bool tp::Scene::loadLuaFormat(const std::string& scenePath) {
|
||||
lua_State* L = luaL_newstate();
|
||||
luaL_openlibs(L);
|
||||
|
||||
|
|
@ -100,7 +100,7 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
if (luaL_dofile(L, scenePath.c_str()) != 0) {
|
||||
lua_close(L);
|
||||
printf("Cant open scene script.\n");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
lua_getglobal(L, "Meshes");
|
||||
|
|
@ -110,14 +110,14 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
|
||||
directoryPath /= meshesPath;
|
||||
|
||||
if (!scene.load(directoryPath.string())) {
|
||||
if (!loadOBJFormat(directoryPath.string())) {
|
||||
printf("No 'meshes' loaded - check ur .obj path and validate content of .obj .\n");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
printf("No 'meshes' path given.\n");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
// --- camera
|
||||
|
|
@ -127,7 +127,7 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
if (!lua_istable(L, -1)) {
|
||||
printf("Camera is not a table.\n");
|
||||
lua_close(L);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Verify you are inside the "Camera" table
|
||||
|
|
@ -138,7 +138,7 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
if (!lua_istable(L, -1) || lua_rawlen(L, -1) != 3) {
|
||||
printf("Invalid 'pos' field in Camera table.\n");
|
||||
lua_close(L);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read the values from the table
|
||||
|
|
@ -150,7 +150,7 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
} else {
|
||||
printf("Invalid 'pos' field value at index %d.\n", i + 1);
|
||||
lua_close(L);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
|
@ -160,7 +160,7 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
if (!lua_isnumber(L, -1)) {
|
||||
printf("Invalid or missing 'size_x' field in Camera table.\n");
|
||||
lua_close(L);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
int size_x = lua_tointeger(L, -1);
|
||||
lua_pop(L, 1); // Pop the 'size_x' value from the stack
|
||||
|
|
@ -170,16 +170,16 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
if (!lua_isnumber(L, -1)) {
|
||||
printf("Invalid or missing 'size_y' field in Camera table.\n");
|
||||
lua_close(L);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
int size_y = lua_tointeger(L, -1);
|
||||
|
||||
settings.size = { (tp::halnf) size_x, (tp::halnf) size_y };
|
||||
mRenderSettings.size = { (tp::halnf) size_x, (tp::halnf) size_y };
|
||||
|
||||
scene.mCamera.lookAtPoint({ 0, 0, 0 }, { pos[0], pos[1], pos[2] }, { 0, 0, 1 });
|
||||
scene.mCamera.setFOV(3.14 / 4);
|
||||
scene.mCamera.setFar(100);
|
||||
scene.mCamera.setRatio((tp::halnf) size_y / (tp::halnf) size_x);
|
||||
mCamera.lookAtPoint({ 0, 0, 0 }, { pos[0], pos[1], pos[2] }, { 0, 0, 1 });
|
||||
mCamera.setFOV(3.14 / 4);
|
||||
mCamera.setFar(100);
|
||||
mCamera.setRatio((tp::halnf) size_y / (tp::halnf) size_x);
|
||||
|
||||
// ---------- LIGHTS
|
||||
{
|
||||
|
|
@ -187,7 +187,7 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
if (!lua_istable(L, -1)) {
|
||||
printf("Lights is not a table.\n");
|
||||
lua_close(L);
|
||||
return; // Error
|
||||
return false; // Error
|
||||
}
|
||||
|
||||
// Read and process each light in the "Lights" table
|
||||
|
|
@ -199,20 +199,22 @@ void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::Re
|
|||
if (!readLight(L, &light)) {
|
||||
printf("Cant read lights data\n");
|
||||
lua_close(L);
|
||||
return; // Error
|
||||
return false; // Error
|
||||
}
|
||||
scene.mLights.append(light);
|
||||
mLights.append(light);
|
||||
}
|
||||
lua_pop(L, 1); // Pop the i-th light table
|
||||
}
|
||||
}
|
||||
|
||||
// ----------- settings --------------
|
||||
if (!readRenderSettings(L, settings)) {
|
||||
if (!readRenderSettings(L, mRenderSettings)) {
|
||||
printf("Cant Read Render Settings");
|
||||
lua_close(L);
|
||||
return; // Error
|
||||
return false; // Error
|
||||
}
|
||||
|
||||
lua_close(L);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ extern "C" {
|
|||
|
||||
#include <filesystem>
|
||||
|
||||
bool tp::Scene::load(const std::string& objetsPath) {
|
||||
bool tp::Scene::loadOBJFormat(const std::string& objetsPath) {
|
||||
using namespace tp;
|
||||
|
||||
objl::Loader Loader;
|
||||
|
|
@ -1,2 +1,6 @@
|
|||
|
||||
#include "Scene.hpp"
|
||||
#include "Scene.hpp"
|
||||
|
||||
bool tp::Scene::load(const std::string& scenePath) {
|
||||
return loadLuaFormat(scenePath);
|
||||
}
|
||||
|
|
@ -7,6 +7,13 @@
|
|||
#include <string>
|
||||
|
||||
namespace tp {
|
||||
struct RenderSettings {
|
||||
uhalni depth = 2;
|
||||
uhalni spray = 1;
|
||||
ualni multisampling = 1;
|
||||
Vec2<ualni> size;
|
||||
};
|
||||
|
||||
class GPUBuffers {
|
||||
public:
|
||||
GPUBuffers() = default;
|
||||
|
|
@ -41,9 +48,14 @@ namespace tp {
|
|||
|
||||
bool load(const std::string& scenePath);
|
||||
|
||||
bool loadLuaFormat(const std::string& scenePath);
|
||||
bool loadOBJFormat(const std::string& objectsPath);
|
||||
|
||||
public:
|
||||
Buffer<Object> mObjects;
|
||||
Buffer<PointLight> mLights;
|
||||
Camera mCamera;
|
||||
|
||||
RenderSettings mRenderSettings;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ target_link_libraries(${PROJECT_NAME} PUBLIC 3DScene Connection)
|
|||
### -------------------------- Applications -------------------------- ###
|
||||
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} ImageIO)
|
||||
file(COPY "rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/")
|
||||
|
||||
### -------------------------- Tests -------------------------- ###
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
// #include "NewPlacement.hpp"
|
||||
|
||||
#include "Rayt.hpp"
|
||||
#include "RayTracer.hpp"
|
||||
|
||||
#include "Timing.hpp"
|
||||
|
||||
|
|
@ -53,9 +53,11 @@ void printStatus(const halnf* percentage) {
|
|||
|
||||
void renderCommand(const std::string& scenePath) {
|
||||
Scene scene;
|
||||
RayTracer::RenderSettings settings;
|
||||
RenderSettings& settings = scene.mRenderSettings;
|
||||
|
||||
loadScene(scene, scenePath, settings);
|
||||
if (!scene.load(scenePath)) {
|
||||
return;
|
||||
}
|
||||
|
||||
RayTracer::OutputBuffers output;
|
||||
RayTracer rayt;
|
||||
|
|
|
|||
|
|
@ -1,7 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
#include "RayTracer.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
void loadScene(tp::Scene& scene, const std::string& scenePath, tp::RayTracer::RenderSettings& settings);
|
||||
|
|
@ -16,13 +16,6 @@ namespace tp {
|
|||
halnf percentage = 0.f;
|
||||
} mProgress;
|
||||
|
||||
struct RenderSettings {
|
||||
uhalni depth = 2;
|
||||
uhalni spray = 1;
|
||||
ualni multisampling = 1;
|
||||
Vec2<ualni> size;
|
||||
};
|
||||
|
||||
struct OutputBuffers {
|
||||
RenderBuffer normals;
|
||||
RenderBuffer color;
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ SUITE(RayTracer) {
|
|||
object.mCache.Source = &object.mTopology;
|
||||
object.mCache.updateCache();
|
||||
|
||||
RayTracer::RenderSettings settings = {
|
||||
RenderSettings settings = {
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue