nuclear@16: #include nuclear@17: #include nuclear@17: #include nuclear@17: #include nuclear@16: #include "goat3d.h" nuclear@16: nuclear@17: #define DEF_USUB 16 nuclear@17: #define DEF_VSUB 8 nuclear@17: #define DEF_SIZE 1.0 nuclear@17: #define DEF_OUTER 0.25 nuclear@16: nuclear@17: enum { BOX, SPHERE, TORUS }; nuclear@17: nuclear@17: void gen_box(struct goat3d_mesh *mesh, float size); nuclear@17: void gen_sphere(struct goat3d_mesh *mesh, float rad, int usub, int vsub); nuclear@17: void gen_sphere_part(struct goat3d_mesh *mesh, float rad, int usub, int vsub, float umax, float vmax); nuclear@17: void gen_torus(struct goat3d_mesh *mesh, float inner, float outer, int usub, int vsub); nuclear@17: void gen_torus_part(struct goat3d_mesh *mesh, float inner, float outer, nuclear@17: int usub, int vsub, float umax, float vmin, float vmax); nuclear@17: nuclear@17: nuclear@17: int main(int argc, char **argv) nuclear@16: { nuclear@17: int i, prim = BOX; nuclear@17: int usub = DEF_USUB; nuclear@17: int vsub = DEF_VSUB; nuclear@17: float size = DEF_SIZE; nuclear@17: float outer = DEF_OUTER; nuclear@16: struct goat3d *goat; nuclear@16: struct goat3d_material *mtl; nuclear@16: struct goat3d_mesh *mesh; nuclear@17: const char *fname = 0; nuclear@17: nuclear@17: for(i=1; i, -rad , -inner (default: %g)\n", DEF_SIZE); nuclear@17: printf(" -outer torus outer radius (default: %g)\n", DEF_OUTER); nuclear@17: printf(" -usub subdivisions along the horizontal direction (default: %d)\n", DEF_USUB); nuclear@17: printf(" -vsub subdivisions along the vertical direction (default: %d)\n", DEF_VSUB); nuclear@17: printf(" -h, -help print usage information and exit\n"); nuclear@17: return 0; nuclear@17: nuclear@17: } else { nuclear@17: if(fname) { nuclear@17: fprintf(stderr, "unexpected argument: %s\n", argv[i]); nuclear@17: return 1; nuclear@17: } nuclear@17: fname = argv[i]; nuclear@17: } nuclear@17: } nuclear@17: nuclear@17: if(!fname) { nuclear@17: fname = "out.xml"; nuclear@17: } nuclear@16: nuclear@16: goat = goat3d_create(); nuclear@17: goat3d_set_name(goat, fname); nuclear@16: nuclear@16: mtl = goat3d_create_mtl(); nuclear@16: goat3d_set_mtl_name(mtl, "mat"); nuclear@16: goat3d_set_mtl_attrib4f(mtl, GOAT3D_MAT_ATTR_DIFFUSE, 1, 0, 0, 1); nuclear@16: goat3d_add_mtl(goat, mtl); nuclear@16: nuclear@17: mesh = goat3d_create_mesh(); nuclear@17: nuclear@17: switch(prim) { nuclear@17: case BOX: nuclear@17: gen_box(mesh, size); nuclear@17: break; nuclear@17: nuclear@17: case SPHERE: nuclear@17: gen_sphere(mesh, size, usub, vsub); nuclear@17: break; nuclear@17: nuclear@17: case TORUS: nuclear@17: gen_torus(mesh, size, outer, usub, vsub); nuclear@17: break; nuclear@17: nuclear@17: default: nuclear@17: return 1; nuclear@17: } nuclear@17: goat3d_set_mesh_mtl(mesh, mtl); nuclear@16: goat3d_add_mesh(goat, mesh); nuclear@16: nuclear@16: goat3d_setopt(goat, GOAT3D_OPT_SAVEXML, 1); nuclear@17: goat3d_save(goat, fname); nuclear@16: nuclear@16: goat3d_free(goat); nuclear@16: return 0; nuclear@16: } nuclear@16: nuclear@17: void gen_box(struct goat3d_mesh *mesh, float size) nuclear@16: { nuclear@17: float hsz = size / 2.0; nuclear@16: nuclear@16: goat3d_begin(mesh, GOAT3D_QUADS); nuclear@16: // +X nuclear@16: goat3d_normal3f(1, 0, 0); nuclear@17: goat3d_texcoord2f(0, 0); nuclear@17: goat3d_vertex3f(hsz, -hsz, hsz); nuclear@17: goat3d_texcoord2f(1, 0); nuclear@17: goat3d_vertex3f(hsz, -hsz, -hsz); nuclear@17: goat3d_texcoord2f(1, 1); nuclear@17: goat3d_vertex3f(hsz, hsz, -hsz); nuclear@17: goat3d_texcoord2f(0, 1); nuclear@17: goat3d_vertex3f(hsz, hsz, hsz); nuclear@16: nuclear@16: // -X nuclear@16: goat3d_normal3f(-1, 0, 0); nuclear@17: goat3d_texcoord2f(0, 0); nuclear@17: goat3d_vertex3f(-hsz, -hsz, -hsz); nuclear@17: goat3d_texcoord2f(1, 0); nuclear@17: goat3d_vertex3f(-hsz, -hsz, hsz); nuclear@17: goat3d_texcoord2f(1, 1); nuclear@17: goat3d_vertex3f(-hsz, hsz, hsz); nuclear@17: goat3d_texcoord2f(0, 1); nuclear@17: goat3d_vertex3f(-hsz, hsz, -hsz); nuclear@16: nuclear@16: // +Y nuclear@16: goat3d_normal3f(0, 1, 0); nuclear@17: goat3d_texcoord2f(0, 0); nuclear@17: goat3d_vertex3f(-hsz, hsz, hsz); nuclear@17: goat3d_texcoord2f(1, 0); nuclear@17: goat3d_vertex3f(hsz, hsz, hsz); nuclear@17: goat3d_texcoord2f(1, 1); nuclear@17: goat3d_vertex3f(hsz, hsz, -hsz); nuclear@17: goat3d_texcoord2f(0, 1); nuclear@17: goat3d_vertex3f(-hsz, hsz, -hsz); nuclear@16: nuclear@16: // -Y nuclear@16: goat3d_normal3f(0, -1, 0); nuclear@17: goat3d_texcoord2f(0, 0); nuclear@17: goat3d_vertex3f(-hsz, -hsz, -hsz); nuclear@17: goat3d_texcoord2f(1, 0); nuclear@17: goat3d_vertex3f(hsz, -hsz, -hsz); nuclear@17: goat3d_texcoord2f(1, 1); nuclear@17: goat3d_vertex3f(hsz, -hsz, hsz); nuclear@17: goat3d_texcoord2f(0, 1); nuclear@17: goat3d_vertex3f(-hsz, -hsz, hsz); nuclear@16: nuclear@16: // +Z nuclear@16: goat3d_normal3f(0, 0, 1); nuclear@17: goat3d_texcoord2f(0, 0); nuclear@17: goat3d_vertex3f(-hsz, -hsz, hsz); nuclear@17: goat3d_texcoord2f(1, 0); nuclear@17: goat3d_vertex3f(hsz, -hsz, hsz); nuclear@17: goat3d_texcoord2f(1, 1); nuclear@17: goat3d_vertex3f(hsz, hsz, hsz); nuclear@17: goat3d_texcoord2f(0, 1); nuclear@17: goat3d_vertex3f(-hsz, hsz, hsz); nuclear@16: nuclear@16: // -Z nuclear@16: goat3d_normal3f(0, 0, -1); nuclear@17: goat3d_texcoord2f(0, 0); nuclear@17: goat3d_vertex3f(hsz, -hsz, -hsz); nuclear@17: goat3d_texcoord2f(1, 0); nuclear@17: goat3d_vertex3f(-hsz, -hsz, -hsz); nuclear@17: goat3d_texcoord2f(1, 1); nuclear@17: goat3d_vertex3f(-hsz, hsz, -hsz); nuclear@17: goat3d_texcoord2f(0, 1); nuclear@17: goat3d_vertex3f(hsz, hsz, -hsz); nuclear@16: goat3d_end(); nuclear@17: } nuclear@16: nuclear@17: void gen_sphere(struct goat3d_mesh *mesh, float rad, int usub, int vsub) nuclear@17: { nuclear@17: gen_sphere_part(mesh, rad, usub, vsub, 1.0, 1.0); nuclear@16: } nuclear@17: nuclear@17: #define sphere_vertex(u, v) \ nuclear@17: do { \ nuclear@17: float x, y, z, theta, phi; \ nuclear@17: float costheta, sinphi; \ nuclear@17: theta = (u) * 2.0 * M_PI; \ nuclear@17: phi = (v) * M_PI; \ nuclear@17: costheta = cos(theta); \ nuclear@17: sinphi = sin(phi); \ nuclear@17: x = costheta * sinphi; \ nuclear@17: y = cos(phi); \ nuclear@17: z = sin(theta) * sinphi; \ nuclear@17: goat3d_normal3f(x, y, z); \ nuclear@17: goat3d_texcoord2f(u, v); \ nuclear@17: goat3d_vertex3f(rad * x, rad * y, rad * z); \ nuclear@17: } while(0) nuclear@17: nuclear@17: void gen_sphere_part(struct goat3d_mesh *mesh, float rad, int usub, int vsub, float umax, float vmax) nuclear@17: { nuclear@17: int i, j; nuclear@17: float u, v, du, dv; nuclear@17: nuclear@17: if(usub < 3) usub = 3; nuclear@17: if(vsub < 3) vsub = 3; nuclear@17: nuclear@17: du = umax / (float)usub; nuclear@17: dv = vmax / (float)vsub; nuclear@17: nuclear@17: goat3d_begin(mesh, GOAT3D_QUADS); nuclear@17: nuclear@17: u = 0.0; nuclear@17: for(i=0; i