static void print_towers() { u32b_t i; // print them out printf("Towers: %u\n",State->player.ntowers); for(i=0; i<State->player.ntowers; i++) { printf( "\tgem: "); if( color_is_black(&State->player.towers[i].gem.color) ) { printf("none"); } else { printf( "<%.0lf,%.0lf,%.0lf>\trange: %.1lf\tfire rate: %.1lf\t", State->player.towers[i].gem.color.s.x, State->player.towers[i].gem.color.s.y, State->player.towers[i].gem.color.s.z, State->player.towers[i].gem.range, State->player.towers[i].gem.rate ); } printf("\tposition: <%.0lf,%.0lf,%.0lf>\n", State->player.towers[i].position.s.x, State->player.towers[i].position.s.y, State->player.towers[i].position.s.z ); } printf("\n"); }
/******* Fonction à écrire par les etudiants ******/ Color trace_ray (Ray ray_) { /** * \todo : recursive raytracing * * La fonction trace_ray() renvoie une couleur obtenue par la somme de l'éclairage direct (couleur calculée par la fonction * compute_direct_lighting()) et des couleurs provenant des reflets et transparences éventuels aux points d'intersection. * Dans la première partie du TP, seul l'éclairage direct sera calculé. Dans la seconde partie, les reflets et transparences seront rajoutés. * * Pour la première étape, la fonction trace_ray() ne calculant que les rayons primaires, l'intersection * entre le rayon et la scène doit être calculée (fonction intersect_scene() du module \ref RayAPI). * S'il n'y a pas d'intersection, une couleur blanche (triplet RGB [1, 1, 1], élément neutre de la multiplication des couleurs) * devra être retournée. * S'il y a une intersection, la couleur retournée sera la couleur résultante de l'éclairage direct du point d'intersection par les * sources lumineuses de la scène et calculée par la fonction compute_direct_lighting() à écrire dans la suite. * * Pour la deuxième étape, à partir des fonctions définies dans le module \ref RayAPI et permettant d'accéder aux informations de * profondeur et d'importance sur le rayon, définir un cas d'arêt dela récursivité et renvoyer si ce cas est vérifié la couleur * résultante de l'éclairage direct. Si la récursivité n'est pas terminée, en utilisant les fonctions définies dans le module \ref LightAPI, * calculer la couleur réfléchie. Pour cela, il faut tester si le matériau est réflechissant et, si c'est le cas, calculer le rayon * réfléchi et le coefficient de réflexion (une couleur). La couleur calculée en lançant le rayon réfléchi devra alors être multipliée par ce coefficient avant d'être ajoutée * à la couleur renvoyée par trace_ray(). * * Pour la troisème étape et de façon très similaire à la réflexion, utiliser les fonctions définies dans le module \ref LightAPI pour calculer la couleur réfractée. * Pour cela, il faut tester si le matériau est transparent et, si c'est le cas, calculer le rayon réfracté et le coefficient de * transparence (une couleur). La couleur calculée en lançant le rayon réfracté devra alors être multipliée par ce coefficient avant * d'être ajoutée à la couleur renvoyée par trace_ray(). * */ Color l = init_color (0.075f, 0.075f, 0.075f); Isect isect_; int isInter = intersect_scene (&ray_, &isect_ ); if (isInter!=0){ l = compute_direct_lighting (ray_, isect_); } if (ray_depth(ray_)>10 || ray_importance(ray_)<0.01f) return (l); //reflection if(isect_has_reflection(isect_)){ Ray refl_ray; Color refl_col = reflect(ray_, isect_, &refl_ray); l = l+refl_col*(trace_ray(refl_ray)); } //refraction if(isect_has_refraction(isect_)){ Ray rafr_ray; Color rafr_col = refract(ray_, isect_, &rafr_ray); if(color_is_black(rafr_col)==0) l = l+rafr_col*(trace_ray(rafr_ray)); } return l; }