void performUpdate(void) { apply_gravity(); move_balls(10); handleBallBallCollisions(); handleBallWallCollisions(); }
void advance(float t, float timeUntilUpdate) { while (t > 0) { if (timeUntilUpdate <= t) { move_balls(timeUntilUpdate); performUpdate(); t -= timeUntilUpdate; timeUntilUpdate = TIME_BETWEEN_UPDATES; } else { move_balls(timeUntilUpdate); timeUntilUpdate -= t; t = 0; } } }
bool App::update() { game_time.update(); options->set_viewport(canvas.get_size()); options->set_background_color(clan::Colorf(0.6f, 0.6f, 0.2f, 1.0f)); options->update(); int num_balls = options->num_balls; if (num_balls > max_balls) num_balls = max_balls; if (options->is_moveballs_set) move_balls(game_time.get_time_elapsed(), num_balls); canvas.set_map_mode(options->current_mapmode); const float grid_xpos = 10.0f; const float grid_ypos = 10.0f; if (options->current_mapmode == clan::map_user_projection) { float grid_width = (float)image_grid.get_width(); float grid_height = (float)image_grid.get_height(); clan::Sizef area_size(grid_width + (grid_xpos * 2.0f), grid_height + (grid_ypos * 2.0f)); set_user_projection(canvas, area_size, options.get()); } // Draw the grid image_grid.draw(canvas, grid_xpos, grid_ypos); for (int cnt=0; cnt<num_balls; cnt++) { image_ball.draw(canvas, grid_xpos + balls[cnt].xpos, grid_ypos + balls[cnt].ypos); } canvas.set_transform(clan::Mat4f::identity()); canvas.set_projection(clan::Mat4f::identity()); canvas.set_map_mode(clan::map_2d_upper_left); canvas.set_viewport(canvas.get_size()); window.flip(1); return !quit; }
bool App::update() { game_time.update(); int num_balls = 3; // options->num_balls; if (num_balls > max_balls) num_balls = max_balls; // if (options->is_moveballs_set) move_balls(game_time.get_time_elapsed(), num_balls); // canvas.set_map_mode(options->current_mapmode); const float grid_xpos = 10.0f; const float grid_ypos = 10.0f; // if (options->current_mapmode == clan::map_user_projection) // { // clan::Sizef area_size(grid_width + (grid_xpos * 2.0f), grid_height + (grid_ypos * 2.0f)); // set_user_projection(canvas, area_size, options); // } // Draw the grid image_grid.draw(canvas, grid_xpos, grid_ypos); for (int cnt=0; cnt<num_balls; cnt++) { image_ball.draw(canvas, grid_xpos + balls[cnt].xpos, grid_ypos + balls[cnt].ypos); } canvas.set_transform(clan::Mat4f::identity()); canvas.set_projection(clan::Mat4f::identity()); canvas.set_map_mode(clan::map_2d_upper_left); canvas.get_gc().set_viewport(canvas.get_size()); window.flip(1); return !quit; }
// The start of the Application int App::start(const std::vector<CL_String> &args) { CL_DisplayWindowDescription win_desc; win_desc.set_allow_resize(true); win_desc.set_stencil_size(8); // For simplicity this example does not use the depth components //win_desc.set_depth_size(16); win_desc.set_title("Stencil Example"); win_desc.set_size(CL_Size( 900, 570 ), false); CL_DisplayWindow window(win_desc); CL_Slot slot_quit = window.sig_window_close().connect(this, &App::on_window_close); CL_Slot slot_input_up = (window.get_ic().get_keyboard()).sig_key_up().connect(this, &App::on_input_up); CL_String theme; if (CL_FileHelp::file_exists("../../../Resources/GUIThemeAero/theme.css")) theme = "../../../Resources/GUIThemeAero"; else if (CL_FileHelp::file_exists("../../../Resources/GUIThemeBasic/theme.css")) theme = "../../../Resources/GUIThemeBasic"; else throw CL_Exception("No themes found"); CL_GUIWindowManagerTexture wm(window); CL_GUIManager gui(wm, theme); CL_GraphicContext gc = window.get_gc(); // Deleted automatically by the GUI Options *options = new Options(gui, CL_Rect(0, 0, gc.get_size())); CL_Image image_grid(gc, "../Blend/Resources/grid.png"); CL_Image image_ball(gc, "../Blend/Resources/ball.png"); grid_space = (float) (image_grid.get_width() - image_ball.get_width()); setup_balls(); CL_BufferControl buffer_control; CL_BufferControl default_buffer_control; options->request_repaint(); CL_Font font(gc, "Tahoma", 24); unsigned int time_last = CL_System::get_time(); while (!quit) { unsigned int time_now = CL_System::get_time(); float time_diff = (float) (time_now - time_last); time_last = time_now; wm.process(); wm.draw_windows(gc); int num_balls = options->num_balls; if (num_balls > max_balls) num_balls = max_balls; if (options->is_moveballs_set) move_balls(time_diff, num_balls); gc.clear_stencil(0); // Draw the grid const float grid_xpos = 10.0f; const float grid_ypos = 10.0f; image_grid.draw(gc, grid_xpos, grid_ypos); // Draw the circle onto the stencil if (options->is_circle_set) { buffer_control.enable_logic_op(false); buffer_control.enable_stencil_test(true); buffer_control.set_stencil_compare_func(cl_comparefunc_always, cl_comparefunc_always); buffer_control.set_stencil_fail(cl_stencil_incr_wrap, cl_stencil_incr_wrap); buffer_control.set_stencil_pass_depth_fail(cl_stencil_incr_wrap, cl_stencil_incr_wrap); buffer_control.set_stencil_pass_depth_pass(cl_stencil_incr_wrap, cl_stencil_incr_wrap); buffer_control.enable_color_write(false); buffer_control.enable_depth_write(false); buffer_control.enable_depth_test(false); gc.set_buffer_control(buffer_control); CL_Draw::circle(gc, grid_xpos + image_grid.get_width()/2, grid_ypos + image_grid.get_height()/2, 100, CL_Colorf::white); } buffer_control.enable_color_write(true); buffer_control.enable_logic_op(false); buffer_control.enable_stencil_test(true); buffer_control.set_stencil_compare_func(options->compare_function, options->compare_function); buffer_control.set_stencil_compare_reference(options->compare_reference, options->compare_reference); buffer_control.set_stencil_write_mask(255, 255); buffer_control.set_stencil_compare_mask(255, 255); buffer_control.set_stencil_fail(options->stencil_fail, options->stencil_fail);; // Note, depth testing disabled for this example buffer_control.set_stencil_pass_depth_fail(options->stencil_pass, options->stencil_pass); buffer_control.set_stencil_pass_depth_pass(options->stencil_pass, options->stencil_pass); buffer_control.enable_depth_write(false); buffer_control.enable_depth_test(false); gc.set_buffer_control(buffer_control); for (int cnt=0; cnt<num_balls; cnt++) { image_ball.draw(gc, grid_xpos + balls[cnt].xpos, grid_ypos + balls[cnt].ypos); } gc.set_buffer_control(default_buffer_control); CL_Image stencil_image = get_stencil(gc, CL_Rect(grid_xpos, grid_ypos, image_grid.get_width(), image_grid.get_height())); const float stencil_image_xpos = 400.0f; const float stencil_image_ypos = 30.0f; const float stencil_image_scale = 0.5f; stencil_image.set_scale(stencil_image_scale, stencil_image_scale); stencil_image.draw(gc, stencil_image_xpos, stencil_image_ypos); CL_Draw::box(gc, CL_Rectf(stencil_image_xpos, stencil_image_ypos, CL_Sizef(stencil_image.get_width() * stencil_image_scale, stencil_image.get_height() * stencil_image_scale)), CL_Colorf::white); font.draw_text(gc, stencil_image_xpos, stencil_image_ypos - 4.0f, "Stencil", CL_Colorf::black); // Add a note to avoid confusion font.draw_text(gc, 10.0f, 500.0, "(This example does not use the stencil depth buffer comparison or the stencil bitmask)", CL_Colorf::black); window.flip(1); CL_KeepAlive::process(); } return 0; }
// The start of the Application int App::start(const std::vector<std::string> &args) { clan::DisplayWindowDescription win_desc; win_desc.set_allow_resize(true); win_desc.set_title("MapMode Example"); win_desc.set_size(clan::Size( 800, 480 ), false); clan::DisplayWindow window(win_desc); clan::SlotContainer cc; cc.connect(window.sig_window_close(), clan::bind_member(this, &App::on_window_close)); cc.connect(window.get_ic().get_keyboard().sig_key_up(), clan::bind_member(this, &App::on_input_up)); std::string theme; if (clan::FileHelp::file_exists("../../../Resources/GUIThemeAero/theme.css")) theme = "../../../Resources/GUIThemeAero"; else if (clan::FileHelp::file_exists("../../../Resources/GUIThemeBasic/theme.css")) theme = "../../../Resources/GUIThemeBasic"; else throw clan::Exception("No themes found"); clan::GUIWindowManagerTexture wm(window); clan::GUIManager gui(wm, theme); clan::Canvas canvas(window); // Deleted automatically by the GUI Options *options = new Options(gui, clan::Rect(0, 0, canvas.get_size())); clan::Image image_grid(canvas, "../Blend/Resources/grid.png"); clan::Image image_ball(canvas, "../Blend/Resources/ball.png"); float grid_width = (float) image_grid.get_width(); float grid_height = (float) image_grid.get_height(); grid_space = (float) (image_grid.get_width() - image_ball.get_width()); setup_balls(); options->request_repaint(); clan::GameTime game_time; while (!quit) { game_time.update(); wm.process(); wm.draw_windows(canvas); int num_balls = options->num_balls; if (num_balls > max_balls) num_balls = max_balls; if (options->is_moveballs_set) move_balls(game_time.get_time_elapsed(), num_balls); canvas.set_map_mode(options->current_mapmode); const float grid_xpos = 10.0f; const float grid_ypos = 10.0f; if (options->current_mapmode == clan::map_user_projection) { clan::Sizef area_size(grid_width + (grid_xpos * 2.0f), grid_height + (grid_ypos * 2.0f)); set_user_projection(canvas, area_size, options); } // Draw the grid image_grid.draw(canvas, grid_xpos, grid_ypos); for (int cnt=0; cnt<num_balls; cnt++) { image_ball.draw(canvas, grid_xpos + balls[cnt].xpos, grid_ypos + balls[cnt].ypos); } canvas.set_modelview(clan::Mat4f::identity()); canvas.set_projection(clan::Mat4f::identity()); canvas.set_map_mode(clan::map_2d_upper_left); canvas.get_gc().set_viewport(canvas.get_size()); window.flip(1); clan::KeepAlive::process(); } return 0; }
static void animate_lava (ModeInfo *mi) { lavalite_configuration *bp = &bps[MI_SCREEN(mi)]; int wire = MI_IS_WIREFRAME(mi); Bool just_started_p = bp->just_started_p; double isolevel = 0.3; /* Maybe bubble a new blobby to the surface. */ if (just_started_p || frand(1.0) < bp->launch_chance) { bp->just_started_p = False; launch_balls (mi); if (do_impatient && just_started_p) while (1) { int i; move_balls (mi); for (i = 0; i < bp->nballs; i++) { metaball *b = &bp->balls[i]; if (b->alive_p && !b->static_p && !b->leader && b->z > 0.5) goto DONE; } } DONE: ; } move_balls (mi); glNewList (bp->ball_list, GL_COMPILE); glPushMatrix(); glMaterialfv (GL_FRONT, GL_SPECULAR, lava_spec); glMateriali (GL_FRONT, GL_SHININESS, lava_shininess); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lava_color); /* For the blobbies, the origin is on the axis at the bottom of the glass bottle; and the top of the bottle is +1 on Z. */ glTranslatef (0, 0, -0.5); mi->polygon_count = 0; { double s; if (bp->grid_size == 0) bp->grid_size = 1; /* first time through */ s = 1.0/bp->grid_size; glPushMatrix(); glTranslatef (-0.5, -0.5, 0); glScalef (s, s, s); marching_cubes (resolution, isolevel, wire, do_smooth, obj_init, obj_compute, obj_free, bp, &mi->polygon_count); glPopMatrix(); } mi->polygon_count += bp->bottle_poly_count; glPopMatrix(); glEndList (); }
bool App::update() { game_time.update(); options->set_viewport(canvas.get_size()); options->set_background_color(clan::Colorf(0.6f, 0.6f, 0.2f, 1.0f)); options->update(); int num_balls = options->num_balls; if (num_balls > max_balls) num_balls = max_balls; if (options->is_moveballs_set) move_balls(game_time.get_time_elapsed(), num_balls); canvas.clear_stencil(0); // Draw the grid const float grid_xpos = 10.0f; const float grid_ypos = 10.0f; image_grid.draw(canvas, grid_xpos, grid_ypos); clan::DepthStencilStateDescription stencil_desc; // Draw the circle onto the stencil if (options->is_circle_set) { stencil_desc.enable_stencil_test(true); stencil_desc.set_stencil_compare_front(clan::compare_always, 255, 255); stencil_desc.set_stencil_compare_back(clan::compare_always, 255, 255); stencil_desc.set_stencil_op_front(clan::stencil_incr_wrap, clan::stencil_incr_wrap, clan::stencil_incr_wrap); stencil_desc.set_stencil_op_back(clan::stencil_incr_wrap, clan::stencil_incr_wrap, clan::stencil_incr_wrap); stencil_desc.enable_depth_write(false); stencil_desc.enable_depth_test(false); clan::DepthStencilState stencil_state(canvas, stencil_desc); canvas.set_depth_stencil_state(stencil_state); canvas.set_blend_state(blend_state_no_color_write); canvas.fill_circle(grid_xpos + image_grid.get_width()/2, grid_ypos + image_grid.get_height()/2, 100, clan::Colorf::white); canvas.reset_blend_state(); } stencil_desc.enable_stencil_test(true); stencil_desc.set_stencil_compare_front(options->compare_function, options->compare_reference, 255); stencil_desc.set_stencil_compare_back(options->compare_function, options->compare_reference, 255); stencil_desc.set_stencil_op_front(options->stencil_fail, options->stencil_pass, options->stencil_pass); stencil_desc.set_stencil_op_back(options->stencil_fail, options->stencil_pass, options->stencil_pass); // Note, depth testing disabled for this example stencil_desc.enable_depth_write(false); stencil_desc.enable_depth_test(false); //clan::BlendState blend_state(canvas, blend_desc); clan::DepthStencilState stencil_state(canvas, stencil_desc); canvas.set_depth_stencil_state(stencil_state); for (int cnt=0; cnt<num_balls; cnt++) { image_ball.draw(canvas, grid_xpos + balls[cnt].xpos, grid_ypos + balls[cnt].ypos); } canvas.reset_depth_stencil_state(); clan::Image stencil_image = get_stencil(canvas, clan::Rect(grid_xpos, grid_ypos, image_grid.get_width(), image_grid.get_height())); const float stencil_image_xpos = 400.0f; const float stencil_image_ypos = 30.0f; const float stencil_image_scale = 0.5f; stencil_image.set_scale(stencil_image_scale, stencil_image_scale); stencil_image.draw(canvas, stencil_image_xpos, stencil_image_ypos); canvas.draw_box(clan::Rectf(stencil_image_xpos, stencil_image_ypos, clan::Sizef(stencil_image.get_width() * stencil_image_scale, stencil_image.get_height() * stencil_image_scale)), clan::Colorf::white); font.draw_text(canvas, stencil_image_xpos, stencil_image_ypos - 4.0f, "Stencil", clan::Colorf::black); // Add a note to avoid confusion font.draw_text(canvas, 10.0f, 500.0, "(This example does not use the stencil depth buffer comparison or the stencil bitmask)", clan::Colorf::black); window.flip(1); return !quit; }
// The start of the Application int App::start(const std::vector<std::string> &args) { clan::DisplayWindowDescription win_desc; win_desc.set_allow_resize(true); win_desc.set_stencil_size(8); // For simplicity this example does not use the depth components //win_desc.set_depth_size(16); win_desc.set_title("Stencil Example"); win_desc.set_size(clan::Size( 900, 570 ), false); clan::DisplayWindow window(win_desc); clan::Slot slot_quit = window.sig_window_close().connect(this, &App::on_window_close); clan::Slot slot_input_up = (window.get_ic().get_keyboard()).sig_key_up().connect(this, &App::on_input_up); std::string theme; if (clan::FileHelp::file_exists("../../../Resources/GUIThemeAero/theme.css")) theme = "../../../Resources/GUIThemeAero"; else if (clan::FileHelp::file_exists("../../../Resources/GUIThemeBasic/theme.css")) theme = "../../../Resources/GUIThemeBasic"; else throw clan::Exception("No themes found"); clan::GUIWindowManagerTexture wm(window); clan::GUIManager gui(wm, theme); clan::Canvas canvas(window); // Deleted automatically by the GUI Options *options = new Options(gui, clan::Rect(0, 0, canvas.get_size())); clan::Image image_grid(canvas, "../Blend/Resources/grid.png"); clan::Image image_ball(canvas, "../Blend/Resources/ball.png"); grid_space = (float) (image_grid.get_width() - image_ball.get_width()); setup_balls(); options->request_repaint(); clan::Font font(canvas, "Tahoma", 20); clan::BlendStateDescription blend_desc; blend_desc.enable_color_write(false, false, false, false); clan::BlendState blend_state_no_color_write(canvas, blend_desc); clan::GameTime game_time; while (!quit) { game_time.update(); wm.process(); wm.draw_windows(canvas); int num_balls = options->num_balls; if (num_balls > max_balls) num_balls = max_balls; if (options->is_moveballs_set) move_balls(game_time.get_time_elapsed(), num_balls); canvas.clear_stencil(0); // Draw the grid const float grid_xpos = 10.0f; const float grid_ypos = 10.0f; image_grid.draw(canvas, grid_xpos, grid_ypos); clan::DepthStencilStateDescription stencil_desc; // Draw the circle onto the stencil if (options->is_circle_set) { stencil_desc.enable_stencil_test(true); stencil_desc.set_stencil_compare_front(clan::compare_always, 255, 255); stencil_desc.set_stencil_compare_back(clan::compare_always, 255, 255); stencil_desc.set_stencil_op_front(clan::stencil_incr_wrap, clan::stencil_incr_wrap, clan::stencil_incr_wrap); stencil_desc.set_stencil_op_back(clan::stencil_incr_wrap, clan::stencil_incr_wrap, clan::stencil_incr_wrap); stencil_desc.enable_depth_write(false); stencil_desc.enable_depth_test(false); clan::DepthStencilState stencil_state(canvas, stencil_desc); canvas.set_depth_stencil_state(stencil_state); canvas.set_blend_state(blend_state_no_color_write); canvas.fill_circle(grid_xpos + image_grid.get_width()/2, grid_ypos + image_grid.get_height()/2, 100, clan::Colorf::white); canvas.reset_blend_state(); } stencil_desc.enable_stencil_test(true); stencil_desc.set_stencil_compare_front(options->compare_function, options->compare_reference, 255); stencil_desc.set_stencil_compare_back(options->compare_function, options->compare_reference, 255); stencil_desc.set_stencil_op_front(options->stencil_fail, options->stencil_pass, options->stencil_pass); stencil_desc.set_stencil_op_back(options->stencil_fail, options->stencil_pass, options->stencil_pass); // Note, depth testing disabled for this example stencil_desc.enable_depth_write(false); stencil_desc.enable_depth_test(false); clan::BlendState blend_state(canvas, blend_desc); clan::DepthStencilState stencil_state(canvas, stencil_desc); canvas.set_depth_stencil_state(stencil_state); for (int cnt=0; cnt<num_balls; cnt++) { image_ball.draw(canvas, grid_xpos + balls[cnt].xpos, grid_ypos + balls[cnt].ypos); } canvas.reset_depth_stencil_state(); clan::Image stencil_image = get_stencil(canvas, clan::Rect(grid_xpos, grid_ypos, image_grid.get_width(), image_grid.get_height())); const float stencil_image_xpos = 400.0f; const float stencil_image_ypos = 30.0f; const float stencil_image_scale = 0.5f; stencil_image.set_scale(stencil_image_scale, stencil_image_scale); stencil_image.draw(canvas, stencil_image_xpos, stencil_image_ypos); canvas.draw_box(clan::Rectf(stencil_image_xpos, stencil_image_ypos, clan::Sizef(stencil_image.get_width() * stencil_image_scale, stencil_image.get_height() * stencil_image_scale)), clan::Colorf::white); font.draw_text(canvas, stencil_image_xpos, stencil_image_ypos - 4.0f, "Stencil", clan::Colorf::black); // Add a note to avoid confusion font.draw_text(canvas, 10.0f, 500.0, "(This example does not use the stencil depth buffer comparison or the stencil bitmask)", clan::Colorf::black); window.flip(1); clan::KeepAlive::process(); } return 0; }
// The start of the Application int App::start(const std::vector<CL_String> &args) { CL_DisplayWindowDescription win_desc; win_desc.set_allow_resize(true); win_desc.set_title("MapMode Example"); win_desc.set_size(CL_Size( 800, 480 ), false); CL_DisplayWindow window(win_desc); CL_Slot slot_quit = window.sig_window_close().connect(this, &App::on_window_close); CL_Slot slot_input_up = (window.get_ic().get_keyboard()).sig_key_up().connect(this, &App::on_input_up); CL_String theme; if (CL_FileHelp::file_exists("../../../Resources/GUIThemeAero/theme.css")) theme = "../../../Resources/GUIThemeAero"; else if (CL_FileHelp::file_exists("../../../Resources/GUIThemeBasic/theme.css")) theme = "../../../Resources/GUIThemeBasic"; else throw CL_Exception("No themes found"); CL_GUIWindowManagerTexture wm(window); CL_GUIManager gui(wm, theme); CL_GraphicContext gc = window.get_gc(); // Deleted automatically by the GUI Options *options = new Options(gui, CL_Rect(0, 0, gc.get_size())); CL_Image image_grid(gc, "../Blend/Resources/grid.png"); CL_Image image_ball(gc, "../Blend/Resources/ball.png"); float grid_width = (float) image_grid.get_width(); float grid_height = (float) image_grid.get_height(); grid_space = (float) (image_grid.get_width() - image_ball.get_width()); setup_balls(); options->request_repaint(); unsigned int time_last = CL_System::get_time(); while (!quit) { unsigned int time_now = CL_System::get_time(); float time_diff = (float) (time_now - time_last); time_last = time_now; wm.process(); wm.draw_windows(gc); int num_balls = options->num_balls; if (num_balls > max_balls) num_balls = max_balls; if (options->is_moveballs_set) move_balls(time_diff, num_balls); gc.set_map_mode(options->current_mapmode); const float grid_xpos = 10.0f; const float grid_ypos = 10.0f; if (options->current_mapmode == cl_user_projection) { CL_Sizef area_size(grid_width + (grid_xpos * 2.0f), grid_height + (grid_ypos * 2.0f)); set_user_projection(gc, area_size, options); } // Draw the grid image_grid.draw(gc, grid_xpos, grid_ypos); gc.flush_batcher(); // <--- Fix me, this should not be required for cl_user_projection for (int cnt=0; cnt<num_balls; cnt++) { image_ball.draw(gc, grid_xpos + balls[cnt].xpos, grid_ypos + balls[cnt].ypos); } gc.set_modelview(CL_Mat4f::identity()); gc.set_projection(CL_Mat4f::identity()); gc.set_map_mode(cl_map_2d_upper_left); window.flip(1); CL_KeepAlive::process(); } return 0; }