int main(void) { allegro_init(); install_timer(); install_keyboard(); rgb_map = malloc(sizeof(RGB_MAP)); create_rgb_table(rgb_map, desktop_palette, NULL); set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0); buffer = create_bitmap(SCREEN_W, SCREEN_H); set_projection_viewport(0, 0, SCREEN_W, SCREEN_H); init_shape(); while (!key[KEY_ESC]) { move_shape(); translate_shape(); vsync(); draw(); } destroy_bitmap(buffer); free(rgb_map); allegro_exit(); return 0; }
static void emit_spiral(bool inner) { double mod; Vector3d *tmp; Vector3d translate; int i; /* initial; buffer setup */ g_shape = g_vector_buffer[0]; g_target = g_vector_buffer[1]; /* create shape */ create_shape(inner ? MARBLE_RUN_SEGMENT_HEIGHT/2 : MARBLE_RUN_SEGMENT_HEIGHT/2+MARBLE_RUN_WALL ); /* remember start */ if(inner) memcpy(g_vector_inner[0], g_shape, sizeof(g_vector_inner[0])); else emit_cap(g_vector_inner[0], g_shape, true); /* emit sculpture */ translate = Vector3d::UnitZ()*(MARBLE_RUN_SEGMENT_HEIGHT+MARBLE_RUN_WALL)/MARBLE_RUN_RESOLUTION; for(i=0; i<(6*MARBLE_RUN_RESOLUTION); i++) { if(inner) mod = sin(i*M_PI/(((i / ((MARBLE_RUN_RESOLUTION)/10)) % 4)+1.5))/7; else mod = 0; /* translate all points */ translate_shape(translate, mod); /* emit resulting layer */ emit_stl_layer(inner); /* move to next layer */ tmp = g_shape; g_shape = g_target; g_target = tmp; } /* remember end */ if(inner) memcpy(g_vector_inner[1], g_shape, sizeof(g_vector_inner[1])); else emit_cap(g_vector_inner[1], g_shape, false); }