-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSceneObject.cpp
141 lines (116 loc) · 2.53 KB
/
SceneObject.cpp
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
/*--------------------------------------------------------------
* COSC363 Ray Tracer
*
* The SceneObject class
* This is a generic type for storing objects in the scene
* Sphere, Plane etc. must be defined as subclasses of SceneObject.
* 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)
{
if (_light) return 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;
}
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::isLight()
{
return _light;
}
bool SceneObject::isSpecular()
{
return spec_;
}
bool SceneObject::isTransparent()
{
return tran_;
}
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::setLight(bool flag)
{
_light = flag;
}
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;
}