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

namespace shapes {
	Group::Group (const util::Transformation& transform)
		:shapeList (std::vector<std::shared_ptr<Shape>> ()), transform (transform) {}
	Group::Group (const util::Mat4& matrix)
		: shapeList (std::vector<std::shared_ptr<Shape>> ()), transform (util::Transformation (matrix)) {}

	std::shared_ptr<cam::Hit> Group::intersect (const cam::Ray& r) {
		cam::Ray imagR (transform.fromWorld.transformPoint (r.x0_), transform.fromWorld.transformDir (r.d_), r.tmin_, r.tmax_, r.normalize_);

		std::shared_ptr<cam::Hit> result;

		for (std::shared_ptr<Shape> s : shapeList) {
			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;
				}
			}
		}
		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;
	}
	void Group::add (const std::shared_ptr<Shape>& shape)
	{
		shapeList.push_back (shape);
	}
}