Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct Triangle : public Intersectable {
- vec3 points[3];
- Triangle() {
- }
- Triangle(Triangle& tri) {
- points[0] = tri.points[0];
- points[1] = tri.points[1];
- points[2] = tri.points[2];
- material = tri.getMaterial();
- }
- Triangle(vec3 point1, vec3 point2, vec3 point3, Material* _material) {
- points[0] = point1;
- points[1] = point2;
- points[2] = point3;
- material = _material;
- }
- void setMaterial(Material* _material) {
- material = _material;
- }
- Material* getMaterial() {
- return material;
- }
- bool contains(vec3 position, vec3 normal) {
- if (dot(cross(points[1] - points[0], position - points[0]), normal) > 0.0f)
- if (dot(cross(points[2] - points[1], position - points[1]), normal) > 0.0f)
- if (dot(cross(points[0] - points[2], position - points[2]), normal) > 0.0f)
- return true;
- return false;
- }
- Hit intersect(const Ray& ray) {
- Hit hit;
- vec3 normal = cross(points[1] - points[0], points[2] - points[0]).normalize();
- vec3 dist = points[0] - ray.start;
- float upper = dot(dist, normal);
- float lower = dot(ray.dir, normal);
- float t = upper / lower;
- vec3 position = ray.start + ray.dir * t;
- if (!contains(position, normal)) {
- return hit;
- }
- hit.t = t;
- hit.position = position;
- vec3 normalPlus = normal * vec3(1, 1, -1);
- hit.normal = normalPlus;
- hit.material = material;
- return hit;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement