diff --git a/inc/Math.hpp b/inc/Math.hpp index 4f4fa24..82b5a91 100644 --- a/inc/Math.hpp +++ b/inc/Math.hpp @@ -1,4 +1,5 @@ #include Color ColorLerp(Color c1, Color c2, float amount); -Color ColorAdd(Color c, int add); \ No newline at end of file +Color ColorAdd(Color c1, Color c2); +Color ColorAddValue(Color c, int add); \ No newline at end of file diff --git a/inc/canvas/Tree.hpp b/inc/canvas/Tree.hpp index 7a6a3e0..d3ce8f5 100644 --- a/inc/canvas/Tree.hpp +++ b/inc/canvas/Tree.hpp @@ -25,12 +25,16 @@ public: private: Dna *m_dna; + uint128 branchSeed; int size = 0; Vector2 start = {0}; std::list draw_calls; - void generateBranches(); void drawBranch(); Vector2 drawLine(); + + inline uint8_t get_num_of_branches(uint8_t dep); + inline Color get_start_color(uint8_t dep); + inline Color get_end_color(uint8_t dep, Color &start); }; \ No newline at end of file diff --git a/inc/values/Dna.hpp b/inc/values/Dna.hpp index 401a2b5..01fa4c9 100644 --- a/inc/values/Dna.hpp +++ b/inc/values/Dna.hpp @@ -28,9 +28,9 @@ struct Branch uint8_t colorR; uint8_t colorG; uint8_t colorB; - uint8_t colorR_change; - uint8_t colorG_change; - uint8_t colorB_change; + int8_t colorR_change; + int8_t colorG_change; + int8_t colorB_change; uint8_t color_parent; uint8_t color_var; diff --git a/random/netw.cpp b/random/netw.cpp new file mode 100644 index 0000000..24915ba --- /dev/null +++ b/random/netw.cpp @@ -0,0 +1,142 @@ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define PORT 8080 +#define BUFFER_SIZE 1024 + +struct in_addr ipAddr; +bool resolved = false; + +bool resolveDNS() +{ + const char *host = "petrovv.com"; + struct addrinfo hints{}, *res, *p; + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version + hints.ai_socktype = SOCK_STREAM; + + int status = getaddrinfo(host, nullptr, &hints, &res); + if (status != 0) + { + return false; + } + + for (p = res; p != nullptr; p = p->ai_next) + { + + if (p->ai_family == AF_INET) + { // IPv4 + auto *ipv4 = (struct sockaddr_in *)p->ai_addr; + ipAddr = ipv4->sin_addr; + resolved = true; + } + + break; // Just take the first address + } + freeaddrinfo(res); + return true; +} + +int sendFile() +{ + int sock = 0; + struct sockaddr_in serv_addr; + char buffer[BUFFER_SIZE] = {0}; + std::ifstream file("example.txt", std::ios::binary); + + if (!file) + { + // std::cerr << "Unable to open file" << std::endl; + TraceLog(LOG_ERROR, "Unable to open file"); + return 1; + } + + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + TraceLog(LOG_ERROR, "Socket creation error"); + return 1; + } + + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(PORT); + + // Convert IPv4 and IPv6 addresses from text to binary form + if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) + { + TraceLog(LOG_ERROR, "Invalid address/ Address not supported"); + return 1; + } + + if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) + { + TraceLog(LOG_ERROR, "Connection Failed"); + return 1; + } + + while (file.read(buffer, BUFFER_SIZE)) + { + send(sock, buffer, file.gcount(), 0); + } + + // Send the remaining bytes if the file size is not a multiple of BUFFER_SIZE + send(sock, buffer, file.gcount(), 0); + + TraceLog(LOG_INFO, "File sent successfully"); + + close(sock); + file.close(); + return 0; +} + +int sendBuffer() +{ + if (!resolved) + return 1; + int sock = 0; + struct sockaddr_in serv_addr; + char buffer[BUFFER_SIZE] = {123, 123, 123}; + + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + TraceLog(LOG_ERROR, "Socket creation error"); + return 1; + } + + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(PORT); + serv_addr.sin_addr = ipAddr; + + // Convert IPv4 and IPv6 addresses from text to binary form + // if (inet_pton(AF_INET, "192.168.0.31", &serv_addr.sin_addr) <= 0) + // { + // TraceLog(LOG_ERROR, "Invalid address/ Address not supported"); + // return 1; + // } + + if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) + { + TraceLog(LOG_ERROR, "Connection Failed"); + return 1; + } + + send(sock, buffer, 3, 0); + + TraceLog(LOG_INFO, "File sent successfully"); + + close(sock); + + return 0; +} diff --git a/random/server.cpp b/random/server.cpp new file mode 100644 index 0000000..728e4da --- /dev/null +++ b/random/server.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include + +#define PORT 8080 +#define BUFFER_SIZE 1024 + +// use this https://github.com/eminfedar/async-sockets-cpp/tree/master + +int main() +{ + int server_fd, new_socket; + struct sockaddr_in address; + int opt = 1; + int addrlen = sizeof(address); + char buffer[BUFFER_SIZE] = {0}; + std::ofstream file("received_example.txt", std::ios::binary); + + if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) + { + std::cerr << "Socket failed" << std::endl; + return 1; + } + + if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) + { + std::cerr << "setsockopt" << std::endl; + return 1; + } + + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + address.sin_port = htons(PORT); + + if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) + { + std::cerr << "Bind failed" << std::endl; + return 1; + } + + if (listen(server_fd, 3) < 0) + { + std::cerr << "Listen failed" << std::endl; + return 1; + } + + if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) + { + std::cerr << "Accept failed" << std::endl; + return 1; + } + + int valread; + while ((valread = recv(new_socket, buffer, BUFFER_SIZE, 0)) > 0) + { + file.write(buffer, valread); + } + + std::cout << "File received successfully" << std::endl; + + close(new_socket); + close(server_fd); + file.close(); + return 0; +} diff --git a/src/Math.cpp b/src/Math.cpp index fefb840..5f1e7b8 100644 --- a/src/Math.cpp +++ b/src/Math.cpp @@ -16,11 +16,21 @@ Color ColorLerp(Color c1, Color c2, float amount) return ret; } -Color ColorAdd(Color c, int add) +Color ColorAddValue(Color c, int add) { int r = std::clamp(c.r + add, 0, 255); int g = std::clamp(c.g + add, 0, 255); int b = std::clamp(c.b + add, 0, 255); return {(unsigned char)r, (unsigned char)g, (unsigned char)b, c.a}; +} + +Color ColorAdd(Color c1, Color c2) +{ + int r = std::clamp(c1.r + c2.r, 0, 255); + int g = std::clamp(c1.g + c2.g, 0, 255); + int b = std::clamp(c1.b + c2.b, 0, 255); + int a = std::clamp(c1.a + c2.a, 0, 255); + + return {(unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a}; } \ No newline at end of file diff --git a/src/canvas/BackGround.cpp b/src/canvas/BackGround.cpp index fdad349..6b64757 100644 --- a/src/canvas/BackGround.cpp +++ b/src/canvas/BackGround.cpp @@ -38,7 +38,7 @@ void BackGround::draw(Dna *dna) } else { - DrawRectangleGradientV(0, 0, canvasSize, canvasSize, ColorAdd(BackGroundColors::backGroundColor, 60), BackGroundColors::backGroundColor); + DrawRectangleGradientV(0, 0, canvasSize, canvasSize, ColorAddValue(BackGroundColors::backGroundColor, 60), BackGroundColors::backGroundColor); } drawSun(); diff --git a/src/canvas/Tree.cpp b/src/canvas/Tree.cpp index 94c8f1c..de3ae31 100644 --- a/src/canvas/Tree.cpp +++ b/src/canvas/Tree.cpp @@ -9,6 +9,8 @@ #define ITER_PER_FRAME 5000 +constexpr int max_num_of_branches = 3; + // Public void Tree::init(int size) { @@ -22,6 +24,7 @@ void Tree::draw(Dna *dna) Circle::setSoftEdge(false); m_dna = dna; + branchSeed = dna->branchSeed; draw_calls.push_back({start, 0, (float)size / 4, 1}); tick(); } @@ -56,34 +59,24 @@ Vector2 Tree::drawLine() float thick = 2.0; float fstep = 1.0 / ((arg.lenghth / thick) * 1.5); - Color colorParent = { - m_dna->branches[arg.dep - 1].colorR, - m_dna->branches[arg.dep - 1].colorG, - m_dna->branches[arg.dep - 1].colorB, - 255}; + Color colorStart = get_start_color(arg.dep); - Color colorM = { - m_dna->branches[arg.dep].colorR, - m_dna->branches[arg.dep].colorG, - m_dna->branches[arg.dep].colorB, - 255}; + Color colorEnd = get_end_color(arg.dep, colorStart); for (float i = 0; i < 1; i += fstep) { Vector2 point = Vector2Lerp(arg.start, end, i); - Color color = ColorLerp(colorParent, colorM, i); + Color color = ColorLerp(colorStart, colorEnd, i); DrawCircleV(point, thick, color); // Fester on the phone to call DrawCircle insted of the Circle shader // Circle::setColor(color); // Circle::draw(point.x, point.y, thick); // TODO Change to BeginShaderMode and EndShaderMode only onece + + // use + // DrawRectangleGradientEx } return end; } -inline uint8_t get_num_of_branches(uint8_t count) -{ - return ((float)count / 255.0f) * 3 + 1; -} - void Tree::drawBranch() { DrawArgs arg = draw_calls.front(); @@ -93,12 +86,48 @@ void Tree::drawBranch() Vector2 next = drawLine(); float next_len = 0.7f; - float sectors = get_num_of_branches(m_dna->branches[arg.dep].branch_count) + 1; + float sectors = get_num_of_branches(arg.dep) + 1; float degres = 180.0f / sectors; - for (size_t i = 0; i < get_num_of_branches(m_dna->branches[arg.dep].branch_count); i++) + for (size_t i = 0; i < get_num_of_branches(arg.dep); i++) { float newAngle = arg.angleDeg - 90 + (degres * (i + 1)); draw_calls.push_back({next, newAngle, arg.lenghth * next_len, arg.dep + 1}); } } + +inline uint8_t Tree::get_num_of_branches(uint8_t dep) +{ + return ((float)m_dna->branches[dep].branch_count / 255.0f) * max_num_of_branches + 1; +} + +inline Color Tree::get_start_color(uint8_t dep) +{ + Color ret = { + m_dna->branches[dep].colorR, + m_dna->branches[dep].colorG, + m_dna->branches[dep].colorB, + 255}; + + if (dep > 0) + { + Color parent = { + m_dna->branches[dep - 1].colorR, + m_dna->branches[dep - 1].colorG, + m_dna->branches[dep - 1].colorB, + 255}; + float mix = ((float)m_dna->branches[dep].color_parent) / 255.0f; + ret = ColorLerp(ret, parent, mix); + } + + return ret; +} + +inline Color Tree::get_end_color(uint8_t dep, Color &start) +{ + return { + start.r + m_dna->branches[dep].colorR_change, + start.g + m_dna->branches[dep].colorG_change, + start.b + m_dna->branches[dep].colorB_change, + 255}; +} \ No newline at end of file