From b2c8aaaf09f25f67fa6b4ed130330dbcff8a6e66 Mon Sep 17 00:00:00 2001 From: AfonsoCMSousa Date: Thu, 12 Jun 2025 12:19:36 +0100 Subject: [PATCH] Created and tested vec3. --- .gitignore | 8 ++++++ ROADMAP.md | 6 ++++- build/bin/test | Bin 82184 -> 0 bytes include/vector/utils_vec.cpp | 49 +++++++++++++++++++++++++++++++++++ include/vector/utils_vec.hpp | 37 ++++++++++++++++++++++++++ source/main.cpp | 24 ++++++++++++++++- 6 files changed, 122 insertions(+), 2 deletions(-) delete mode 100755 build/bin/test create mode 100644 include/vector/utils_vec.cpp create mode 100644 include/vector/utils_vec.hpp diff --git a/.gitignore b/.gitignore index 226ada1..2b70b8a 100644 --- a/.gitignore +++ b/.gitignore @@ -100,3 +100,11 @@ CTestTestfile.cmake _deps CMakeUserPresets.json +# Build / Compiled program + +build/Render +build/bin/* +Render +build/Render.exe +Render.exe + diff --git a/ROADMAP.md b/ROADMAP.md index c2f166a..b49e491 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -5,13 +5,17 @@ This roadmap breaks down the essential steps to build your CPU-based raytracer f --- ## Phase 1: Foundations & Core Engine -- [ ] Set up vector math utilities (`vec3`): add, subtract, dot, cross, normalize +- [x] Set up vector math utilities (`vec3`): add, subtract, dot, cross, normalize - [ ] Implement Ray class — origin, direction, basic functions - [ ] Basic Sphere object — position, radius, material properties - [ ] Ray-Sphere intersection logic — the core of your renderer - [ ] Camera setup — generate rays through the viewport - [ ] Scene structure — manage objects and lights +# Objectives: + - [ ] Render a single sphere with basic color + - [ ] Output to a simple PPM file format + --- ## Phase 2: Lighting & Shading Basics diff --git a/build/bin/test b/build/bin/test deleted file mode 100755 index e9a12480d30d1d2d0fae5e3854a0e87ed2b7410d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82184 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 diff --git a/include/vector/utils_vec.cpp b/include/vector/utils_vec.cpp new file mode 100644 index 0000000..79bfcfc --- /dev/null +++ b/include/vector/utils_vec.cpp @@ -0,0 +1,49 @@ +#include "utils_vec.hpp" + +vec3 vec3::operator+(const vec3 &other) const +{ + return vec3(x + other.x, y + other.y, z + other.z); +} + +vec3 vec3::operator-(const vec3 &other) const +{ + return vec3(x - other.x, y - other.y, z - other.z); +} + +vec3 vec3::operator*(float scalar) const +{ + return vec3(x * scalar, y * scalar, z * scalar); +} + +vec3 vec3::operator/(float scalar) const +{ + if (scalar == 0) + { + fprintf(stderr, "Error: Division by zero in vec3::operator/.\n"); + } + return vec3(x / scalar, y / scalar, z / scalar); +} + +vec3 vec3::dot(const vec3 &other) const +{ + return vec3(x * other.x, y * other.y, z * other.z); +} + +vec3 vec3::cross(const vec3 &other) const +{ + return vec3( + y * other.z - z * other.y, + z * other.x - x * other.z, + x * other.y - y * other.x); +} + +vec3 vec3::normalize() const +{ + float length = sqrt(x * x + y * y + z * z); + if (length == 0) + { + fprintf(stderr, "Error: Normalization of zero vector in vec3::normalize.\n"); + return vec3(0, 0, 0); // Return zero vector if normalization fails + } + return vec3(x / length, y / length, z / length); +} \ No newline at end of file diff --git a/include/vector/utils_vec.hpp b/include/vector/utils_vec.hpp new file mode 100644 index 0000000..ee56b19 --- /dev/null +++ b/include/vector/utils_vec.hpp @@ -0,0 +1,37 @@ +#ifndef UTILS_VEC_HPP +#define UTILS_VEC_HPP + +#include +#include +#include +#include +#include + +class vec3 +{ +private: + float x, y, z; + +public: + vec3() : x(0), y(0), z(0) {} + vec3(float x, float y, float z) : x(x), y(y), z(z) {} + + float getX() const { return x; } + float getY() const { return y; } + float getZ() const { return z; } + + void setX(float val) { this->x = val; } + void setY(float val) { this->y = val; } + void setZ(float val) { this->z = val; } + + vec3 operator+(const vec3 &other) const; + vec3 operator-(const vec3 &other) const; + vec3 operator*(float scalar) const; + vec3 operator/(float scalar) const; + + vec3 dot(const vec3 &other) const; + vec3 cross(const vec3 &other) const; + vec3 normalize() const; +}; + +#endif // !UTILS_VEC_HPP diff --git a/source/main.cpp b/source/main.cpp index df28b27..3874686 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,7 +1,29 @@ #include +// Include the vector utilities header file +#include "vector/utils_vec.hpp" + int main() { - std::cout << "Hello, World!" << std::endl; + vec3 *v1 = (vec3 *)malloc(sizeof(vec3) * 2); + + if (v1 == nullptr) + { + fprintf(stderr, "Error: Memory allocation failed for vec3 array.\n"); + return 1; // Exit with error code + } + + for (int i = 0; i < 2; i++) + { + v1[i].setX(i + 1.0f); + v1[i].setY(i + 2.0f); + v1[i].setZ(i + 3.0f); + } + + vec3 v2 = v1[0] + v1[1]; + + std::cout << "v2: (" << v2.getX() << ", " << v2.getY() << ", " << v2.getZ() << ")" << std::endl; + + free(v1); // Free the allocated memory return 0; } \ No newline at end of file