-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRender.cpp
More file actions
122 lines (102 loc) · 3.34 KB
/
Render.cpp
File metadata and controls
122 lines (102 loc) · 3.34 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
#include "Image.hh"
#include "Basic.hh"
#include "Sphere.hh"
#include "Triangle.hh"
#include "InfinitePlane.hh"
#include "PerspectiveCamera.hh"
#include "FlatShader.hh"
#include "Scene.hh"
#include <time.h>
void Render(char *filename,int num_rays, char *outputImg)
{
printf("===============> %s, %d, %s \n", filename, num_rays, outputImg);
int depth = 3;
Scene scene(depth);
scene.ParseNFF(filename);
//kmeans
double **cluster = kmeans_main(scene.amostras,6);
vector<Primitive *>::iterator iter = scene.primitives.primitive.begin();
Primitive *pri;
//criando os grupos
for(int j=0;j<6;j++)
scene.grupos_primitivas.push_back(new Group());
//Esse for pega todas as primitivias lidas do arquivo.nff
//e separa em grupos definidos pelo kmeans...
//vale lembrar que quando eh inserida uma primitiva em um grupo
// ja � feito um box englobando ela e as demais prmitivas que pertecem
// ao mesmo grupo
for(int i=0;i<scene.primitives.primitive.size();i++,iter++){
for(int j=0;j<6;j++){
if(cluster[j][i]==1){
scene.grupos_primitivas[j]->Add(*iter);
}
}
}
//imprimindo os box!!!
for(int i=0;i<scene.grupos_primitivas.size();i++){
cout << "[" << scene.grupos_primitivas[i]->unionPri.min.x << "," << scene.grupos_primitivas[i]->unionPri.min.y << "," << scene.grupos_primitivas[i]->unionPri.min.z << "]" << endl;
cout << "[" << scene.grupos_primitivas[i]->unionPri.max.x << "," << scene.grupos_primitivas[i]->unionPri.max.y << "," << scene.grupos_primitivas[i]->unionPri.max.z << "]" << endl;
cout << scene.grupos_primitivas[i]->primitive.size() << endl;
}
Image *img;
int RES_X, RES_Y;
RES_X = ((PerspectiveCamera *)scene.camera)->resX;
RES_Y = ((PerspectiveCamera *)scene.camera)->resY;
img = new Image(RES_X, RES_Y);
if(!img)
return;
img->Clear();
time_t t1 = time(&t1);
//Ray ray;
for(int j = 0; j < RES_Y; j++)
{
for(int i = 0; i < RES_X; i++)
{
vector<Ray> rays;
Vec3f color(0,0,0);
int number = scene.camera->InitRay(i, j, rays,num_rays);
for(int s=0; s<number; s++){
//Ray ray(rays[s]);
//float weight = ray.contribution;
//cout << weight << endl;
color = color + scene.RayTrace(rays[s]);
}
color = color/number;
//float sampleRatio = 0.25f;
//float exposure = -1.00f;
//Vec3f color = scene.RayTrace(ray);
//color = Vec3f((1.0f-expf(color[0])*exposure),(1.0f-expf(color[1])*exposure),(1.0f-expf(color[2])*exposure));
//color = sampleRatio*color;
img->SetValuePixel(i, j, color);
}
}
time_t t2 = time(&t2);
printf("Rendering Time = %d seg\n", (int)t2 - (int)t1);
if(img == NULL){
printf("opppssssss img null\n");
return;
}
printf("Saving image\n");
int result = img->SavePPM(outputImg);
printf("Result save image %d\n", result);
if(result < 0){
printf("Cannot save the file %s.\n", outputImg);
}
delete img;
}
int main(int argc, char *argv[])
{
if(argc < 4)
{
printf("render <inputfile> <outputfile> <numero_raios>\n");
return 0;
}
printf(" ======> %s, %s, %s \n", argv[1], argv[2], argv[3]);
printf("Rendering %s...\n", argv[1]);
//time_t t1 = time(&t1);
Render(argv[1],atoi(argv[3]), argv[2]);
//time_t t2 = time(&t2);
printf("zica\n");
//printf("Rendering Time = %d seg\n", (int)t2 - (int)t1);
return 0;
}