From c298b3e6d02345b4ed897ec23923a79656da9b92 Mon Sep 17 00:00:00 2001 From: LittleTheFu Date: Sun, 29 Sep 2024 15:30:14 +0800 Subject: [PATCH] save progress --- CMakeLists.txt | 2 + camera/camera.cpp | 2 +- geometry/tri.cpp | 134 ++++++++++++++++++++++++++++++++++++++++++++++ geometry/tri.h | 46 ++++++++++++++++ light/light.cpp | 2 +- main/main.cpp | 11 ++-- scene/scene.cpp | 35 +++++++----- 7 files changed, 212 insertions(+), 20 deletions(-) create mode 100644 geometry/tri.cpp create mode 100644 geometry/tri.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d5461e29..e6c2f2c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ SET (RAY_TRACER_SOURCE geometry/mesh.cpp geometry/plane.cpp geometry/triangle.cpp + geometry/tri.cpp light/light.cpp # main/main.cpp material/dummyMaterial.cpp @@ -75,6 +76,7 @@ SET (RAY_TRACER_HEADER geometry/geometry.h geometry/mesh.h geometry/plane.h + geometry/tri.h geometry/triangle.h light/light.h material/dummyMaterial.h diff --git a/camera/camera.cpp b/camera/camera.cpp index 20944262..e7b087da 100644 --- a/camera/camera.cpp +++ b/camera/camera.cpp @@ -6,7 +6,7 @@ Camera::Camera() { - m_factor = 5; + m_factor = 3; m_Width = Common::default_screen_width * m_factor; m_Height = Common::default_screen_height * m_factor; diff --git a/geometry/tri.cpp b/geometry/tri.cpp new file mode 100644 index 00000000..c7061523 --- /dev/null +++ b/geometry/tri.cpp @@ -0,0 +1,134 @@ +#include "tri.h" +#include "common.h" + +Tri::Tri() +{ + m_ab = m_b.pos - m_a.pos; + m_bc = m_c.pos - m_b.pos; + m_ca = m_a.pos - m_c.pos; +} + +Tri::Tri(const TriVertex &a, const TriVertex &b, const TriVertex &c, Material *pMtrl) +{ + m_a = a; + m_b = b; + m_c = c; + + m_ab = m_b.pos - m_a.pos; + m_bc = m_c.pos - m_b.pos; + m_ca = m_a.pos - m_c.pos; + + this->m_pMtrl = pMtrl; + + Vector3 pos(0,0,320); + init(Vector3::ZERO, pos); +} + +bool Tri::hit(const Ray &ray, HitRecord &record, Light *pLight) const +{ + record.t = Common::FLOAT_MAX; + + const Ray newRay = ray.genNewRay(m_transform); + + bool reverse = false; + if (newRay.dir.isSameDir(getLocalNormal())) + { + reverse = true; + } + + const float n = (-newRay.origin) * getLocalNormal(reverse); + const float d = newRay.dir * getLocalNormal(reverse); + + record.t = n / d; + if (record.t < Common::FLOAT_SAMLL_NUMBER) + { + // std::cout << record.t << "," << n << "," << d << std::endl; + // std::cout<<"false"<eval(record.u, record.v, -newRay.dir, r, record.reflectPdf); + record.dot = Common::clamp(std::abs(r * Common::LOCAL_NORMAL), Common::FLOAT_SAMLL_NUMBER, 1.0f); + record.reflect = m_transform.transformVector(r); + record.isMirror = m_pMtrl->isMirror(); + + if (record.isMirror) + { + record.dot = 1; + } + } + + // std::cout<<"true"<setTag(Common::TAG_PLANE_FRONT); - backPlane->setTag(Common::TAG_PLANE_BACK); - topPlane->setTag(Common::TAG_PLANE_TOP); - bottomPlane->setTag(Common::TAG_PLANE_BOTTOM); - leftPlane->setTag(Common::TAG_PLANE_LEFT); - rightPlane->setTag(Common::TAG_PLANE_RIGHT); + // frontPlane->setTag(Common::TAG_PLANE_FRONT); + // backPlane->setTag(Common::TAG_PLANE_BACK); + // topPlane->setTag(Common::TAG_PLANE_TOP); + // bottomPlane->setTag(Common::TAG_PLANE_BOTTOM); + // leftPlane->setTag(Common::TAG_PLANE_LEFT); + // rightPlane->setTag(Common::TAG_PLANE_RIGHT); light->setTag(Common::TAG_LIGHT); @@ -134,7 +140,10 @@ void Scene::constructScene() m_pObjectPool->add(light); - m_pObjectPool->add(triAngle); + m_pObjectPool->add(aquaBall); + m_pObjectPool->add(tri); + + // m_pObjectPool->add(triAngle); // pool->add(redBall); // pool->add(yellowBall); @@ -148,12 +157,12 @@ void Scene::constructScene() // pool->add(textureBall); - m_pObjectPool->add(frontPlane); - m_pObjectPool->add(backPlane); - m_pObjectPool->add(topPlane); - m_pObjectPool->add(bottomPlane); - m_pObjectPool->add(leftPlane); - m_pObjectPool->add(rightPlane); + // m_pObjectPool->add(frontPlane); + // m_pObjectPool->add(backPlane); + // m_pObjectPool->add(topPlane); + // m_pObjectPool->add(bottomPlane); + // m_pObjectPool->add(leftPlane); + // m_pObjectPool->add(rightPlane); } void Scene::preRender()