]>
Dogcows Code - chaz/rasterize/blob - scene.c
1493e3163c9a781b7def812d573c392736bbdda5
3 * CS5600 University of Utah
5 * mcgarvey@eng.utah.edu
16 static int _model_set_colors(model_t
* m
, FILE* file
);
17 static int _model_add_translate(model_t
* m
, FILE* file
);
18 static int _model_add_rotate(model_t
* m
, FILE* file
);
19 static int _model_add_scale(model_t
* m
, FILE* file
);
20 static int _model_set_material(model_t
* m
, FILE* file
);
21 static int _model_set_texture(model_t
* m
, FILE* file
);
22 static int _scene_set_ambient(scene_t
* s
, FILE* file
);
23 static int _scene_add_light(scene_t
* s
, FILE* file
);
38 scene_t
* scene_alloc(FILE* file
)
41 double eyeX
, eyeY
, eyeZ
, spotX
, spotY
, spotZ
, upX
, upY
, upZ
;
42 double fovy
, aspect
, near
, far
;
44 if (fscanf(file
, "U4 %d %d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",
46 &eyeX
, &eyeY
, &eyeZ
, &spotX
, &spotY
, &spotZ
, &upX
, &upY
, &upZ
,
47 &fovy
, &aspect
, &near
, &far
,
48 &aR
, &aG
, &aB
) != 18) {
49 fprintf(stderr
, "Cannot read scene header.\n");
53 scene_t
* s
= (scene_t
*)mem_alloc(sizeof(scene_t
));
57 s
->view
= MAT_LOOKAT(vec_new( (scal_t
)eyeX
, (scal_t
)eyeY
, (scal_t
)eyeZ
),
58 vec_new((scal_t
)spotX
, (scal_t
)spotY
, (scal_t
)spotZ
),
59 vec_new( (scal_t
)upX
, (scal_t
)upY
, (scal_t
)upZ
));
60 s
->eye
= vec_new(eyeX
, eyeY
, eyeZ
);
61 s
->projection
= MAT_PERSPECTIVE((scal_t
)fovy
, (scal_t
)aspect
, (scal_t
)near
, (scal_t
)far
);
63 s
->ambient
= color_new((scal_t
)aR
, (scal_t
)aG
, (scal_t
)aB
, S(1.0));
70 fprintf(stderr, "Unexpected line before group is specified.\n"); \
75 while (fscanf(file
, " %c", &type
) == 1) {
78 if (fgets(filename
, 4096, file
) == NULL
) {
79 fprintf(stderr
, "Cannot read model filename.\n");
81 m
= model_alloc(trim(filename
));
85 list_push2(&s
->models
, m
, DTOR(model_destroy
));
90 if (_model_set_colors(m
, file
) != 0) {
97 if (_model_add_translate(m
, file
) != 0) {
103 if (_model_add_rotate(m
, file
) != 0) {
110 if (_model_add_scale(m
, file
) != 0) {
116 if (_scene_add_light(s
, file
) != 0) {
123 if (_model_set_material(m
, file
) != 0) {
130 if (_model_set_texture(m
, file
) != 0) {
139 fprintf(stderr
, "Unknown identifier: %c\n", type
);
145 list_reverse(&s
->models
);
153 void scene_destroy(scene_t
* s
)
155 list_destroy(&s
->models
);
156 list_destroy(&s
->lights
);
162 * Set the colors of the triangles in the group as defined in a file.
164 static int _model_set_colors(model_t
* m
, FILE* file
)
167 if (fscanf(file
, " %lf %lf %lf %lf", &a
, &r
, &g
, &b
) != 4) {
168 fprintf(stderr
, "Cannot read color values from scene.\n");
172 color_t color
= color_new((colorchan_t
)r
, (colorchan_t
)g
, (colorchan_t
)b
, (colorchan_t
)a
);
174 array_it_t it
= array_begin(model_geometry(m
));
175 for (tri_t
* t
; t
= array_it_tri_next(&it
);) {
184 * Concat a translation matrix to the transformation as defined in a file.
186 static int _model_add_translate(model_t
* m
, FILE* file
)
189 if (fscanf(file
, " %lf %lf %lf", &tx
, &ty
, &tz
) != 3) {
190 fprintf(stderr
, "Cannot read translate coordinates from scene.\n");
193 mat_t transform
= MAT_TRANSLATE((scal_t
)tx
, (scal_t
)ty
, (scal_t
)tz
);
194 model_transform(m
, &transform
);
199 * Concat a rotation matrix to the transformation as defined in a file.
201 static int _model_add_rotate(model_t
* m
, FILE* file
)
203 double theta
, ax
, ay
, az
;
204 if (fscanf(file
, " %lf %lf %lf %lf", &theta
, &ax
, &ay
, &az
) != 4) {
205 fprintf(stderr
, "Cannot read rotation angle from scene.\n");
208 mat_t transform
= MAT_ROTATE((scal_t
)theta
, (scal_t
)ax
, (scal_t
)ay
, (scal_t
)az
);
209 model_transform(m
, &transform
);
214 * Concat a scale matrix to the transformation as defined in a file.
216 static int _model_add_scale(model_t
* m
, FILE* file
)
219 if (fscanf(file
, " %lf %lf %lf", &sx
, &sy
, &sz
) != 3) {
220 fprintf(stderr
, "Cannot read scale factors from scene.\n");
223 mat_t transform
= MAT_SCALE((scal_t
)sx
, (scal_t
)sy
, (scal_t
)sz
);
224 model_transform(m
, &transform
);
229 * Set the specular highlight and shininess factor for the group.
231 static int _model_set_material(model_t
* m
, FILE* file
)
233 double sr
, sg
, sb
, shininess
;
234 if (fscanf(file
, " %lf %lf %lf %lf", &sr
, &sg
, &sb
, &shininess
) != 4) {
235 fprintf(stderr
, "Cannot read material information from scene.\n");
238 model_material(m
, color_new((scal_t
)sr
, (scal_t
)sg
, (scal_t
)sb
, S(1.0)), (scal_t
)shininess
);
243 * Set the texture to be used while drawing the current model.
245 static int _model_set_texture(model_t
* m
, FILE* file
)
248 if (fgets(filename
, 4096, file
) == NULL
) {
249 fprintf(stderr
, "Cannot read texture filename from scene.\n");
253 model_texture(m
, (const void*)raster_import(trim(filename
)));
259 * Add a light to the scene.
261 static int _scene_add_light(scene_t
* s
, FILE* file
)
263 double lx
, ly
, lz
, r
, g
, b
;
264 if (fscanf(file
, " %lf %lf %lf %lf %lf %lf",
265 &lx
, &ly
, &lz
, &r
, &g
, &b
) != 6) {
266 fprintf(stderr
, "Cannot read light values from scene.\n");
269 light_t
* l
= light_alloc(
271 color_new((scal_t
)r
, (scal_t
)g
, (scal_t
)b
, S(1.0)),
272 color_new((scal_t
)r
, (scal_t
)g
, (scal_t
)b
, S(1.0))
274 list_push2(&s
->lights
, l
, mem_free
);
279 raster_t
* scene_render(scene_t
* s
)
285 raster_t
* p
= raster_alloc(s
->w
, s
->h
, COLOR_BLACK
);
286 raster_view(p
, &s
->view
);
287 raster_projection(p
, &s
->projection
);
288 raster_eye(p
, s
->eye
);
289 raster_ambient(p
, s
->ambient
);
291 for (list_t
* i
= s
->lights
; i
; i
= i
->link
) {
292 raster_light(p
, *(light_t
*)i
->val
);
296 printf("rendering scene...\n");
299 for (list_t
* gi
= s
->models
; gi
; gi
= gi
->link
) {
300 model_t
* m
= (model_t
*)gi
->val
;
301 raster_draw_model(p
, m
);
305 long dt
= timer_stop();
306 printf("render complete!\ntime\t%.3fms\n", (float)dt
/ 1000.0f
);
This page took 0.045216 seconds and 4 git commands to generate.