From 960c4eb99c0dd78ee7b91cd098cf2d82b3c0ff55 Mon Sep 17 00:00:00 2001 From: tomoron Date: Thu, 20 Feb 2025 22:43:39 +0100 Subject: [PATCH] start server part of clusterizer --- Makefile | 3 ++ imgui.ini | 34 --------------- includes/RT.hpp | 8 +++- includes/RT/Arguments.hpp | 9 +++- includes/RT/Clusterizer.hpp | 60 ++++++++++++++++++++++++++ srcs/class/Arguments.cpp | 51 ++++++++++++---------- srcs/class/Clusterizer/Clusterizer.cpp | 56 ++++++++++++++++++++++++ srcs/class/Clusterizer/client.cpp | 23 ++++++++++ srcs/class/Clusterizer/server.cpp | 48 +++++++++++++++++++++ srcs/class/Renderer/Renderer.cpp | 6 +-- 10 files changed, 237 insertions(+), 61 deletions(-) delete mode 100644 imgui.ini create mode 100644 includes/RT/Clusterizer.hpp create mode 100644 srcs/class/Clusterizer/Clusterizer.cpp create mode 100644 srcs/class/Clusterizer/client.cpp create mode 100644 srcs/class/Clusterizer/server.cpp diff --git a/Makefile b/Makefile index d3d8cd1..61ccb7f 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,9 @@ ALL_SRCS := $(IMGUI_SRCS) gl.cpp \ class/Renderer/imgui.cpp \ class/Renderer/movements.cpp\ class/Renderer/saveLoad.cpp \ + class/Clusterizer/Clusterizer.cpp\ + class/Clusterizer/client.cpp \ + class/Clusterizer/server.cpp \ SRCS := $(ALL_SRCS:%=$(SRCS_DIR)/%) OBJS := $(addprefix $(OBJS_DIR)/, $(SRCS:%.cpp=%.o)) diff --git a/imgui.ini b/imgui.ini deleted file mode 100644 index c6c3f9e..0000000 --- a/imgui.ini +++ /dev/null @@ -1,34 +0,0 @@ -[Window][Debug##Default] -Pos=60,60 -Size=400,400 - -[Window][Camera] -Pos=1617,8 -Size=259,200 - -[Window][Material] -Pos=1594,206 -Size=262,299 - -[Window][Fog settings] -Pos=1632,514 -Size=247,130 -Collapsed=1 - -[Window][Debug] -Pos=1642,668 -Size=260,143 - -[Window][Debug BVH] -Pos=1628,542 -Size=274,131 -Collapsed=1 - -[Window][Renderer] -Pos=1556,610 -Size=284,382 - -[Window][Settings] -Pos=1616,42 -Size=340,941 - diff --git a/includes/RT.hpp b/includes/RT.hpp index 87f7736..fdd7680 100644 --- a/includes/RT.hpp +++ b/includes/RT.hpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/27 14:52:10 by TheRed #+# #+# */ -/* Updated: 2025/02/04 23:39:14 by tomoron ### ########.fr */ +/* Updated: 2025/02/20 21:28:15 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,6 +45,11 @@ # include # include +# include +# include +# include +# include + struct Vertex { glm::vec2 position; glm::vec2 texCoord; @@ -70,6 +75,7 @@ struct Vertex { # include "SceneParser.hpp" # include "ObjParser.hpp" # include "BVH.hpp" +# include "Clusterizer.hpp" diff --git a/includes/RT/Arguments.hpp b/includes/RT/Arguments.hpp index f5e4eed..c2e6c9e 100644 --- a/includes/RT/Arguments.hpp +++ b/includes/RT/Arguments.hpp @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 01:07:08 by tomoron #+# #+# */ -/* Updated: 2025/02/04 22:04:04 by tomoron ### ########.fr */ +/* Updated: 2025/02/20 19:52:31 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,10 +31,17 @@ class Arguments bool error(void) const; void show(void); + bool getBoolean(std::string name); + std::string *getString(std::string name); + std::string &getSceneName(void); std::string *getRenderPath(void); bool getHeadless(void); + bool isServer(void); + bool isClient(void); + std::string *getServerIp(void); + private: void printUsage(); diff --git a/includes/RT/Clusterizer.hpp b/includes/RT/Clusterizer.hpp new file mode 100644 index 0000000..bc2e83a --- /dev/null +++ b/includes/RT/Clusterizer.hpp @@ -0,0 +1,60 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Clusterizer.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tomoron +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/20 18:25:18 by tomoron #+# #+# */ +/* Updated: 2025/02/20 22:41:05 by tomoron ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef CLUSTERIZER_HPP +# define CLUSTERIZER_HPP + +# include "RT.hpp" + +typedef struct s_job +{ + std::string scene; + glm::vec3 pos; + glm::vec2 dir; + size_t samples; +} t_job; + +class Clusterizer +{ + public: + Clusterizer(Arguments args); + ~Clusterizer(); + + private: + void update(void); + bool getError(void); + + bool _isActive; + bool _isServer; + bool _error; + std::vector _jobs; + + private: //client + void initClient(void); + void updateClient(void); + + std::string _serverIp; + + private: //server + void initServer(std::string port); + void updateServer(void); + + void initServerSocket(uint16_t port); + + int _serverSocket; + + + + +}; + +#endif diff --git a/srcs/class/Arguments.cpp b/srcs/class/Arguments.cpp index 0f7e7cf..a426ae4 100644 --- a/srcs/class/Arguments.cpp +++ b/srcs/class/Arguments.cpp @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 01:05:44 by tomoron #+# #+# */ -/* Updated: 2025/02/04 22:17:04 by tomoron ### ########.fr */ +/* Updated: 2025/02/20 22:36:06 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,20 +38,28 @@ Arguments::Arguments(int argc, char **argv) std::cerr << "missing scene name" << std::endl; _err = 1; } + if(getBoolean("server") && getBoolean("client")) + { + std::cerr << "RT can't be both a client and a server" << std::endl; + _err = 1; + } } void Arguments::initArguments() { addArgument('r', "renderpath", 0); addArgument('h', "headless", 1); + addArgument('c', "client", 0); + addArgument('s', "server", 0); } void Arguments::printUsage(void) -{ - std::cerr << "usage : [options] [options]" << std::endl; +{ std::cerr << "usage : [options] [options]" << std::endl; std::cerr << R""""(options : -r | --renderpath : filename for the renderer path -h | --headless : does the program need to start rendering as soon as it starts(and close automatically) + -c | --client : start RT as a client + -s | --server : start a server )""""; } @@ -67,25 +75,6 @@ bool Arguments::error(void) const } -std::string &Arguments::getSceneName(void) -{ - return(_values["sceneName"]); -} - -std::string *Arguments::getRenderPath(void) -{ - if(_values.find("renderpath") != _values.end()) - return(&_values["renderpath"]); - else - return(0); -} - -bool Arguments::getHeadless(void) -{ - return(_values.find("headless") != _values.end()); -} - - void Arguments::addArgument(char shortName, std::string longName, int isFlag) { t_arg arg; @@ -161,3 +150,21 @@ int Arguments::handleArg(char **argv, int argc, int *i) } return(1); } + +bool Arguments::getBoolean(std::string name) +{ + return(_values.find(name) != _values.end()); +} + +std::string *Arguments::getString(std::string name) +{ + if(_values.find(name) != _values.end()) + return(&_values[name]); + else + return(0); +} + +std::string &Arguments::getSceneName(void) +{ + return(_values["sceneName"]); +} diff --git a/srcs/class/Clusterizer/Clusterizer.cpp b/srcs/class/Clusterizer/Clusterizer.cpp new file mode 100644 index 0000000..4abc8d7 --- /dev/null +++ b/srcs/class/Clusterizer/Clusterizer.cpp @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Clusterizer.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tomoron +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/20 18:24:39 by tomoron #+# #+# */ +/* Updated: 2025/02/20 22:42:42 by tomoron ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "RT.hpp" + +Clusterizer::Clusterizer(Arguments args) +{ + _isActive = 1; + _isServer = 0; + _error = 0; + _serverSocket = 0; + + if(args.getBoolean("server")) + { + _isServer = 1; + initServer(*args.getString("server")); + } + else if(args.getBoolean("client")) + { + _isServer = 0; + _serverIp = *args.getString("client"); + initClient(); + } + else + _isActive = 0; +} + +Clusterizer::~Clusterizer(void) +{ + if(_serverSocket) + close(_serverSocket); +} + +void Clusterizer::update(void) +{ + if(!_isActive) + return ; + if(_isServer) + updateServer(); + else + updateClient(); +} + +bool Clusterizer::getError(void) +{ + return(_error); +} diff --git a/srcs/class/Clusterizer/client.cpp b/srcs/class/Clusterizer/client.cpp new file mode 100644 index 0000000..517162a --- /dev/null +++ b/srcs/class/Clusterizer/client.cpp @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* client.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tomoron +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/20 21:08:38 by tomoron #+# #+# */ +/* Updated: 2025/02/20 21:21:45 by tomoron ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "RT.hpp" + +void Clusterizer::initClient(void) +{ + +} + +void Clusterizer::updateClient(void) +{ + +} diff --git a/srcs/class/Clusterizer/server.cpp b/srcs/class/Clusterizer/server.cpp new file mode 100644 index 0000000..b0e83e1 --- /dev/null +++ b/srcs/class/Clusterizer/server.cpp @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* server.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tomoron +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/20 21:08:38 by tomoron #+# #+# */ +/* Updated: 2025/02/20 22:43:00 by tomoron ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "RT.hpp" + +void Clusterizer::initServer(std::string port) +{ + try + { + initServerSocket(stoi(port)); + } + catch(std::exception &e) + { + std::cerr << "server initialization error : " << e.what() << std::endl; + _error = 1; + } +} + +void Clusterizer::initServerSocket(uint16_t port) +{ + struct sockaddr_in s_addr; + + _serverSocket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + if (_serverSocket < 0) + throw std::runtime_error("can't create socket"); + s_addr.sin_family = AF_INET; + s_addr.sin_addr.s_addr = INADDR_ANY; + s_addr.sin_port = port >> 8 | port << 8; + if (bind(_serverSocket, (struct sockaddr *)&s_addr, \ + sizeof(struct sockaddr_in)) < 0) + throw std::runtime_error("can't bind socket"); + if (::listen(_serverSocket, 50) < 0) + throw std::runtime_error("can't listen on socket"); +} + +void Clusterizer::updateServer(void) +{ + +} diff --git a/srcs/class/Renderer/Renderer.cpp b/srcs/class/Renderer/Renderer.cpp index 403f42f..45c5daf 100644 --- a/srcs/class/Renderer/Renderer.cpp +++ b/srcs/class/Renderer/Renderer.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/22 16:34:53 by tomoron #+# #+# */ -/* Updated: 2025/02/20 16:06:18 by tomoron ### ########.fr */ +/* Updated: 2025/02/20 20:02:05 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,8 @@ Renderer::Renderer(Scene *scene, Window *win, Arguments &args) std::string *renderPath; init(scene, win); - _headless = args.getHeadless(); - renderPath = args.getRenderPath(); + _headless = args.getBoolean("headless"); + renderPath = args.getString("renderpath"); if(renderPath) {