Skip to content
Snippets Groups Projects
Group.cpp 1.56 KiB
Newer Older
Postea's avatar
Postea committed
#include "Group.h"
Yoel's avatar
Yoel committed

#include "../material/Material.h"
#include "../tools/Vec3.h"
Postea's avatar
Postea committed

namespace shapes {
Group::Group(const util::Transformation& transform)
Yoel's avatar
Yoel committed
    : shapeList(std::vector<std::shared_ptr<Shape>>()), transform(transform) {
}
Group::Group(const util::Mat4& matrix)
Yoel's avatar
Yoel committed
    : shapeList(std::vector<std::shared_ptr<Shape>>()),
      transform(util::Transformation(matrix)) {
Postea's avatar
Postea committed

std::shared_ptr<cam::Hit> Group::intersect(const cam::Ray& r) const {
Yoel's avatar
Yoel committed
	cam::Ray imagR(transform.fromWorld.transformPoint(r.x0),
	               transform.fromWorld.transformDir(r.d), r.tmin, r.tmax,
	               r.normalize);
Postea's avatar
Postea committed

Yoel's avatar
Yoel committed
	std::shared_ptr<cam::Hit> result;
Postea's avatar
Postea committed

Yoel's avatar
Yoel committed
	for (std::shared_ptr<Shape> s : shapeList) {
		if (s->bounds().intersects(imagR)) {
			std::shared_ptr<cam::Hit> temp = s->intersect(imagR);
			if (temp != nullptr) {
				if (result == nullptr) {
					result = temp;
				} else if (result->t > temp->t) {
					result = temp;
				}
Yoel's avatar
Yoel committed
			}
		}
	}
	if (result != nullptr) {
		result = std::make_shared<cam::Hit>(
		    cam::Hit(transform.toWorld.transformPoint(result->hit),
		             transform.toWorldN.transformDir(result->n), result->t,
		             result->material));
	}
	return result;
util::AxisAlignedBoundingBox Group::bounds() const {
Yoel's avatar
Yoel committed
void Group::add(const std::shared_ptr<Shape>& shape) {
	shapeList.push_back(shape);
void Group::rebuildBoundingVolume() {
	util::AxisAlignedBoundingBox bb = shapeList[0]->bounds();
	for (auto shape_bb : shapeList) {
		bb = bb + shape_bb->bounds();
	}
	boundingVolume = bb;
}

Yoel's avatar
Yoel committed
}  // namespace shapes