]>
Dogcows Code - chaz/rasterize/blob - scene.c
d079e17ac7c4788617beb42d6c1ff4665ddb428a
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 _scene_set_ambient(scene_t
* s
, FILE* file
);
22 static int _scene_add_light(scene_t
* s
, FILE* file
);
37 scene_t
* scene_alloc(FILE* file
)
40 double eyeX
, eyeY
, eyeZ
, spotX
, spotY
, spotZ
, upX
, upY
, upZ
;
41 double fovy
, aspect
, near
, far
;
43 if (fscanf(file
, "U4 %d %d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",
45 &eyeX
, &eyeY
, &eyeZ
, &spotX
, &spotY
, &spotZ
, &upX
, &upY
, &upZ
,
46 &fovy
, &aspect
, &near
, &far
,
47 &aR
, &aG
, &aB
) != 18) {
48 fprintf(stderr
, "Cannot read scene header.\n");
52 scene_t
* s
= (scene_t
*)mem_alloc(sizeof(scene_t
));
56 s
->view
= MAT_LOOKAT(vec_new( (scal_t
)eyeX
, (scal_t
)eyeY
, (scal_t
)eyeZ
),
57 vec_new((scal_t
)spotX
, (scal_t
)spotY
, (scal_t
)spotZ
),
58 vec_new( (scal_t
)upX
, (scal_t
)upY
, (scal_t
)upZ
));
59 s
->eye
= vec_new(eyeX
, eyeY
, eyeZ
);
60 s
->projection
= MAT_PERSPECTIVE((scal_t
)fovy
, (scal_t
)aspect
, (scal_t
)near
, (scal_t
)far
);
62 s
->ambient
= color_new((scal_t
)aR
, (scal_t
)aG
, (scal_t
)aB
, S(1.0));
69 fprintf(stderr, "Unexpected line before group is specified.\n"); \
74 while (fscanf(file
, " %c", &type
) == 1) {
77 if (fgets(filename
, 4096, file
) == NULL
) {
78 fprintf(stderr
, "Cannot read model filename.\n");
80 m
= model_alloc(trim(filename
));
84 list_push2(&s
->models
, m
, DTOR(model_destroy
));
89 if (_model_set_colors(m
, file
) != 0) {
96 if (_model_add_translate(m
, file
) != 0) {
102 if (_model_add_rotate(m
, file
) != 0) {
109 if (_model_add_scale(m
, file
) != 0) {
115 if (_scene_add_light(s
, file
) != 0) {
122 if (_model_set_material(m
, file
) != 0) {
131 fprintf(stderr
, "Unknown identifier: %c\n", type
);
137 list_reverse(&s
->models
);
145 void scene_destroy(scene_t
* s
)
147 list_destroy(&s
->models
);
148 list_destroy(&s
->lights
);
154 * Set the colors of the triangles in the group as defined in a file.
156 static int _model_set_colors(model_t
* m
, FILE* file
)
159 if (fscanf(file
, " %lf %lf %lf %lf", &a
, &r
, &g
, &b
) != 4) {
160 fprintf(stderr
, "Cannot read color values from scene.\n");
164 for (const list_t
* i
= model_geometry(m
); i
; i
= i
->link
) {
165 tri_t
* t
= (tri_t
*)i
->val
;
166 t
->a
.c
= color_new((colorchan_t
)r
, (colorchan_t
)g
, (colorchan_t
)b
, (colorchan_t
)a
);
167 t
->b
.c
= color_new((colorchan_t
)r
, (colorchan_t
)g
, (colorchan_t
)b
, (colorchan_t
)a
);
168 t
->c
.c
= color_new((colorchan_t
)r
, (colorchan_t
)g
, (colorchan_t
)b
, (colorchan_t
)a
);
174 * Concat a translation matrix to the transformation as defined in a file.
176 static int _model_add_translate(model_t
* m
, FILE* file
)
179 if (fscanf(file
, " %lf %lf %lf", &tx
, &ty
, &tz
) != 3) {
180 fprintf(stderr
, "Cannot read translate coordinates from scene.\n");
183 mat_t transform
= MAT_TRANSLATE((scal_t
)tx
, (scal_t
)ty
, (scal_t
)tz
);
184 model_transform(m
, &transform
);
189 * Concat a rotation matrix to the transformation as defined in a file.
191 static int _model_add_rotate(model_t
* m
, FILE* file
)
193 double theta
, ax
, ay
, az
;
194 if (fscanf(file
, " %lf %lf %lf %lf", &theta
, &ax
, &ay
, &az
) != 4) {
195 fprintf(stderr
, "Cannot read rotation angle from scene.\n");
198 mat_t transform
= MAT_ROTATE((scal_t
)theta
, (scal_t
)ax
, (scal_t
)ay
, (scal_t
)az
);
199 model_transform(m
, &transform
);
204 * Concat a scale matrix to the transformation as defined in a file.
206 static int _model_add_scale(model_t
* m
, FILE* file
)
209 if (fscanf(file
, " %lf %lf %lf", &sx
, &sy
, &sz
) != 3) {
210 fprintf(stderr
, "Cannot read scale factors from scene.\n");
213 mat_t transform
= MAT_SCALE((scal_t
)sx
, (scal_t
)sy
, (scal_t
)sz
);
214 model_transform(m
, &transform
);
219 * Set the specular highlight and shininess factor for the group.
221 static int _model_set_material(model_t
* m
, FILE* file
)
223 double sr
, sg
, sb
, shininess
;
224 if (fscanf(file
, " %lf %lf %lf %lf", &sr
, &sg
, &sb
, &shininess
) != 4) {
225 fprintf(stderr
, "Cannot read material information from scene.\n");
228 model_material(m
, color_new((scal_t
)sr
, (scal_t
)sg
, (scal_t
)sb
, S(1.0)), (scal_t
)shininess
);
233 * Add a light to the scene.
235 static int _scene_add_light(scene_t
* s
, FILE* file
)
237 double lx
, ly
, lz
, r
, g
, b
;
238 if (fscanf(file
, " %lf %lf %lf %lf %lf %lf",
239 &lx
, &ly
, &lz
, &r
, &g
, &b
) != 6) {
240 fprintf(stderr
, "Cannot read light values from scene.\n");
243 light_t
* l
= light_alloc(
245 color_new((scal_t
)r
, (scal_t
)g
, (scal_t
)b
, S(1.0)),
246 color_new((scal_t
)r
, (scal_t
)g
, (scal_t
)b
, S(1.0))
248 list_push2(&s
->lights
, l
, mem_free
);
253 raster_t
* scene_render(scene_t
* s
)
259 raster_t
* p
= raster_alloc(s
->w
, s
->h
, COLOR_BLACK
);
260 raster_view(p
, &s
->view
);
261 raster_projection(p
, &s
->projection
);
262 raster_eye(p
, s
->eye
);
263 raster_ambient(p
, s
->ambient
);
265 for (list_t
* i
= s
->lights
; i
; i
= i
->link
) {
266 raster_light(p
, *(light_t
*)i
->val
);
270 printf("rendering scene...\n");
273 for (list_t
* gi
= s
->models
; gi
; gi
= gi
->link
) {
274 model_t
* m
= (model_t
*)gi
->val
;
275 raster_draw_model(p
, m
);
279 long dt
= timer_stop();
280 printf("render complete!\ntime\t%.3fms\n", (float)dt
/ 1000.0f
);
This page took 0.038575 seconds and 3 git commands to generate.