-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlab6.h
170 lines (144 loc) · 3.46 KB
/
lab6.h
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
#include <string>
//Define types for matrix/vector to make arguments
//more logical and easy to follow
typedef float matrix[4][4];
typedef float vector[4];
typedef int face[3];
typedef float Color[3];
struct Camera {
vector pos;
vector coi;
float angle;
float aspect;
float hither;
float yon;
float tilt;
int xres;
int yres;
};
struct HitData{
vector normal_obj; //object space
vector point_obj; //object space
vector normal_world;
vector point_world;
float t_obj; //distance
float t_world;
bool external; //1 if external hit, 0 if internal
int index;
};
enum light_type {
POINT,
DIRECTIONAL,
SPOT
};
enum object_type {
SPHERE,
CUBE,
TRIANGLES
};
struct PointLight {
vector pos;
float i; // intensity
float size;
};
struct DirLight {
vector dir;
float i; // intensity
};
struct SpotLight {
vector pos;
vector dir;
float angle; //hood-angle
int falloff; //falloff-power
float i; // intensity
float size;
};
struct Light {
light_type type;
void* li;
};
struct Object {
object_type type;
struct Triangles* triangles;
float r;
float g;
float b;
std::string tex;
float kd;
float ks;
int n;
float kr;
float gl;
float kt;
float n1;
float tr;
matrix trans;
matrix inverse;
};
struct Triangles {
float radius;
int vCount, fCount;
//the vertices of face i are
//vertex a = vertices[faces[i][0]]
//...
vector *vertices;
face *faces;
vector *fNorms;
vector *vNorms;
float *dList;
bool smooth;
};
struct Scene {
Camera cam;
char outName[20];
int numObjects;
struct Object *objects[10];
int numLights;
struct Light *lights[10];
float bg_r;
float bg_g;
float bg_b;
float amb;
int aa;
};
struct Ray {
vector o; //origin
vector d; //direction
};
//vector.cpp
extern float v_length(vector v);
extern void v_normalize(vector result, vector v);
extern void v_normalize(vector v);
extern void v_copy(vector result, vector v);
extern float v_dot(vector v1, vector v2);
extern void v_cross(vector result, vector v1, vector v2);
extern void v_add(vector result, vector v1, vector v2);
extern void v_print(vector v);
extern void v_scale(vector result, vector v, float scale);
extern void v_subtract(vector result, vector v1, vector v2);
//matrix.cpp
extern void setIdentity(matrix mat);
extern void mv_mult(vector result, matrix mat, vector v);
extern void mm_mult(matrix result, matrix m1, matrix m2);
extern void m_copy(matrix mdest, matrix m);
extern void m_print(matrix m);
extern void m_transpose(matrix result, matrix m);
//parser.cpp
extern void parse(Scene &scene, char* name);
extern int* readPPM();
//sphere.cpp
extern bool intersectSphere(Ray ray, HitData* hd);
extern bool intersectSphere(Ray ray, HitData* hd, float radius);
//cube.cpp
extern bool intersectCube(Ray ray, HitData* hd);
//triangle.cpp
extern bool intersectTriangles(Ray ray, HitData* hd, Triangles* t);
extern bool intersectTriangle(Ray ray, vector v1, vector v2, vector v3, HitData* hd, float d, vector norm, vector bc);
extern void calculateNorms(Triangles *t);
extern void printFace(Triangles *t, face f);
//lights.cpp
extern void illuminate(vector point, Object* s, vector normal, Scene scene, float initColor[], vector light);
//main.cpp
extern float shadowRay(Ray r);
float randFloat(float low, float high);
float jitter(int x);