diff --git a/CMakeLists.txt b/CMakeLists.txt index 01fd637..88cab3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(Inferno) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} CMakeModules/) cmake_policy(SET CMP0037 OLD) set(CMAKE_BUILD_TYPE Debug) +SET(CMAKE_CXX_FLAGS "-g") set(executable output) set(SrcDIR ./src) diff --git a/resources/cornell.mtl b/resources/cornell.mtl new file mode 100644 index 0000000..0d734c0 --- /dev/null +++ b/resources/cornell.mtl @@ -0,0 +1,84 @@ +# Blender MTL File: 'None' +# Material Count: 8 + +newmtl backWall +Ns 9.803922 +Ka 0.705000 0.705000 0.705000 +Kd 0.725000 0.710000 0.680000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +#illum 2 + +newmtl ceiling +Ns 9.803922 +Ka 0.705000 0.705000 0.705000 +Kd 0.725000 0.710000 0.680000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +#illum 2 + +newmtl floor +Ns 9.803922 +Ka 0.705000 0.705000 0.705000 +Kd 0.725000 0.710000 0.680000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +#illum 2 + +newmtl leftWall +Ns 9.803922 +Ka 0.248333 0.248333 0.248333 +#Kd 1.000000 0.000000 0.000000 +Kd 0.750000 0.250000 0.250000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.500000 +d 1.000000 +#illum 2 + +newmtl light +Ns 9.803922 +Ka 0.780000 0.780000 0.780000 +Kd 0.780000 0.780000 0.780000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 15 + +newmtl rightWall +Ns 9.803922 +Ka 0.227000 0.227000 0.227000 +#Kd 0.000000 0.000000 1.000000 +Kd 0.250000 0.250000 0.750000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.500000 +d 1.000000 +#illum 2 + +newmtl shortBox +Ns 9.803922 +Ka 0.705000 0.705000 0.705000 +Kd 0.725000 0.710000 0.680000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +#illum 2 + +newmtl tallBox +Ns 9.803922 +Ka 0.705000 0.705000 0.705000 +Kd 0.725000 0.710000 0.680000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +#illum 2 diff --git a/resources/cornell.obj b/resources/cornell.obj new file mode 100644 index 0000000..beb88af --- /dev/null +++ b/resources/cornell.obj @@ -0,0 +1,106 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +mtllib cornell.mtl +o cornell +v -0.990000 0.000000 -1.040000 +v 1.000000 0.000000 -1.040000 +v 1.000000 1.990000 -1.040000 +v -1.020000 1.990000 -1.040000 +v -1.010000 -0.000000 0.990000 +v 1.000000 -0.000000 0.990000 +v 1.000000 0.000000 -1.040000 +v -0.990000 0.000000 -1.040000 +v -0.240000 1.980000 0.160000 +v -0.240000 1.980000 -0.220000 +v 0.230000 1.980000 -0.220000 +v 0.230000 1.980000 0.160000 +v 1.000000 0.000000 -1.040000 +v 1.000000 -0.000000 0.990000 +v 1.000000 1.990000 0.990000 +v 1.000000 1.990000 -1.040000 +v -1.020000 1.990000 0.990000 +v -1.020000 1.990000 -1.040000 +v 1.000000 1.990000 -1.040000 +v 1.000000 1.990000 0.990000 +v -1.010000 -0.000000 0.990000 +v -0.990000 0.000000 -1.040000 +v -1.020000 1.990000 -1.040000 +v -1.020000 1.990000 0.990000 +v 0.530000 0.600000 0.750000 +v 0.700000 0.600000 0.170000 +v 0.130000 0.600000 0.000000 +v -0.050000 0.600000 0.570000 +v -0.050000 -0.000000 0.570000 +v -0.050000 0.600000 0.570000 +v 0.130000 0.600000 0.000000 +v 0.130000 0.000000 0.000000 +v 0.530000 -0.000000 0.750000 +v 0.530000 0.600000 0.750000 +v -0.050000 0.600000 0.570000 +v -0.050000 -0.000000 0.570000 +v 0.700000 -0.000000 0.170000 +v 0.700000 0.600000 0.170000 +v 0.530000 0.600000 0.750000 +v 0.530000 -0.000000 0.750000 +v 0.130000 0.000000 0.000000 +v 0.130000 0.600000 0.000000 +v 0.700000 0.600000 0.170000 +v 0.700000 -0.000000 0.170000 +v -0.530000 1.200000 0.090000 +v 0.040000 1.200000 -0.090000 +v -0.140000 1.200000 -0.670000 +v -0.710000 1.200000 -0.490000 +v -0.530000 -0.000000 0.090000 +v -0.530000 1.200000 0.090000 +v -0.710000 1.200000 -0.490000 +v -0.710000 0.000000 -0.490000 +v -0.710000 0.000000 -0.490000 +v -0.710000 1.200000 -0.490000 +v -0.140000 1.200000 -0.670000 +v -0.140000 0.000000 -0.670000 +v -0.140000 0.000000 -0.670000 +v -0.140000 1.200000 -0.670000 +v 0.040000 1.200000 -0.090000 +v 0.040000 0.000000 -0.090000 +v 0.040000 0.000000 -0.090000 +v 0.040000 1.200000 -0.090000 +v -0.530000 1.200000 0.090000 +v -0.530000 -0.000000 0.090000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +vn -0.9551 0.0000 0.2964 +vn -0.3011 0.0000 -0.9536 +vn 0.9551 0.0000 -0.2964 +vn 0.3011 -0.0000 0.9536 +vn 0.9999 0.0100 0.0049 +vn -0.9536 0.0000 -0.3011 +vn -0.2964 0.0000 0.9551 +vn 0.9596 -0.0000 0.2813 +vn 0.2858 0.0000 -0.9583 +usemtl rightWall +s 1 +f 13//1 14//1 15//1 16//1 +usemtl light +f 9//2 10//2 11//2 12//2 +usemtl floor +f 5//3 6//3 7//3 8//3 +usemtl ceiling +f 17//2 18//2 19//2 20//2 +usemtl backWall +f 1//4 2//4 3//4 4//4 +usemtl tallBox +f 45//3 46//3 47//3 48//3 +f 49//5 50//5 51//5 52//5 +f 53//6 54//6 55//6 56//6 +f 57//7 58//7 59//7 60//7 +f 61//8 62//8 63//8 64//8 +usemtl leftWall +f 21//9 22//9 23//9 24//9 +usemtl shortBox +f 25//3 26//3 27//3 28//3 +f 29//10 30//10 31//10 32//10 +f 33//11 34//11 35//11 36//11 +f 37//12 38//12 39//12 40//12 +f 41//13 42//13 43//13 44//13 diff --git a/src/definitions/primatives/sphere.cpp b/src/definitions/primatives/sphere.cpp index 32119f4..ef489f4 100644 --- a/src/definitions/primatives/sphere.cpp +++ b/src/definitions/primatives/sphere.cpp @@ -18,15 +18,15 @@ bool Sphere::DoesIntersect(Ray& ray, float& t) { return true; } - + glm::vec3 Sphere::SurfaceNormal(glm::vec3 hitPoint) { return glm::normalize(hitPoint - center); } glm::vec2 Sphere::TexCoords(glm::vec3 hitPoint) { glm::vec3 hit = hitPoint - center; - return { (1.0 + atan2(hit.z, hit.x) / PI) * 0.5, - acos(hit.y / radius) / PI }; + return { (1.0f + atan2(hit.z, hit.x) / PI) * 0.5f, + acos(hit.y / radius) / PI}; } void Sphere::Translate(glm::vec3 trans) { diff --git a/src/engine/progressiverenderer.cpp b/src/engine/progressiverenderer.cpp index 3be3cfe..6ebacf3 100644 --- a/src/engine/progressiverenderer.cpp +++ b/src/engine/progressiverenderer.cpp @@ -81,11 +81,7 @@ std::vector loadTriangles(std::string path) { anz[v] = attrib.normals[3 * idx.normal_index + 2]; } - tinyobj::material_t material = materials[shapes[s].mesh.material_ids[f]]; - - // glm::vec3 normal = getNormal({avx[0], avy[0], avz[0]}, - // {avx[1], avy[1], avz[1]}, - // {avx[2], avy[2], avz[2]}); + // tinyobj::material_t material = materials[shapes[s].mesh.material_ids[f]]; Triangle* tmp = new Triangle { {avx[0], avy[0], avz[0]}, @@ -113,6 +109,9 @@ std::vector loadTriangles(std::string path) { void ProgressiveRenderer::Render() { + m_scene->objects = loadTriangles("/home/ben/programming/inferno/resources/cornell.obj"); + for (const auto& object : m_scene->objects) + object->Translate({ 0.0f, -1.0f, -3.0f }); while (m_interface->Active) { @@ -129,15 +128,17 @@ void ProgressiveRenderer::Render() { float t, i; bool didhit = TraceRay(ray, m_scene, t, i); if (!didhit) { - m_interface->SetPixelSafe(x, y, 0xFFFFFF); + m_interface->SetPixelSafe(x, y, 0x000000); continue; } Primative* hit = m_scene->objects[i]; + glm::vec3 hitPoint = ray.origin + ray.direction * t; - if (hit->type == TYPE_SPHERE) { - m_interface->SetPixelSafe(x, y, 0xFFFF00); - } + + glm::vec3 normal = hit->SurfaceNormal(hitPoint); + Pixel col((normal.x + 1.0f) * 127.5f, (normal.y + 1.0f) * 127.5f, (normal.z + 1.0f) * 127.5f); + m_interface->SetPixelSafe(x, y, col.rgb()); } diff --git a/src/pixel.hpp b/src/pixel.hpp index 86fbc64..2e06f4e 100644 --- a/src/pixel.hpp +++ b/src/pixel.hpp @@ -7,6 +7,9 @@ struct Pixel { uint8_t g; uint8_t b; + Pixel(uint8_t r, uint8_t g, uint8_t b) + : r(r), g(g), b(b) { }; + inline uint32_t argb() { return a << 24 | r << 16 | g << 8| b; } @@ -14,8 +17,19 @@ struct Pixel { inline uint32_t rgb() { return 0xFF000000 | r << 16 | g << 8| b; } + + inline void Clamp() { + std::max((uint8_t)0, std::min(a, (uint8_t)256)); + std::max((uint8_t)0, std::min(r, (uint8_t)256)); + std::max((uint8_t)0, std::min(g, (uint8_t)256)); + std::max((uint8_t)0, std::min(b, (uint8_t)256)); + } + }; +inline uint8_t Clamp(int n, int upper, int lower) { + return std::max(lower, std::min(n, upper)); +} inline uint32_t argb8888(uint8_t a, uint8_t r, uint8_t g, uint8_t b) { return a << 24 | r << 16 | g << 8| b;