int main( int argc, char *argv[]){ //set up the images Image *src; Image *myImage; //set up the modules!! Module *basket; Module *connector; Module *connector1; Line l; Point pts[2]; Module *circle; Module *hotAirBalloon; Module *teamOfBalloons; Module *scene; //pick the colors Color colors[6]; Color brown; Color blue; Color green; Color grey; //set up view stuff, and image file stuff Matrix vtm, gtm; int rows; int cols; View3D view; DrawState *ds; char filename[256]; int i, j, k, m, n; //Set the colors up color_set(&brown, 0.2, 0.1, 0.0); color_set(&blue, 0.6, 0.8, 1.0); color_set(&green, 0.1, 0.4, 0.0); color_set(&grey, 0.3, 0.3, 0.3); color_set(&colors[0], 1.0, 0.0, 0.0);//Red color_set(&colors[1],1.0, 0.5, 0.0);//orange color_set(&colors[2],1.0, 1.0, 0.1);//yellow color_set(&colors[3], 0.0, 1.0, 0.0);//green color_set(&colors[4], 0.0, 0.0, 1.0);//blue color_set(&colors[5], 0.4, 0.0, 0.8);//purple //if you want to supply a background image you can, otherwise I set a default sky blue background! if(argc>1){ printf("you supplied an image\n"); myImage = image_read(argv[1]); rows = myImage->rows; cols = myImage->cols; printf("%d %d\n", rows, cols); }else{ printf("We are giving your image a default size!\n"); rows = 500; cols = 500; myImage = image_create(rows, cols); for(m = 0; m< rows; m++){ for(n = 0; n<cols; n++){ image_setColor(myImage, m, n, blue); } } } //Loop over the scene 300 times moving the scene around!! for(k = 0; k<300; k++){ //Set up the view point_set( &(view.vrp), 150, 100, 200, 1.0); vector_set( &(view.vpn), -view.vrp.val[0], -view.vrp.val[1], -view.vrp.val[2]); vector_set( &(view.vup), 0, 1.0, 0); view.d = 20; view.du = 10; view.dv = view.du* (float)rows/cols; view.f = 0; view.b = 5; view.screenx = rows; view.screeny = cols; matrix_setView3D( &vtm, &view); matrix_identity( >m ); // basket: cube (will need 1 in hot air balloon module) basket = module_create(); module_color(basket, &brown); module_cube(basket, 1); //connectors: lines need 4 connector = module_create(); point_set3D(&pts[0],1,1,1 ); point_set3D(&pts[1],2,4.2,1); line_set(&l, pts[0], pts[1]); module_line(connector, &l); connector1 = module_create(); point_set3D(&pts[0], 1,1 , 1); point_set3D(&pts[1], 0,4.2 ,1 ); line_set(&l, pts[0], pts[1]); module_line(connector1, &l); // balloon: circles nested on top of eachother circle = module_create(); module_color(circle, &colors[0]); module_rotateX(circle, 0, 1); module_translate2D(circle, 0, 3); module_circle(circle, 1); module_color(circle, &colors[1]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 2.5); module_color(circle, &colors[2]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 3); module_color(circle, &colors[3]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 4); module_color(circle, &colors[4]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 5); module_color(circle, &colors[5]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 6); module_color(circle, &colors[0]); module_rotateX(circle, 1,0); module_translate2D(circle, 0, 1); module_circle(circle, 7); module_color(circle, &colors[1]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 7); module_color(circle, &colors[2]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0,1); module_circle(circle, 7); module_color(circle, &colors[3]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 7); module_color(circle, &colors[4]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 6); module_color(circle, &colors[5]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 5); module_color(circle, &colors[0]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 1); module_circle(circle, 4); module_color(circle, &colors[1]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 0.5); module_circle(circle, 3); module_color(circle, &colors[2]); module_rotateX(circle, 1, 0); module_translate2D(circle, 0, 0.5); module_circle(circle, 2); //hotAirBalloon: put the above parts together hotAirBalloon = module_create(); module_module(hotAirBalloon, basket); module_module(hotAirBalloon, connector); module_translate(hotAirBalloon, -2,0 ,0 ); module_module(hotAirBalloon, connector1); module_translate(hotAirBalloon, 0, 0, -2); module_module(hotAirBalloon, connector1); module_translate(hotAirBalloon, 2, 0, 0); module_module(hotAirBalloon, connector); module_module(hotAirBalloon, circle); //make a team of balloons teamOfBalloons = module_create(); module_translate(teamOfBalloons, 0,-30,-15); module_module(teamOfBalloons, hotAirBalloon); module_translate(teamOfBalloons, 0, 0+(k*0.1),15); module_module(teamOfBalloons, hotAirBalloon); module_translate(teamOfBalloons, 0, 0+(k*0.1),15); module_module(teamOfBalloons, hotAirBalloon); //make a scene of balloons scene = module_create(); module_translate(scene, -40, 10+(k*0.1), 10); module_module(scene, teamOfBalloons); module_translate(scene, 140, 10, 55); module_module(scene, teamOfBalloons); module_translate(scene, -50, 10+(k*0.1), -40); module_module(scene, teamOfBalloons); module_translate(scene, 30, 10+(k*0.2) , -55); module_module(scene, teamOfBalloons); //set up the image src = image_create(rows, cols); //Either draw the background image you supplied or use my default background for (i = 0; i<rows; i++){ for (j = 0; j<cols; j++){ blue = image_getColor(myImage, i, j); image_setColor(src,i, j, blue); } } //set up the draw state if you want filled polygons need to use ShadeConstant instead of ShadeFrame ds = drawstate_create(); ds->shade = ShadeFrame; //draw the modules! module_draw( scene, &vtm, >m, ds, NULL, src); //put the files in the right place with the right name!! sprintf(filename, "/export/home/vedwards/Desktop/Graphics/images/hotAirBalloons3/frame-%04d.ppm", k ); printf("Writing image\n"); image_write( src, filename ); } //Clean up, delete all of the modules, images, and drawState module_delete(basket); module_delete(connector); module_delete(connector1); module_delete(circle); module_delete(hotAirBalloon); module_delete(teamOfBalloons); free(ds); image_free( src ); image_free( myImage ); return(0); }
/* * add a teapot to the module with the specified number of divisions */ void module_teapot(Module *m, int divisions, int solid){ int i, j; Point teapot[127] = { {{ 0.2000, 0.0000, 2.70000, 1.0 }}, {{ 0.2000, -0.1120, 2.70000, 1.0 }}, {{ 0.1120, -0.2000, 2.70000, 1.0 }}, {{ 0.0000, -0.2000, 2.70000, 1.0 }}, {{ 1.3375, 0.0000, 2.53125, 1.0 }}, {{ 1.3375, -0.7490, 2.53125, 1.0 }}, {{ 0.7490, -1.3375, 2.53125, 1.0 }}, {{ 0.0000, -1.3375, 2.53125, 1.0 }}, {{ 1.4375, 0.0000, 2.53125, 1.0 }}, {{ 1.4375, -0.8050, 2.53125, 1.0 }}, {{ 0.8050, -1.4375, 2.53125, 1.0 }}, {{ 0.0000, -1.4375, 2.53125, 1.0 }}, {{ 1.5000, 0.0000, 2.40000, 1.0 }}, {{ 1.5000, -0.8400, 2.40000, 1.0 }}, {{ 0.8400, -1.5000, 2.40000, 1.0 }}, {{ 0.0000, -1.5000, 2.40000, 1.0 }}, {{ 1.7500, 0.0000, 1.87500, 1.0 }}, {{ 1.7500, -0.9800, 1.87500, 1.0 }}, {{ 0.9800, -1.7500, 1.87500, 1.0 }}, {{ 0.0000, -1.7500, 1.87500, 1.0 }}, {{ 2.0000, 0.0000, 1.35000, 1.0 }}, {{ 2.0000, -1.1200, 1.35000, 1.0 }}, {{ 1.1200, -2.0000, 1.35000, 1.0 }}, {{ 0.0000, -2.0000, 1.35000, 1.0 }}, {{ 2.0000, 0.0000, 0.90000, 1.0 }}, {{ 2.0000, -1.1200, 0.90000, 1.0 }}, {{ 1.1200, -2.0000, 0.90000, 1.0 }}, {{ 0.0000, -2.0000, 0.90000, 1.0 }}, {{ -2.0000, 0.0000, 0.90000, 1.0 }}, {{ 2.0000, 0.0000, 0.45000, 1.0 }}, {{ 2.0000, -1.1200, 0.45000, 1.0 }}, {{ 1.1200, -2.0000, 0.45000, 1.0 }}, {{ 0.0000, -2.0000, 0.45000, 1.0 }}, {{ 1.5000, 0.0000, 0.22500, 1.0 }}, {{ 1.5000, -0.8400, 0.22500, 1.0 }}, {{ 0.8400, -1.5000, 0.22500, 1.0 }}, {{ 0.0000, -1.5000, 0.22500, 1.0 }}, {{ 1.5000, 0.0000, 0.15000, 1.0 }}, {{ 1.5000, -0.8400, 0.15000, 1.0 }}, {{ 0.8400, -1.5000, 0.15000, 1.0 }}, {{ 0.0000, -1.5000, 0.15000, 1.0 }}, {{ -1.6000, 0.0000, 2.02500, 1.0 }}, {{ -1.6000, -0.3000, 2.02500, 1.0 }}, {{ -1.5000, -0.3000, 2.25000, 1.0 }}, {{ -1.5000, 0.0000, 2.25000, 1.0 }}, {{ -2.3000, 0.0000, 2.02500, 1.0 }}, {{ -2.3000, -0.3000, 2.02500, 1.0 }}, {{ -2.5000, -0.3000, 2.25000, 1.0 }}, {{ -2.5000, 0.0000, 2.25000, 1.0 }}, {{ -2.7000, 0.0000, 2.02500, 1.0 }}, {{ -2.7000, -0.3000, 2.02500, 1.0 }}, {{ -3.0000, -0.3000, 2.25000, 1.0 }}, {{ -3.0000, 0.0000, 2.25000, 1.0 }}, {{ -2.7000, 0.0000, 1.80000, 1.0 }}, {{ -2.7000, -0.3000, 1.80000, 1.0 }}, {{ -3.0000, -0.3000, 1.80000, 1.0 }}, {{ -3.0000, 0.0000, 1.80000, 1.0 }}, {{ -2.7000, 0.0000, 1.57500, 1.0 }}, {{ -2.7000, -0.3000, 1.57500, 1.0 }}, {{ -3.0000, -0.3000, 1.35000, 1.0 }}, {{ -3.0000, 0.0000, 1.35000, 1.0 }}, {{ -2.5000, 0.0000, 1.12500, 1.0 }}, {{ -2.5000, -0.3000, 1.12500, 1.0 }}, {{ -2.6500, -0.3000, 0.93750, 1.0 }}, {{ -2.6500, 0.0000, 0.93750, 1.0 }}, {{ -2.0000, -0.3000, 0.90000, 1.0 }}, {{ -1.9000, -0.3000, 0.60000, 1.0 }}, {{ -1.9000, 0.0000, 0.60000, 1.0 }}, {{ 1.7000, 0.0000, 1.42500, 1.0 }}, {{ 1.7000, -0.6600, 1.42500, 1.0 }}, {{ 1.7000, -0.6600, 0.60000, 1.0 }}, {{ 1.7000, 0.0000, 0.60000, 1.0 }}, {{ 2.6000, 0.0000, 1.42500, 1.0 }}, {{ 2.6000, -0.6600, 1.42500, 1.0 }}, {{ 3.1000, -0.6600, 0.82500, 1.0 }}, {{ 3.1000, 0.0000, 0.82500, 1.0 }}, {{ 2.3000, 0.0000, 2.10000, 1.0 }}, {{ 2.3000, -0.2500, 2.10000, 1.0 }}, {{ 2.4000, -0.2500, 2.02500, 1.0 }}, {{ 2.4000, 0.0000, 2.02500, 1.0 }}, {{ 2.7000, 0.0000, 2.40000, 1.0 }}, {{ 2.7000, -0.2500, 2.40000, 1.0 }}, {{ 3.3000, -0.2500, 2.40000, 1.0 }}, {{ 3.3000, 0.0000, 2.40000, 1.0 }}, {{ 2.8000, 0.0000, 2.47500, 1.0 }}, {{ 2.8000, -0.2500, 2.47500, 1.0 }}, {{ 3.5250, -0.2500, 2.49375, 1.0 }}, {{ 3.5250, 0.0000, 2.49375, 1.0 }}, {{ 2.9000, 0.0000, 2.47500, 1.0 }}, {{ 2.9000, -0.1500, 2.47500, 1.0 }}, {{ 3.4500, -0.1500, 2.51250, 1.0 }}, {{ 3.4500, 0.0000, 2.51250, 1.0 }}, {{ 2.8000, 0.0000, 2.40000, 1.0 }}, {{ 2.8000, -0.1500, 2.40000, 1.0 }}, {{ 3.2000, -0.1500, 2.40000, 1.0 }}, {{ 3.2000, 0.0000, 2.40000, 1.0 }}, {{ 0.0000, 0.0000, 3.15000, 1.0 }}, {{ 0.8000, 0.0000, 3.15000, 1.0 }}, {{ 0.8000, -0.4500, 3.15000, 1.0 }}, {{ 0.4500, -0.8000, 3.15000, 1.0 }}, {{ 0.0000, -0.8000, 3.15000, 1.0 }}, {{ 0.0000, 0.0000, 2.85000, 1.0 }}, {{ 1.4000, 0.0000, 2.40000, 1.0 }}, {{ 1.4000, -0.7840, 2.40000, 1.0 }}, {{ 0.7840, -1.4000, 2.40000, 1.0 }}, {{ 0.0000, -1.4000, 2.40000, 1.0 }}, {{ 0.4000, 0.0000, 2.55000, 1.0 }}, {{ 0.4000, -0.2240, 2.55000, 1.0 }}, {{ 0.2240, -0.4000, 2.55000, 1.0 }}, {{ 0.0000, -0.4000, 2.55000, 1.0 }}, {{ 1.3000, 0.0000, 2.55000, 1.0 }}, {{ 1.3000, -0.7280, 2.55000, 1.0 }}, {{ 0.7280, -1.3000, 2.55000, 1.0 }}, {{ 0.0000, -1.3000, 2.55000, 1.0 }}, {{ 1.3000, 0.0000, 2.40000, 1.0 }}, {{ 1.3000, -0.7280, 2.40000, 1.0 }}, {{ 0.7280, -1.3000, 2.40000, 1.0 }}, {{ 0.0000, -1.3000, 2.40000, 1.0 }}, {{ 0.0000, 0.0000, 0.00000, 1.0 }}, {{ 1.4250, -0.7980, 0.00000, 1.0 }}, {{ 1.5000, 0.0000, 0.07500, 1.0 }}, {{ 1.4250, 0.0000, 0.00000, 1.0 }}, {{ 0.7980, -1.4250, 0.00000, 1.0 }}, {{ 0.0000, -1.5000, 0.07500, 1.0 }}, {{ 0.0000, -1.4250, 0.00000, 1.0 }}, {{ 1.5000, -0.8400, 0.07500, 1.0 }}, {{ 0.8400, -1.5000, 0.07500, 1.0 }} }; int rim[16] = { 102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; int body[2][16] = { { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 }, { 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 } }; int lid[2][16] = { { 96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101, 101, 0, 1, 2, 3 }, { 0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117 } }; int handle[2][16] = { { 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56 }, { 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 28, 65, 66, 67 } }; int spout[2][16] = { { 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83 }, { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 } }; int bottom[16] = { 118, 118, 118, 118, 124, 122, 119, 121, 123, 126, 125, 120, 40, 39, 38, 37 }; BezierSurface rimSurf, body1Surf, body2Surf, lid1Surf, lid2Surf, handle1Surf, handle2Surf, spout1Surf, spout2Surf, bottomSurf; // init all surfaces rimSurf.zBuffer = body1Surf.zBuffer = body2Surf.zBuffer = lid1Surf.zBuffer = lid2Surf.zBuffer = handle1Surf.zBuffer = handle2Surf.zBuffer = spout1Surf.zBuffer = spout2Surf.zBuffer = bottomSurf.zBuffer = 1; for(i=0;i<4;i++){ for(j=0;j<4;j++){ rimSurf.c[i][j] = teapot[rim[j+4*i]]; body1Surf.c[i][j] = teapot[body[0][j+4*i]]; body2Surf.c[i][j] = teapot[body[1][j+4*i]]; lid1Surf.c[i][j] = teapot[lid[0][j+4*i]]; lid2Surf.c[i][j] = teapot[lid[1][j+4*i]]; handle1Surf.c[i][j] = teapot[handle[0][j+4*i]]; handle2Surf.c[i][j] = teapot[handle[1][j+4*i]]; spout1Surf.c[i][j] = teapot[spout[0][j+4*i]]; spout2Surf.c[i][j] = teapot[spout[1][j+4*i]]; bottomSurf.c[i][j] = teapot[bottom[j+4*i]]; } } // add surfaces to module so y is up module_rotateX(m, cos(1.5*M_PI), sin(1.5*M_PI)); for(i=0;i<4;i++){ module_rotateY(m, cos(0.5*M_PI*i), sin(0.5*M_PI*i)); module_bezierSurface(m, &rimSurf, divisions, solid); module_bezierSurface(m, &body1Surf, divisions, solid); module_bezierSurface(m, &body2Surf, divisions, solid); module_bezierSurface(m, &lid1Surf, divisions, solid); module_bezierSurface(m, &lid2Surf, divisions, solid); module_bezierSurface(m, &bottomSurf, divisions, solid); } module_bezierSurface(m, &handle1Surf, divisions, solid); module_bezierSurface(m, &handle2Surf, divisions, solid); module_bezierSurface(m, &spout1Surf, divisions, solid); module_bezierSurface(m, &spout2Surf, divisions, solid); for(i=0;i<4;i++){ for(j=0;j<4;j++){ handle1Surf.c[i][j].val[1] = -1*handle1Surf.c[i][j].val[1]; handle2Surf.c[i][j].val[1] = -1*handle2Surf.c[i][j].val[1]; spout1Surf.c[i][j].val[1] = -1*spout1Surf.c[i][j].val[1]; spout2Surf.c[i][j].val[1] = -1*spout2Surf.c[i][j].val[1]; } } module_bezierSurface(m, &handle1Surf, divisions, solid); module_bezierSurface(m, &handle2Surf, divisions, solid); module_bezierSurface(m, &spout1Surf, divisions, solid); module_bezierSurface(m, &spout2Surf, divisions, solid); }