static void animation_done_cb (GstyleSlidein *self) { GstyleSlideinDirectionType animation_direction; g_assert (GSTYLE_IS_SLIDEIN (self)); if (self->is_opening) { animate_stop (self); animation_direction = self->direction_type; self->revealed = TRUE; gtk_grab_add (GTK_WIDGET (self)); gtk_event_box_set_above_child (GTK_EVENT_BOX (self), TRUE); gtk_widget_set_can_focus (self->overlay_child, TRUE); gtk_widget_grab_focus (self->overlay_child); } else if (self->is_closing) { animate_stop (self); animation_direction = self->direction_type_reverse; self->revealed = FALSE; gtk_event_box_set_above_child (GTK_EVENT_BOX (self), FALSE); } else g_assert_not_reached (); self->is_closing = self->is_opening = FALSE; self->offset = self->dst_offset; g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_REVEALED]); g_signal_emit (self, signals [REVEALED], 0, animation_direction, self->revealed); }
/// update the scene during animation playback void animate_update() { float dt = update_timer.elapsed(); if(fixed_dt) dt = clamp(1/30.0f,0.0f,animate_interval.max-draw_opts.time); else dt = clamp(dt,0.0f,animate_interval.max-draw_opts.time); if(dt > 0) { draw_opts.time += dt; scene_simulation_update(scene,dt); update_timer.start(); } else { if(draw_opts.time >= animate_interval.max) animate_stop(); } if(time_init_advance > 0.0f and draw_opts.time >= time_init_advance) { animate_stop(); time_init_advance = 0.0f; } }
/* src_offset and dst_offset need to be in [0.0, 1.0] range */ static gboolean animate (GstyleSlidein *self, gdouble target_offset) { GtkWidget *child; g_assert (GSTYLE_IS_SLIDEIN (self)); g_assert (0.0 <= target_offset && target_offset <= 1.0); child = gtk_bin_get_child (GTK_BIN (self)); if (child == NULL || self->overlay_child == NULL) return FALSE; animate_stop (self); if (!self->duration_set) self->duration = gstyle_animation_check_enable_animation () ? compute_duration (self) : 0; self->src_offset = self->offset; self->dst_offset = target_offset; gtk_widget_set_child_visible (child, TRUE); if (self->src_offset == self->dst_offset) return FALSE; if (self->src_offset < self->dst_offset) { self->is_opening = TRUE; g_signal_emit (self, signals [OPENING], 0); } else { self->is_closing = TRUE; g_signal_emit (self, signals [CLOSING], 0); } if (self->duration == 0) { self->offset = target_offset; animation_done_cb (self); gtk_widget_queue_resize (GTK_WIDGET (self)); } else if (!self->animation_handler_id) { self->animation_starttime = g_get_monotonic_time(); self->animation_handler_id = gtk_widget_add_tick_callback (GTK_WIDGET (self), animation_tick_cb, self, NULL); } return TRUE; }
/// keyboard event handler void keyboard(unsigned char c, int x, int y) { switch(c) { case 27: exit(0); break; case 'h': print_help(); break; case '1': draw_opts.faces = not draw_opts.faces; break; case '2': draw_opts.edges = not draw_opts.edges; break; case '3': draw_opts.lines = not draw_opts.lines; break; case '4': draw_opts.control = not draw_opts.control; break; case '$': draw_opts.control_no_depth = not draw_opts.control_no_depth; break; case '5': draw_opts.gizmos = not draw_opts.gizmos; break; case '7': draw_opts.cameralights = not draw_opts.cameralights; break; case '8': tesselation_level = max(-1,tesselation_level-1); init(); break; case '9': tesselation_level = min(88,tesselation_level+1); init(); break; case '0': tesselation_smooth = !tesselation_smooth; init(); break; case '`': draw_opts.doublesided = not draw_opts.doublesided; break; case ' ': if(animating) animate_stop(); else animate_start(); break; case '/': init(); break; case '?': animate_loop = !animate_loop; break; case ',': animate_step(false); break; case '.': animate_step(true); break; case 'j': hud = not hud; break; case 'f': frame(); break; case 'r': reload(); break; case 'i': screenshot(filename_image.c_str()); break; #ifdef AUTORELOAD case 'R': reload_auto = not reload_auto; break; #endif case '[': selection_element_next(false); break; case ']': selection_element_next(true); break; case '\\': selection_element_clear(); break; case '{': selection_subelement_next(false); break; case '}': selection_subelement_next(true); break; case '|': selection_subelement_clear(); break; case 'a': selection_move( - x3f * selecion_speed_keyboard_translate ); break; case 'd': selection_move( x3f * selecion_speed_keyboard_translate ); break; case 'w': selection_move( z3f * selecion_speed_keyboard_translate ); break; case 's': selection_move( - z3f * selecion_speed_keyboard_translate ); break; case 'q': selection_move( - y3f * selecion_speed_keyboard_translate ); break; case 'e': selection_move( y3f * selecion_speed_keyboard_translate ); break; case 'A': selection_rotate( - x3f * selecion_speed_keyboard_rotate ); break; case 'D': selection_rotate( x3f * selecion_speed_keyboard_rotate ); break; case 'W': selection_rotate( z3f * selecion_speed_keyboard_rotate ); break; case 'S': selection_rotate( - z3f * selecion_speed_keyboard_rotate ); break; case 'Q': selection_rotate( - y3f * selecion_speed_keyboard_rotate ); break; case 'E': selection_rotate( y3f * selecion_speed_keyboard_rotate ); break; default: break; } glutPostRedisplay(); }