-
Notifications
You must be signed in to change notification settings - Fork 0
/
RayTracer.cpp
98 lines (75 loc) · 2.46 KB
/
RayTracer.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
//Hard code resolution for now
#define RES 250
#define MAX_COLOR_COMPONENT 255.0f
#define NUM_SUBPIXELS 4
#define _USE_MATH_DEFINES //This enables math constants in Windows
#include <math.h> //Math functions and some constants
#include "RayTracer/Ray.h"
#include "RayTracer/RayGenerator.h"
#include "RayTracer/Camera.h"
#include "RayTracer/Scene.h"
#include "RayTracer/libs/png/simplePNG.h"
#include "Buffer.h"
#include "RayTracer/SceneLoader.h"
#include <time.h>
int main(int argc, char** argv)
{
time_t start, end;
time(&start);
//Create buffer
Buffer<Color> buffer = Buffer<Color>(RES, RES);
Buffer<Vector3> floatbuffer = Buffer<Vector3>(RES, RES);
//Need at least two arguments (*.obj input, *.png output)
if (argc < 3)
{
printf("Usage %s input.obj output.png\n", argv[0]);
exit(0);
}
//Create and add objects to the scene
Scene scene = Scene();
loadScene(&scene, argv[1]);
scene.printObjects(); // Print everything in the scene for testing
//Create a ray generator for the camera
RayGenerator generator = RayGenerator(scene.getCamera(), RES*NUM_SUBPIXELS, RES*NUM_SUBPIXELS);
printf("Rendering scene...");
// Generate rays from camera
float maxComponent = -1;
for (unsigned int y = 0; y < RES; y++)
{
for (unsigned int x = 0; x < RES; x++)
{
Vector3 totalColor = Vector3(0, 0, 0);
for (unsigned int i = 0; i < NUM_SUBPIXELS; i++)
{
Ray r = generator.getRay(x * NUM_SUBPIXELS + i, y * NUM_SUBPIXELS + i);
HitPoint hp = HitPoint();
Vector3 c;
if (!scene.getFirstRayIntersection(r, hp))
c = Vector3(0, 0, 0);
else
c = scene.colorPointBasedOnShadow(r, hp);
totalColor += c;
}
totalColor /= NUM_SUBPIXELS; // Average subpixel colors
// Keeping track of the maximum component for tone mapping later
if (maxComponent < totalColor.maxComponent())
maxComponent = totalColor.maxComponent();
floatbuffer.at(x, y) = totalColor;
}
}
// Scaling/tone mapping
for (unsigned int y = 0; y < RES; y++)
{
for (unsigned int x = 0; x < RES; x++)
{
for (unsigned int i = 0; i < 3; i++)
floatbuffer.at(x, y).c[i] *= (MAX_COLOR_COMPONENT / maxComponent);
buffer.at(x, y) = Color(floatbuffer.at(x, y).c[0], floatbuffer.at(x, y).c[1], floatbuffer.at(x, y).c[2]);
}
}
//Write output buffer to file argv2
simplePNG_write(argv[2], buffer.getWidth(), buffer.getHeight(), (unsigned char*)&buffer.at(0, 0));
time(&end);
printf("\n---\nTIME ELAPSED: %f second(s)\n", difftime(end, start));
return 0;
}