-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSceneObject.cpp
More file actions
192 lines (164 loc) · 4.19 KB
/
Copy pathSceneObject.cpp
File metadata and controls
192 lines (164 loc) · 4.19 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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*----------------------------------------------------------
* COSC363 Ray Tracer
*
* The object class
* This is a generic type for storing objects in the scene
* Sphere, Plane etc. must be defined as subclasses of Object.
* Being an abstract class, this class cannot be instantiated.
-------------------------------------------------------------*/
#include "SceneObject.h"
glm::vec3 SceneObject::getColor()
{
return color_;
}
glm::vec3 SceneObject::lighting(glm::vec3 lightPos, glm::vec3 viewVec, glm::vec3 hit)
{
float ambientTerm = 0.2;
float diffuseTerm = 0;
float specularTerm = 0;
glm::vec3 normalVec = normal(hit);
glm::vec3 lightVec = lightPos - hit;
lightVec = glm::normalize(lightVec);
float lDotn = glm::dot(lightVec, normalVec);
if (spec_)
{
glm::vec3 reflVec = glm::reflect(-lightVec, normalVec);
float rDotv = glm::dot(reflVec, viewVec);
if (rDotv > 0) specularTerm = pow(rDotv, shin_);
}
glm::vec3 colorSum = ambientTerm * color_ + lDotn * color_ + specularTerm * glm::vec3(1);
return colorSum;
}
glm::vec3 SceneObject::lighting(glm::vec3 lightPos, glm::vec3 viewVec, glm::vec3 hit, glm::vec3 color)
{
float ambientTerm = 0.2;
float diffuseTerm = 0;
float specularTerm = 0;
glm::vec3 normalVec = normal(hit);
glm::vec3 lightVec = lightPos - hit;
lightVec = glm::normalize(lightVec);
float lDotn = glm::dot(lightVec, normalVec);
if (spec_)
{
glm::vec3 reflVec = glm::reflect(-lightVec, normalVec);
float rDotv = glm::dot(reflVec, viewVec);
if (rDotv > 0) specularTerm = pow(rDotv, shin_);
}
glm::vec3 colorSum = ambientTerm * color + lDotn * color + specularTerm * glm::vec3(1);
return colorSum;
}
glm::vec3 SceneObject::normal(glm::vec3 pos, glm::vec3 normalMap)
{
// normal map logic retrieved from:
// https://stackoverflow.com/questions/41015574/raytracing-normal-mapping
glm::vec3 normalHit = normal(pos);
glm::vec3 tangent = glm::cross(normalHit, glm::vec3(0, 1, 0));
if (glm::length(tangent) == 0.0f)
{
tangent = glm::cross(normalHit, glm::vec3(0, 0, 1));
}
tangent = glm::normalize(tangent);
glm::vec3 bitangent = glm::normalize(glm::cross(normalHit, tangent));
glm::vec3 modifiedMap = normalMap * 2.0f - glm::vec3(1);
glm::mat3 tbn(tangent, bitangent, normalHit);
glm::vec3 normalVec = glm::normalize(tbn * modifiedMap);
return normalVec;
}
glm::vec3 SceneObject::lighting(glm::vec3 lightPos, glm::vec3 viewVec, glm::vec3 hit, glm::vec3 color, glm::vec3 normalMap)
{
float ambientTerm = 0.2;
float diffuseTerm = 0;
float specularTerm = 0;
glm::vec3 normalVec = normal(hit, normalMap);
glm::vec3 lightVec = lightPos - hit;
lightVec = glm::normalize(lightVec);
float lDotn = glm::dot(lightVec, normalVec);
if (spec_)
{
glm::vec3 reflVec = glm::reflect(-lightVec, normalVec);
float rDotv = glm::dot(reflVec, viewVec);
if (rDotv > 0) specularTerm = pow(rDotv, shin_);
}
glm::vec3 colorSum = ambientTerm * color + lDotn * color + specularTerm * glm::vec3(1);
return colorSum;
}
float SceneObject::getReflectionCoeff()
{
return reflc_;
}
float SceneObject::getRefractionCoeff()
{
return refrc_;
}
float SceneObject::getTransparencyCoeff()
{
return tranc_;
}
float SceneObject::getRefractiveIndex()
{
return refri_;
}
float SceneObject::getShininess()
{
return shin_;
}
bool SceneObject::isReflective()
{
return refl_;
}
bool SceneObject::isRefractive()
{
return refr_;
}
bool SceneObject::isSpecular()
{
return spec_;
}
bool SceneObject::isTransparent()
{
return tran_;
}
ObjectType SceneObject::getType()
{
return type_;
}
void SceneObject::setColor(glm::vec3 col)
{
color_ = col;
}
void SceneObject::setReflectivity(bool flag)
{
refl_ = flag;
}
void SceneObject::setReflectivity(bool flag, float refl_coeff)
{
refl_ = flag;
reflc_ = refl_coeff;
}
void SceneObject::setRefractivity(bool flag)
{
refr_ = flag;
}
void SceneObject::setRefractivity(bool flag, float refr_coeff, float refr_index)
{
refr_ = flag;
refrc_ = refr_coeff;
refri_ = refr_index;
}
void SceneObject::setShininess(float shininess)
{
shin_ = shininess;
}
void SceneObject::setSpecularity(bool flag)
{
spec_ = flag;
}
void SceneObject::setTransparency(bool flag)
{
tran_ = flag;
}
void SceneObject::setTransparency(bool flag, float tran_coeff)
{
tran_ = flag;
tranc_ = tran_coeff;
}