From 3efff641ae021e54797aab6da5b5c04d83c27b80 Mon Sep 17 00:00:00 2001 From: tomoron Date: Sun, 16 Mar 2025 17:57:51 +0100 Subject: [PATCH] change scene request. doesn't work, black screen --- Makefile | 1 + includes/RT/Clusterizer.hpp | 12 ++++-- includes/RT/Scene.hpp | 7 +++- output.path | Bin 663 -> 0 bytes srcs/RT.cpp | 5 +-- srcs/RT_utils.cpp | 38 +------------------ srcs/class/Clusterizer/client.cpp | 59 +++++++++++++++++++++++------- srcs/class/Clusterizer/server.cpp | 6 ++- srcs/class/Scene.cpp | 58 +++++++++++++++++++++++++++-- 9 files changed, 124 insertions(+), 62 deletions(-) delete mode 100644 output.path diff --git a/Makefile b/Makefile index 410e713..9cf6a1a 100644 --- a/Makefile +++ b/Makefile @@ -80,6 +80,7 @@ $(NAME): $(OBJS) $(HEADERS) @echo $(WHITE) $(NAME): PROJECT COMPILED !$(RESET) else $(NAME): $(OBJS) $(HEADERS) + @printf "$(LINE_CLR)$(WHITE) $(NAME): linking ...$(RESET)" @$(CC) $(OBJS) $(IFLAGS) $(CFLAGS) $(LDFLAGS) -o $(NAME) @printf "$(LINE_CLR)$(WHITE) $(NAME): PROJECT COMPILED !$(RESET)\n\n" endif diff --git a/includes/RT/Clusterizer.hpp b/includes/RT/Clusterizer.hpp index 62eff43..91608ba 100644 --- a/includes/RT/Clusterizer.hpp +++ b/includes/RT/Clusterizer.hpp @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/20 18:25:18 by tomoron #+# #+# */ -/* Updated: 2025/02/25 22:26:49 by tomoron ### ########.fr */ +/* Updated: 2025/03/14 17:29:56 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,6 +49,7 @@ typedef enum e_msg PROGRESS_UPDATE, IMG_SEND_RQ, IMG, + SET_MAP, ABORT } t_msg; @@ -83,15 +84,18 @@ class Clusterizer private: //client void initClient(std::string &dest); void openClientConnection(const char *ip, int port); - void clientHandleBuffer(void); + void clientHandleBuffer(Scene &scene); void updateClient(Scene &scene, Window &win, std::vector &textures, ShaderProgram &denoisingProgram); void clientGetJob(void); - void clientReceive(void); + void clientReceive(Scene &scene); void handleCurrentJob(Scene &scene, Window &win, std::vector &textures, ShaderProgram &denoisingProgram); void sendProgress(uint8_t progress); - void sendImageToServer(std::vector &textures, ShaderProgram &denoisingProgram); + void sendImageToServer(Scene &scene, std::vector &textures, ShaderProgram &denoisingProgram); std::vector rgb32fToRgb24i(std::vector &imageFloat); + void changeMap(Scene &scene); + bool stringComplete(void); + int _serverFd; std::string _serverIp; int _serverPort; diff --git a/includes/RT/Scene.hpp b/includes/RT/Scene.hpp index 2315820..1176055 100644 --- a/includes/RT/Scene.hpp +++ b/includes/RT/Scene.hpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/23 18:30:18 by ycontre #+# #+# */ -/* Updated: 2025/02/25 01:44:31 by tomoron ### ########.fr */ +/* Updated: 2025/03/16 17:00:32 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -140,8 +140,13 @@ class Scene GPUMaterial getMaterial(int material_index); bool fail(void) const; + + void changeScene(std::string &name); + + std::vector createDataOnGPU(void); private: + void init(std::string &name); bool _fail; std::vector _gpu_bvh_data; diff --git a/output.path b/output.path deleted file mode 100644 index afe9c07732f734308a3bcf647b4ad5812d46eb11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmXRe$j_@v)JrVOWKd*aV8{SsIUueLnC{qjX1=}Ps`UpL7&sgm7(5OGh2db*%5cYB zPIDYCCpb9h8b3bZV9W)RUodm#N_*X^BKsXoiydUQ=Q{lTAAdl0mghmJW``FiciS&H zZ*=gm(o2U~3vch&Gxk2H^8ddBRKB6<-BJ6lKRXXbnx#7~y?1Os1H*&^^UuUO!}Oa4 zoU?z}Iq9JN)pW=6qJ{_O&a6D3Z!#ICf5ES)OZHI;Pwmz|Y;gRt;r#&<-e|Dau_j?UT-!!)a5)7s=_c<6FzqS`mW$0Z{%4nmjkNm*cXh)s88Se2!@H4z617?4yEqI_zJW>ln9en}bQ(vi-sh otuXTwDjeV2%NX5v`0Cr_C_m}+f$+3z2h +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/27 14:51:49 by TheRed #+# #+# */ -/* Updated: 2025/02/25 01:51:27 by tomoron ### ########.fr */ +/* Updated: 2025/03/16 17:38:51 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,6 @@ void drawScreenTriangle(GLuint VAO, GLuint output_texture, GLuint program); std::vector generateTextures(unsigned int textures_count); -std::vector createDataOnGPU(Scene &scene); void updateDataOnGPU(Scene &scene, std::vector buffers); void shaderDenoise(ShaderProgram &denoising_program, GPUDenoise &denoise, std::vector textures); @@ -60,7 +59,7 @@ int main(int argc, char **argv) render_program.attachShader(&frag); render_program.link(); - std::vector buffers = createDataOnGPU(scene); + std::vector buffers = scene.createDataOnGPU(); if (!scene.loadTextures()) return (-1); diff --git a/srcs/RT_utils.cpp b/srcs/RT_utils.cpp index 223054f..32659fc 100644 --- a/srcs/RT_utils.cpp +++ b/srcs/RT_utils.cpp @@ -6,7 +6,7 @@ /* By: TheRed +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/12 23:21:09 by TheRed #+# #+# */ -/* Updated: 2025/02/12 23:21:09 by TheRed ### ########.fr */ +/* Updated: 2025/03/16 17:37:32 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -74,40 +74,6 @@ std::vector generateTextures(unsigned int textures_count) return (textures); } -std::vector createDataOnGPU(Scene &scene) -{ - GLint max_gpu_size; - glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size); - - const std::vector &object_data = scene.getObjectData(); - const std::vector &triangle_data = scene.getTriangleData(); - const std::vector &bvh_nodes = scene.getBvh(); - const std::vector &bvh_data = scene.getBvhData(); - const std::vector &material_data = scene.getMaterialData(); - - std::cout << "Sending " << object_data.size() << " objects for " << \ - object_data.size() * sizeof(GPUObject) + \ - triangle_data.size() * sizeof(GPUTriangle) + \ - bvh_nodes.size() * sizeof(GPUBvh) + \ - material_data.size() * sizeof(GPUMaterial) \ - << " / " << max_gpu_size << " bytes" << std::endl; - - std::vector buffers; - - buffers.push_back(new Buffer(Buffer::Type::SSBO, 1, sizeof(GPUObject) * object_data.size(), object_data.data())); - buffers.push_back(new Buffer(Buffer::Type::SSBO, 2, sizeof(GPUTriangle) * triangle_data.size(), triangle_data.data())); - buffers.push_back(new Buffer(Buffer::Type::SSBO, 3, sizeof(GPUBvhData) * bvh_data.size(), bvh_data.data())); - buffers.push_back(new Buffer(Buffer::Type::SSBO, 4, sizeof(GPUBvh) * bvh_nodes.size(), bvh_nodes.data())); - buffers.push_back(new Buffer(Buffer::Type::SSBO, 5, sizeof(GPUMaterial) * material_data.size(), nullptr)); - buffers.push_back(new Buffer(Buffer::Type::SSBO, 6, scene.getGPULights().size() * sizeof(int), nullptr)); - - buffers.push_back(new Buffer(Buffer::Type::UBO, 0, sizeof(GPUCamera), nullptr)); - buffers.push_back(new Buffer(Buffer::Type::UBO, 1, sizeof(GPUVolume), nullptr)); - buffers.push_back(new Buffer(Buffer::Type::UBO, 2, sizeof(GPUDebug), nullptr)); - - return (buffers); -} - void updateDataOnGPU(Scene &scene, std::vector buffers) { const std::vector &material_data = scene.getMaterialData(); @@ -150,4 +116,4 @@ void shaderDenoise(ShaderProgram &denoising_program, GPUDenoise &denoise, std::v } glBindImageTexture(5, textures[output_texture], 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F); -} \ No newline at end of file +} diff --git a/srcs/class/Clusterizer/client.cpp b/srcs/class/Clusterizer/client.cpp index 0338423..a4fce3a 100644 --- a/srcs/class/Clusterizer/client.cpp +++ b/srcs/class/Clusterizer/client.cpp @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/20 21:08:38 by tomoron #+# #+# */ -/* Updated: 2025/02/25 20:41:09 by tomoron ### ########.fr */ +/* Updated: 2025/03/16 16:42:41 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,7 +37,6 @@ void Clusterizer::initClient(std::string &dest) void Clusterizer::openClientConnection(const char *ip, int port) { struct sockaddr_in serv_addr; - uint8_t sendBuffer; if(port > 65535 || port < 0) { @@ -59,8 +58,7 @@ void Clusterizer::openClientConnection(const char *ip, int port) close(_serverFd); _serverFd = 0; } - sendBuffer = RDY; - (void)write(_serverFd, &sendBuffer, 1); +// (void)write(_serverFd, (uint8_t []){RDY}, 1); } void Clusterizer::clientGetJob(void) @@ -79,7 +77,31 @@ void Clusterizer::clientGetJob(void) _progress = 0; } -void Clusterizer::clientHandleBuffer(void) +bool Clusterizer::stringComplete(void) +{ + for(size_t i = 1; i < _receiveBuffer.size(); i++) + if(_receiveBuffer[i] == 0) + return(true); + return(false); +} + +void Clusterizer::changeMap(Scene &scene) +{ + size_t len; + + len = 1; + while(_receiveBuffer[len]) + len++; + _sceneName = std::string((char *)_receiveBuffer.data() + 1); + _receiveBuffer.erase(_receiveBuffer.begin(), _receiveBuffer.begin() + len); + std::cout << "changing scene to name :" << _sceneName << std::endl; + scene.changeScene(_sceneName); + if(scene.fail()) + throw std::runtime_error("map change failed"); + (void)write(_serverFd, (uint8_t []){RDY}, 1); +} + +void Clusterizer::clientHandleBuffer(Scene &scene) { std::vector sendBuf; @@ -98,11 +120,19 @@ void Clusterizer::clientHandleBuffer(void) } else if(_receiveBuffer[0] == ABORT) { - std::cout << "got a abort request, aborting current job"; + std::cout << "got a abort request, aborting current job" << std::endl; delete _currentJob; _currentJob = 0; _receiveBuffer.erase(_receiveBuffer.begin()); } + else if(_receiveBuffer[0] == SET_MAP) + { + std::cout << "got change map request" << std::endl; + if(stringComplete()) + changeMap(scene); + else + std::cout << "string is not complete, waiting for eof signal" << std::endl; + } else { std::cout << "unknown request sent, ignoring" << std::endl; @@ -111,10 +141,10 @@ void Clusterizer::clientHandleBuffer(void) if(sendBuf.size()) - (void)write(1, sendBuf.data(), sendBuf.size()); + (void)write(_serverFd, sendBuf.data(), sendBuf.size()); } -void Clusterizer::clientReceive(void) +void Clusterizer::clientReceive(Scene &scene) { uint8_t buffer[512]; size_t ret; @@ -130,7 +160,7 @@ void Clusterizer::clientReceive(void) } _receiveBuffer.insert(_receiveBuffer.end(), buffer, buffer + ret); } - clientHandleBuffer(); + clientHandleBuffer(scene); } void Clusterizer::sendProgress(uint8_t progress) @@ -165,7 +195,7 @@ std::vector Clusterizer::rgb32fToRgb24i(std::vector &imageFloat) return(buffer); } -void Clusterizer::sendImageToServer(std::vector &textures, ShaderProgram &denoisingProgram) +void Clusterizer::sendImageToServer(Scene &scene, std::vector &textures, ShaderProgram &denoisingProgram) { _srvReady = 0; std::vector imageFloat(WIDTH * HEIGHT * 4); @@ -174,7 +204,7 @@ void Clusterizer::sendImageToServer(std::vector &textures, ShaderProgram (void)write(_serverFd, (uint8_t []){IMG_SEND_RQ}, 1); while(!_srvReady) { - clientReceive(); + clientReceive(scene); if(!_serverFd) { delete _currentJob; @@ -234,7 +264,7 @@ void Clusterizer::handleCurrentJob(Scene &scene, Window &win, std::vectorsamples) { std::cout << "send request" << std::endl; - sendImageToServer(textures, denoisingProgram); + sendImageToServer(scene, textures, denoisingProgram); } } @@ -245,10 +275,13 @@ void Clusterizer::updateClient(Scene &scene, Window &win, std::vector &t { std::cout << "server isn't connected, waiting for connection" << std::endl; while(!_serverFd) + { openClientConnection(_serverIp.c_str(), _serverPort); + usleep(10000); + } std::cout << "server reconnected." << std::endl; } - clientReceive(); + clientReceive(scene); handleCurrentJob(scene, win, textures, denoisingProgram); } diff --git a/srcs/class/Clusterizer/server.cpp b/srcs/class/Clusterizer/server.cpp index 3c5190a..990a825 100644 --- a/srcs/class/Clusterizer/server.cpp +++ b/srcs/class/Clusterizer/server.cpp @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/20 21:08:38 by tomoron #+# #+# */ -/* Updated: 2025/03/14 14:22:06 by tomoron ### ########.fr */ +/* Updated: 2025/03/16 17:39:06 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -73,6 +73,8 @@ int Clusterizer::acceptClients(void) std::cout << "new client :" << fd << std::endl; _clients[fd].ready = 0; _clients[fd].curJob = 0; + (void)write(fd, (uint8_t []){SET_MAP}, 1); + (void)write(fd, _sceneName.c_str(), _sceneName.size() + 1); updatePollfds(); return(1); } @@ -157,8 +159,8 @@ void Clusterizer::getImageFromClient(int fd, std::vector &buf) auto posIter = std::find(_jobs[IN_PROGRESS].begin(), _jobs[IN_PROGRESS].end(), _clients[fd].curJob); _jobs[IN_PROGRESS].erase(posIter); _jobs[DONE].push_back(_clients[fd].curJob); - _clients[fd].curJob = 0; + _clients[fd].curJob = 0; _curFrame++; } diff --git a/srcs/class/Scene.cpp b/srcs/class/Scene.cpp index f8ee49a..8c05348 100644 --- a/srcs/class/Scene.cpp +++ b/srcs/class/Scene.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/23 18:29:41 by ycontre #+# #+# */ -/* Updated: 2025/02/13 18:13:58 by ycontre ### ########.fr */ +/* Updated: 2025/03/16 17:49:37 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,13 +16,19 @@ #include "stb_image.h" Scene::Scene(std::string &name) +{ + _camera = new Camera(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f), -90.0f, 0.0f); + _fail = 0; + init(name); +} + +void Scene::init(std::string &name) { std::ifstream file(name); std::string line; - _camera = new Camera(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f), -90.0f, 0.0f); + _gpu_volume.enabled = 0; - _fail = 0; _gpu_volume.sigma_a = glm::vec3(0.0000f); _gpu_volume.sigma_s = glm::vec3(0.0800f); _gpu_volume.sigma_t = _gpu_volume.sigma_a + _gpu_volume.sigma_s; @@ -397,3 +403,49 @@ GPUMaterial Scene::getMaterial(int material_index) throw std::runtime_error("Incorrect material index"); return (_gpu_materials[material_index]); } + +std::vector Scene::createDataOnGPU(void) +{ + GLint max_gpu_size; + glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size); + + + std::cout << "Sending " << _gpu_objects.size() << " objects for " << \ + _gpu_objects.size() * sizeof(GPUObject) + \ + _gpu_triangles.size() * sizeof(GPUTriangle) + \ + _gpu_bvh.size() * sizeof(GPUBvh) + \ + _gpu_materials.size() * sizeof(GPUMaterial) \ + << " / " << max_gpu_size << " bytes" << std::endl; + + std::vector buffers; + + buffers.push_back(new Buffer(Buffer::Type::SSBO, 1, sizeof(GPUObject) * _gpu_objects.size(), _gpu_objects.data())); + buffers.push_back(new Buffer(Buffer::Type::SSBO, 2, sizeof(GPUTriangle) * _gpu_triangles.size(), _gpu_triangles.data())); + buffers.push_back(new Buffer(Buffer::Type::SSBO, 3, sizeof(GPUBvhData) * _gpu_bvh_data.size(), _gpu_bvh_data.data())); + buffers.push_back(new Buffer(Buffer::Type::SSBO, 4, sizeof(GPUBvh) * _gpu_bvh.size(), _gpu_bvh.data())); + buffers.push_back(new Buffer(Buffer::Type::SSBO, 5, sizeof(GPUMaterial) * _gpu_materials.size(), nullptr)); + buffers.push_back(new Buffer(Buffer::Type::SSBO, 6, getGPULights().size() * sizeof(int), nullptr)); + + buffers.push_back(new Buffer(Buffer::Type::UBO, 0, sizeof(GPUCamera), nullptr)); + buffers.push_back(new Buffer(Buffer::Type::UBO, 1, sizeof(GPUVolume), nullptr)); + buffers.push_back(new Buffer(Buffer::Type::UBO, 2, sizeof(GPUDebug), nullptr)); + + return (buffers); +} + +void Scene::changeScene(std::string &name) +{ + _gpu_bvh_data.clear(); + _gpu_bvh.clear(); + _gpu_objects.clear(); + _gpu_triangles.clear(); + _gpu_materials.clear(); + _textures.clear(); + _emissive_textures.clear(); + _gpu_textures.clear(); + _gpu_emissive_textures.clear(); + _gpu_lights.clear(); + init(name); + createDataOnGPU(); + loadTextures(); +}