-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRectangle.cpp
More file actions
85 lines (73 loc) · 1.75 KB
/
Copy pathRectangle.cpp
File metadata and controls
85 lines (73 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "Rectangle.h"
#include "Triangle.h"
#include "GeometricObject.h"
#include "Point3D.h"
#include "Vector3D.h"
#include "Ray.h"
#include "AppConstants.h"
Rectangle::Rectangle()
{
}
Rectangle::Rectangle(float width, float height, const Point3D& position, const Vector3D& norm)
: width(width), height(height), position(position), normal(norm)
{
normal.normalize();
calculateDirections();
generateTriangles();
}
Rectangle::Rectangle(const Rectangle& rectangle)
: width(rectangle.width), height(rectangle.height), position(rectangle.position), normal(rectangle.normal)
{
calculateDirections();
generateTriangles();
}
void Rectangle::calculateDirections()
{
//direction is parallel with axis z
if (DotProduct(Vector3D(0, 1, 0), normal) == 0)
{
right = CrossProduct(Vector3D(0, 1, 0), normal);
}
else
{
right = CrossProduct(Vector3D(0, 0, 1), normal);
}
right.normalize();
up = CrossProduct(normal, right);
up.normalize();
}
void Rectangle::generateTriangles()
{
Point3D a = position;
Point3D b = a + right * width;
Point3D c = b + up * height;
Point3D d = a + up * height;
triangle1 = Triangle(a, b, c);
triangle2 = Triangle(a, c, d);
}
float Rectangle::intersect(const Ray& ray) const
{
float t = triangle1.intersect(ray);
if (t != appconst::MISS) return t;
t = triangle2.intersect(ray);
return t;
}
Vector3D Rectangle::getNormal(const Point3D& ip) const
{
return normal;
}
void Rectangle::setMaterial(const Material* mat)
{
material = mat;
}
const Material* Rectangle::getMaterial(const Point3D& hitPoint) const
{
return material;
}
Sample2D Rectangle::getUV(const Point3D& hitPoint) const
{
Vector3D pointDir = hitPoint - position;
float u = DotProduct(right, pointDir) / width;
float v = DotProduct(up, pointDir) / height;
return { u, v };
}