Skip to content
Snippets Groups Projects
Commit 285275ec authored by Yoel's avatar Yoel
Browse files

Triangle and Mesh refactor: Currently no impl for texture coords

parent fe5d63f6
No related branches found
No related tags found
No related merge requests found
...@@ -45,9 +45,14 @@ std::optional<cam::Hit> Triangle::intersect(const cam::Ray& r) const { ...@@ -45,9 +45,14 @@ std::optional<cam::Hit> Triangle::intersect(const cam::Ray& r) const {
.normalize(); .normalize();
// if (util::dot(bary_normal, cross_normal) < 0) // if (util::dot(bary_normal, cross_normal) < 0)
// std::cout << "Hm" << std::endl; // std::cout << "Hm" << std::endl;
return std::optional<cam::Hit>(cam::Hit(hit, cross_normal, t, material)); return std::optional<cam::Hit>(
cam::Hit(hit, cross_normal, texture_coordinates(hit), t, material));
} }
std::pair<float, float> Triangle::texture_coordinates(
const util::Vec3& pos) const {
return std::pair<float, float>({0, 0});
}
util::AxisAlignedBoundingBox Triangle::bounds() const { util::AxisAlignedBoundingBox Triangle::bounds() const {
// std::cout << "In tri bounds" << std::endl; // std::cout << "In tri bounds" << std::endl;
return bb; return bb;
...@@ -58,8 +63,9 @@ util::SurfacePoint Triangle::sampleLight() const { ...@@ -58,8 +63,9 @@ util::SurfacePoint Triangle::sampleLight() const {
float x = util::disMinus1To1(util::gen) * 1 / 2; float x = util::disMinus1To1(util::gen) * 1 / 2;
// Z coord of the sampled point. // Z coord of the sampled point.
float z = util::disMinus1To1(util::gen) * 1 / 2; float z = util::disMinus1To1(util::gen) * 1 / 2;
return util::SurfacePoint(util::Vec3(x, 0, z), util::Vec3(0, 1, 0), util::Vec3 pos(x, 0, z);
material); return util::SurfacePoint(pos, util::Vec3(0, 1, 0),
texture_coordinates(pos), material);
// The sampled point will be in local coordinates. // The sampled point will be in local coordinates.
} }
// TODO // TODO
......
...@@ -15,6 +15,7 @@ class Triangle : public Light, public Shape { ...@@ -15,6 +15,7 @@ class Triangle : public Light, public Shape {
Triangle(util::Vertex p1, util::Vertex p2, util::Vertex p3, Triangle(util::Vertex p1, util::Vertex p2, util::Vertex p3,
const std::shared_ptr<material::Material>& material); const std::shared_ptr<material::Material>& material);
std::optional<cam::Hit> intersect(const cam::Ray& r) const; std::optional<cam::Hit> intersect(const cam::Ray& r) const;
std::pair<float, float> texture_coordinates(const util::Vec3& pos) const;
util::AxisAlignedBoundingBox bounds() const; util::AxisAlignedBoundingBox bounds() const;
void recalculateBB(); void recalculateBB();
......
...@@ -31,25 +31,25 @@ std::optional<cam::Hit> TriangleMesh::intersect(size_t i, ...@@ -31,25 +31,25 @@ std::optional<cam::Hit> TriangleMesh::intersect(size_t i,
const cam::Ray& r) const { const cam::Ray& r) const {
if (!hierarchy[i].bb.intersects(r)) return std::nullopt; if (!hierarchy[i].bb.intersects(r)) return std::nullopt;
std::array<cam::Hit, 3> hits = { std::array<cam::Hit, 3> hits = {
cam::Hit(util::Vec3(0), util::Vec3(0), cam::Hit(util::Vec3(0), util::Vec3(0), {0.0, 0.0},
std::numeric_limits<float>::infinity(), nullptr), std::numeric_limits<float>::infinity(), nullptr),
cam::Hit(util::Vec3(0), util::Vec3(0), cam::Hit(util::Vec3(0), util::Vec3(0), {0.0, 0.0},
std::numeric_limits<float>::infinity(), nullptr), std::numeric_limits<float>::infinity(), nullptr),
cam::Hit(util::Vec3(0), util::Vec3(0), cam::Hit(util::Vec3(0), util::Vec3(0), {0.0, 0.0},
std::numeric_limits<float>::infinity(), nullptr)}; std::numeric_limits<float>::infinity(), nullptr)};
// Check left // Check left
size_t left_i = hierarchy[i].left; size_t left_i = hierarchy[i].left;
std::optional<cam::Hit> left_hit = std::nullopt; std::optional<cam::Hit> left_hit = std::nullopt;
if (left_i != -1) left_hit = intersect(left_i, r); if (left_i != -1) left_hit = intersect(left_i, r);
hits[0] = left_hit.value_or(cam::Hit(util::Vec3(0), util::Vec3(0), hits[0] = left_hit.value_or(
std::numeric_limits<float>::infinity(), cam::Hit(util::Vec3(0), util::Vec3(0), {0.0, 0.0},
nullptr)); std::numeric_limits<float>::infinity(), nullptr));
// Check right // Check right
size_t right_i = hierarchy[i].right; size_t right_i = hierarchy[i].right;
std::optional<cam::Hit> right_hit = std::nullopt; std::optional<cam::Hit> right_hit = std::nullopt;
if (right_i != -1) right_hit = intersect(right_i, r); if (right_i != -1) right_hit = intersect(right_i, r);
hits[1] = right_hit.value_or( hits[1] = right_hit.value_or(
cam::Hit(util::Vec3(0), util::Vec3(0), cam::Hit(util::Vec3(0), util::Vec3(0), {0.0, 0.0},
std::numeric_limits<float>::infinity(), nullptr)); std::numeric_limits<float>::infinity(), nullptr));
std::optional<cam::Hit> temp = std::nullopt; std::optional<cam::Hit> temp = std::nullopt;
...@@ -69,21 +69,26 @@ std::optional<cam::Hit> TriangleMesh::intersect(size_t i, ...@@ -69,21 +69,26 @@ std::optional<cam::Hit> TriangleMesh::intersect(size_t i,
} }
} }
} }
hits[2] = mid_hit.value_or(cam::Hit(util::Vec3(0), util::Vec3(0), hits[2] = mid_hit.value_or(
std::numeric_limits<float>::infinity(), cam::Hit(util::Vec3(0), util::Vec3(0), {0.0, 0.0},
nullptr)); std::numeric_limits<float>::infinity(), nullptr));
std::sort(hits.begin(), hits.end(), std::sort(hits.begin(), hits.end(),
[](cam::Hit a, cam::Hit b) { return a.scalar() < b.scalar(); }); [](cam::Hit a, cam::Hit b) { return a.scalar() < b.scalar(); });
if (hits[0].material == nullptr) return std::nullopt; if (hits[0].material == nullptr) return std::nullopt;
// for (auto hit : hits) std::cout << hit << std::endl; // for (auto hit : hits) std::cout << hit << std::endl;
return hits[0]; return hits[0];
} }
std::pair<float, float> TriangleMesh::texture_coordinates(
const util::Vec3& pos) const {
return std::pair<float, float>({0.0, 0.0});
}
util::AxisAlignedBoundingBox TriangleMesh::bounds() const { util::AxisAlignedBoundingBox TriangleMesh::bounds() const {
return hierarchy[0].bb; return hierarchy[0].bb;
} }
util::SurfacePoint TriangleMesh::sampleLight() const { util::SurfacePoint TriangleMesh::sampleLight() const {
return util::SurfacePoint(util::Vec3(), 0, material); return util::SurfacePoint(util::Vec3(0), 0, {0.0, 0.0}, material);
} }
util::Vec3 TriangleMesh::calculateLightEmission(const util::SurfacePoint& p, util::Vec3 TriangleMesh::calculateLightEmission(const util::SurfacePoint& p,
const util::Vec3& d) const { const util::Vec3& d) const {
......
...@@ -23,6 +23,8 @@ class TriangleMesh : public Light, public Shape { ...@@ -23,6 +23,8 @@ class TriangleMesh : public Light, public Shape {
TriangleMesh(std::istream& in, TriangleMesh(std::istream& in,
const std::shared_ptr<material::Material>& mat); const std::shared_ptr<material::Material>& mat);
std::optional<cam::Hit> intersect(const cam::Ray& r) const override; std::optional<cam::Hit> intersect(const cam::Ray& r) const override;
std::pair<float, float> texture_coordinates(
const util::Vec3& pos) const override;
util::AxisAlignedBoundingBox bounds() const override; util::AxisAlignedBoundingBox bounds() const override;
util::SurfacePoint sampleLight() const override; util::SurfacePoint sampleLight() const override;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment