#include #include #include #include #include #include #include void usage(char* argv[], char* type) { if(!strcmp(type,"general")) { printf("usage :\n%s \n",argv[0]); printf("--> %s grille \n",argv[0]); printf("--> %s cylindre \n",argv[0]); printf("--> %s cone \n",argv[0]); printf("--> %s uvsphere \n",argv[0]); printf("--> %s icosphere \n",argv[0]); printf("--> %s boite \n",argv[0]); exit(EXIT_FAILURE); } if(!strcmp(type,"grille")) { printf("usage :\n%s grille \n",argv[0]); exit(EXIT_FAILURE); } if(!strcmp(type,"boite")) { printf("usage :\n%s boite \n",argv[0]); exit(EXIT_FAILURE); } if(!strcmp(type,"icosphere")) { printf("usage :\n%s icosphere \n",argv[0]); exit(EXIT_FAILURE); } if(!strcmp(type,"uvsphere")) { printf("usage :\n%s uvsphere \n",argv[0]); exit(EXIT_FAILURE); } if(!strcmp(type,"cylindre")) { printf("usage :\n%s cylindre \n",argv[0]); exit(EXIT_FAILURE); } if(!strcmp(type,"cone")) { printf("usage :\n%s cone \n",argv[0]); exit(EXIT_FAILURE); } } /*************************************************************/ void gen_grille(char* argv[], vf_model *primitive) { double tailleh=atof(argv[2]),taillev=atof(argv[3]); int nbcaseh=atoi(argv[4]),nbcasev=atoi(argv[5]); float dh=tailleh/(nbcaseh*1.),dv=taillev/(nbcasev*1.); for(int j=0;j<=nbcasev;j++) for(int i=0;i<=nbcaseh;i++) a2ri_vf_add_vertex(primitive,i*dh,j*dv,0); for(int j=0;jnbvertex; for(int j=0;j<=nbcaseY;j++) for(int i=0;i<=nbcaseX;i++) a2ri_vf_add_vertex(primitive,i*dX,j*dY,tailleZ); nbpt_2=primitive->nbvertex; //sommets dessous/dessus for(int k=1;knbvertex; for(int k=1;knbvertex; //sommets gauche/droite for(int j=1;jnbvertex; for(int j=1;j2) { for(int k=0;k1) { for(int i=0;i2) { for(int j=0;j1 && nbcaseZ>1) { for(int k=0;k1) { a2ri_vf_add_face(primitive,nbcaseX+1,0,nbpt_2); a2ri_vf_add_face(primitive,nbcaseX+1,nbpt_2,nbpt_3); a2ri_vf_add_face(primitive,2*nbcaseX+1,nbpt_2+nbcaseX,nbcaseX); a2ri_vf_add_face(primitive,2*nbcaseX+1,nbpt_3+nbcaseX,nbpt_2+nbcaseX); for(int i=0;i1 && nbcaseZ==1) { for(int i=0;i=2 && nbcaseZ>=2) { a2ri_vf_add_face(primitive,0,nbpt_2,nbcaseX+1); a2ri_vf_add_face(primitive,nbcaseX+1,nbpt_2,nbpt_4); a2ri_vf_add_face(primitive,(nbcaseX+1)*nbcaseY,(nbcaseX+1)*(nbcaseY-1),nbpt_4+(nbcaseZ-1)*(nbcaseY-2)); a2ri_vf_add_face(primitive,(nbcaseX+1)*nbcaseY,nbpt_4+(nbcaseZ-1)*(nbcaseY-2),nbpt_3); a2ri_vf_add_face(primitive,nbcaseX,nbcaseX+1+nbcaseX,nbpt_2+nbcaseX); a2ri_vf_add_face(primitive,nbcaseX+1+nbcaseX,nbpt_5,nbpt_2+nbcaseX); a2ri_vf_add_face(primitive,(nbcaseX+1)*nbcaseY+nbcaseX,nbpt_5+(nbcaseZ-1)*(nbcaseY-2),(nbcaseX+1)*(nbcaseY-1)+nbcaseX); a2ri_vf_add_face(primitive,(nbcaseX+1)*nbcaseY+nbcaseX,nbpt_3+nbcaseX,nbpt_5+(nbcaseZ-1)*(nbcaseY-2)); a2ri_vf_add_face(primitive,nbpt_4+nbcaseZ-2,nbpt_1,nbpt_1+nbcaseX+1); a2ri_vf_add_face(primitive,nbpt_2+(nbcaseX+1)*(nbcaseZ-2),nbpt_1,nbpt_4+nbcaseZ-2); a2ri_vf_add_face(primitive,nbpt_3+(nbcaseX+1)*(nbcaseZ-2),nbpt_4+(nbcaseZ-1)*(nbcaseY-1)-1,nbpt_1+(nbcaseX+1)*(nbcaseY-1)); a2ri_vf_add_face(primitive,nbpt_1+(nbcaseX+1)*(nbcaseY),nbpt_3+(nbcaseX+1)*(nbcaseZ-2),nbpt_1+(nbcaseX+1)*(nbcaseY-1)); a2ri_vf_add_face(primitive,nbpt_5+nbcaseZ-2,nbpt_1+nbcaseX+1+nbcaseX,nbpt_1+nbcaseX); a2ri_vf_add_face(primitive,nbpt_2+(nbcaseX+1)*(nbcaseZ-2)+nbcaseX,nbpt_5+nbcaseZ-2,nbpt_1+nbcaseX); a2ri_vf_add_face(primitive,nbpt_3+(nbcaseX+1)*(nbcaseZ-2)+nbcaseX,nbpt_1+(nbcaseX+1)*(nbcaseY-1)+nbcaseX,nbpt_5+(nbcaseZ-1)*(nbcaseY-1)-1); a2ri_vf_add_face(primitive,nbpt_1+(nbcaseX+1)*(nbcaseY)+nbcaseX,nbpt_1+(nbcaseX+1)*(nbcaseY-1)+nbcaseX,nbpt_3+(nbcaseX+1)*(nbcaseZ-2)+nbcaseX); } } void gen_icosphere(char* argv[], vf_model *primitive) { double rayon=atof(argv[2]); int subdivision=atoi(argv[3]); vector3d p; a2ri_vf_add_vertex(primitive,0.000000,-0.525731,0.850651); a2ri_vf_add_vertex(primitive,0.000000,0.525731,0.850651); a2ri_vf_add_vertex(primitive,0.000000,-0.525731,-0.850651); a2ri_vf_add_vertex(primitive,0.000000,0.525731,-0.850651); a2ri_vf_add_vertex(primitive,0.850651,0.000000,0.525731); a2ri_vf_add_vertex(primitive,0.850651,0.000000,-0.525731); a2ri_vf_add_vertex(primitive,-0.850651,0.000000,0.525731); a2ri_vf_add_vertex(primitive,-0.850651,0.000000,-0.525731); a2ri_vf_add_vertex(primitive,0.525731,0.850651,0.000000); a2ri_vf_add_vertex(primitive,0.525731,-0.850651,0.000000); a2ri_vf_add_vertex(primitive,-0.525731,0.850651,0.000000); a2ri_vf_add_vertex(primitive,-0.525731,-0.850651,0.000000); a2ri_vf_add_face(primitive,0,4,1); a2ri_vf_add_face(primitive,0,9,4); a2ri_vf_add_face(primitive,9,5,4); a2ri_vf_add_face(primitive,4,5,8); a2ri_vf_add_face(primitive,4,8,1); a2ri_vf_add_face(primitive,8,10,1); a2ri_vf_add_face(primitive,8,3,10); a2ri_vf_add_face(primitive,5,3,8); a2ri_vf_add_face(primitive,5,2,3); a2ri_vf_add_face(primitive,2,7,3); a2ri_vf_add_face(primitive,7,10,3); a2ri_vf_add_face(primitive,7,6,10); a2ri_vf_add_face(primitive,7,11,6); a2ri_vf_add_face(primitive,11,0,6); a2ri_vf_add_face(primitive,0,1,6); a2ri_vf_add_face(primitive,6,1,10); a2ri_vf_add_face(primitive,9,0,11); a2ri_vf_add_face(primitive,9,11,2); a2ri_vf_add_face(primitive,9,2,5); a2ri_vf_add_face(primitive,7,2,11); a2ri_vf_4_subdivision(primitive,subdivision-1); for(int i=0;inbvertex;i++) { vector3d_init(&p,primitive->ve[i].x,primitive->ve[i].y,primitive->ve[i].z); vector3d_normalize(&p); primitive->ve[i].x=p.dx*rayon; primitive->ve[i].y=p.dy*rayon; primitive->ve[i].z=p.dz*rayon; } } void gen_uvsphere(char* argv[], vf_model *primitive) { double rayon=atof(argv[2]); int segment=atoi(argv[3]),anneau=atoi(argv[4]); if(segment<3 || anneau<3) { printf("impossible de creer une sphere avec moins de 3 anneaux segments\n"); exit(EXIT_FAILURE); } for(int j=1;j