From a5d67cad19eb7c181f1c5f511025a95be80e1aaf Mon Sep 17 00:00:00 2001 From: warren powers Date: Sat, 2 Jul 2011 16:16:50 +0000 Subject: [PATCH] initial commit. includes PhsyicsBox2dExtension --- AndEngine/.classpath | 7 + AndEngine/.hg/00changelog.i | Bin 0 -> 57 bytes AndEngine/.hg/branch | 1 + AndEngine/.hg/cache/branchheads | 19 + AndEngine/.hg/cache/tags | 6 + AndEngine/.hg/dirstate | Bin 0 -> 31518 bytes AndEngine/.hg/hgrc | 2 + AndEngine/.hg/requires | 4 + AndEngine/.hg/store/00changelog.d | Bin 0 -> 161157 bytes AndEngine/.hg/store/00changelog.i | Bin 0 -> 50240 bytes AndEngine/.hg/store/00manifest.d | Bin 0 -> 279750 bytes AndEngine/.hg/store/00manifest.i | Bin 0 -> 50240 bytes .../.hg/store/data/_android_manifest.xml.i | Bin 0 -> 1301 bytes .../export_jar_to_and_engine_examples.xml.i | Bin 0 -> 441 bytes ...ort_jar_to_and_engine_live_wallpaper.xml.i | Bin 0 -> 682 bytes ...ort_jar_to_and_engine_physics_box2_d.xml.i | Bin 0 -> 447 bytes .../export_jar_to_and_engine_playground.xml.i | Bin 0 -> 443 bytes .../ant/export_jar_to_box_face_stacker.xml.i | Bin 0 -> 517 bytes ...xport_jar_to_campfire_live_wallpaper.xml.i | Bin 0 -> 450 bytes ...port_jar_to_cigarette_live_wallpaper.xml.i | Bin 0 -> 450 bytes .../data/ant/export_jar_to_heli_taxi.xml.i | Bin 0 -> 508 bytes ...port_jar_to_heli_taxi_live_wallpaper.xml.i | Bin 0 -> 513 bytes .../ant/export_jar_to_heli_taxi_shared.xml.i | Bin 0 -> 511 bytes .../data/ant/export_jar_to_high_rise.xml.i | Bin 0 -> 440 bytes ...port_jar_to_lava_lamp_live_wallpaper.xml.i | Bin 0 -> 449 bytes .../data/ant/export_jar_to_super_droid.xml.i | Bin 0 -> 440 bytes ...export_jar_to_volcano_live_wallpaper.xml.i | Bin 0 -> 448 bytes AndEngine/.hg/store/data/build__hudson.xml.i | Bin 0 -> 491 bytes AndEngine/.hg/store/data/default.properties.i | Bin 0 -> 738 bytes .../.hg/store/data/export_jar_to_all.xml.i | Bin 0 -> 6698 bytes .../export_jar_to_and_engine_examples.xml.i | Bin 0 -> 1797 bytes ...ort_jar_to_and_engine_live_wallpaper.xml.i | Bin 0 -> 440 bytes .../store/data/export_jar_to_heli_taxi.xml.i | Bin 0 -> 510 bytes ...port_jar_to_heli_taxi_live_wallpaper.xml.i | Bin 0 -> 449 bytes .../data/export_jar_to_heli_taxi_shared.xml.i | Bin 0 -> 445 bytes .../store/data/export_jar_to_space_taxi.xml.i | Bin 0 -> 440 bytes .../.hg/store/data/ext/img/android.svg.i | Bin 0 -> 1641 bytes AndEngine/.hg/store/data/ext/img/badge.png.i | Bin 0 -> 13701 bytes AndEngine/.hg/store/data/ext/img/badge.svg.i | Bin 0 -> 3245 bytes .../.hg/store/data/ext/img/clapboard.png.i | Bin 0 -> 22696 bytes .../.hg/store/data/ext/img/clapboard.svg.i | Bin 0 -> 4272 bytes .../.hg/store/data/ext/img/favicon.png.i | Bin 0 -> 613 bytes .../.hg/store/data/ext/img/favicon.svg.i | Bin 0 -> 2566 bytes AndEngine/.hg/store/data/ext/img/icon.svg.i | Bin 0 -> 7952 bytes AndEngine/.hg/store/data/ext/img/index.html.i | Bin 0 -> 188 bytes AndEngine/.hg/store/data/ext/img/logo.png.i | Bin 0 -> 45970 bytes AndEngine/.hg/store/data/ext/img/logo.svg.i | Bin 0 -> 19882 bytes AndEngine/.hg/store/data/ext/img/logo2.png.i | Bin 0 -> 29310 bytes AndEngine/.hg/store/data/ext/img/logo3.png.i | Bin 0 -> 29886 bytes AndEngine/.hg/store/data/ext/img/logo4.png.i | Bin 0 -> 10218 bytes .../.hg/store/data/ext/img/logo__icon.svg.i | Bin 0 -> 9436 bytes AndEngine/.hg/store/data/ext/img/source.png.i | Bin 0 -> 23566 bytes AndEngine/.hg/store/data/ext/img/source.svg.i | Bin 0 -> 15663 bytes AndEngine/.hg/store/data/ext/img/splash.png.i | Bin 0 -> 25702 bytes AndEngine/.hg/store/data/ext/img/splash.svg.i | Bin 0 -> 3190 bytes AndEngine/.hg/store/data/hudson__build.xml.i | Bin 0 -> 599 bytes .../store/data/lib/lib_progress_monitor.jar.i | Bin 0 -> 2176 bytes AndEngine/.hg/store/data/push__buxs.bat.i | Bin 0 -> 114 bytes .../.hg/store/data/push__google__code.bat.i | Bin 0 -> 181 bytes .../andengine/audio/_base_audio_entity.java.i | Bin 0 -> 721 bytes .../audio/_base_audio_manager.java.i | Bin 0 -> 709 bytes .../andengine/audio/_i_audio_entity.java.i | Bin 0 -> 360 bytes .../andengine/audio/_i_audio_manager.java.i | Bin 0 -> 314 bytes .../andengine/audio/music/_music.java.i | Bin 0 -> 1396 bytes .../audio/music/_music_factory.java.i | Bin 0 -> 1611 bytes .../audio/music/_music_manager.java.i | Bin 0 -> 451 bytes .../andengine/audio/sound/_sound.java.i | Bin 0 -> 2254 bytes .../audio/sound/_sound_factory.java.i | Bin 0 -> 1899 bytes .../audio/sound/_sound_library.java.i | Bin 0 -> 338 bytes .../audio/sound/_sound_manager.java.i | Bin 0 -> 1825 bytes .../collision/_base_collision_checker.java.i | Bin 0 -> 2335 bytes .../collision/_collision_checker.java.i | Bin 0 -> 2172 bytes .../collision/_line_collision_checker.java.i | Bin 0 -> 648 bytes ...rectangular_shape_collision_checker.java.i | Bin 0 -> 3632 bytes .../collision/_shape_collision_checker.java.i | Bin 0 -> 4419 bytes .../_double_scene_split_screen_engine.java.i | Bin 0 -> 4314 bytes .../anddev/andengine/engine/_engine.java.i | Bin 0 -> 37478 bytes .../andengine/engine/_engine_hook.java.i | Bin 0 -> 542 bytes .../andengine/engine/_engine_options.java.i | Bin 0 -> 1640 bytes .../engine/_fixed_f_p_s_engine.java.i | Bin 0 -> 976 bytes .../engine/_fixed_step_engine.java.i | Bin 0 -> 1707 bytes .../engine/_i_scene_touch_listener.java.i | Bin 0 -> 315 bytes .../andengine/engine/_i_update_handler.java.i | Bin 0 -> 339 bytes .../engine/_limited_f_p_s_engine.java.i | Bin 0 -> 790 bytes .../_single_scene_split_screen_engine.java.i | Bin 0 -> 3792 bytes .../andengine/engine/_smooth_engine.java.i | Bin 0 -> 1180 bytes .../engine/_split_screen_engine.java.i | Bin 0 -> 2968 bytes .../_split_screen_engine_options.java.i | Bin 0 -> 555 bytes .../engine/_update_handler_list.java.i | Bin 0 -> 591 bytes .../engine/camera/_bound_camera.java.i | Bin 0 -> 2740 bytes .../andengine/engine/camera/_camera.java.i | Bin 0 -> 13691 bytes .../engine/camera/_camera_factory.java.i | Bin 0 -> 833 bytes .../engine/camera/_chase_camera.java.i | Bin 0 -> 2328 bytes .../engine/camera/_smooth_camera.java.i | Bin 0 -> 2614 bytes .../engine/camera/_smooth_chase_camera.java.i | Bin 0 -> 1514 bytes .../engine/camera/_zoom_camera.java.i | Bin 0 -> 3345 bytes .../andengine/engine/camera/hud/_h_u_d.java.i | Bin 0 -> 1512 bytes .../controls/_analog_on_screen_control.java.i | Bin 0 -> 3097 bytes .../controls/_base_on_screen_control.java.i | Bin 0 -> 7434 bytes .../_digital_on_screen_control.java.i | Bin 0 -> 1648 bytes .../andengine/engine/easying/_easing.java.i | Bin 0 -> 1289 bytes .../_base_entity_update_handler.java.i | Bin 0 -> 467 bytes .../engine/handler/_i_update_handler.java.i | Bin 0 -> 768 bytes .../handler/_update_handler_list.java.i | Bin 0 -> 1152 bytes .../collision/_collision_handler.java.i | Bin 0 -> 991 bytes .../collision/_i_collision_callback.java.i | Bin 0 -> 449 bytes .../handler/physics/_physics_handler.java.i | Bin 0 -> 1116 bytes .../handler/runnable/_runnable_handler.java.i | Bin 0 -> 1015 bytes .../handler/timer/_i_timer_callback.java.i | Bin 0 -> 346 bytes .../handler/timer/_timer_handler.java.i | Bin 0 -> 1895 bytes .../engine/options/_engine_options.java.i | Bin 0 -> 3279 bytes .../_fixed_f_p_s_engine_options.java.i | Bin 0 -> 635 bytes .../options/_fixed_step_engine_options.java.i | Bin 0 -> 895 bytes .../engine/options/_render_hints.java.i | Bin 0 -> 411 bytes .../engine/options/_render_options.java.i | Bin 0 -> 765 bytes .../_split_screen_engine_options.java.i | Bin 0 -> 2129 bytes .../engine/options/_touch_options.java.i | Bin 0 -> 466 bytes .../engine/options/_wake_lock_options.java.i | Bin 0 -> 776 bytes .../_base_resolution_policy.java.i | Bin 0 -> 538 bytes .../_fill_resolution_policy.java.i | Bin 0 -> 971 bytes .../_fixed_resolution_policy.java.i | Bin 0 -> 930 bytes .../_i_resolution_policy.java.i | Bin 0 -> 536 bytes .../_ratio_resolution_policy.java.i | Bin 0 -> 1466 bytes .../_relative_resolution_policy.java.i | Bin 0 -> 1212 bytes .../entity/_base_dynamic_entity.java.i | Bin 0 -> 2066 bytes .../andengine/entity/_base_entity.java.i | Bin 0 -> 3502 bytes .../entity/_base_static_entity.java.i | Bin 0 -> 1104 bytes .../andengine/entity/_camera_scene.java.i | Bin 0 -> 1312 bytes .../andengine/entity/_dynamic_entity.java.i | Bin 0 -> 6228 bytes .../anddev/andengine/entity/_entity.java.i | Bin 0 -> 13500 bytes .../andengine/entity/_f_p_s_counter.java.i | Bin 0 -> 3470 bytes .../andengine/entity/_frame_counter.java.i | Bin 0 -> 425 bytes .../entity/_frame_length_logger.java.i | Bin 0 -> 619 bytes .../andengine/entity/_horizontal_align.java.i | Bin 0 -> 338 bytes .../andengine/entity/_i_base_entity.java.i | Bin 0 -> 826 bytes .../andengine/entity/_i_dynamic_entity.java.i | Bin 0 -> 941 bytes .../anddev/andengine/entity/_i_entity.java.i | Bin 0 -> 6119 bytes .../entity/_i_on_scene_touch_listener.java.i | Bin 0 -> 293 bytes .../entity/_i_scene_touch_listener.java.i | Bin 0 -> 197 bytes .../andengine/entity/_i_static_entity.java.i | Bin 0 -> 628 bytes .../andengine/entity/_i_update_handler.java.i | Bin 0 -> 499 bytes .../org/anddev/andengine/entity/_layer.java.i | Bin 0 -> 3441 bytes .../org/anddev/andengine/entity/_scene.java.i | Bin 0 -> 9095 bytes .../andengine/entity/_scene_with_child.java.i | Bin 0 -> 1270 bytes .../andengine/entity/_screen_capture.java.i | Bin 0 -> 1598 bytes .../andengine/entity/_splash_scene.java.i | Bin 0 -> 1942 bytes .../andengine/entity/_static_entity.java.i | Bin 0 -> 4793 bytes .../entity/_update_handler_list.java.i | Bin 0 -> 849 bytes .../entity/background/_base_background.java.i | Bin 0 -> 342 bytes .../background/_fixed_color_background.java.i | Bin 0 -> 1023 bytes .../entity/group/_transformation_group.java.i | Bin 0 -> 1018 bytes .../collision/_collision_handler.java.i | Bin 0 -> 2675 bytes .../collision/_i_collision_callback.java.i | Bin 0 -> 842 bytes .../handler/runnable/_runnable_handler.java.i | Bin 0 -> 803 bytes .../handler/timer/_i_timer_callback.java.i | Bin 0 -> 481 bytes .../handler/timer/_timer_handler.java.i | Bin 0 -> 1066 bytes .../andengine/entity/layer/_base_layer.java.i | Bin 0 -> 1274 bytes .../layer/_dynamic_capacity_layer.java.i | Bin 0 -> 2708 bytes .../entity/layer/_fixed_capacity_layer.java.i | Bin 0 -> 3604 bytes .../andengine/entity/layer/_i_layer.java.i | Bin 0 -> 2212 bytes .../andengine/entity/layer/_layer.java.i | Bin 0 -> 1668 bytes .../entity/layer/_layer_sorter.java.i | Bin 0 -> 612 bytes .../entity/layer/_z_index_sorter.java.i | Bin 0 -> 739 bytes .../_i_t_m_x_tile_properties_listener.java.i | Bin 0 -> 370 bytes .../layer/tiled/tmx/_t_m_x_layer.java.i | Bin 0 -> 14192 bytes .../tiled/tmx/_t_m_x_layer_property.java.i | Bin 0 -> 494 bytes .../layer/tiled/tmx/_t_m_x_loader.java.i | Bin 0 -> 3327 bytes .../layer/tiled/tmx/_t_m_x_object.java.i | Bin 0 -> 1216 bytes .../tiled/tmx/_t_m_x_object_group.java.i | Bin 0 -> 1051 bytes .../tmx/_t_m_x_object_group_property.java.i | Bin 0 -> 391 bytes .../tiled/tmx/_t_m_x_object_property.java.i | Bin 0 -> 486 bytes .../layer/tiled/tmx/_t_m_x_parser.java.i | Bin 0 -> 6268 bytes .../layer/tiled/tmx/_t_m_x_properties.java.i | Bin 0 -> 901 bytes .../layer/tiled/tmx/_t_m_x_property.java.i | Bin 0 -> 927 bytes .../entity/layer/tiled/tmx/_t_m_x_tile.java.i | Bin 0 -> 1045 bytes .../tiled/tmx/_t_m_x_tile_property.java.i | Bin 0 -> 835 bytes .../layer/tiled/tmx/_t_m_x_tile_set.java.i | Bin 0 -> 6526 bytes .../layer/tiled/tmx/_t_m_x_tiled_map.java.i | Bin 0 -> 6593 bytes .../tmx/_t_m_x_tiled_map_property.java.i | Bin 0 -> 497 bytes .../layer/tiled/tmx/_t_s_x_loader.java.i | Bin 0 -> 914 bytes .../layer/tiled/tmx/_t_s_x_parser.java.i | Bin 0 -> 1044 bytes .../util/constants/_t_m_x_constants.java.i | Bin 0 -> 1882 bytes .../util/exception/_t_m_x_exception.java.i | Bin 0 -> 470 bytes .../exception/_t_m_x_load_exception.java.i | Bin 0 -> 595 bytes .../exception/_t_m_x_parse_exception.java.i | Bin 0 -> 626 bytes .../exception/_t_s_x_load_exception.java.i | Bin 0 -> 469 bytes .../exception/_t_s_x_parse_exception.java.i | Bin 0 -> 484 bytes .../entity/menu/_i_menu_animator.java.i | Bin 0 -> 453 bytes .../_i_on_menu_item_click_listener.java.i | Bin 0 -> 504 bytes .../_i_on_menu_item_clicker_listener.java.i | Bin 0 -> 368 bytes .../andengine/entity/menu/_menu_item.java.i | Bin 0 -> 878 bytes .../andengine/entity/menu/_menu_scene.java.i | Bin 0 -> 4225 bytes .../menu/animator/_alpha_menu_animator.java.i | Bin 0 -> 2897 bytes .../menu/animator/_base_menu_animator.java.i | Bin 0 -> 2058 bytes .../animator/_direct_menu_animator.java.i | Bin 0 -> 1297 bytes .../menu/animator/_slide_menu_animator.java.i | Bin 0 -> 2633 bytes .../entity/modifier/_alpha_modifier.java.i | Bin 0 -> 685 bytes .../entity/modifier/_color_modifier.java.i | Bin 0 -> 731 bytes .../entity/modifier/_delay_modifier.java.i | Bin 0 -> 585 bytes .../_double_value_span_shape_modifier.java.i | Bin 0 -> 614 bytes .../modifier/_duration_shape_modifier.java.i | Bin 0 -> 535 bytes .../entity/modifier/_entity_modifier.java.i | Bin 0 -> 504 bytes .../modifier/_entity_modifier_list.java.i | Bin 0 -> 626 bytes .../entity/modifier/_fade_in_modifier.java.i | Bin 0 -> 591 bytes .../entity/modifier/_fade_out_modifier.java.i | Bin 0 -> 590 bytes .../entity/modifier/_i_entity_modifier.java.i | Bin 0 -> 640 bytes .../modifier/_loop_entity_modifier.java.i | Bin 0 -> 621 bytes .../entity/modifier/_move_modifier.java.i | Bin 0 -> 705 bytes .../entity/modifier/_move_x_modifier.java.i | Bin 0 -> 696 bytes .../entity/modifier/_move_y_modifier.java.i | Bin 0 -> 697 bytes .../modifier/_parallel_entity_modifier.java.i | Bin 0 -> 576 bytes .../entity/modifier/_path_modifier.java.i | Bin 0 -> 2132 bytes .../modifier/_rotation_at_modifier.java.i | Bin 0 -> 728 bytes .../modifier/_rotation_by_modifier.java.i | Bin 0 -> 573 bytes .../entity/modifier/_rotation_modifier.java.i | Bin 0 -> 688 bytes .../entity/modifier/_scale_at_modifier.java.i | Bin 0 -> 795 bytes .../entity/modifier/_scale_modifier.java.i | Bin 0 -> 751 bytes .../modifier/_sequence_entity_modifier.java.i | Bin 0 -> 642 bytes ..._single_value_change_shape_modifier.java.i | Bin 0 -> 550 bytes .../_single_value_span_shape_modifier.java.i | Bin 0 -> 599 bytes .../_triple_value_span_shape_modifier.java.i | Bin 0 -> 607 bytes .../particle/_i_particle_initializer.java.i | Bin 0 -> 270 bytes .../particle/_i_particle_modifier.java.i | Bin 0 -> 526 bytes .../entity/particle/_particle.java.i | Bin 0 -> 2310 bytes .../entity/particle/_particle_engine.java.i | Bin 0 -> 1268 bytes .../entity/particle/_particle_system.java.i | Bin 0 -> 10204 bytes .../_base_circle_particle_emitter.java.i | Bin 0 -> 526 bytes .../emitter/_base_particle_emitter.java.i | Bin 0 -> 503 bytes .../_base_rectangle_particle_emitter.java.i | Bin 0 -> 550 bytes .../_circle_outline_particle_emitter.java.i | Bin 0 -> 843 bytes .../emitter/_circle_particle_emitter.java.i | Bin 0 -> 867 bytes .../emitter/_i_particle_emitter.java.i | Bin 0 -> 314 bytes .../emitter/_point_particle_emitter.java.i | Bin 0 -> 667 bytes ..._rectangle_outline_particle_emitter.java.i | Bin 0 -> 789 bytes .../_rectangle_particle_emitter.java.i | Bin 0 -> 813 bytes .../_acceleration_initializer.java.i | Bin 0 -> 721 bytes .../initializer/_alpha_initializer.java.i | Bin 0 -> 533 bytes .../_base_double_value_initializer.java.i | Bin 0 -> 688 bytes .../_base_single_value_initializer.java.i | Bin 0 -> 659 bytes .../_base_triple_value_initializer.java.i | Bin 0 -> 707 bytes .../initializer/_color_initializer.java.i | Bin 0 -> 583 bytes .../initializer/_gravity_initializer.java.i | Bin 0 -> 486 bytes .../_i_particle_initializer.java.i | Bin 0 -> 357 bytes .../initializer/_rotation_initializer.java.i | Bin 0 -> 601 bytes .../initializer/_velocity_initializer.java.i | Bin 0 -> 716 bytes .../modifier/_acceleration_initializer.java.i | Bin 0 -> 1270 bytes .../modifier/_acceleration_modifier.java.i | Bin 0 -> 1595 bytes .../modifier/_alpha_initializer.java.i | Bin 0 -> 595 bytes .../particle/modifier/_alpha_modifier.java.i | Bin 0 -> 1904 bytes .../_base_double_value_initializer.java.i | Bin 0 -> 688 bytes .../_base_double_value_span_modifier.java.i | Bin 0 -> 1017 bytes .../modifier/_base_from_to_modifier.java.i | Bin 0 -> 670 bytes .../modifier/_base_initializer.java.i | Bin 0 -> 582 bytes .../_base_pair_initialize_modifier.java.i | Bin 0 -> 659 bytes .../modifier/_base_pair_initializer.java.i | Bin 0 -> 680 bytes .../_base_single_value_initializer.java.i | Bin 0 -> 751 bytes .../_base_single_value_span_modifier.java.i | Bin 0 -> 1090 bytes .../_base_triple_value_initializer.java.i | Bin 0 -> 629 bytes .../_base_triple_value_span_modifier.java.i | Bin 0 -> 1046 bytes .../modifier/_color_initializer.java.i | Bin 0 -> 707 bytes .../particle/modifier/_color_modifier.java.i | Bin 0 -> 696 bytes .../particle/modifier/_expire_modifier.java.i | Bin 0 -> 1704 bytes .../modifier/_gravity_initializer.java.i | Bin 0 -> 487 bytes .../modifier/_gravity_modifier.java.i | Bin 0 -> 402 bytes .../modifier/_i_particle_initializer.java.i | Bin 0 -> 351 bytes .../modifier/_i_particle_modifier.java.i | Bin 0 -> 514 bytes .../_off_camera_expire_modifier.java.i | Bin 0 -> 751 bytes .../modifier/_rotate_initialize.java.i | Bin 0 -> 533 bytes .../modifier/_rotate_initializer.java.i | Bin 0 -> 749 bytes .../particle/modifier/_rotate_modifier.java.i | Bin 0 -> 803 bytes .../modifier/_rotation_initializer.java.i | Bin 0 -> 717 bytes .../modifier/_rotation_modifier.java.i | Bin 0 -> 552 bytes .../particle/modifier/_scale_modifier.java.i | Bin 0 -> 1522 bytes .../modifier/_velocity_initializer.java.i | Bin 0 -> 1022 bytes .../modifier/_velocity_modifier.java.i | Bin 0 -> 1553 bytes .../entity/primitive/_base_rectangle.java.i | Bin 0 -> 1066 bytes .../andengine/entity/primitive/_line.java.i | Bin 0 -> 5383 bytes .../entity/primitive/_rectangle.java.i | Bin 0 -> 759 bytes .../primitive/_rectangular_shape.java.i | Bin 0 -> 3224 bytes .../entity/primitives/_base_rectangle.java.i | Bin 0 -> 891 bytes .../andengine/entity/primitives/_line.java.i | Bin 0 -> 4853 bytes .../entity/primitives/_rectangle.java.i | Bin 0 -> 2845 bytes .../primitives/_rectangular_shape.java.i | Bin 0 -> 4113 bytes .../andengine/entity/primitives/_shape.java.i | Bin 0 -> 4631 bytes .../entity/scene/_camera_scene.java.i | Bin 0 -> 2936 bytes .../andengine/entity/scene/_scene.java.i | Bin 0 -> 18825 bytes .../entity/scene/_splash_scene.java.i | Bin 0 -> 2199 bytes .../_auto_parallax_background.java.i | Bin 0 -> 478 bytes .../scene/background/_base_background.java.i | Bin 0 -> 761 bytes .../scene/background/_color_background.java.i | Bin 0 -> 2087 bytes .../background/_entity_background.java.i | Bin 0 -> 807 bytes .../scene/background/_i_background.java.i | Bin 0 -> 1373 bytes .../background/_parallax_background.java.i | Bin 0 -> 1893 bytes .../_repeating_sprite_background.java.i | Bin 0 -> 1967 bytes .../background/_sprite_background.java.i | Bin 0 -> 971 bytes .../modifier/_color_modifier.java.i | Bin 0 -> 1117 bytes .../modifier/_i_background_modifier.java.i | Bin 0 -> 348 bytes .../modifier/_loop_background_modifier.java.i | Bin 0 -> 851 bytes .../_parallel_background_modifier.java.i | Bin 0 -> 796 bytes .../_sequence_background_modifier.java.i | Bin 0 -> 890 bytes .../entity/scene/menu/_menu_scene.java.i | Bin 0 -> 3753 bytes .../menu/animator/_alpha_menu_animator.java.i | Bin 0 -> 2148 bytes .../menu/animator/_base_menu_animator.java.i | Bin 0 -> 1416 bytes .../animator/_direct_menu_animator.java.i | Bin 0 -> 1006 bytes .../menu/animator/_i_menu_animator.java.i | Bin 0 -> 449 bytes .../menu/animator/_slide_menu_animator.java.i | Bin 0 -> 2086 bytes .../item/_animated_sprite_menu_item.java.i | Bin 0 -> 697 bytes .../menu/item/_color_text_menu_item.java.i | Bin 0 -> 690 bytes .../menu/item/_colored_text_menu_item.java.i | Bin 0 -> 987 bytes .../scene/menu/item/_i_menu_item.java.i | Bin 0 -> 384 bytes .../menu/item/_scale_text_menu_item.java.i | Bin 0 -> 529 bytes .../scene/menu/item/_sprite_menu_item.java.i | Bin 0 -> 771 bytes .../scene/menu/item/_text_menu_item.java.i | Bin 0 -> 753 bytes .../_base_menu_item_decorator.java.i | Bin 0 -> 6459 bytes .../_color_menu_item_decorator.java.i | Bin 0 -> 674 bytes .../_scale_menu_item_decorator.java.i | Bin 0 -> 592 bytes .../entity/scene/popup/_popup_scene.java.i | Bin 0 -> 640 bytes .../scene/popup/_text_popup_scene.java.i | Bin 0 -> 2201 bytes .../transition/_base_transition_scene.java.i | Bin 0 -> 540 bytes .../transition/_fade_transition_scene.java.i | Bin 0 -> 852 bytes .../entity/shape/_base_renderer.java.i | Bin 0 -> 1090 bytes .../andengine/entity/shape/_g_l_shape.java.i | Bin 0 -> 862 bytes .../entity/shape/_i_modifier_listener.java.i | Bin 0 -> 354 bytes .../andengine/entity/shape/_i_renderer.java.i | Bin 0 -> 738 bytes .../andengine/entity/shape/_i_shape.java.i | Bin 0 -> 3666 bytes .../entity/shape/_i_shape_modifier.java.i | Bin 0 -> 865 bytes .../entity/shape/_rectangle_renderer.java.i | Bin 0 -> 474 bytes .../entity/shape/_rectangular_shape.java.i | Bin 0 -> 4087 bytes .../andengine/entity/shape/_shape.java.i | Bin 0 -> 14844 bytes .../shape/modifier/_alpha_modifier.java.i | Bin 0 -> 2862 bytes .../modifier/_base_change_modifier.java.i | Bin 0 -> 596 bytes .../_base_double_value_span_modifier.java.i | Bin 0 -> 2356 bytes .../modifier/_base_from_to_modifier.java.i | Bin 0 -> 1125 bytes .../shape/modifier/_base_modifier.java.i | Bin 0 -> 2509 bytes .../_base_pair_from_to_modifier.java.i | Bin 0 -> 1162 bytes .../_base_shape_duration_modifier.java.i | Bin 0 -> 852 bytes .../modifier/_base_shape_modifier.java.i | Bin 0 -> 747 bytes .../_base_single_value_change_modifier.java.i | Bin 0 -> 1220 bytes .../_base_single_value_span_modifier.java.i | Bin 0 -> 2527 bytes .../_base_triple_value_span_modifier.java.i | Bin 0 -> 2022 bytes .../shape/modifier/_color_modifier.java.i | Bin 0 -> 2785 bytes .../shape/modifier/_delay_modifier.java.i | Bin 0 -> 1696 bytes .../_double_value_span_shape_modifier.java.i | Bin 0 -> 1016 bytes .../modifier/_duration_shape_modifier.java.i | Bin 0 -> 712 bytes .../shape/modifier/_fade_in_modifier.java.i | Bin 0 -> 1803 bytes .../shape/modifier/_fade_out_modifier.java.i | Bin 0 -> 1809 bytes .../shape/modifier/_i_shape_modifier.java.i | Bin 0 -> 1073 bytes .../_i_shape_modifier_listener.java.i | Bin 0 -> 202 bytes .../shape/modifier/_loop_modifier.java.i | Bin 0 -> 2018 bytes .../modifier/_loop_shape_modifier.java.i | Bin 0 -> 755 bytes .../shape/modifier/_move_modifier.java.i | Bin 0 -> 2935 bytes .../shape/modifier/_move_x_modifier.java.i | Bin 0 -> 1141 bytes .../shape/modifier/_move_y_modifier.java.i | Bin 0 -> 1142 bytes .../shape/modifier/_parallel_modifier.java.i | Bin 0 -> 3024 bytes .../modifier/_parallel_shape_modifier.java.i | Bin 0 -> 698 bytes .../shape/modifier/_path_modifier.java.i | Bin 0 -> 6666 bytes .../shape/modifier/_rotate_by_modifier.java.i | Bin 0 -> 1295 bytes .../shape/modifier/_rotate_modifier.java.i | Bin 0 -> 1384 bytes .../modifier/_rotation_at_modifier.java.i | Bin 0 -> 2482 bytes .../modifier/_rotation_by_modifier.java.i | Bin 0 -> 1054 bytes .../shape/modifier/_rotation_modifier.java.i | Bin 0 -> 2427 bytes .../shape/modifier/_scale_at_modifier.java.i | Bin 0 -> 2618 bytes .../shape/modifier/_scale_modifier.java.i | Bin 0 -> 3947 bytes .../shape/modifier/_sequence_modifier.java.i | Bin 0 -> 4328 bytes .../modifier/_sequence_shape_modifier.java.i | Bin 0 -> 792 bytes .../shape/modifier/_shape_modifier.java.i | Bin 0 -> 657 bytes ..._single_value_change_shape_modifier.java.i | Bin 0 -> 745 bytes .../_single_value_span_shape_modifier.java.i | Bin 0 -> 992 bytes .../_triple_value_span_shape_modifier.java.i | Bin 0 -> 1005 bytes .../shape/modifier/ease/_ease_back_in.java.i | Bin 0 -> 829 bytes .../modifier/ease/_ease_back_in_out.java.i | Bin 0 -> 930 bytes .../shape/modifier/ease/_ease_back_out.java.i | Bin 0 -> 844 bytes .../modifier/ease/_ease_bounce_in.java.i | Bin 0 -> 817 bytes .../modifier/ease/_ease_bounce_in_out.java.i | Bin 0 -> 898 bytes .../modifier/ease/_ease_bounce_out.java.i | Bin 0 -> 978 bytes .../modifier/ease/_ease_circular_in.java.i | Bin 0 -> 916 bytes .../ease/_ease_circular_in_out.java.i | Bin 0 -> 919 bytes .../modifier/ease/_ease_circular_out.java.i | Bin 0 -> 908 bytes .../shape/modifier/ease/_ease_cubic_in.java.i | Bin 0 -> 765 bytes .../modifier/ease/_ease_cubic_in_out.java.i | Bin 0 -> 843 bytes .../modifier/ease/_ease_cubic_out.java.i | Bin 0 -> 789 bytes .../modifier/ease/_ease_elastic_in.java.i | Bin 0 -> 1161 bytes .../modifier/ease/_ease_elastic_in_out.java.i | Bin 0 -> 1240 bytes .../modifier/ease/_ease_elastic_out.java.i | Bin 0 -> 1156 bytes .../modifier/ease/_ease_exponential_in.java.i | Bin 0 -> 850 bytes .../ease/_ease_exponential_in_out.java.i | Bin 0 -> 958 bytes .../ease/_ease_exponential_out.java.i | Bin 0 -> 844 bytes .../shape/modifier/ease/_ease_linear.java.i | Bin 0 -> 749 bytes .../shape/modifier/ease/_ease_quad_in.java.i | Bin 0 -> 761 bytes .../modifier/ease/_ease_quad_in_out.java.i | Bin 0 -> 854 bytes .../shape/modifier/ease/_ease_quad_out.java.i | Bin 0 -> 772 bytes .../shape/modifier/ease/_ease_quart_in.java.i | Bin 0 -> 780 bytes .../modifier/ease/_ease_quart_in_out.java.i | Bin 0 -> 849 bytes .../modifier/ease/_ease_quart_out.java.i | Bin 0 -> 792 bytes .../shape/modifier/ease/_ease_quint_in.java.i | Bin 0 -> 765 bytes .../modifier/ease/_ease_quint_in_out.java.i | Bin 0 -> 845 bytes .../modifier/ease/_ease_quint_out.java.i | Bin 0 -> 791 bytes .../shape/modifier/ease/_ease_sine_in.java.i | Bin 0 -> 916 bytes .../modifier/ease/_ease_sine_in_out.java.i | Bin 0 -> 944 bytes .../shape/modifier/ease/_ease_sine_out.java.i | Bin 0 -> 903 bytes .../modifier/ease/_ease_strong_in.java.i | Bin 0 -> 767 bytes .../modifier/ease/_ease_strong_in_out.java.i | Bin 0 -> 857 bytes .../modifier/ease/_ease_strong_out.java.i | Bin 0 -> 791 bytes .../modifier/ease/_i_ease_function.java.i | Bin 0 -> 659 bytes .../util/_shape_modifier_utils.java.i | Bin 0 -> 809 bytes .../entity/shape/util/_shape_utils.java.i | Bin 0 -> 614 bytes .../entity/sprite/_animated_sprite.java.i | Bin 0 -> 9782 bytes .../sprite/_animated_sprite_renderer.java.i | Bin 0 -> 1610 bytes .../entity/sprite/_base_sprite.java.i | Bin 0 -> 10321 bytes .../sprite/_i_modification_listener.java.i | Bin 0 -> 292 bytes .../entity/sprite/_i_modifier_listener.java.i | Bin 0 -> 454 bytes .../entity/sprite/_i_sprite_modifier.java.i | Bin 0 -> 769 bytes .../andengine/entity/sprite/_sprite.java.i | Bin 0 -> 3894 bytes .../entity/sprite/_sprite_renderer.java.i | Bin 0 -> 728 bytes .../entity/sprite/_tiled_sprite.java.i | Bin 0 -> 2489 bytes .../sprite/_tiled_sprite_renderer.java.i | Bin 0 -> 811 bytes .../sprite/modifier/_alpha_modifier.java.i | Bin 0 -> 696 bytes .../modifier/_base_from_to_modifier.java.i | Bin 0 -> 883 bytes .../sprite/modifier/_base_modifier.java.i | Bin 0 -> 2249 bytes .../_base_pair_from_to_modifier.java.i | Bin 0 -> 869 bytes .../sprite/modifier/_delay_modifier.java.i | Bin 0 -> 486 bytes .../sprite/modifier/_move_modifier.java.i | Bin 0 -> 527 bytes .../modifier/_rotate_by_modifier.java.i | Bin 0 -> 879 bytes .../sprite/modifier/_rotate_modifier.java.i | Bin 0 -> 1931 bytes .../sprite/modifier/_scale_modifier.java.i | Bin 0 -> 697 bytes .../sprite/modifier/_sequence_modifier.java.i | Bin 0 -> 1652 bytes .../entity/text/_changeable_text.java.i | Bin 0 -> 1972 bytes .../anddev/andengine/entity/text/_text.java.i | Bin 0 -> 9579 bytes .../entity/text/_text_renderer.java.i | Bin 0 -> 1658 bytes .../andengine/entity/text/_ticker_text.java.i | Bin 0 -> 1881 bytes .../entity/util/_average_f_p_s_counter.java.i | Bin 0 -> 687 bytes .../entity/util/_f_p_s_counter.java.i | Bin 0 -> 1644 bytes .../entity/util/_f_p_s_logger.java.i | Bin 0 -> 2131 bytes .../entity/util/_frame_count_crasher.java.i | Bin 0 -> 821 bytes .../entity/util/_frame_counter.java.i | Bin 0 -> 766 bytes .../entity/util/_frame_length_logger.java.i | Bin 0 -> 954 bytes .../util/_i_on_area_touch_listener.java.i | Bin 0 -> 203 bytes .../util/_i_on_scene_touch_listener.java.i | Bin 0 -> 309 bytes .../entity/util/_i_touch_area.java.i | Bin 0 -> 178 bytes .../entity/util/_screen_capture.java.i | Bin 0 -> 7407 bytes .../entity/util/_screen_grabber.java.i | Bin 0 -> 2105 bytes .../andengine/game/_base_game_activity.java.i | Bin 0 -> 1326 bytes .../touch/_i_on_area_touch_listener.java.i | Bin 0 -> 309 bytes .../touch/_i_on_scene_touch_listener.java.i | Bin 0 -> 561 bytes .../input/touch/_i_touch_area.java.i | Bin 0 -> 352 bytes .../andengine/input/touch/_touch_event.java.i | Bin 0 -> 2770 bytes .../controller/_base_touch_controller.java.i | Bin 0 -> 2974 bytes .../controller/_i_touch_controller.java.i | Bin 0 -> 1249 bytes .../controller/_multi_touch_controler.java.i | Bin 0 -> 919 bytes .../controller/_single_touch_controler.java.i | Bin 0 -> 1476 bytes .../touch/detector/_base_detector.java.i | Bin 0 -> 562 bytes .../touch/detector/_click_detector.java.i | Bin 0 -> 2558 bytes .../touch/detector/_hold_detector.java.i | Bin 0 -> 3657 bytes .../touch/detector/_scroll_detector.java.i | Bin 0 -> 2139 bytes .../detector/_surface_gesture_detector.java.i | Bin 0 -> 1878 bytes .../detector/_surface_scroll_detector.java.i | Bin 0 -> 481 bytes .../andengine/level/_level_loader.java.i | Bin 0 -> 1461 bytes .../andengine/level/_level_parser.java.i | Bin 0 -> 651 bytes .../util/constants/_level_constants.java.i | Bin 0 -> 338 bytes .../andengine/opengl/_base_buffer.java.i | Bin 0 -> 1349 bytes .../andengine/opengl/_g_l_helper.java.i | Bin 0 -> 9847 bytes .../andengine/opengl/_i_drawable.java.i | Bin 0 -> 308 bytes .../andengine/opengl/_i_render_handler.java.i | Bin 0 -> 338 bytes .../andengine/opengl/_i_renderable.java.i | Bin 0 -> 707 bytes .../opengl/buffer/_base_buffer.java.i | Bin 0 -> 968 bytes .../opengl/buffer/_buffer_object.java.i | Bin 0 -> 4180 bytes .../buffer/_buffer_object_manager.java.i | Bin 0 -> 3936 bytes .../anddev/andengine/opengl/font/_font.java.i | Bin 0 -> 8491 bytes .../opengl/font/_font_factory.java.i | Bin 0 -> 1900 bytes .../opengl/font/_font_library.java.i | Bin 0 -> 845 bytes .../opengl/font/_font_manager.java.i | Bin 0 -> 2228 bytes .../andengine/opengl/font/_letter.java.i | Bin 0 -> 934 bytes .../anddev/andengine/opengl/font/_size.java.i | Bin 0 -> 896 bytes .../andengine/opengl/font/_stroke_font.java.i | Bin 0 -> 1100 bytes .../anddev/andengine/opengl/text/_font.java.i | Bin 0 -> 3190 bytes .../andengine/opengl/text/_glyph.java.i | Bin 0 -> 467 bytes .../andengine/opengl/text/_letter.java.i | Bin 0 -> 700 bytes .../andengine/opengl/text/_rectangle.java.i | Bin 0 -> 419 bytes .../anddev/andengine/opengl/text/_size.java.i | Bin 0 -> 619 bytes .../opengl/texture/_asset_texture.java.i | Bin 0 -> 982 bytes .../opengl/texture/_buildable_texture.java.i | Bin 0 -> 2701 bytes .../opengl/texture/_font_manager.java.i | Bin 0 -> 541 bytes .../texture/_i_texture_state_listener.java.i | Bin 0 -> 509 bytes .../opengl/texture/_packable_texture.java.i | Bin 0 -> 1409 bytes .../opengl/texture/_resource_texture.java.i | Bin 0 -> 413 bytes .../andengine/opengl/texture/_texture.java.i | Bin 0 -> 13609 bytes .../opengl/texture/_texture_atlas.java.i | Bin 0 -> 2410 bytes .../opengl/texture/_texture_buffer.java.i | Bin 0 -> 1013 bytes .../opengl/texture/_texture_factory.java.i | Bin 0 -> 1349 bytes .../opengl/texture/_texture_manager.java.i | Bin 0 -> 6792 bytes .../opengl/texture/_texture_options.java.i | Bin 0 -> 2568 bytes .../opengl/texture/_texture_region.java.i | Bin 0 -> 2073 bytes .../texture/_texture_region_factory.java.i | Bin 0 -> 1025 bytes .../opengl/texture/_tiled_texture.java.i | Bin 0 -> 989 bytes .../texture/_tiled_texture_region.java.i | Bin 0 -> 1461 bytes .../buffer/_base_texture_buffer.java.i | Bin 0 -> 607 bytes .../buffer/_base_texture_region_buffer.java.i | Bin 0 -> 2680 bytes .../buffer/_text_texture_buffer.java.i | Bin 0 -> 1737 bytes .../texture/buffer/_texture_buffer.java.i | Bin 0 -> 818 bytes .../buffer/_texture_region_buffer.java.i | Bin 0 -> 840 bytes .../buffer/_tiled_texture_buffer.java.i | Bin 0 -> 529 bytes .../_tiled_texture_region_buffer.java.i | Bin 0 -> 1089 bytes .../_black_pawn_texture_builder.java.i | Bin 0 -> 4721 bytes .../texture/builder/_i_texture_builder.java.i | Bin 0 -> 936 bytes .../texture/factory/_texture_factory.java.i | Bin 0 -> 532 bytes .../factory/_texture_region_factory.java.i | Bin 0 -> 728 bytes .../region/_base_texture_region.java.i | Bin 0 -> 1188 bytes .../texture/region/_texture_region.java.i | Bin 0 -> 2845 bytes .../region/_texture_region_factory.java.i | Bin 0 -> 3622 bytes .../region/_texture_region_library.java.i | Bin 0 -> 1270 bytes .../region/_tiled_texture_region.java.i | Bin 0 -> 2438 bytes .../buffer/_base_texture_region_buffer.java.i | Bin 0 -> 3417 bytes .../buffer/_texture_region_buffer.java.i | Bin 0 -> 814 bytes .../_tiled_texture_region_buffer.java.i | Bin 0 -> 795 bytes .../source/_asset_texture_source.java.i | Bin 0 -> 2813 bytes ..._color_key_texture_source_decorator.java.i | Bin 0 -> 782 bytes .../_empty_bitmap_texture_source.java.i | Bin 0 -> 665 bytes .../source/_file_texture_source.java.i | Bin 0 -> 1127 bytes .../texture/source/_i_texture_source.java.i | Bin 0 -> 666 bytes .../_outline_texture_source_decorator.java.i | Bin 0 -> 644 bytes .../source/_resource_texture_source.java.i | Bin 0 -> 2417 bytes .../source/_texture_source_decorator.java.i | Bin 0 -> 835 bytes ...base_shape_texture_source_decorator.java.i | Bin 0 -> 1878 bytes .../_base_texture_source_decorator.java.i | Bin 0 -> 2220 bytes ...ircle_fill_texture_source_decorator.java.i | Bin 0 -> 694 bytes ...le_outline_texture_source_decorator.java.i | Bin 0 -> 699 bytes ..._color_key_texture_source_decorator.java.i | Bin 0 -> 2140 bytes .../_fill_texture_source_decorator.java.i | Bin 0 -> 1655 bytes ...dient_fill_texture_source_decorator.java.i | Bin 0 -> 2661 bytes .../_outline_texture_source_decorator.java.i | Bin 0 -> 2060 bytes ...dient_fill_texture_source_decorator.java.i | Bin 0 -> 1661 bytes ...angle_fill_texture_source_decorator.java.i | Bin 0 -> 564 bytes .../_texture_source_decorator.java.i | Bin 0 -> 740 bytes ..._arc_texture_source_decorator_shape.java.i | Bin 0 -> 839 bytes ...rcle_texture_source_decorator_shape.java.i | Bin 0 -> 684 bytes ...ipse_texture_source_decorator_shape.java.i | Bin 0 -> 675 bytes .../_i_texture_source_decorator_shape.java.i | Bin 0 -> 349 bytes ...ngle_texture_source_decorator_shape.java.i | Bin 0 -> 581 bytes ...wn_texture_source_packing_algorithm.java.i | Bin 0 -> 2288 bytes ..._i_texture_source_packing_algorithm.java.i | Bin 0 -> 758 bytes .../opengl/util/_fast_float_buffer.java.i | Bin 0 -> 3020 bytes .../andengine/opengl/util/_g_l_helper.java.i | Bin 0 -> 7651 bytes .../opengl/vertex/_line_vertex_buffer.java.i | Bin 0 -> 2251 bytes .../vertex/_rectangle_vertex_buffer.java.i | Bin 0 -> 3776 bytes .../opengl/vertex/_text_vertex_buffer.java.i | Bin 0 -> 3404 bytes .../opengl/vertex/_vertex_buffer.java.i | Bin 0 -> 1773 bytes .../opengl/view/_base_config_chooser.java.i | Bin 0 -> 744 bytes .../view/_component_size_chooser.java.i | Bin 0 -> 987 bytes .../opengl/view/_e_g_l_config_chooser.java.i | Bin 0 -> 697 bytes .../opengl/view/_g_l_surface_view.java.i | Bin 0 -> 23249 bytes .../andengine/opengl/view/_g_l_wrapper.java.i | Bin 0 -> 770 bytes .../andengine/opengl/view/_log_writer.java.i | Bin 0 -> 594 bytes .../opengl/view/_render_surface_view.java.i | Bin 0 -> 8129 bytes .../view/_simple_e_g_l_config_chooser.java.i | Bin 0 -> 634 bytes .../opengl/view/camera/_camera.java.i | Bin 0 -> 2026 bytes .../opengl/view/camera/_chase_camera.java.i | Bin 0 -> 680 bytes .../opengl/view/camera/_smooth_camera.java.i | Bin 0 -> 850 bytes .../physics/_base_physics_body.java.i | Bin 0 -> 928 bytes .../physics/_dynamic_physics_body.java.i | Bin 0 -> 1530 bytes .../andengine/physics/_i_physics_space.java.i | Bin 0 -> 924 bytes .../andengine/physics/_physics_data.java.i | Bin 0 -> 424 bytes .../andengine/physics/_physics_shape.java.i | Bin 0 -> 697 bytes .../physics/_static_physics_body.java.i | Bin 0 -> 967 bytes .../collision/_collision_checker.java.i | Bin 0 -> 1666 bytes .../physics/collision/_intersector.java.i | Bin 0 -> 1490 bytes .../andengine/sensor/_base_sensor_data.java.i | Bin 0 -> 813 bytes .../andengine/sensor/_sensor_delay.java.i | Bin 0 -> 466 bytes .../accelerometer/_accelerometer_data.java.i | Bin 0 -> 1280 bytes .../_accelerometer_listener.java.i | Bin 0 -> 279 bytes .../_accelerometer_sensor_options.java.i | Bin 0 -> 394 bytes .../_i_accelerometer_listener.java.i | Bin 0 -> 437 bytes .../location/_i_location_listener.java.i | Bin 0 -> 409 bytes .../location/_location_provider_status.java.i | Bin 0 -> 450 bytes .../location/_location_sensor_options.java.i | Bin 0 -> 953 bytes .../_i_orientation_listener.java.i | Bin 0 -> 352 bytes .../orientation/_orientation_data.java.i | Bin 0 -> 1857 bytes .../_orientation_sensor_options.java.i | Bin 0 -> 393 bytes .../andengine/ui/_i_game_interface.java.i | Bin 0 -> 1051 bytes .../ui/activity/_base_activity.java.i | Bin 0 -> 3938 bytes .../ui/activity/_base_game_activity.java.i | Bin 0 -> 12001 bytes .../ui/activity/_base_splash_activity.java.i | Bin 0 -> 5051 bytes .../ui/activity/_layout_game_activity.java.i | Bin 0 -> 574 bytes .../_generic_input_dialog_builder.java.i | Bin 0 -> 1854 bytes .../_string_input_dialog_builder.java.i | Bin 0 -> 717 bytes .../dialog/_string_input_dialoguilder.java.i | Bin 0 -> 533 bytes .../andengine/util/_activity_utils.java.i | Bin 0 -> 2956 bytes .../anddev/andengine/util/_array_utils.java.i | Bin 0 -> 502 bytes .../andengine/util/_async_callable.java.i | Bin 0 -> 972 bytes .../org/anddev/andengine/util/_base64.java.i | Bin 0 -> 12376 bytes .../util/_base64_input_stream.java.i | Bin 0 -> 2797 bytes .../anddev/andengine/util/_beta_utils.java.i | Bin 0 -> 1154 bytes .../anddev/andengine/util/_callable.java.i | Bin 0 -> 694 bytes .../anddev/andengine/util/_callback.java.i | Bin 0 -> 338 bytes .../anddev/andengine/util/_color_utils.java.i | Bin 0 -> 954 bytes .../anddev/andengine/util/_data_utils.java.i | Bin 0 -> 356 bytes .../org/anddev/andengine/util/_debug.java.i | Bin 0 -> 2744 bytes .../anddev/andengine/util/_file_utils.java.i | Bin 0 -> 2843 bytes .../andengine/util/_hashtable_utils.java.i | Bin 0 -> 457 bytes .../andengine/util/_horizontal_align.java.i | Bin 0 -> 516 bytes .../andengine/util/_i_entity_matcher.java.i | Bin 0 -> 356 bytes .../anddev/andengine/util/_i_matcher.java.i | Bin 0 -> 263 bytes .../org/anddev/andengine/util/_library.java.i | Bin 0 -> 943 bytes .../anddev/andengine/util/_list_utils.java.i | Bin 0 -> 546 bytes .../anddev/andengine/util/_math_utils.java.i | Bin 0 -> 7103 bytes .../anddev/andengine/util/_multi_key.java.i | Bin 0 -> 861 bytes .../andengine/util/_multi_key_hash_map.java.i | Bin 0 -> 740 bytes .../andengine/util/_parameter_callable.java.i | Bin 0 -> 259 bytes .../org/anddev/andengine/util/_path.java.i | Bin 0 -> 1364 bytes .../util/_probability_generator.java.i | Bin 0 -> 735 bytes .../andengine/util/_progress_callable.java.i | Bin 0 -> 609 bytes .../anddev/andengine/util/_s_a_x_utils.java.i | Bin 0 -> 3258 bytes .../andengine/util/_simple_preferences.java.i | Bin 0 -> 1759 bytes .../anddev/andengine/util/_smart_list.java.i | Bin 0 -> 966 bytes .../andengine/util/_socket_utils.java.i | Bin 0 -> 651 bytes .../andengine/util/_stream_utils.java.i | Bin 0 -> 2517 bytes .../andengine/util/_string_utils.java.i | Bin 0 -> 1893 bytes .../andengine/util/_system_utils.java.i | Bin 0 -> 3112 bytes .../anddev/andengine/util/_time_utils.java.i | Bin 0 -> 630 bytes .../andengine/util/_transformation.java.i | Bin 0 -> 3210 bytes .../util/_transformation_pool.java.i | Bin 0 -> 496 bytes .../anddev/andengine/util/_user_task.java.i | Bin 0 -> 4725 bytes .../andengine/util/_vertical_align.java.i | Bin 0 -> 437 bytes .../anddev/andengine/util/_view_utils.java.i | Bin 0 -> 668 bytes .../_rectangle_vertex_buffer_cache.java.i | Bin 0 -> 690 bytes .../util/constants/_color_constants.java.i | Bin 0 -> 364 bytes .../util/constants/_constants.java.i | Bin 0 -> 481 bytes .../util/constants/_m_i_m_e_types.java.i | Bin 0 -> 296 bytes .../util/constants/_math_constants.java.i | Bin 0 -> 550 bytes .../util/constants/_time_constants.java.i | Bin 0 -> 1019 bytes .../_level_stats_d_b_connector.java.i | Bin 0 -> 1876 bytes .../_base_double_value_span_modifier.java.i | Bin 0 -> 1132 bytes .../modifier/_base_duration_modifier.java.i | Bin 0 -> 1031 bytes .../util/modifier/_base_modifier.java.i | Bin 0 -> 835 bytes .../_base_single_value_change_modifier.java.i | Bin 0 -> 780 bytes .../_base_single_value_span_modifier.java.i | Bin 0 -> 1130 bytes .../_base_triple_value_span_modifier.java.i | Bin 0 -> 1081 bytes .../util/modifier/_i_modifier.java.i | Bin 0 -> 593 bytes .../util/modifier/_loop_modifier.java.i | Bin 0 -> 1242 bytes .../util/modifier/_modifier_list.java.i | Bin 0 -> 1069 bytes .../util/modifier/_parallel_modifier.java.i | Bin 0 -> 1298 bytes .../util/modifier/_sequence_modifier.java.i | Bin 0 -> 1736 bytes .../util/modifier/ease/_ease_back_in.java.i | Bin 0 -> 613 bytes .../modifier/ease/_ease_back_in_out.java.i | Bin 0 -> 674 bytes .../util/modifier/ease/_ease_back_out.java.i | Bin 0 -> 617 bytes .../util/modifier/ease/_ease_bounce_in.java.i | Bin 0 -> 605 bytes .../modifier/ease/_ease_bounce_in_out.java.i | Bin 0 -> 641 bytes .../modifier/ease/_ease_bounce_out.java.i | Bin 0 -> 679 bytes .../modifier/ease/_ease_circular_in.java.i | Bin 0 -> 633 bytes .../ease/_ease_circular_in_out.java.i | Bin 0 -> 670 bytes .../modifier/ease/_ease_circular_out.java.i | Bin 0 -> 626 bytes .../util/modifier/ease/_ease_cubic_in.java.i | Bin 0 -> 596 bytes .../modifier/ease/_ease_cubic_in_out.java.i | Bin 0 -> 624 bytes .../util/modifier/ease/_ease_cubic_out.java.i | Bin 0 -> 602 bytes .../modifier/ease/_ease_elastic_in.java.i | Bin 0 -> 1041 bytes .../modifier/ease/_ease_elastic_in_out.java.i | Bin 0 -> 1115 bytes .../modifier/ease/_ease_elastic_out.java.i | Bin 0 -> 1032 bytes .../modifier/ease/_ease_exponential_in.java.i | Bin 0 -> 632 bytes .../ease/_ease_exponential_in_out.java.i | Bin 0 -> 672 bytes .../ease/_ease_exponential_out.java.i | Bin 0 -> 631 bytes .../util/modifier/ease/_ease_linear.java.i | Bin 0 -> 583 bytes .../util/modifier/ease/_ease_quad_in.java.i | Bin 0 -> 592 bytes .../modifier/ease/_ease_quad_in_out.java.i | Bin 0 -> 630 bytes .../util/modifier/ease/_ease_quad_out.java.i | Bin 0 -> 595 bytes .../util/modifier/ease/_ease_quart_in.java.i | Bin 0 -> 599 bytes .../modifier/ease/_ease_quart_in_out.java.i | Bin 0 -> 627 bytes .../util/modifier/ease/_ease_quart_out.java.i | Bin 0 -> 606 bytes .../util/modifier/ease/_ease_quint_in.java.i | Bin 0 -> 594 bytes .../modifier/ease/_ease_quint_in_out.java.i | Bin 0 -> 624 bytes .../util/modifier/ease/_ease_quint_out.java.i | Bin 0 -> 604 bytes .../util/modifier/ease/_ease_sine_in.java.i | Bin 0 -> 815 bytes .../modifier/ease/_ease_sine_in_out.java.i | Bin 0 -> 643 bytes .../util/modifier/ease/_ease_sine_out.java.i | Bin 0 -> 810 bytes .../util/modifier/ease/_ease_strong_in.java.i | Bin 0 -> 595 bytes .../modifier/ease/_ease_strong_in_out.java.i | Bin 0 -> 625 bytes .../modifier/ease/_ease_strong_out.java.i | Bin 0 -> 605 bytes .../modifier/ease/_i_ease_function.java.i | Bin 0 -> 433 bytes .../util/modifier/util/_modifier_utils.java.i | Bin 0 -> 551 bytes .../andengine/util/path/_direction.java.i | Bin 0 -> 557 bytes .../andengine/util/path/_i_path_finder.java.i | Bin 0 -> 305 bytes .../andengine/util/path/_i_tiled_map.java.i | Bin 0 -> 362 bytes .../anddev/andengine/util/path/_path.java.i | Bin 0 -> 978 bytes .../path/astar/_a_star_path_finder.java.i | Bin 0 -> 2041 bytes .../path/astar/_euclidean_heuristic.java.i | Bin 0 -> 501 bytes .../path/astar/_i_a_star_heuristic.java.i | Bin 0 -> 341 bytes .../path/astar/_manhattan_heuristic.java.i | Bin 0 -> 465 bytes .../util/path/astar/_null_heuristic.java.i | Bin 0 -> 435 bytes .../_entity_detach_runnable_pool_item.java.i | Bin 0 -> 919 bytes ...detach_runnable_pool_update_handler.java.i | Bin 0 -> 476 bytes .../_entity_remove_runnable_pool_item.java.i | Bin 0 -> 924 bytes ...remove_runnable_pool_update_handler.java.i | Bin 0 -> 396 bytes .../andengine/util/pool/_generic_pool.java.i | Bin 0 -> 2498 bytes .../andengine/util/pool/_multi_pool.java.i | Bin 0 -> 519 bytes .../anddev/andengine/util/pool/_pool.java.i | Bin 0 -> 2441 bytes .../andengine/util/pool/_pool_item.java.i | Bin 0 -> 1042 bytes .../util/pool/_pool_update_handler.java.i | Bin 0 -> 1865 bytes .../util/pool/_runnable_pool_item.java.i | Bin 0 -> 334 bytes .../pool/_runnable_pool_update_handler.java.i | Bin 0 -> 661 bytes .../util/progress/_i_progress_listener.java.i | Bin 0 -> 323 bytes .../util/progress/_progress_callable.java.i | Bin 0 -> 421 bytes .../util/progress/_progress_monitor.java.i | Bin 0 -> 945 bytes .../util/sort/_insertion_sorter.java.i | Bin 0 -> 1027 bytes .../anddev/andengine/util/sort/_sorter.java.i | Bin 0 -> 874 bytes .../andengine/util/_string_utils_test.java.i | Bin 0 -> 635 bytes .../data/uml/andengine__classdiagram.png.i | Bin 0 -> 32951 bytes .../data/uml/andengine__classdiagram.ucls.i | Bin 0 -> 11039 bytes AndEngine/.hg/store/data/~2eclasspath.i | Bin 0 -> 946 bytes AndEngine/.hg/store/data/~2ehgignore.i | Bin 0 -> 275 bytes AndEngine/.hg/store/data/~2eproject.i | Bin 0 -> 324 bytes ...557b574af419ce9da084d7cb2edd96c8167e414d.i | Bin 0 -> 623 bytes ...ca23493c2bf9765f3a9663ef116bd36864da9289.i | Bin 0 -> 776 bytes AndEngine/.hg/store/fncache | 698 +++++ AndEngine/.hg/store/undo | Bin 0 -> 49553 bytes AndEngine/.hg/undo.branch | 1 + AndEngine/.hg/undo.desc | 3 + AndEngine/.hg/undo.dirstate | 0 AndEngine/.hgignore | 5 + AndEngine/.project | 33 + AndEngine/AndroidManifest.xml | 10 + AndEngine/default.properties | 14 + AndEngine/exportJarToAll.xml | 85 + AndEngine/ext/img/android.svg | 32 + AndEngine/ext/img/badge.png | Bin 0 -> 13844 bytes AndEngine/ext/img/badge.svg | 296 ++ AndEngine/ext/img/clapboard.png | Bin 0 -> 23581 bytes AndEngine/ext/img/clapboard.svg | 547 ++++ AndEngine/ext/img/favicon.png | Bin 0 -> 548 bytes AndEngine/ext/img/favicon.svg | 199 ++ AndEngine/ext/img/icon.svg | 404 +++ AndEngine/ext/img/logo.png | Bin 0 -> 36664 bytes AndEngine/ext/img/logo.svg | 2318 ++++++++++++++ AndEngine/ext/img/logo_icon.svg | 305 ++ AndEngine/ext/img/source.png | Bin 0 -> 23613 bytes AndEngine/ext/img/source.svg | 2730 +++++++++++++++++ AndEngine/ext/img/splash.png | Bin 0 -> 26705 bytes AndEngine/ext/img/splash.svg | 271 ++ AndEngine/jni/Android.mk | 101 + AndEngine/jni/Box2D/Android.mk | 53 + AndEngine/jni/Box2D/Body.cpp | 637 ++++ AndEngine/jni/Box2D/Body.h | 365 +++ AndEngine/jni/Box2D/Box2D.h | 62 + AndEngine/jni/Box2D/CircleShape.cpp | 56 + AndEngine/jni/Box2D/CircleShape.h | 52 + .../Box2D/Collision/Shapes/b2CircleShape.cpp | 89 + .../Box2D/Collision/Shapes/b2CircleShape.h | 87 + .../Box2D/Collision/Shapes/b2PolygonShape.cpp | 434 +++ .../Box2D/Collision/Shapes/b2PolygonShape.h | 131 + .../jni/Box2D/Collision/Shapes/b2Shape.h | 95 + .../jni/Box2D/Collision/b2BroadPhase.cpp | 116 + AndEngine/jni/Box2D/Collision/b2BroadPhase.h | 264 ++ .../jni/Box2D/Collision/b2CollideCircle.cpp | 154 + .../jni/Box2D/Collision/b2CollidePolygon.cpp | 306 ++ AndEngine/jni/Box2D/Collision/b2Collision.cpp | 250 ++ AndEngine/jni/Box2D/Collision/b2Collision.h | 240 ++ AndEngine/jni/Box2D/Collision/b2Distance.cpp | 571 ++++ AndEngine/jni/Box2D/Collision/b2Distance.h | 141 + .../jni/Box2D/Collision/b2DynamicTree.cpp | 365 +++ AndEngine/jni/Box2D/Collision/b2DynamicTree.h | 286 ++ .../jni/Box2D/Collision/b2TimeOfImpact.cpp | 483 +++ .../jni/Box2D/Collision/b2TimeOfImpact.h | 59 + .../jni/Box2D/Common/b2BlockAllocator.cpp | 205 ++ AndEngine/jni/Box2D/Common/b2BlockAllocator.h | 59 + AndEngine/jni/Box2D/Common/b2Math.cpp | 55 + AndEngine/jni/Box2D/Common/b2Math.h | 623 ++++ AndEngine/jni/Box2D/Common/b2Settings.cpp | 33 + AndEngine/jni/Box2D/Common/b2Settings.h | 151 + .../jni/Box2D/Common/b2StackAllocator.cpp | 83 + AndEngine/jni/Box2D/Common/b2StackAllocator.h | 60 + AndEngine/jni/Box2D/Contact.cpp | 105 + AndEngine/jni/Box2D/Contact.h | 76 + AndEngine/jni/Box2D/DistanceJoint.cpp | 89 + AndEngine/jni/Box2D/DistanceJoint.h | 77 + .../Dynamics/Contacts/b2CircleContact.cpp | 52 + .../Box2D/Dynamics/Contacts/b2CircleContact.h | 38 + .../jni/Box2D/Dynamics/Contacts/b2Contact.cpp | 226 ++ .../jni/Box2D/Dynamics/Contacts/b2Contact.h | 242 ++ .../Dynamics/Contacts/b2ContactSolver.cpp | 623 ++++ .../Box2D/Dynamics/Contacts/b2ContactSolver.h | 78 + .../Contacts/b2PolygonAndCircleContact.cpp | 52 + .../Contacts/b2PolygonAndCircleContact.h | 38 + .../Dynamics/Contacts/b2PolygonContact.cpp | 52 + .../Dynamics/Contacts/b2PolygonContact.h | 38 + .../Box2D/Dynamics/Contacts/b2TOISolver.cpp | 231 ++ .../jni/Box2D/Dynamics/Contacts/b2TOISolver.h | 51 + .../Box2D/Dynamics/Joints/b2DistanceJoint.cpp | 211 ++ .../Box2D/Dynamics/Joints/b2DistanceJoint.h | 140 + .../Box2D/Dynamics/Joints/b2FrictionJoint.cpp | 229 ++ .../Box2D/Dynamics/Joints/b2FrictionJoint.h | 99 + .../jni/Box2D/Dynamics/Joints/b2GearJoint.cpp | 259 ++ .../jni/Box2D/Dynamics/Joints/b2GearJoint.h | 111 + .../jni/Box2D/Dynamics/Joints/b2Joint.cpp | 186 ++ AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.h | 226 ++ .../jni/Box2D/Dynamics/Joints/b2LineJoint.cpp | 591 ++++ .../jni/Box2D/Dynamics/Joints/b2LineJoint.h | 170 + .../Box2D/Dynamics/Joints/b2MouseJoint.cpp | 198 ++ .../jni/Box2D/Dynamics/Joints/b2MouseJoint.h | 114 + .../Dynamics/Joints/b2PrismaticJoint.cpp | 586 ++++ .../Box2D/Dynamics/Joints/b2PrismaticJoint.h | 175 ++ .../Box2D/Dynamics/Joints/b2PulleyJoint.cpp | 427 +++ .../jni/Box2D/Dynamics/Joints/b2PulleyJoint.h | 148 + .../Box2D/Dynamics/Joints/b2RevoluteJoint.cpp | 478 +++ .../Box2D/Dynamics/Joints/b2RevoluteJoint.h | 174 ++ .../jni/Box2D/Dynamics/Joints/b2WeldJoint.cpp | 219 ++ .../jni/Box2D/Dynamics/Joints/b2WeldJoint.h | 82 + AndEngine/jni/Box2D/Dynamics/b2Body.cpp | 470 +++ AndEngine/jni/Box2D/Dynamics/b2Body.h | 802 +++++ .../jni/Box2D/Dynamics/b2ContactManager.cpp | 266 ++ .../jni/Box2D/Dynamics/b2ContactManager.h | 52 + AndEngine/jni/Box2D/Dynamics/b2Fixture.cpp | 163 + AndEngine/jni/Box2D/Dynamics/b2Fixture.h | 326 ++ AndEngine/jni/Box2D/Dynamics/b2Island.cpp | 374 +++ AndEngine/jni/Box2D/Dynamics/b2Island.h | 105 + AndEngine/jni/Box2D/Dynamics/b2TimeStep.h | 35 + AndEngine/jni/Box2D/Dynamics/b2World.cpp | 1076 +++++++ AndEngine/jni/Box2D/Dynamics/b2World.h | 285 ++ .../jni/Box2D/Dynamics/b2WorldCallbacks.cpp | 61 + .../jni/Box2D/Dynamics/b2WorldCallbacks.h | 217 ++ AndEngine/jni/Box2D/Fixture.cpp | 185 ++ AndEngine/jni/Box2D/Fixture.h | 117 + AndEngine/jni/Box2D/FrictionJoint.cpp | 65 + AndEngine/jni/Box2D/FrictionJoint.h | 60 + AndEngine/jni/Box2D/GearJoint.cpp | 41 + AndEngine/jni/Box2D/GearJoint.h | 44 + AndEngine/jni/Box2D/Joint.cpp | 127 + AndEngine/jni/Box2D/Joint.h | 92 + AndEngine/jni/Box2D/LineJoint.cpp | 185 ++ AndEngine/jni/Box2D/LineJoint.h | 125 + AndEngine/jni/Box2D/MouseJoint.cpp | 116 + AndEngine/jni/Box2D/MouseJoint.h | 92 + AndEngine/jni/Box2D/PolygonShape.cpp | 113 + AndEngine/jni/Box2D/PolygonShape.h | 69 + AndEngine/jni/Box2D/PrismaticJoint.cpp | 173 ++ AndEngine/jni/Box2D/PrismaticJoint.h | 132 + AndEngine/jni/Box2D/PulleyJoint.cpp | 83 + AndEngine/jni/Box2D/PulleyJoint.h | 68 + AndEngine/jni/Box2D/RevoluteJoint.cpp | 173 ++ AndEngine/jni/Box2D/RevoluteJoint.h | 132 + AndEngine/jni/Box2D/Shape.cpp | 63 + AndEngine/jni/Box2D/Shape.h | 56 + AndEngine/jni/Box2D/World.cpp | 659 ++++ AndEngine/jni/Box2D/World.h | 260 ++ AndEngine/jni/build.bat | 6 + AndEngine/jni/build.sh | 2 + .../libandenginephysicsbox2dextension.so | Bin 0 -> 260857 bytes AndEngine/push_google_code.bat | 2 + .../src/com/badlogic/gdx/math/Vector2.java | 233 ++ .../com/badlogic/gdx/physics/box2d/Body.java | 613 ++++ .../badlogic/gdx/physics/box2d/BodyDef.java | 98 + .../gdx/physics/box2d/CircleShape.java | 64 + .../badlogic/gdx/physics/box2d/Contact.java | 102 + .../gdx/physics/box2d/ContactFilter.java | 24 + .../gdx/physics/box2d/ContactListener.java | 26 + .../physics/box2d/DestructionListener.java | 18 + .../badlogic/gdx/physics/box2d/Filter.java | 37 + .../badlogic/gdx/physics/box2d/Fixture.java | 216 ++ .../gdx/physics/box2d/FixtureDef.java | 44 + .../com/badlogic/gdx/physics/box2d/Joint.java | 143 + .../badlogic/gdx/physics/box2d/JointDef.java | 45 + .../badlogic/gdx/physics/box2d/JointEdge.java | 29 + .../badlogic/gdx/physics/box2d/MassData.java | 32 + .../gdx/physics/box2d/PolygonShape.java | 109 + .../gdx/physics/box2d/QueryCallback.java | 25 + .../com/badlogic/gdx/physics/box2d/Shape.java | 93 + .../badlogic/gdx/physics/box2d/Transform.java | 91 + .../com/badlogic/gdx/physics/box2d/World.java | 508 +++ .../gdx/physics/box2d/WorldManifold.java | 50 + .../physics/box2d/joints/DistanceJoint.java | 81 + .../box2d/joints/DistanceJointDef.java | 66 + .../physics/box2d/joints/FrictionJoint.java | 62 + .../box2d/joints/FrictionJointDef.java | 58 + .../gdx/physics/box2d/joints/GearJoint.java | 48 + .../physics/box2d/joints/GearJointDef.java | 43 + .../gdx/physics/box2d/joints/LineJoint.java | 153 + .../physics/box2d/joints/LineJointDef.java | 86 + .../gdx/physics/box2d/joints/MouseJoint.java | 108 + .../physics/box2d/joints/MouseJointDef.java | 47 + .../physics/box2d/joints/PrismaticJoint.java | 146 + .../box2d/joints/PrismaticJointDef.java | 94 + .../gdx/physics/box2d/joints/PulleyJoint.java | 83 + .../physics/box2d/joints/PulleyJointDef.java | 96 + .../physics/box2d/joints/RevoluteJoint.java | 147 + .../box2d/joints/RevoluteJointDef.java | 87 + .../gdx/physics/box2d/joints/WeldJoint.java | 27 + .../physics/box2d/joints/WeldJointDef.java | 43 + .../com/badlogic/gdx/utils/LongHashMap.java | 216 ++ .../andengine/audio/BaseAudioEntity.java | 86 + .../andengine/audio/BaseAudioManager.java | 74 + .../anddev/andengine/audio/IAudioEntity.java | 33 + .../anddev/andengine/audio/IAudioManager.java | 22 + .../anddev/andengine/audio/music/Music.java | 114 + .../andengine/audio/music/MusicFactory.java | 91 + .../andengine/audio/music/MusicManager.java | 41 + .../anddev/andengine/audio/sound/Sound.java | 123 + .../andengine/audio/sound/SoundFactory.java | 81 + .../andengine/audio/sound/SoundLibrary.java | 37 + .../andengine/audio/sound/SoundManager.java | 63 + .../collision/BaseCollisionChecker.java | 112 + .../collision/LineCollisionChecker.java | 40 + .../RectangularShapeCollisionChecker.java | 79 + .../collision/ShapeCollisionChecker.java | 108 + .../engine/DoubleSceneSplitScreenEngine.java | 170 + .../org/anddev/andengine/engine/Engine.java | 715 +++++ .../andengine/engine/FixedStepEngine.java | 60 + .../andengine/engine/LimitedFPSEngine.java | 63 + .../engine/SingleSceneSplitScreenEngine.java | 123 + .../andengine/engine/camera/BoundCamera.java | 164 + .../andengine/engine/camera/Camera.java | 364 +++ .../engine/camera/CameraFactory.java | 52 + .../andengine/engine/camera/SmoothCamera.java | 147 + .../andengine/engine/camera/ZoomCamera.java | 147 + .../andengine/engine/camera/hud/HUD.java | 54 + .../hud/controls/AnalogOnScreenControl.java | 103 + .../hud/controls/BaseOnScreenControl.java | 215 ++ .../hud/controls/DigitalOnScreenControl.java | 67 + .../handler/BaseEntityUpdateHandler.java | 55 + .../engine/handler/IUpdateHandler.java | 36 + .../engine/handler/UpdateHandlerList.java | 63 + .../handler/collision/CollisionHandler.java | 86 + .../handler/collision/ICollisionCallback.java | 24 + .../handler/physics/PhysicsHandler.java | 160 + .../handler/runnable/RunnableHandler.java | 60 + .../engine/handler/timer/ITimerCallback.java | 17 + .../engine/handler/timer/TimerHandler.java | 102 + .../engine/options/EngineOptions.java | 129 + .../engine/options/RenderOptions.java | 57 + .../engine/options/TouchOptions.java | 57 + .../engine/options/WakeLockOptions.java | 60 + .../BaseResolutionPolicy.java | 46 + .../FillResolutionPolicy.java | 49 + .../FixedResolutionPolicy.java | 50 + .../resolutionpolicy/IResolutionPolicy.java | 19 + .../RatioResolutionPolicy.java | 72 + .../RelativeResolutionPolicy.java | 60 + .../org/anddev/andengine/entity/Entity.java | 794 +++++ .../org/anddev/andengine/entity/IEntity.java | 171 ++ .../anddev/andengine/entity/layer/Layer.java | 45 + .../andengine/entity/layer/ZIndexSorter.java | 73 + .../entity/layer/tiled/tmx/TMXLayer.java | 321 ++ .../layer/tiled/tmx/TMXLayerProperty.java | 41 + .../entity/layer/tiled/tmx/TMXLoader.java | 118 + .../entity/layer/tiled/tmx/TMXObject.java | 88 + .../layer/tiled/tmx/TMXObjectGroup.java | 81 + .../tiled/tmx/TMXObjectGroupProperty.java | 41 + .../layer/tiled/tmx/TMXObjectProperty.java | 41 + .../entity/layer/tiled/tmx/TMXParser.java | 217 ++ .../entity/layer/tiled/tmx/TMXProperties.java | 51 + .../entity/layer/tiled/tmx/TMXProperty.java | 59 + .../entity/layer/tiled/tmx/TMXTile.java | 107 + .../layer/tiled/tmx/TMXTileProperty.java | 41 + .../entity/layer/tiled/tmx/TMXTileSet.java | 177 ++ .../entity/layer/tiled/tmx/TMXTiledMap.java | 198 ++ .../layer/tiled/tmx/TMXTiledMapProperty.java | 41 + .../entity/layer/tiled/tmx/TSXLoader.java | 92 + .../entity/layer/tiled/tmx/TSXParser.java | 115 + .../tmx/util/constants/TMXConstants.java | 81 + .../tmx/util/exception/TMXException.java | 53 + .../tmx/util/exception/TMXLoadException.java | 53 + .../tmx/util/exception/TMXParseException.java | 55 + .../tmx/util/exception/TSXLoadException.java | 53 + .../tmx/util/exception/TSXParseException.java | 55 + .../entity/modifier/AlphaModifier.java | 73 + .../entity/modifier/ColorModifier.java | 73 + .../entity/modifier/DelayModifier.java | 64 + .../DoubleValueSpanShapeModifier.java | 59 + .../modifier/DurationShapeModifier.java | 54 + .../entity/modifier/EntityModifier.java | 50 + .../entity/modifier/EntityModifierList.java | 48 + .../entity/modifier/FadeInModifier.java | 63 + .../entity/modifier/FadeOutModifier.java | 63 + .../entity/modifier/IEntityModifier.java | 43 + .../entity/modifier/LoopEntityModifier.java | 73 + .../entity/modifier/MoveModifier.java | 73 + .../entity/modifier/MoveXModifier.java | 73 + .../entity/modifier/MoveYModifier.java | 73 + .../modifier/ParallelEntityModifier.java | 55 + .../entity/modifier/PathModifier.java | 316 ++ .../entity/modifier/RotationAtModifier.java | 83 + .../entity/modifier/RotationByModifier.java | 55 + .../entity/modifier/RotationModifier.java | 73 + .../entity/modifier/ScaleAtModifier.java | 93 + .../entity/modifier/ScaleModifier.java | 89 + .../modifier/SequenceEntityModifier.java | 69 + .../SingleValueChangeShapeModifier.java | 50 + .../SingleValueSpanShapeModifier.java | 59 + .../TripleValueSpanShapeModifier.java | 51 + .../andengine/entity/particle/Particle.java | 101 + .../entity/particle/ParticleSystem.java | 258 ++ .../emitter/BaseCircleParticleEmitter.java | 75 + .../particle/emitter/BaseParticleEmitter.java | 74 + .../emitter/BaseRectangleParticleEmitter.java | 69 + .../emitter/CircleOutlineParticleEmitter.java | 58 + .../emitter/CircleParticleEmitter.java | 58 + .../particle/emitter/IParticleEmitter.java | 19 + .../emitter/PointParticleEmitter.java | 48 + .../RectangleOutlineParticleEmitter.java | 50 + .../emitter/RectangleParticleEmitter.java | 50 + .../initializer/AccelerationInitializer.java | 97 + .../initializer/AlphaInitializer.java | 51 + .../BaseDoubleValueInitializer.java | 63 + .../BaseSingleValueInitializer.java | 62 + .../BaseTripleValueInitializer.java | 63 + .../initializer/ColorInitializer.java | 51 + .../initializer/GravityInitializer.java | 41 + .../initializer/IParticleInitializer.java | 19 + .../initializer/RotationInitializer.java | 68 + .../initializer/VelocityInitializer.java | 97 + .../particle/modifier/AlphaModifier.java | 51 + .../modifier/BaseDoubleValueSpanModifier.java | 71 + .../modifier/BaseSingleValueSpanModifier.java | 81 + .../modifier/BaseTripleValueSpanModifier.java | 71 + .../particle/modifier/ColorModifier.java | 51 + .../particle/modifier/ExpireModifier.java | 79 + .../particle/modifier/IParticleModifier.java | 20 + .../modifier/OffCameraExpireModifier.java | 61 + .../particle/modifier/RotationModifier.java | 51 + .../particle/modifier/ScaleModifier.java | 55 + .../entity/primitive/BaseRectangle.java | 59 + .../andengine/entity/primitive/Line.java | 229 ++ .../andengine/entity/primitive/Rectangle.java | 55 + .../andengine/entity/scene/CameraScene.java | 125 + .../anddev/andengine/entity/scene/Scene.java | 485 +++ .../andengine/entity/scene/SplashScene.java | 57 + .../background/AutoParallaxBackground.java | 51 + .../scene/background/BaseBackground.java | 67 + .../scene/background/ColorBackground.java | 127 + .../scene/background/EntityBackground.java | 57 + .../entity/scene/background/IBackground.java | 26 + .../scene/background/ParallaxBackground.java | 142 + .../background/RepeatingSpriteBackground.java | 84 + .../scene/background/SpriteBackground.java | 45 + .../background/modifier/ColorModifier.java | 74 + .../modifier/IBackgroundModifier.java | 32 + .../modifier/LoopBackgroundModifier.java | 73 + .../modifier/ParallelBackgroundModifier.java | 55 + .../modifier/SequenceBackgroundModifier.java | 69 + .../entity/scene/menu/MenuScene.java | 206 ++ .../menu/animator/AlphaMenuAnimator.java | 124 + .../scene/menu/animator/BaseMenuAnimator.java | 105 + .../menu/animator/DirectMenuAnimator.java | 95 + .../scene/menu/animator/IMenuAnimator.java | 24 + .../menu/animator/SlideMenuAnimator.java | 130 + .../menu/item/AnimatedSpriteMenuItem.java | 64 + .../entity/scene/menu/item/IMenuItem.java | 21 + .../scene/menu/item/SpriteMenuItem.java | 64 + .../entity/scene/menu/item/TextMenuItem.java | 64 + .../item/decorator/BaseMenuItemDecorator.java | 507 +++ .../decorator/ColorMenuItemDecorator.java | 77 + .../decorator/ScaleMenuItemDecorator.java | 68 + .../entity/scene/popup/PopupScene.java | 63 + .../entity/scene/popup/TextPopupScene.java | 73 + .../anddev/andengine/entity/shape/IShape.java | 34 + .../entity/shape/RectangularShape.java | 169 + .../anddev/andengine/entity/shape/Shape.java | 145 + .../entity/sprite/AnimatedSprite.java | 256 ++ .../andengine/entity/sprite/BaseSprite.java | 89 + .../andengine/entity/sprite/Sprite.java | 59 + .../andengine/entity/sprite/TiledSprite.java | 75 + .../andengine/entity/text/ChangeableText.java | 90 + .../anddev/andengine/entity/text/Text.java | 179 ++ .../andengine/entity/text/TickerText.java | 107 + .../entity/util/AverageFPSCounter.java | 64 + .../andengine/entity/util/FPSCounter.java | 57 + .../andengine/entity/util/FPSLogger.java | 79 + .../entity/util/FrameCountCrasher.java | 69 + .../andengine/entity/util/FrameCounter.java | 53 + .../andengine/entity/util/ScreenCapture.java | 121 + .../andengine/entity/util/ScreenGrabber.java | 132 + .../physics/box2d/FixedStepPhysicsWorld.java | 89 + .../physics/box2d/PhysicsConnector.java | 123 + .../box2d/PhysicsConnectorManager.java | 86 + .../physics/box2d/PhysicsFactory.java | 260 ++ .../extension/physics/box2d/PhysicsWorld.java | 228 ++ .../physics/box2d/util/Vector2Pool.java | 62 + .../util/constants/PhysicsConstants.java | 17 + .../box2d/util/hull/BaseHullAlgorithm.java | 64 + .../physics/box2d/util/hull/GrahamScan.java | 113 + .../box2d/util/hull/IHullAlgorithm.java | 19 + .../physics/box2d/util/hull/JarvisMarch.java | 78 + .../physics/box2d/util/hull/QuickHull.java | 117 + .../physics/box2d/util/hull/Vector2Line.java | 45 + .../physics/box2d/util/hull/Vector2Util.java | 71 + .../EarClippingTriangulator.java | 273 ++ .../triangulation/ITriangulationAlgoritm.java | 24 + .../andengine/input/touch/TouchEvent.java | 144 + .../touch/controller/BaseTouchController.java | 134 + .../touch/controller/ITouchController.java | 35 + .../controller/SingleTouchControler.java | 46 + .../input/touch/detector/BaseDetector.java | 64 + .../input/touch/detector/ClickDetector.java | 95 + .../input/touch/detector/HoldDetector.java | 189 ++ .../input/touch/detector/ScrollDetector.java | 117 + .../detector/SurfaceGestureDetector.java | 195 ++ .../touch/detector/SurfaceScrollDetector.java | 55 + .../anddev/andengine/level/LevelLoader.java | 143 + .../anddev/andengine/level/LevelParser.java | 59 + .../level/util/constants/LevelConstants.java | 22 + .../anddev/andengine/opengl/IDrawable.java | 22 + .../andengine/opengl/buffer/BufferObject.java | 120 + .../opengl/buffer/BufferObjectManager.java | 151 + .../anddev/andengine/opengl/font/Font.java | 226 ++ .../andengine/opengl/font/FontFactory.java | 77 + .../andengine/opengl/font/FontLibrary.java | 57 + .../andengine/opengl/font/FontManager.java | 80 + .../anddev/andengine/opengl/font/Letter.java | 84 + .../anddev/andengine/opengl/font/Size.java | 68 + .../andengine/opengl/font/StrokeFont.java | 69 + .../opengl/texture/BuildableTexture.java | 206 ++ .../andengine/opengl/texture/Texture.java | 380 +++ .../opengl/texture/TextureFactory.java | 59 + .../opengl/texture/TextureManager.java | 165 + .../opengl/texture/TextureOptions.java | 65 + .../texture/buffer/TextTextureBuffer.java | 88 + .../builder/BlackPawnTextureBuilder.java | 324 ++ .../texture/builder/ITextureBuilder.java | 59 + .../texture/region/BaseTextureRegion.java | 147 + .../opengl/texture/region/TextureRegion.java | 60 + .../texture/region/TextureRegionFactory.java | 150 + .../texture/region/TextureRegionLibrary.java | 54 + .../texture/region/TiledTextureRegion.java | 133 + .../buffer/BaseTextureRegionBuffer.java | 162 + .../region/buffer/TextureRegionBuffer.java | 66 + .../buffer/TiledTextureRegionBuffer.java | 70 + .../texture/source/AssetTextureSource.java | 117 + .../source/EmptyBitmapTextureSource.java | 71 + .../texture/source/FileTextureSource.java | 116 + .../opengl/texture/source/ITextureSource.java | 24 + .../texture/source/ResourceTextureSource.java | 95 + .../BaseShapeTextureSourceDecorator.java | 56 + .../decorator/BaseTextureSourceDecorator.java | 209 ++ .../ColorKeyTextureSourceDecorator.java | 72 + .../decorator/FillTextureSourceDecorator.java | 59 + ...earGradientFillTextureSourceDecorator.java | 145 + .../OutlineTextureSourceDecorator.java | 59 + ...ialGradientFillTextureSourceDecorator.java | 118 + .../shape/ArcTextureSourceDecoratorShape.java | 84 + .../CircleTextureSourceDecoratorShape.java | 67 + .../EllipseTextureSourceDecoratorShape.java | 69 + .../shape/ITextureSourceDecoratorShape.java | 22 + .../RectangleTextureSourceDecoratorShape.java | 58 + ...dRectangleTextureSourceDecoratorShape.java | 78 + .../opengl/util/FastFloatBuffer.java | 209 ++ .../andengine/opengl/util/GLHelper.java | 437 +++ .../opengl/vertex/LineVertexBuffer.java | 60 + .../opengl/vertex/RectangleVertexBuffer.java | 72 + .../opengl/vertex/TextVertexBuffer.java | 117 + .../andengine/opengl/vertex/VertexBuffer.java | 41 + .../opengl/view/BaseConfigChooser.java | 70 + .../opengl/view/ComponentSizeChooser.java | 86 + .../opengl/view/EGLConfigChooser.java | 38 + .../andengine/opengl/view/GLSurfaceView.java | 991 ++++++ .../andengine/opengl/view/GLWrapper.java | 47 + .../andengine/opengl/view/LogWriter.java | 73 + .../opengl/view/RenderSurfaceView.java | 162 + .../opengl/view/SimpleEGLConfigChooser.java | 48 + .../andengine/sensor/BaseSensorData.java | 65 + .../anddev/andengine/sensor/SensorDelay.java | 57 + .../accelerometer/AccelerometerData.java | 74 + .../AccelerometerSensorOptions.java | 47 + .../accelerometer/IAccelerometerListener.java | 17 + .../sensor/location/ILocationListener.java | 41 + .../location/LocationProviderStatus.java | 43 + .../location/LocationSensorOptions.java | 110 + .../orientation/IOrientationListener.java | 17 + .../sensor/orientation/OrientationData.java | 139 + .../orientation/OrientationSensorOptions.java | 47 + .../anddev/andengine/ui/IGameInterface.java | 27 + .../andengine/ui/activity/BaseActivity.java | 127 + .../ui/activity/BaseGameActivity.java | 303 ++ .../ui/activity/BaseSplashActivity.java | 123 + .../ui/activity/LayoutGameActivity.java | 50 + .../ui/dialog/GenericInputDialogBuilder.java | 120 + .../ui/dialog/StringInputDialogBuilder.java | 53 + .../anddev/andengine/util/ActivityUtils.java | 242 ++ .../org/anddev/andengine/util/ArrayUtils.java | 39 + .../anddev/andengine/util/AsyncCallable.java | 25 + .../src/org/anddev/andengine/util/Base64.java | 759 +++++ .../andengine/util/Base64InputStream.java | 163 + .../org/anddev/andengine/util/BetaUtils.java | 96 + .../org/anddev/andengine/util/Callable.java | 23 + .../org/anddev/andengine/util/Callback.java | 17 + .../org/anddev/andengine/util/ColorUtils.java | 60 + .../org/anddev/andengine/util/DataUtils.java | 39 + .../src/org/anddev/andengine/util/Debug.java | 142 + .../org/anddev/andengine/util/FileUtils.java | 159 + .../andengine/util/HorizontalAlign.java | 43 + .../org/anddev/andengine/util/IMatcher.java | 18 + .../org/anddev/andengine/util/Library.java | 65 + .../org/anddev/andengine/util/ListUtils.java | 43 + .../org/anddev/andengine/util/MathUtils.java | 207 ++ .../org/anddev/andengine/util/MultiKey.java | 89 + .../andengine/util/MultiKeyHashMap.java | 75 + .../andengine/util/ParameterCallable.java | 17 + .../andengine/util/ProbabilityGenerator.java | 109 + .../org/anddev/andengine/util/SAXUtils.java | 152 + .../andengine/util/SimplePreferences.java | 78 + .../org/anddev/andengine/util/SmartList.java | 112 + .../anddev/andengine/util/SocketUtils.java | 62 + .../anddev/andengine/util/StreamUtils.java | 161 + .../anddev/andengine/util/StringUtils.java | 109 + .../anddev/andengine/util/SystemUtils.java | 213 ++ .../org/anddev/andengine/util/TimeUtils.java | 56 + .../anddev/andengine/util/Transformation.java | 229 ++ .../andengine/util/TransformationPool.java | 53 + .../anddev/andengine/util/VerticalAlign.java | 43 + .../org/anddev/andengine/util/ViewUtils.java | 48 + .../cache/RectangleVertexBufferCache.java | 70 + .../util/constants/ColorConstants.java | 17 + .../andengine/util/constants/Constants.java | 20 + .../andengine/util/constants/MIMETypes.java | 19 + .../util/constants/MathConstants.java | 23 + .../util/constants/TimeConstants.java | 37 + .../levelstats/LevelStatsDBConnector.java | 131 + .../modifier/BaseDoubleValueSpanModifier.java | 78 + .../util/modifier/BaseDurationModifier.java | 103 + .../andengine/util/modifier/BaseModifier.java | 81 + .../BaseSingleValueChangeModifier.java | 65 + .../modifier/BaseSingleValueSpanModifier.java | 83 + .../modifier/BaseTripleValueSpanModifier.java | 70 + .../andengine/util/modifier/IModifier.java | 47 + .../andengine/util/modifier/LoopModifier.java | 138 + .../andengine/util/modifier/ModifierList.java | 80 + .../util/modifier/ParallelModifier.java | 125 + .../util/modifier/SequenceModifier.java | 151 + .../util/modifier/ease/EaseBackIn.java | 53 + .../util/modifier/ease/EaseBackInOut.java | 58 + .../util/modifier/ease/EaseBackOut.java | 53 + .../util/modifier/ease/EaseBounceIn.java | 53 + .../util/modifier/ease/EaseBounceInOut.java | 57 + .../util/modifier/ease/EaseBounceOut.java | 61 + .../util/modifier/ease/EaseCircularIn.java | 54 + .../util/modifier/ease/EaseCircularInOut.java | 58 + .../util/modifier/ease/EaseCircularOut.java | 54 + .../util/modifier/ease/EaseCubicIn.java | 52 + .../util/modifier/ease/EaseCubicInOut.java | 55 + .../util/modifier/ease/EaseCubicOut.java | 52 + .../util/modifier/ease/EaseElasticIn.java | 74 + .../util/modifier/ease/EaseElasticInOut.java | 77 + .../util/modifier/ease/EaseElasticOut.java | 74 + .../util/modifier/ease/EaseExponentialIn.java | 52 + .../modifier/ease/EaseExponentialInOut.java | 61 + .../modifier/ease/EaseExponentialOut.java | 52 + .../util/modifier/ease/EaseLinear.java | 52 + .../util/modifier/ease/EaseQuadIn.java | 52 + .../util/modifier/ease/EaseQuadInOut.java | 55 + .../util/modifier/ease/EaseQuadOut.java | 52 + .../util/modifier/ease/EaseQuartIn.java | 53 + .../util/modifier/ease/EaseQuartInOut.java | 55 + .../util/modifier/ease/EaseQuartOut.java | 52 + .../util/modifier/ease/EaseQuintIn.java | 52 + .../util/modifier/ease/EaseQuintInOut.java | 55 + .../util/modifier/ease/EaseQuintOut.java | 52 + .../util/modifier/ease/EaseSineIn.java | 56 + .../util/modifier/ease/EaseSineInOut.java | 56 + .../util/modifier/ease/EaseSineOut.java | 56 + .../util/modifier/ease/EaseStrongIn.java | 52 + .../util/modifier/ease/EaseStrongInOut.java | 55 + .../util/modifier/ease/EaseStrongOut.java | 52 + .../util/modifier/ease/IEaseFunction.java | 19 + .../util/modifier/util/ModifierUtils.java | 62 + .../anddev/andengine/util/path/Direction.java | 74 + .../andengine/util/path/IPathFinder.java | 17 + .../anddev/andengine/util/path/ITiledMap.java | 24 + .../org/anddev/andengine/util/path/Path.java | 187 ++ .../util/path/astar/AStarPathFinder.java | 252 ++ .../util/path/astar/EuclideanHeuristic.java | 47 + .../util/path/astar/IAStarHeuristic.java | 19 + .../util/path/astar/ManhattanHeuristic.java | 42 + .../util/path/astar/NullHeuristic.java | 42 + .../pool/EntityDetachRunnablePoolItem.java | 48 + ...EntityDetachRunnablePoolUpdateHandler.java | 40 + .../andengine/util/pool/GenericPool.java | 132 + .../anddev/andengine/util/pool/MultiPool.java | 59 + .../org/anddev/andengine/util/pool/Pool.java | 92 + .../anddev/andengine/util/pool/PoolItem.java | 68 + .../util/pool/PoolUpdateHandler.java | 129 + .../andengine/util/pool/RunnablePoolItem.java | 35 + .../util/pool/RunnablePoolUpdateHandler.java | 54 + .../util/progress/IProgressListener.java | 17 + .../util/progress/ProgressCallable.java | 24 + .../util/progress/ProgressMonitor.java | 82 + .../andengine/util/sort/InsertionSorter.java | 71 + .../anddev/andengine/util/sort/Sorter.java | 51 + AndEngine/uml/andengine_classdiagram.png | Bin 0 -> 34363 bytes AndEngine/uml/andengine_classdiagram.ucls | 511 +++ 1283 files changed, 71363 insertions(+) create mode 100644 AndEngine/.classpath create mode 100644 AndEngine/.hg/00changelog.i create mode 100644 AndEngine/.hg/branch create mode 100644 AndEngine/.hg/cache/branchheads create mode 100644 AndEngine/.hg/cache/tags create mode 100644 AndEngine/.hg/dirstate create mode 100644 AndEngine/.hg/hgrc create mode 100644 AndEngine/.hg/requires create mode 100644 AndEngine/.hg/store/00changelog.d create mode 100644 AndEngine/.hg/store/00changelog.i create mode 100644 AndEngine/.hg/store/00manifest.d create mode 100644 AndEngine/.hg/store/00manifest.i create mode 100644 AndEngine/.hg/store/data/_android_manifest.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_and_engine_examples.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_and_engine_live_wallpaper.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_and_engine_physics_box2_d.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_and_engine_playground.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_box_face_stacker.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_campfire_live_wallpaper.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_cigarette_live_wallpaper.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_heli_taxi.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_heli_taxi_live_wallpaper.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_heli_taxi_shared.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_high_rise.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_lava_lamp_live_wallpaper.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_super_droid.xml.i create mode 100644 AndEngine/.hg/store/data/ant/export_jar_to_volcano_live_wallpaper.xml.i create mode 100644 AndEngine/.hg/store/data/build__hudson.xml.i create mode 100644 AndEngine/.hg/store/data/default.properties.i create mode 100644 AndEngine/.hg/store/data/export_jar_to_all.xml.i create mode 100644 AndEngine/.hg/store/data/export_jar_to_and_engine_examples.xml.i create mode 100644 AndEngine/.hg/store/data/export_jar_to_and_engine_live_wallpaper.xml.i create mode 100644 AndEngine/.hg/store/data/export_jar_to_heli_taxi.xml.i create mode 100644 AndEngine/.hg/store/data/export_jar_to_heli_taxi_live_wallpaper.xml.i create mode 100644 AndEngine/.hg/store/data/export_jar_to_heli_taxi_shared.xml.i create mode 100644 AndEngine/.hg/store/data/export_jar_to_space_taxi.xml.i create mode 100644 AndEngine/.hg/store/data/ext/img/android.svg.i create mode 100644 AndEngine/.hg/store/data/ext/img/badge.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/badge.svg.i create mode 100644 AndEngine/.hg/store/data/ext/img/clapboard.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/clapboard.svg.i create mode 100644 AndEngine/.hg/store/data/ext/img/favicon.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/favicon.svg.i create mode 100644 AndEngine/.hg/store/data/ext/img/icon.svg.i create mode 100644 AndEngine/.hg/store/data/ext/img/index.html.i create mode 100644 AndEngine/.hg/store/data/ext/img/logo.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/logo.svg.i create mode 100644 AndEngine/.hg/store/data/ext/img/logo2.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/logo3.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/logo4.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/logo__icon.svg.i create mode 100644 AndEngine/.hg/store/data/ext/img/source.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/source.svg.i create mode 100644 AndEngine/.hg/store/data/ext/img/splash.png.i create mode 100644 AndEngine/.hg/store/data/ext/img/splash.svg.i create mode 100644 AndEngine/.hg/store/data/hudson__build.xml.i create mode 100644 AndEngine/.hg/store/data/lib/lib_progress_monitor.jar.i create mode 100644 AndEngine/.hg/store/data/push__buxs.bat.i create mode 100644 AndEngine/.hg/store/data/push__google__code.bat.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/_base_audio_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/_base_audio_manager.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/_i_audio_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/_i_audio_manager.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/music/_music.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/music/_music_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/music/_music_manager.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/sound/_sound.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/sound/_sound_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/sound/_sound_library.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/audio/sound/_sound_manager.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_base_collision_checker.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_collision_checker.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_line_collision_checker.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_rectangular_shape_collision_checker.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_shape_collision_checker.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_double_scene_split_screen_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine_hook.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_fixed_f_p_s_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_fixed_step_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_i_scene_touch_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_i_update_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_limited_f_p_s_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_single_scene_split_screen_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_smooth_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_split_screen_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_split_screen_engine_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_update_handler_list.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_bound_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_camera_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_chase_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_smooth_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_smooth_chase_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_zoom_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/_h_u_d.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/controls/_analog_on_screen_control.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/controls/_base_on_screen_control.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/controls/_digital_on_screen_control.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/easying/_easing.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/_base_entity_update_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/_i_update_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/_update_handler_list.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/collision/_collision_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/collision/_i_collision_callback.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/physics/_physics_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/runnable/_runnable_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/timer/_i_timer_callback.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/timer/_timer_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_engine_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_fixed_f_p_s_engine_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_fixed_step_engine_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_render_hints.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_render_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_split_screen_engine_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_touch_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_wake_lock_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_base_resolution_policy.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_fill_resolution_policy.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_fixed_resolution_policy.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_i_resolution_policy.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_ratio_resolution_policy.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_relative_resolution_policy.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_dynamic_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_static_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_camera_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_dynamic_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_f_p_s_counter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_frame_counter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_frame_length_logger.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_horizontal_align.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_base_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_dynamic_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_on_scene_touch_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_scene_touch_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_static_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_update_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_layer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_scene_with_child.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_screen_capture.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_splash_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_static_entity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_update_handler_list.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/background/_base_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/background/_fixed_color_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/group/_transformation_group.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/collision/_collision_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/collision/_i_collision_callback.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/runnable/_runnable_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/timer/_i_timer_callback.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/timer/_timer_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_base_layer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_dynamic_capacity_layer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_fixed_capacity_layer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_i_layer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_layer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_layer_sorter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_z_index_sorter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_i_t_m_x_tile_properties_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_layer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_layer_property.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_loader.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_group.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_group_property.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_property.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_parser.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_properties.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_property.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tile.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tile_property.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tile_set.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tiled_map.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tiled_map_property.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_s_x_loader.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_s_x_parser.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/constants/_t_m_x_constants.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_m_x_exception.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_m_x_load_exception.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_m_x_parse_exception.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_s_x_load_exception.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_s_x_parse_exception.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_i_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_i_on_menu_item_click_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_i_on_menu_item_clicker_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_menu_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_menu_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_alpha_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_base_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_direct_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_slide_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_alpha_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_color_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_delay_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_double_value_span_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_duration_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_entity_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_entity_modifier_list.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_fade_in_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_fade_out_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_i_entity_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_loop_entity_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_move_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_move_x_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_move_y_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_parallel_entity_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_path_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_rotation_at_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_rotation_by_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_rotation_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_scale_at_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_scale_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_sequence_entity_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_single_value_change_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_single_value_span_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_triple_value_span_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_i_particle_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_i_particle_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle_engine.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle_system.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_base_circle_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_base_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_base_rectangle_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_circle_outline_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_circle_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_i_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_point_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_rectangle_outline_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_rectangle_particle_emitter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_acceleration_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_alpha_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_double_value_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_single_value_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_triple_value_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_color_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_gravity_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_i_particle_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_rotation_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_velocity_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_acceleration_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_acceleration_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_alpha_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_alpha_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_double_value_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_double_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_from_to_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_pair_initialize_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_pair_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_single_value_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_single_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_triple_value_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_triple_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_color_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_color_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_expire_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_gravity_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_gravity_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_i_particle_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_i_particle_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_off_camera_expire_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_rotate_initialize.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_rotate_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_rotate_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_rotation_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_rotation_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_scale_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_velocity_initializer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_velocity_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitive/_base_rectangle.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitive/_line.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitive/_rectangle.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitive/_rectangular_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitives/_base_rectangle.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitives/_line.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitives/_rectangle.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitives/_rectangular_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitives/_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/_camera_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/_splash_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_auto_parallax_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_base_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_color_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_entity_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_i_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_parallax_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_repeating_sprite_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_sprite_background.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_color_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_i_background_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_loop_background_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_parallel_background_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_sequence_background_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/_menu_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_alpha_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_base_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_direct_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_i_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_slide_menu_animator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_animated_sprite_menu_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_color_text_menu_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_colored_text_menu_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_i_menu_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_scale_text_menu_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_sprite_menu_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_text_menu_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_base_menu_item_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_color_menu_item_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_scale_menu_item_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/popup/_popup_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/popup/_text_popup_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/transition/_base_transition_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/transition/_fade_transition_scene.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_base_renderer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_g_l_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_modifier_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_renderer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_rectangle_renderer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_rectangular_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_alpha_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_change_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_double_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_from_to_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_pair_from_to_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_shape_duration_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_single_value_change_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_single_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_triple_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_color_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_delay_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_double_value_span_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_duration_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_fade_in_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_fade_out_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_i_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_i_shape_modifier_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_loop_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_loop_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_move_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_move_x_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_move_y_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_parallel_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_parallel_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_path_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotate_by_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotate_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_at_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_by_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_scale_at_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_scale_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_sequence_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_sequence_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_single_value_change_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_single_value_span_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_triple_value_span_shape_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_back_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_back_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_back_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_circular_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_circular_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_circular_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_cubic_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_cubic_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_cubic_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_exponential_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_exponential_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_exponential_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_linear.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quad_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quad_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quad_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quart_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quart_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quart_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quint_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quint_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quint_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_strong_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_strong_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_strong_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_i_ease_function.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/util/_shape_modifier_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/util/_shape_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_animated_sprite.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_animated_sprite_renderer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_base_sprite.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_modification_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_modifier_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_sprite_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_sprite.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_sprite_renderer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_tiled_sprite.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_tiled_sprite_renderer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_alpha_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_from_to_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_pair_from_to_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_delay_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_move_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_rotate_by_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_rotate_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_scale_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_sequence_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_changeable_text.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_text.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_text_renderer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_ticker_text.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_average_f_p_s_counter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_f_p_s_counter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_f_p_s_logger.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_frame_count_crasher.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_frame_counter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_frame_length_logger.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_i_on_area_touch_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_i_on_scene_touch_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_i_touch_area.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_screen_capture.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_screen_grabber.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/game/_base_game_activity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/_i_on_area_touch_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/_i_on_scene_touch_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/_i_touch_area.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/_touch_event.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_base_touch_controller.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_i_touch_controller.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_multi_touch_controler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_single_touch_controler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_base_detector.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_click_detector.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_hold_detector.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_scroll_detector.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_surface_gesture_detector.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_surface_scroll_detector.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/level/_level_loader.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/level/_level_parser.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/level/util/constants/_level_constants.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_base_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_g_l_helper.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_i_drawable.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_i_render_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_i_renderable.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_base_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_buffer_object.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_buffer_object_manager.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font_library.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font_manager.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_letter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_size.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_stroke_font.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_font.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_glyph.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_letter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_rectangle.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_size.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_asset_texture.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_buildable_texture.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_font_manager.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_i_texture_state_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_packable_texture.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_resource_texture.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_atlas.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_manager.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_region.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_region_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_tiled_texture.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_tiled_texture_region.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_base_texture_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_base_texture_region_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_text_texture_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_texture_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_texture_region_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_tiled_texture_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_tiled_texture_region_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/builder/_black_pawn_texture_builder.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/builder/_i_texture_builder.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/factory/_texture_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/factory/_texture_region_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_base_texture_region.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region_factory.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region_library.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_tiled_texture_region.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/buffer/_base_texture_region_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/buffer/_texture_region_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/buffer/_tiled_texture_region_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_asset_texture_source.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_color_key_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_empty_bitmap_texture_source.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_file_texture_source.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_i_texture_source.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_outline_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_resource_texture_source.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_base_shape_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_base_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_circle_fill_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_circle_outline_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_color_key_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_fill_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_linear_gradient_fill_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_outline_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_radial_gradient_fill_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_rectangle_fill_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_texture_source_decorator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_arc_texture_source_decorator_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_circle_texture_source_decorator_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_ellipse_texture_source_decorator_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_i_texture_source_decorator_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_rectangle_texture_source_decorator_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/packing/_black_pawn_texture_source_packing_algorithm.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/packing/_i_texture_source_packing_algorithm.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/util/_fast_float_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/util/_g_l_helper.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_line_vertex_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_rectangle_vertex_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_text_vertex_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_vertex_buffer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_base_config_chooser.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_component_size_chooser.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_e_g_l_config_chooser.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_g_l_surface_view.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_g_l_wrapper.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_log_writer.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_render_surface_view.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_simple_e_g_l_config_chooser.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/camera/_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/camera/_chase_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/camera/_smooth_camera.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_base_physics_body.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_dynamic_physics_body.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_i_physics_space.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_physics_data.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_physics_shape.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_static_physics_body.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/physics/collision/_collision_checker.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/physics/collision/_intersector.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/_base_sensor_data.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/_sensor_delay.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/accelerometer/_accelerometer_data.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/accelerometer/_accelerometer_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/accelerometer/_accelerometer_sensor_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/accelerometer/_i_accelerometer_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_i_location_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_location_provider_status.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_location_sensor_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_i_orientation_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_orientation_data.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_orientation_sensor_options.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/ui/_i_game_interface.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/ui/activity/_base_activity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/ui/activity/_base_game_activity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/ui/activity/_base_splash_activity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/ui/activity/_layout_game_activity.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/ui/dialog/_generic_input_dialog_builder.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/ui/dialog/_string_input_dialog_builder.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/ui/dialog/_string_input_dialoguilder.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_activity_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_array_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_async_callable.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_base64.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_base64_input_stream.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_beta_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_callable.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_callback.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_color_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_data_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_debug.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_file_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_hashtable_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_horizontal_align.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_i_entity_matcher.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_i_matcher.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_library.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_list_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_math_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_multi_key.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_multi_key_hash_map.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_parameter_callable.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_path.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_probability_generator.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_progress_callable.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_s_a_x_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_simple_preferences.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_smart_list.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_socket_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_stream_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_string_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_system_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_time_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_transformation.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_transformation_pool.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_user_task.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_vertical_align.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/_view_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/cache/_rectangle_vertex_buffer_cache.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_color_constants.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_constants.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_m_i_m_e_types.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_math_constants.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_time_constants.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/levelstats/_level_stats_d_b_connector.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_double_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_duration_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_single_value_change_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_single_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_triple_value_span_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_i_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_loop_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_modifier_list.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_parallel_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_sequence_modifier.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_back_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_back_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_back_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_bounce_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_bounce_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_bounce_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_circular_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_circular_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_circular_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_cubic_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_cubic_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_cubic_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_elastic_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_elastic_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_elastic_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_exponential_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_exponential_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_exponential_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_linear.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quad_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quad_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quad_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quart_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quart_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quart_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_sine_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_sine_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_sine_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_in.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_in_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_out.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_i_ease_function.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/util/_modifier_utils.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/_direction.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/_i_path_finder.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/_i_tiled_map.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/_path.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_a_star_path_finder.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_euclidean_heuristic.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_i_a_star_heuristic.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_manhattan_heuristic.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_null_heuristic.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_entity_detach_runnable_pool_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_entity_detach_runnable_pool_update_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_entity_remove_runnable_pool_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_entity_remove_runnable_pool_update_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_generic_pool.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_multi_pool.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_pool.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_pool_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_pool_update_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_runnable_pool_item.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_runnable_pool_update_handler.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/progress/_i_progress_listener.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/progress/_progress_callable.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/progress/_progress_monitor.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/sort/_insertion_sorter.java.i create mode 100644 AndEngine/.hg/store/data/src/org/anddev/andengine/util/sort/_sorter.java.i create mode 100644 AndEngine/.hg/store/data/test/org/anddev/andengine/util/_string_utils_test.java.i create mode 100644 AndEngine/.hg/store/data/uml/andengine__classdiagram.png.i create mode 100644 AndEngine/.hg/store/data/uml/andengine__classdiagram.ucls.i create mode 100644 AndEngine/.hg/store/data/~2eclasspath.i create mode 100644 AndEngine/.hg/store/data/~2ehgignore.i create mode 100644 AndEngine/.hg/store/data/~2eproject.i create mode 100644 AndEngine/.hg/store/dh/src/org/anddev/andengin/opengl/texture/source/decorato/rectanglelineargradi557b574af419ce9da084d7cb2edd96c8167e414d.i create mode 100644 AndEngine/.hg/store/dh/src/org/anddev/andengin/opengl/texture/source/decorato/shape/roundedrectangca23493c2bf9765f3a9663ef116bd36864da9289.i create mode 100644 AndEngine/.hg/store/fncache create mode 100644 AndEngine/.hg/store/undo create mode 100644 AndEngine/.hg/undo.branch create mode 100644 AndEngine/.hg/undo.desc create mode 100644 AndEngine/.hg/undo.dirstate create mode 100644 AndEngine/.hgignore create mode 100644 AndEngine/.project create mode 100644 AndEngine/AndroidManifest.xml create mode 100644 AndEngine/default.properties create mode 100644 AndEngine/exportJarToAll.xml create mode 100644 AndEngine/ext/img/android.svg create mode 100644 AndEngine/ext/img/badge.png create mode 100644 AndEngine/ext/img/badge.svg create mode 100644 AndEngine/ext/img/clapboard.png create mode 100644 AndEngine/ext/img/clapboard.svg create mode 100644 AndEngine/ext/img/favicon.png create mode 100644 AndEngine/ext/img/favicon.svg create mode 100644 AndEngine/ext/img/icon.svg create mode 100644 AndEngine/ext/img/logo.png create mode 100644 AndEngine/ext/img/logo.svg create mode 100644 AndEngine/ext/img/logo_icon.svg create mode 100644 AndEngine/ext/img/source.png create mode 100644 AndEngine/ext/img/source.svg create mode 100644 AndEngine/ext/img/splash.png create mode 100644 AndEngine/ext/img/splash.svg create mode 100644 AndEngine/jni/Android.mk create mode 100644 AndEngine/jni/Box2D/Android.mk create mode 100644 AndEngine/jni/Box2D/Body.cpp create mode 100644 AndEngine/jni/Box2D/Body.h create mode 100644 AndEngine/jni/Box2D/Box2D.h create mode 100644 AndEngine/jni/Box2D/CircleShape.cpp create mode 100644 AndEngine/jni/Box2D/CircleShape.h create mode 100644 AndEngine/jni/Box2D/Collision/Shapes/b2CircleShape.cpp create mode 100644 AndEngine/jni/Box2D/Collision/Shapes/b2CircleShape.h create mode 100644 AndEngine/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp create mode 100644 AndEngine/jni/Box2D/Collision/Shapes/b2PolygonShape.h create mode 100644 AndEngine/jni/Box2D/Collision/Shapes/b2Shape.h create mode 100644 AndEngine/jni/Box2D/Collision/b2BroadPhase.cpp create mode 100644 AndEngine/jni/Box2D/Collision/b2BroadPhase.h create mode 100644 AndEngine/jni/Box2D/Collision/b2CollideCircle.cpp create mode 100644 AndEngine/jni/Box2D/Collision/b2CollidePolygon.cpp create mode 100644 AndEngine/jni/Box2D/Collision/b2Collision.cpp create mode 100644 AndEngine/jni/Box2D/Collision/b2Collision.h create mode 100644 AndEngine/jni/Box2D/Collision/b2Distance.cpp create mode 100644 AndEngine/jni/Box2D/Collision/b2Distance.h create mode 100644 AndEngine/jni/Box2D/Collision/b2DynamicTree.cpp create mode 100644 AndEngine/jni/Box2D/Collision/b2DynamicTree.h create mode 100644 AndEngine/jni/Box2D/Collision/b2TimeOfImpact.cpp create mode 100644 AndEngine/jni/Box2D/Collision/b2TimeOfImpact.h create mode 100644 AndEngine/jni/Box2D/Common/b2BlockAllocator.cpp create mode 100644 AndEngine/jni/Box2D/Common/b2BlockAllocator.h create mode 100644 AndEngine/jni/Box2D/Common/b2Math.cpp create mode 100644 AndEngine/jni/Box2D/Common/b2Math.h create mode 100644 AndEngine/jni/Box2D/Common/b2Settings.cpp create mode 100644 AndEngine/jni/Box2D/Common/b2Settings.h create mode 100644 AndEngine/jni/Box2D/Common/b2StackAllocator.cpp create mode 100644 AndEngine/jni/Box2D/Common/b2StackAllocator.h create mode 100644 AndEngine/jni/Box2D/Contact.cpp create mode 100644 AndEngine/jni/Box2D/Contact.h create mode 100644 AndEngine/jni/Box2D/DistanceJoint.cpp create mode 100644 AndEngine/jni/Box2D/DistanceJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2CircleContact.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2CircleContact.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2Contact.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2Contact.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2ContactSolver.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2ContactSolver.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonContact.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonContact.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2TOISolver.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Contacts/b2TOISolver.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2DistanceJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2DistanceJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2FrictionJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2FrictionJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2GearJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2GearJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2LineJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2LineJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2MouseJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2MouseJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2PrismaticJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2PulleyJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2PulleyJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2RevoluteJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2WeldJoint.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/Joints/b2WeldJoint.h create mode 100644 AndEngine/jni/Box2D/Dynamics/b2Body.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/b2Body.h create mode 100644 AndEngine/jni/Box2D/Dynamics/b2ContactManager.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/b2ContactManager.h create mode 100644 AndEngine/jni/Box2D/Dynamics/b2Fixture.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/b2Fixture.h create mode 100644 AndEngine/jni/Box2D/Dynamics/b2Island.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/b2Island.h create mode 100644 AndEngine/jni/Box2D/Dynamics/b2TimeStep.h create mode 100644 AndEngine/jni/Box2D/Dynamics/b2World.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/b2World.h create mode 100644 AndEngine/jni/Box2D/Dynamics/b2WorldCallbacks.cpp create mode 100644 AndEngine/jni/Box2D/Dynamics/b2WorldCallbacks.h create mode 100644 AndEngine/jni/Box2D/Fixture.cpp create mode 100644 AndEngine/jni/Box2D/Fixture.h create mode 100644 AndEngine/jni/Box2D/FrictionJoint.cpp create mode 100644 AndEngine/jni/Box2D/FrictionJoint.h create mode 100644 AndEngine/jni/Box2D/GearJoint.cpp create mode 100644 AndEngine/jni/Box2D/GearJoint.h create mode 100644 AndEngine/jni/Box2D/Joint.cpp create mode 100644 AndEngine/jni/Box2D/Joint.h create mode 100644 AndEngine/jni/Box2D/LineJoint.cpp create mode 100644 AndEngine/jni/Box2D/LineJoint.h create mode 100644 AndEngine/jni/Box2D/MouseJoint.cpp create mode 100644 AndEngine/jni/Box2D/MouseJoint.h create mode 100644 AndEngine/jni/Box2D/PolygonShape.cpp create mode 100644 AndEngine/jni/Box2D/PolygonShape.h create mode 100644 AndEngine/jni/Box2D/PrismaticJoint.cpp create mode 100644 AndEngine/jni/Box2D/PrismaticJoint.h create mode 100644 AndEngine/jni/Box2D/PulleyJoint.cpp create mode 100644 AndEngine/jni/Box2D/PulleyJoint.h create mode 100644 AndEngine/jni/Box2D/RevoluteJoint.cpp create mode 100644 AndEngine/jni/Box2D/RevoluteJoint.h create mode 100644 AndEngine/jni/Box2D/Shape.cpp create mode 100644 AndEngine/jni/Box2D/Shape.h create mode 100644 AndEngine/jni/Box2D/World.cpp create mode 100644 AndEngine/jni/Box2D/World.h create mode 100644 AndEngine/jni/build.bat create mode 100644 AndEngine/jni/build.sh create mode 100644 AndEngine/libs/armeabi/libandenginephysicsbox2dextension.so create mode 100644 AndEngine/push_google_code.bat create mode 100644 AndEngine/src/com/badlogic/gdx/math/Vector2.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/Body.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/BodyDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/CircleShape.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/Contact.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/ContactFilter.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/ContactListener.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/DestructionListener.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/Filter.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/Fixture.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/FixtureDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/Joint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/JointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/JointEdge.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/MassData.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/PolygonShape.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/QueryCallback.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/Shape.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/Transform.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/World.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/WorldManifold.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/DistanceJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/DistanceJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/FrictionJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/FrictionJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/GearJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/GearJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/LineJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/LineJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/MouseJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/MouseJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PrismaticJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PrismaticJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PulleyJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PulleyJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/RevoluteJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/RevoluteJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/WeldJoint.java create mode 100644 AndEngine/src/com/badlogic/gdx/physics/box2d/joints/WeldJointDef.java create mode 100644 AndEngine/src/com/badlogic/gdx/utils/LongHashMap.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/BaseAudioEntity.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/BaseAudioManager.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/IAudioEntity.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/IAudioManager.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/music/Music.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/music/MusicFactory.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/music/MusicManager.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/sound/Sound.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/sound/SoundFactory.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/sound/SoundLibrary.java create mode 100644 AndEngine/src/org/anddev/andengine/audio/sound/SoundManager.java create mode 100644 AndEngine/src/org/anddev/andengine/collision/BaseCollisionChecker.java create mode 100644 AndEngine/src/org/anddev/andengine/collision/LineCollisionChecker.java create mode 100644 AndEngine/src/org/anddev/andengine/collision/RectangularShapeCollisionChecker.java create mode 100644 AndEngine/src/org/anddev/andengine/collision/ShapeCollisionChecker.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/DoubleSceneSplitScreenEngine.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/Engine.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/FixedStepEngine.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/LimitedFPSEngine.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/SingleSceneSplitScreenEngine.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/BoundCamera.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/Camera.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/CameraFactory.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/SmoothCamera.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/ZoomCamera.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/hud/HUD.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/BaseOnScreenControl.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/BaseEntityUpdateHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/IUpdateHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/UpdateHandlerList.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/collision/CollisionHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/collision/ICollisionCallback.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/physics/PhysicsHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/runnable/RunnableHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/timer/ITimerCallback.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/handler/timer/TimerHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/EngineOptions.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/RenderOptions.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/TouchOptions.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/WakeLockOptions.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java create mode 100644 AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/Entity.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/IEntity.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/Layer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/ZIndexSorter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayerProperty.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLoader.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObject.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroup.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroupProperty.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectProperty.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXParser.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperties.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperty.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTile.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileProperty.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileSet.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMap.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMapProperty.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXLoader.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXParser.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/constants/TMXConstants.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXException.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXLoadException.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXParseException.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXLoadException.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXParseException.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/AlphaModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/ColorModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/DelayModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/DoubleValueSpanShapeModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/DurationShapeModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/EntityModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/EntityModifierList.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/FadeInModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/FadeOutModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/IEntityModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/LoopEntityModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/MoveModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/MoveXModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/MoveYModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/ParallelEntityModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/PathModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/RotationAtModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/RotationByModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/RotationModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/ScaleAtModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/ScaleModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/SequenceEntityModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/SingleValueChangeShapeModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/SingleValueSpanShapeModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/modifier/TripleValueSpanShapeModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/Particle.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/ParticleSystem.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseCircleParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseRectangleParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/CircleParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/IParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/PointParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/RectangleOutlineParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/emitter/RectangleParticleEmitter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/AccelerationInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/AlphaInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseDoubleValueInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseSingleValueInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseTripleValueInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/ColorInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/GravityInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/IParticleInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/RotationInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/initializer/VelocityInitializer.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/AlphaModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseDoubleValueSpanModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseSingleValueSpanModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseTripleValueSpanModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/ColorModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/ExpireModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/IParticleModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/OffCameraExpireModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/RotationModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/particle/modifier/ScaleModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/primitive/BaseRectangle.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/primitive/Line.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/primitive/Rectangle.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/CameraScene.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/Scene.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/SplashScene.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/AutoParallaxBackground.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/BaseBackground.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/ColorBackground.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/EntityBackground.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/IBackground.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/ParallaxBackground.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/RepeatingSpriteBackground.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/SpriteBackground.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/ColorModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/IBackgroundModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/MenuScene.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/BaseMenuAnimator.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/DirectMenuAnimator.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/IMenuAnimator.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/SlideMenuAnimator.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/item/IMenuItem.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/item/SpriteMenuItem.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/item/TextMenuItem.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/popup/PopupScene.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/scene/popup/TextPopupScene.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/shape/IShape.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/shape/RectangularShape.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/shape/Shape.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/sprite/AnimatedSprite.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/sprite/BaseSprite.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/sprite/Sprite.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/sprite/TiledSprite.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/text/ChangeableText.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/text/Text.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/text/TickerText.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/util/AverageFPSCounter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/util/FPSCounter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/util/FPSLogger.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/util/FrameCountCrasher.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/util/FrameCounter.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/util/ScreenCapture.java create mode 100644 AndEngine/src/org/anddev/andengine/entity/util/ScreenGrabber.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/FixedStepPhysicsWorld.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsConnector.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsConnectorManager.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsFactory.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsWorld.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/Vector2Pool.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/constants/PhysicsConstants.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/BaseHullAlgorithm.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/GrahamScan.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/IHullAlgorithm.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/JarvisMarch.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/QuickHull.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/Vector2Line.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/Vector2Util.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/triangulation/EarClippingTriangulator.java create mode 100644 AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/triangulation/ITriangulationAlgoritm.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/TouchEvent.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/controller/BaseTouchController.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/controller/ITouchController.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/controller/SingleTouchControler.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/detector/BaseDetector.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/detector/ClickDetector.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/detector/HoldDetector.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/detector/ScrollDetector.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/detector/SurfaceGestureDetector.java create mode 100644 AndEngine/src/org/anddev/andengine/input/touch/detector/SurfaceScrollDetector.java create mode 100644 AndEngine/src/org/anddev/andengine/level/LevelLoader.java create mode 100644 AndEngine/src/org/anddev/andengine/level/LevelParser.java create mode 100644 AndEngine/src/org/anddev/andengine/level/util/constants/LevelConstants.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/IDrawable.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/buffer/BufferObject.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/buffer/BufferObjectManager.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/font/Font.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/font/FontFactory.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/font/FontLibrary.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/font/FontManager.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/font/Letter.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/font/Size.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/font/StrokeFont.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/BuildableTexture.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/Texture.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/TextureFactory.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/TextureManager.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/TextureOptions.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/buffer/TextTextureBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/builder/BlackPawnTextureBuilder.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/builder/ITextureBuilder.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/region/BaseTextureRegion.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegion.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegionFactory.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegionLibrary.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/region/TiledTextureRegion.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/BaseTextureRegionBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/TextureRegionBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/TiledTextureRegionBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/AssetTextureSource.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/EmptyBitmapTextureSource.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/FileTextureSource.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/ITextureSource.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/ResourceTextureSource.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/BaseShapeTextureSourceDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/BaseTextureSourceDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/ColorKeyTextureSourceDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/FillTextureSourceDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/LinearGradientFillTextureSourceDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/OutlineTextureSourceDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/RadialGradientFillTextureSourceDecorator.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ArcTextureSourceDecoratorShape.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/CircleTextureSourceDecoratorShape.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/EllipseTextureSourceDecoratorShape.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ITextureSourceDecoratorShape.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RectangleTextureSourceDecoratorShape.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RoundedRectangleTextureSourceDecoratorShape.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/util/FastFloatBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/util/GLHelper.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/vertex/LineVertexBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/vertex/RectangleVertexBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/vertex/TextVertexBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/vertex/VertexBuffer.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/view/BaseConfigChooser.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/view/ComponentSizeChooser.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/view/EGLConfigChooser.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/view/GLSurfaceView.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/view/GLWrapper.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/view/LogWriter.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/view/RenderSurfaceView.java create mode 100644 AndEngine/src/org/anddev/andengine/opengl/view/SimpleEGLConfigChooser.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/BaseSensorData.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/SensorDelay.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/accelerometer/AccelerometerData.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/accelerometer/AccelerometerSensorOptions.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/accelerometer/IAccelerometerListener.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/location/ILocationListener.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/location/LocationProviderStatus.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/location/LocationSensorOptions.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/orientation/IOrientationListener.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/orientation/OrientationData.java create mode 100644 AndEngine/src/org/anddev/andengine/sensor/orientation/OrientationSensorOptions.java create mode 100644 AndEngine/src/org/anddev/andengine/ui/IGameInterface.java create mode 100644 AndEngine/src/org/anddev/andengine/ui/activity/BaseActivity.java create mode 100644 AndEngine/src/org/anddev/andengine/ui/activity/BaseGameActivity.java create mode 100644 AndEngine/src/org/anddev/andengine/ui/activity/BaseSplashActivity.java create mode 100644 AndEngine/src/org/anddev/andengine/ui/activity/LayoutGameActivity.java create mode 100644 AndEngine/src/org/anddev/andengine/ui/dialog/GenericInputDialogBuilder.java create mode 100644 AndEngine/src/org/anddev/andengine/ui/dialog/StringInputDialogBuilder.java create mode 100644 AndEngine/src/org/anddev/andengine/util/ActivityUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/ArrayUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/AsyncCallable.java create mode 100644 AndEngine/src/org/anddev/andengine/util/Base64.java create mode 100644 AndEngine/src/org/anddev/andengine/util/Base64InputStream.java create mode 100644 AndEngine/src/org/anddev/andengine/util/BetaUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/Callable.java create mode 100644 AndEngine/src/org/anddev/andengine/util/Callback.java create mode 100644 AndEngine/src/org/anddev/andengine/util/ColorUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/DataUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/Debug.java create mode 100644 AndEngine/src/org/anddev/andengine/util/FileUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/HorizontalAlign.java create mode 100644 AndEngine/src/org/anddev/andengine/util/IMatcher.java create mode 100644 AndEngine/src/org/anddev/andengine/util/Library.java create mode 100644 AndEngine/src/org/anddev/andengine/util/ListUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/MathUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/MultiKey.java create mode 100644 AndEngine/src/org/anddev/andengine/util/MultiKeyHashMap.java create mode 100644 AndEngine/src/org/anddev/andengine/util/ParameterCallable.java create mode 100644 AndEngine/src/org/anddev/andengine/util/ProbabilityGenerator.java create mode 100644 AndEngine/src/org/anddev/andengine/util/SAXUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/SimplePreferences.java create mode 100644 AndEngine/src/org/anddev/andengine/util/SmartList.java create mode 100644 AndEngine/src/org/anddev/andengine/util/SocketUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/StreamUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/StringUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/SystemUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/TimeUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/Transformation.java create mode 100644 AndEngine/src/org/anddev/andengine/util/TransformationPool.java create mode 100644 AndEngine/src/org/anddev/andengine/util/VerticalAlign.java create mode 100644 AndEngine/src/org/anddev/andengine/util/ViewUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/cache/RectangleVertexBufferCache.java create mode 100644 AndEngine/src/org/anddev/andengine/util/constants/ColorConstants.java create mode 100644 AndEngine/src/org/anddev/andengine/util/constants/Constants.java create mode 100644 AndEngine/src/org/anddev/andengine/util/constants/MIMETypes.java create mode 100644 AndEngine/src/org/anddev/andengine/util/constants/MathConstants.java create mode 100644 AndEngine/src/org/anddev/andengine/util/constants/TimeConstants.java create mode 100644 AndEngine/src/org/anddev/andengine/util/levelstats/LevelStatsDBConnector.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/BaseDoubleValueSpanModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/BaseDurationModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/BaseModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/BaseSingleValueChangeModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/BaseSingleValueSpanModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/BaseTripleValueSpanModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/IModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/LoopModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ModifierList.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ParallelModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/SequenceModifier.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseLinear.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongIn.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongInOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongOut.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/ease/IEaseFunction.java create mode 100644 AndEngine/src/org/anddev/andengine/util/modifier/util/ModifierUtils.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/Direction.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/IPathFinder.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/ITiledMap.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/Path.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/astar/AStarPathFinder.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/astar/EuclideanHeuristic.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/astar/IAStarHeuristic.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/astar/ManhattanHeuristic.java create mode 100644 AndEngine/src/org/anddev/andengine/util/path/astar/NullHeuristic.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolItem.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolUpdateHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/GenericPool.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/MultiPool.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/Pool.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/PoolItem.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/PoolUpdateHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/RunnablePoolItem.java create mode 100644 AndEngine/src/org/anddev/andengine/util/pool/RunnablePoolUpdateHandler.java create mode 100644 AndEngine/src/org/anddev/andengine/util/progress/IProgressListener.java create mode 100644 AndEngine/src/org/anddev/andengine/util/progress/ProgressCallable.java create mode 100644 AndEngine/src/org/anddev/andengine/util/progress/ProgressMonitor.java create mode 100644 AndEngine/src/org/anddev/andengine/util/sort/InsertionSorter.java create mode 100644 AndEngine/src/org/anddev/andengine/util/sort/Sorter.java create mode 100644 AndEngine/uml/andengine_classdiagram.png create mode 100644 AndEngine/uml/andengine_classdiagram.ucls diff --git a/AndEngine/.classpath b/AndEngine/.classpath new file mode 100644 index 0000000..6e9239f --- /dev/null +++ b/AndEngine/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/AndEngine/.hg/00changelog.i b/AndEngine/.hg/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..d3a8311050e54c57c5be7cfe169e60a95768812c GIT binary patch literal 57 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/hgrc b/AndEngine/.hg/hgrc new file mode 100644 index 0000000..b305abe --- /dev/null +++ b/AndEngine/.hg/hgrc @@ -0,0 +1,2 @@ +[paths] +default = https://andengine.googlecode.com/hg/ diff --git a/AndEngine/.hg/requires b/AndEngine/.hg/requires new file mode 100644 index 0000000..ca69271 --- /dev/null +++ b/AndEngine/.hg/requires @@ -0,0 +1,4 @@ +revlogv1 +store +fncache +dotencode diff --git a/AndEngine/.hg/store/00changelog.d b/AndEngine/.hg/store/00changelog.d new file mode 100644 index 0000000000000000000000000000000000000000..62cd6cb79aec6cec0fc68c14e34f9f174be7af88 GIT binary patch literal 161157 zcmXtf17jx4(rj$owr$(CHcp<{wr$(C&5iABZ0yF##<r3yMu)z~&o*Qa_ zYDPH_M=8%hzegb?mdD&@ktRGHVL29RF%6q8W`j-Uic0!5Oad>8!UR6MvWG~<1x4M` zC>6AkMarV6k)=!e!fUBrbT6z)J=7Q?@xrQF{1*j(u#RK3KWIC<2O`Y->}Y^zs-iI{ z=mc-Gxd20jw0F`iVGoM_ea!1z(FGo%Jvevt+AeT+FT@Qei#1256X=n=2EazRQU4Xk zIhJo0?qibD*luuOMa#eFlaLq@025xu*sIOVxOt0skuC%)?oPNKPlsl8k!W3z`Yg{_ z*wbj%&z}EbO19}yd4`G+n*qX7oC|r0zy01N8?yyqH7Tnq$yYzagX;ML-nC)D^2jMw z?6waN-zlWbCi+9R-0eb$HmOD=UQH$FUFEAuCYRVG5Q!*`??%c% z{bR&Jdb_!hl$0{ZNmzXoKKXzi&G-OKhegIvM*er3A1jHL)EReBv&8h-EMtrSGU7&H zV=UBFpB*(WvQhgRdugHg48g0MWcJ1xSfJQ4;vnl!)<677M|nXRJT0j znY-y_FG2jvU+M-VI;RH!<+SkdB*x?OcuG`N2~PxG{?m{k$?}(wNeLH*v`XQ%ct{6b z+J(-@l|PA2ix%S)&)FxK^yq=P9yy^gy$C@}XrX_8tGdjKLD~kE3As2j@tm1&F+PZ- zl(B>R?@m26!vsg)QvB#+&2ff)*?Nu*3K*lA6-N+980}VWO{xZJa;K3pQTex8TXGU< z!wHIBa5l4NfEf9*ifsNU!Q6Y^ZH>lK7j`1xjM5A{AS4PBI>Ht$nr;e9*5l`K8x1S+ z2%WZxL*Vi_JM2M%IQP7QJkJNvPY%$X!;mj(`%W%-s6;S12H_dfrR ze3%(o8LU353@QBbNBnY$CHvcM>eVAdwtba z$+ZNf8*Quy?)Wc9T~a6eAdv)cRrAIyUw}eQhXTa_yJYvW0}z;p_xA&YmjP|E`xuTx zP?-SoB6f%nYX}l}LCbhLanwI*O9{D68s{5tAenW4)I4%xV`UMBh|t7OYl7glWMm8F zV-^xwA%8>M@ar(6!F~KZ)*VrnjJu-jJk@})UIE%F7$`!nFr8Jl60=c<)w)T7Whfw_ zgdIE&Bq+Yh4dvZ_U3Td=-u=7L1t-!^+LOSJ8I%scox(CVffN|J&U}eH^NxJT`v)F& zZiI^?YmG~Mc-9_7E0{=laNT4j;eVR##1I>PX7d=C<7Qz? zMk4R-5qRdTnINnh4JZHDN;D4Qm7R;<@*x~U_ILVOKHa>T0f`cR5%S02EhGd$dDjEk z+o9tJ?52^G`27xX!v78_KHOHGL9X8txwH&DMMC^DtjYMxR#8=QsPY1U^t2D+fO!?H z+hqh!>f5_;_O-wmbw91h!UVU)=CIzWZ_86)=kiCbSShnrgLdhpIM3|fSy|85w69vn zy$Z0VFCLv*SEU`*hG+7FgllXG8qbTcqi63b<~RWQ>%k83U@YM?;=yD84kPmVzNztm zlF?o;bL%hbAKE8hA1D+__m+#ZHTN!pIBBRzA;pN7a0fk`nE{P6*SSC&(+EWVi9E(% zFPzIa<}@BTwW_`Uj>BR6XB5}e$grR-IibWPTBt!}WxH`sndoQgrPu?v2P^?H23~n8 zi#i~xbjh7^_h~!c1?t6p345+M=jRJaXS4{7cos_6_>h{61b7G^1|Pbkg3(D5=PZnc zCYu~fRst32plu4$qOTwKoABA)re$0z15Z)+8tIMtuM38R3zr=xavxwF3M}RB#1w?{9Ynbeg zyM)^0)mMQg>&?oq-(q>U`aO8aFoBvS$+7z3YJS3mFmB0Gm>0X}mZ{3aWD3Sv9e2vg zTJN6F!9T*Qs(bxM2tyve0VBRH*f6yGUQ5s*bH)o{>`V9(eJla(nJjSCQs|)?EDCJWo+AeAqW|C1zgpm+$_#W9Pk)a zC?N|R^Iod`qRsn{i+3Pm4lV@Uvb0>~+-0{J%&z35)EMJw10kolGDfPG1SzGe!alLi zQzhvfKTA6%V3Rk+-yVb{oq2hG6Dx1#xUxIxW^hThgoMAdF<#hi=sO#=Ptkt4Az!Tj z3^fbg5MKdDsd$s-1J-1!OCk=cZb{##&_{~x`gj|_53ZXxdw$`VP=Ga><=S2#La1!)xCv5F;la|1IU&cF|Q5i8LJaaSPfJn zcHArW(xp3fRE(KfjH2J;m!H#t<%uH z)#QS{W;}R2xBa|ujlic|LmUEqTF7L(NB~g@{e|F(>O0BYoBta`u)%BHBZoas_#fVh z{denBrKJ?36}awoUV%TJ#o@q38*iW60Qxi8>2fSZ5{^g5N;urhdgCxDB9&ljk~?cC zUZmMo$Ml|D`22DYd4>-Pg6GsWqgMyUk`8_Ij(o`~Y_&)|8sz+H@TaCSStF*{U?vU* zpuw)d+CGeX+N1WLWTv_ImR+@Ij2VFmxCqR|+vNIX{(UEZm4<*_;wHd#-+@43#2WvV z&%bVk21n-{)ecrkCcnrwlO)q%B8u$I=_ehlve}d?!m$N@HIxRAIV7)BSxcjqq=Uon zZ!U3|f5>*}6-$I~hK-W7=OZEkkfCG_^Gx`uOduwmlRzbJoJC$oE~twZ=X{GEawv^8 zI?NT2ZOMn%rDN8o6spKo+M$Da1b%pCKdG1m@j<=7W!?3aqiv+i8)+vm?Lv7Bx?du+BK;Ntj@pyDG4*cg_~O?z^I8$-kz19o z=^0nmxfwgvl6n4T(foXWMR4X<(gogarcIZ{q_lZRReN@~eRwb529vkKBf6iCkM6sT z)&QHsEzFz!%=QN#B--3|9Y-^)?6}O}?Qa|x@=_&pARVCl`Cv13917WxOw-8%GZchW z2_{%D`Lqsp{DB^bnY5-FV$>${9!oCB#w`G=N~T8#YYm(cf~DKpH847THIlcnp6%e>dMx4%LglRrzTgqItT*E zo=^BD(ovjFrOq|Mu_gDMPQxm{eHf9Rz$1@jX9~AFmpO3Jk%2}fA?Y3;EVCSg$ysXp ziF@OxBmQH^ULQIAf4xxtAFhUew}~4J>Saefxn?lsHmOqM>wIYk^oz+%i3c(VzPO>~ z860#8FE9I&7l~r(D7`gG>?IfdP3&UR6>9R!T-{DxYn;OZh+i;B672MJmd~jV+Gv`% z%GK)hp%vuaiB(k?CQW>0d4Kls8-yoa*f_6lAbd)nWgdp;jU~lDR!#@awu`1?&koYF&T>(N(?s4;G5a`n2 zcG*}6nZ(^2n3|x&EYFLQ0M@*BJSKbsF+toqEg@W?`9V z*14GQ0fE@&7cQgO99-6}rbbq0zOb;0>q;G`R2H_n(pS+sXal7{RB1pP)g{n^(^FEi z6|W@{Q1E-O@o$Hvy8LLkhKLnlJ!~K)k|8%m;4a72c2YPnUFUL@gS6g$$H3%)i|b5a z;@9p`%)qk-LEz!`{``4SX7Sx^IG#&}j9YDq*=R z*GM-Tg{h>!qRvhd=E-wGw&xZnDwdrRLWt**`6Tn{ExJX^&Cdqs{CPg#kkZYZ`Q<@i zHLwaB)ytAFdIBd+qCr9a@Z$12#7O$O&i2p|Lou0Dqv zoiQ63&Rnk%puFQcxiA-wH3Xb_aV~NKwvncKFdl5nqnF^kAQAB&T|#+F$)g87a(opB zzbgO^e(e*i*Qr2yv(`FZRD=i&lOwh{-9ud|OH4aG)jt4La3E80zZhvJEI|k-Ezd^q z<=0%y<)KY@A_|C13Q@L~T8ifaU1O$Upt^c|DbkG9B2}vzG&~~|{XRWoRTtK&x_t%Kv{%~Q!!!PtXKB;%*3}hEduxhgW&L5|_`=8wCu7>lRmHc+0}2HhBO%yGx~e;OhnK)_VxyHzP}!unYcv z*K58JyiL(YXlUTds*S3t+Qf~X0YeB@>h*Cq6puHasoHQo^DlEhd07^F=buef0Q6WL zOzqAhaQf&}8#99wSBmOmo)=>??}wXnhcj*08%qXsUwXbjz@3Vz_<2b-$|;@GRaVf5 zp2TJcxhSiEz%sy@gOe#6E{Z8gxOUGB1f<6GDc$xyusw;N3!YR@QF*?z2WYbioENes zjJKrm6hHf>?45j8ZRgE|>=Dj-OKmyO;E?)8*-j#i11FEJ$@ZKQ@6Zp#SqQkqK1BhK zD8t^h0f^6f$QA8Bzbv_UaBU+{@mAy=F2;p=FcfBrJE+O3>_pF_Bl4j7ouvY9vik{yzTHty_8hE*PIUeoi7yXgx=LM1Qw?)I9 zsr3rO2L~_PUqI(9_|83YQWdA-zLA112=#|@oOeJ8yz~?@F05D z9pN2Da6r;%QuF|%J59o5g4KiR$=+1cf?-XEpS|5(KK*q{M<~qN;0F6^ExUv;KCQOl z(c0?w8*MIukxV^YS;<;qeS>hrzR5y^erz39E^wSqw)poMqh(=+n7-Mhwm64jG6e@f z=x5@A5M|xo%UwhwN8khKm4Vf^5arX*J|0N-8oQ?%dJwp%O0nO@s?{1>Yx)LPcx&?o z0kb>Pjcj0F^z%V@OVSNw`Ml@_&Gbj&%4CbquQGO@^4Js`Dk>*vkfbLzMoH?QVjvWR z%~*FSJsxzry+&d1pV$u5$Ia~B!a+i2GwbZJLiRv1_4Ki+TlB;b5vwAMDt%H?{Bd8&jjx2kMq8 z&fKOCby0puR=(K89)&rot1oilcwc;u7)oAs+9fmO>UY+9Ii%}E(o62sdO-xCjChl7 zE%{dakWtY*m`TeVHu}Kha%sHlTsF7`<0|$6ix+==Hxl~E1(@$v9I)@5KZI$?v#mm0 zbXJsoRz}J7I}f4iDV`yo zX~{Ye5OXDs2uQvOSIr=bi=A3ZY%#7cRg%H!O7@O-Urpu5 zqp&e(03trUJ^&1O1*1=q_p6q&FWJ5T@rZJldE}6P_ue2OBydA31w(0T;x|?(S%AHT zv0yixY3wY@x?xY4!B5hzJ+dDL6!$FJZ8Lu0^VI~(NzL;WX;!gy>1D)b_*zVcI@*Bk zqe>t7oeAypjR3o96Lq|TG?siy${{wWqq<@<_=7=K=!3IE+3CY0(n!=dNQvJJn>srV zgMY6nUnsi2wjmj~_@cSP9L2oL?;!h1nKHg}?3-nLgOj+vbCjLFC4iQ`CNk1sz!w`v z&B|Ja{FcWHj?p5~GDeotGc!LkKfhnA$DEs(3P@e-CgvF1Axo4LYd>{TNn(%j)w zz5T93cue&*{>wi|1|UaXn4eshl_+V-tG(3@4jwL~!v^Lq(J!xbxD72_Ua;0CJ~I-| z@aPRvHEsN@xadd!FZ?HdaYiC~G#FSDQ!}|3Tty}q2t3eQYWT=@%#l?8`}^Iw>KtHr z@&xeZFsBPI-ADQ3c_N{0^!4Lb_S}vpSkmb`G$Wi}+s8Zhrq6+gOu+G(uuH;6p|;aF zw#TztwIg`BFpf%l$bc8Lmq32%yT~QknYr;uwLhLgVjgd^7r?Mk3w1D)_m7S@n0ct4 zQ7qsuls&+TlM-UzNTV!lH%x@&QtugRuZ{>m+OjS{A+xN?Aiwfvj1fH!JOxqxqVSd@ z$ewgZ(Z{Reg`dn8?3l2o*&mPsVDC}EyqUIX3Y?7D8Ke_fWOMB zsz1e)HAw4{$(8^`&j7M!`sgp5z6aVp$~`|wlqG+N(yA4G$fA*B#wn9Azwa`PlK+=e z68|0rh~6I^#l)qUmou+G4iZna9E@gRGy3fJl=roDVMT#B6|j5RD*A7jCO&tFY=!zQ zHP@Z<8g$Jdrgd!tia(G+-COr_5B`o9y`{vVdx#`c^7<*E%n}r#3p&%N6-<98o18m* zAUi1~Lh-2kR`?XqlyftBV$bYw%MiP@h-V)}D7hU(wvg+EH!dXukCBElggl&bmJo44 z#m2t1ga4x_-B;w}ZLkgvmALk>mr>}c>+u#8m4%Ioxe_z3dpui#)q7yew!DkwFALd} zGt=g(bP_Ff(5^FJv@KMn46)j)WlbnbxY>}SRB2P582#p1({sJcsZ}X7gi*SsQ%-p# zQAoJJc@b~SjrKVfgMH51M0pU1wZk*Z+r7ewn3{P;dmgzi;TJDFmEb=1##~+~y6(na zaN$U6r~CQR0=M`1E9Aou$ogZ(@R9DSo^8*QJ{EQc8FAxkCG$=TPVIRw|!HTanA&_k!S9rClg_jr5n7@9=usdDc$}Q zd!aOoy9SAgE}4t|@D0eB20+L@1@)j9>nCTurk|KMV^7kt%e$0b*8=r<0-JAr4hs%? ze(jl1-oWRFVKu)NC64qlJrhdsOko9?<`tKe7Kme@66#s6=Gh zM>}pU%sPgc@M+6hq^)mWiyFK<8GqcVFD9{U$p){srHaV&YUrpgRh$HtjcIUd6m}q@ z@tb#0;C%=wa)p$3u;*+=1T#{_Nh;g6R>o>b4418{MCDY(Or&Df9G^oX*g@&laeWUP z4kE-DzeLlqPRL!D`}bLPnYPTIa#)Zcpl(6=K|M!*wmpM%ZivKuqo(rIzs^jzw)G53 zcwX3=+#=15p+PUIpJU6^;daD@?gRObE;vG=fY_@PQhHl6##^oL&Gvh(LzKWI zFTy6#oFr7v=5&HDk(F4Q+8CI~3FVG1mg*%_33>LAOn3U=fo1MjNK8@pI~*4+4rQk+ zI;3h^$2F9EDcoJ420#C*f%cNz48U7 z#tHqVL+D~60WGT3%GE{Utcm%FjWz|6`!xIy(C!NS)x84V##+}HFH2!o{HTVqdX~IT zpktx|knhY(_>b{~fsXNu$H^7RCbwEU=l%?&O?7ieZ3jy&k!ecf=gOI&VMf3krPFRR z^H2LgZCZc5NDb0+?xd$3xeqE%XhLs7@uY|SRkUYT3x4L58ip9Mfx(=n7^O_@HUn3cr2*RaXZ$WIqHM3A8~$rH$2)lP{Ev_=cj@QPUlP|3%7tYZ z7BIFE1Zr%v=Ab$AkgpBzGD}`w+~yxr!NsdH4@J@^{#k)E4QOF(3nVK9=G`w4PB%Uk_0DOZry_Ki)wg2?z8gs4v6~GOScFOJ|R*Y+Eoy z6>0t&5bOLo`JwlKmz$*(D3RysQ;iC-M$~Z#@(YwTgv$?;mN}N%&@`!F?I*t^e=S)cPb7b5ofERcI2K(jrFbA;;|01A?@SeHO~^^{@#q)yiQvzYA$Z0wvboK z%_+B74i0YOi=?Ogq02j{B*#$DV<47T5cTrv8DXAF)#`etGijo-uu z32c7nMbXl-91KpMp>}<&vW=`8NIxPJOcwSGE-QirZfx!jbz59!o;6$T z)mx-XwFIA{*leUp0iQ{z?;sas*MPlO^w&UtJl08=(>toZV9Z8Eoo0i&=w_6T)X4!k zh4srLje-DKTE|9$*^G75-NPg(#e-fJ?T%7}J;)TonrC1a+9=e+I|dZGN?&kTEG_rY zRk)@BP{0I!m^1xKXu($orti-|s8BH)yDhP*rDzfDy*@Udad5vgKem1D9+_HV zGdsAG@#BX}DDao9Q?W0R=oMD+2(tn%J;s{W(oh41o9ned=gqvSEkD37;qLQBI2lZ z##wg$6s|;D5MPwMD0BlzN;Yvh@>bIqx?T6ax4*0$HO+pf#>987I3px7r08SJMl7Yzz3sdbz4PtXls1b4?Lej{doQ z4EFN&^Yr$6=ri!@g8G!f>q*)KYpZ0&vS_)tmlwhKZ(Z{5F3`lcn_NwdeQ8Diu-R^z z0#&BMz`;o+uH&D!vUj+poVNW=AK+vn76|qav>%WLj*QglyGwn)TJVi&J?%+Ep`n%> zCXsCxt7y?8OD02)#G!P|j3tpH9|b9PWQ5y=4#Z8t~&H^r9l7I*9rG^$|io^soJx;;6!`$XI$l{>dfZ!&~}|d+p9L);MP< zOA-|H7Kjt$@Ia3(=<4Oblw?S#<07h5P%gtqRJ{_TCP524nl=Zw?MDG8JiKfLULr#a z0BQ%g5VDo{dXi@Uho?*42fwpn6iOc3S5$rIBo=28wZXWpYutsz`o*T^7L$v>YWP>j=6m-&M8q} zi;kQhC!WEqPZnqWS=O{t26yG6t??nrj=il4N?5K;Wng&v_`GK?+w9?!Jd?6@L3~%w=yVjJwQh1;si*3N1yk zJx^bR7CV)-QPGUU=e7g;P}P4;e--qCma`4i;(4j@e!A*Sh6c=<;q%3a2%P*Gx2U{^ z^n;3#r<}-YG(@2gMru?>A`@Phyn!JlEpg_29JZV+vc&TQ#fX#eosWx>H>&Xl>1Jb{ zIps;#`PqcRSfB&7Y!K1U#1#-X0A^Cro?^0`2+mQIiRg45MLF$g7(b!R84{pk*rlMv>6;w+7u`3GVl z*Pbxn>Br?Jqe7-8oG64R6mbJWdp)Xult0dq`1+`%;_m)#z!@LH)<|2sgzGk(Ak=x)DC(Qr%%0|%UR`n`V+9p zE}xp5$gB+woOtq4V91?NqSSG5G;`>H|3kD;t$zS+_fs(e23K-X@+gsdf|k>E|I_1R znoKbgb^_iMM_~1bkvrsxVq$*n)2}aQk0|iIwh9imQ8ALlcveW-FnxxjKS0C+&E?4> zxL5V9LEmdcjTxs6CM1f>hoM$h{&A9@}D%uZLY==lp zpTHl&5l|${t!7ktEj<_wFfCD~`B~eX$RznqG2y_dG)nBvP*oD%a_0eo559V2pk-=s z#`(17C@d#sDZ7Tia-By z@=C3k-6<3~zG`B0!L3nK2t^tbTiG5w&$zN~HKk*wjRe z(5>69xf4_D%`|V%2;7ms`jV$yZOdbjW||Ee=b;4Q%FzF*Z&h*hnP%-E{k>!)kD(hk zahLE3S#0WoAS$CYnGVHPDnf*-ce+t}_mYx6TEFi-w3XV3l?E36qN2TapP(0Z)MHnl zKf6>fhrn~}IhTgK_9k%@XBH#k`A|g`e?r`@_63hyWFZU@8r&`1#oEOcRR}jo*Hm{z zjE=D@Pq-$`=aDO2s+nM(!2PF`x^pi@uTy$rP@N*xQ@HIdni>k*@pe3tFtdlpH%U~y zB%&qb>EPVOqR#1U5D6eNY-$nZ6i_;qF-eYVc4$yw+ZGb3M&Jxy`RgZ8}-D)mZZD>H8FpM_qCgPt!b2cs%>AJcW5RTaP zF~(eW8cdqoN@%JMm5XH@oQ1*d)*uZDo#D4Kp-x;?8cVi5Hk3BG1(Iofpq#iaiSbuf zs9@uHp=S`T0=s>j-ye;He`P;CI}3J(FQMFIL0DjBMTgzZEO4%V$e9|5WV^(t*N9VV zZ?*bCG|uI;yj&PJehW5V$YossM7NJ0#jtXvOO*J&r);et%eAR6v;&?da=~P@uekue=mMpC$T(2h+<#XqY zZ%EFPtug|4nn7j;`=6vtsOIzyLw{-&c%<{|nKp)q^_RZE*b|F>T9}B2lX|+VQ|AfT z(n)4tKRus30G~!zgnTa`WB%DlfW*#MRTDa#j0%-3I|B#?e)1nvmX*RA7N0I=dk|M9 z_e`6g0N>0RiR#jO7lF6-97nloP|eydwRW(lz^5=R(#|~8#nc0-T`!)7IRr{eW&}u1 zGVhdD%;VuF30pVYnFZYs5}`KDF}8>azFcS~&mU7@s_q`sL^r*n^@(>1zLYO8$vffg z-#E-eVx7`8BO;VtCjBP7=VAHgMYZw#FhfE}5~`;lZ2)?gucVr^vi8P?-EHh)h^=vR z=p!aCOvD5IoQPO0Xaqh1h_EMS?Z>R+m=+?_O50NIfR&9vrBX))4Gm%PlxB#Q+Nqql z_@AjBP}=sL%TC2nsa4!_;b&Tey5=B2an6R8zCvNdFKmtbD83?YSA+R{5~~@&PuFJK znG5eWTn`guHf8==0{9Pmu^p(<_<(}v-(DbL(3V2qL_4nWTVX>JpPJ<4V)|V`4^Cjj z=Exit`LlOkQ>9oOHt7c1FUlVvjCoMR$lWCb+5DRym&OTyZ(WeYpSZ;t4U^g0%7}`Bx)wt{0?%D+NaaZYNWH!2-N;)J)%*QM zJA~RAnHbzhtk9{8I_j>2P7oWEVEU zleLv$N?Ez(DXNfy{sMO*!b57Vxp>1n#XA0+5Jx5K>4!j#)cuj&TsWY)-5UClu?V}h zXEB1~wE7%zc?O{l+#3ciZ?y_J>lSzd zM9Z9~T*+eVFnbZT0q>P*n#~~Pnb{zfziL5vvW(1QQd2xBZz<9$c}wqUOVuTrN6s;o zvT8@;2q~@9y9+0x3noD$G6e^l~|*)KV(A#A6^@r5DYLwwq~=XS#bN&+Wg=x26Zit#^O({? z#~vgY;OPWSx$zR-6R^Zgjb07WUT=d2%^P)p^>iLHu1|UIeUmmN;eWehvUCCu@e+e9 zQD!72Ei1&xMNv}ms-(6jaK@kLjr0v99zuc(YpcLC3%WY8q_W+t&AflOK6LdGUIEA! z)Kl+7Lqvtl@hqlvVPIUv&_E{3iqsux?{>;M7eNV40ig>lxx0*&*WE<$gBsNvHidrb zv=jNJ)MR~l-4aJLI<5Po){3dTv36spW%0*!*#6F`=prNH9=kst-bpTC z8*(XGXl0U8h>8|5lz*HI7<6sNh24S78T`nfN+s}$kjxv)frRHasKh46WxC-U*@yDN zGoE{}yaimh>1(6se{GoZ9NJYGcw7nD&-VcAK)+lXX?pC9pBuxz$7lKfh=&XJBdw2k zk*k4%No9E&=oV6{*Y0|@Vai5gE<`BezV$O#+rt2`Qum^zg(PcpjPKkfbgQz2NG4UL zF?=dWr-}**8pTMHMuC%>crvCl%Qbek@BF7+vx=FOx*7J5BeSGwllh@=jR01Nu_ci; zo$#S2F&<_eAJjQ1r*(W$P@Ja{x*tX%U(Fv=Xti<1pvd{NK8G_dX21QM92#CV6B=I8By(La?_hO# z{3gHMO_9R?QW)skYb43rMqBy_M+6#eLzXJA&#+p5ie}X=@i^qYkDmU432xd&inPn| zY#R&jQS4eQ*epCk%=_UZPtqG|r>CrdmElH(X^vXXA!QfkYlzxh&KZ?WFl+Y3=#=-( z(5U-QFXGo`p`NeF1`#K)t9P91f`GL4w0 zQd8uhDEQzA6KI`&gh`JUlTC>TMxc!HEw!UnCCOA-63cxB+;f^r@O)~v2qe=wfK ze!A7#04x4Aceef8!?3>ZDKPuwFGm1$bw1HpJ9~t=1#E8dZ+G+0b@+|Y|Gb`5XIkI8 zo8#G3%#0zlZi72rA?zxnxZH+vSGnuAY(uI2fV0_ggXHlZ`SSAdvq&gd1T&1>^l*t*meF;|DSyQtBSf0Q*>Lz5rpov5AaWRe*)mo;><4QOWrRCtqe9K?Gw z$}F!w=b|io%vn$=O-Ud2&{iCWV=(qt*-A?cB3sqq-MsLYCoIkIGT4>k!n^ZJ}Fsyhd@e+{=cPwV`I++b5A*B~yV70HL%BqtNq|KW(9RC2t|_;vsiD za`>bF10$g8&!`Vz6iS9VdSWre2wlbZfu?TPnD+`i&flk)G9!SJg_wfoQJzDEx5$Wm z&pDlYKJ9Bqmiw#doYpvPeA1N=S|7G)>O~O7Xw!39Gp-dkdt>MX z#>z2glxM;Q(H~$M(;)oj*mm>)g`R)DxBoI4e7?>brY%bg2F+$o-xK%=6s~nNs4xO@ zLDmZvKg(>|4H1SNdl@a487)NFyb8?f6;8Ckpn^N-1VS zI5AntR=0j(9*GiWM`v2MAm2QmjZfBdp6@UlM~evr|H<+y!N~iS-fzUQCoq3LiTRm* zBwd;~2`xgRDJ0@2SpLG?nd&{H>^jHke@*$u14^L%eHdOw;4=a4uF=9$+(CawV_LqLt3-WkFaHB5w-NYhE< zYq7(_5T`p}MiUB0M#@TzeXpylWI_w0Lwyk*)>Xx>vaG+IdtN3KdyoHcvy>&;SYN|! zCC+Ne>^;#xrui3oWf3pt1Hn;H58r*vI5zfNIk7!FWtGj8&r@a#L`67WQGRcjQ(}(r zD8y>uKgjqOKhU+OxPajjnOiMU5s`-~l3)YHCYE&aV%f;4E`9g#yZ~i=41xZk=hQPa;*q4RQfVe8r*xnKxT#$XEF)C z7rD|Mq_~ysLwMmuio~@UEb%;hEbphY(d{5KHt$^XF{YIR+>0>2(c{9cYnS`4a;}A4*lD?=3khRk)Bx}}gm!TJ2n61T2zvkbaACLLAUWdYb zkt1OU9Y?hH5NbHOQ{Q&E@1g$Nb|p47NjPwn3Y(@2a6t9u&>Pf7=p+jp|`x}SOicNl`i_X$o&NfmBoqT5Lo_oqXI;C;Gtum#q zCa|?pW@bz>`%N;x7|AgwsMLLkTh?Je_1YkabL~oS?Ia5Mi=;eYKV9l_>c~~cfzJVp zFBXZf1yp9v;i(vQ7WNqdsSkj~#1i2@6so;?m{kJ|C{fc%L<%YN1KD` ztP~lXn>Uq@!V3qvM-_B?G`{giV>|Gy1x+aazW6q~=PySE&f`0&GUY}#ov@15%pXh( zU6xv1^ux`+G9gu=%)xm367`u6+wBHSKVun*OWzvmCX6cC^!o*XyRIyg{`sf7VSnQ*&3+I3Y@E1g(*-*`d=-e%c~V17@k1(mQ=d zdOKLcH-Rq?I3(RyGPmaO`xmM1Ld;5d>J$~;1p77!p*2XnC_kV zoI9%risdOOwM^_Di-Bo3@Sg?@g~N55Cb-)s7L)F`9Cg6%dJOeSNnut`Im@&?6V%U`mg|*jg10k$dd9(SZ-`Rw3 zX5)M?{mq`khmi(ew#phTLalUaQyFOU0OaJ^l(dU%P!SO=e!`9piDF&;KciO`RJEYk z0?#BeDmVH1hhSpU@Xy?d|@Cj!^CY+)@4w%M5yz zk=`gzq836i7^*Y|Qgiz&bRp?Jo)bRF-*#jTRH718AQYJBR)#DH@m^BRG%r}o8YgL~ zW%;~3#z@5jI(0y-vIJ}!hfIVIRNPbH@wcTYC(38j^FUU8&Kr{!GvXc4XJf}S)bb+# zj?z=AmH3CBU{4r0<9e4)$p?JyAa$LIw{8667V*87bK+lo|Fe30$M>rXiAsu>L9dJ1 zv6R_Sd#c6oU^yjd>{cRg!uWmS`=5xPU)o2L4pW@ZOIiZr~F<@Bq!j5VDcd<97ie8Z{7oEC|99*5E79sPik_&#)*) z2y_v?ZT6L#Q=L7GzSXtj!Q2YRsR7WO2Hrf>!n%c_jBh%K_8k zDJW}nd7aI_ddr1mUCk-)8g(pb<3dlwOD2jT4g_nLmLfq%F{=?FCI^A=^EmvI-8d*c zZpst6#1<7cR|z*5!|!Eb<3J$0 zjlr6lmy*I)oaHV_;9?>6Ro^M9pO;+>Bt{35E#KwYe%kzEUdE__b5 zWgNt8ad79TRTNLgiPw@JgiARSw(-gg!`q8dbO4;|Id^~qIP+s>NH&({`YGzlrlecI z{h|>|+7uagf(H3ruYC5>a#1{Dyt)2D@nQI4s9sWa`MA@Y`(PcjXOJF^*SeDv)&$K) zamFDcg7vou?p%DQ!pJwr43+PHOD4U2STnlsj6ba9 zIb)J|x{80dE_ac#7dUcF^4QKRThlc-58xT?kAXPDaoy^_Mt%(s&LJ5Gd+s#XE(Wi- zReSd_%gD5$p>=uyPjKt>7aoa{B#Cwag7)c5j#*=1{h9y|@--*{~csN{k68Y_W_Nc3kY7ciwMC~2>`dDm6? z49P&s0UzYERg=-WX=0=dMCtf!GMb(z`KdDA$i^dcc?JaLvfEj#_GtSvRBv|xMMKuL zReaC;Suakiz~P45;p%5rrC4Q#OcYTz0xfsr(+e@Yn6qh z0lV8gTY93fWJ1s-HA0ahcfk(&>~>;{*He@$0b*?_Ywn6fUYFX^-NP^-nx*wI&~wlurJue?+YS_zQiAK8K*W`bbqzDb<@uhuyyUSZq?BJ##uz^ zMQjgo3-}LZ{!g_V(Hr0xWwR9)Q+6nI&rqObUL^Y#zS`S$G!b|FeZ*M0&S@sf5}Qiv zn$ud6+5j}AE}E^~Sv4e%Pbm<1`&rCzc?1pd)sFs-F2Em3N-&V$A2)2}ZCk?RYfI2f z%2>=ajW4|O`uEO!j_weL2C%2@5l2uh&<P1L(8F+S3cdIu>kv-X*93w;)4u@@3 zK;$`t&eOCN?MbxAVO3Ip6sM``X=icU9M_wN_p6@&QoE?}`hM)WH;&bBbgl6aAzM z$sLQW-Ep2u-%%vr*_w!VDZMZd%^j1{*JLRsKB?H7DuHr`_1T1F3QL;nn~ADHD`dBt z+U@cuLefp;X&zjh+|QSC8AVxUzSJ=xw40B1o98E zFBB~KYLWM+03w=^6GF@eqgC|Dm)_sy;FiMmnx8-^?~G*MvJ^Qx5GJ_qq;Ate`C>Q^ z*P)C)C;hv?$R0&O5*&K`y+A*ByPV?;-|9p%wH;d~KkwndoSY!m&ea_}wqBc4??gFW z{<^G^wsfhZf07^ssJN8Y1bitYtYt9tIc*%Oup|flVw;k9*tMD0bcUEad`pe-6)Ewl zzIE&XpBpR3cS|$oIZeCcXJ~sNKO)#dWESW(NZt$1*mO3#hJmBZv|uwlo(*dItk2Dl zUyjfcIZwm(Dg5tJKFIMi*qst1pLx&1RS3jhNAq0u)a9gaJz;E-50KBmlc?UffLjnR z_kCMKpZEZ`l_FQ&R%kF*0M?O|z(95c$1*udbZ7&&8kb}5tZ(Eg%##;8T{2~imcb%t zB1k?)Elx~LS}YkP-lrd~d`zBZBPqP8xMt}Lj)f)R2oyt3qFpZa@<@tSGEz&8B&Lk= zKfw)KkgVR_CAtlct)`FBOWeIM$Lk>kK7rAn=bsO=D`+05o)dOezF1acZ(vy7;m$dW zJQ!UMhUn=x8bbq6^csXj+5^#wI*+HQwUSnVa?RKP2viP9o>`7bnyr?RyAZj3h6F&kRK6VlwE+&RnHWuAwDi#h-Fe$mP z^;avUmOu}so&XaAIe8PDXz5X@`BCYa2-VEa!D8oP!u$LIT>j)93Q>n715F)mB5eF{ z(qxkKCQe}U73kg{L7Uixgn8MI!Gokp<^(DE$f1g>$hL|&Mc`JZzgSpUQvog@7#(OX zu9s-MA9uB_K@%K3v~1uVCBoWDelGV?K|!yoEd}iDD`S_Ecf@u{ip)-6@BYZKUCWe+ zm<3ITN_i>|+(__w4%$D?U*+40SMu82rY;Kd*Ie(@J}fiJ@WQ{kRX_+J$p`s=EDXC? zGHJ@Rv{UN(6r>5?n%d5^DqHd2gf$(9znFHj!;_i`Lb*VqiqKm!kyEt3G1qq+^=HD2 z=z_g=CQ+H}HZ6ONE0S1%9Q#H!S09(m3hr4KVG<0^ajdxoyB-2ZUlJhlUx z4w(Z~PKERPa--=5^tX|Y$ak{%pH|fQvWm%hk*)H4312_~QLEzSkITl`6wxHjTO2Pi z1}hxBXwZBPxUU)6q(SYeBmg2?S2;j_7{j3{tQUM?B4J4mMK486PVR&~SzaJ98;ypy zAA~xtI1U?=KF!`%=S%Oh(a#F%@`v@{=Wo*bhKxamKN_ET_D`>~0b#{$>;v*#gkEny zS&#UaZ;n``FgO#2ndXneAa)Z7fwUYji*u8#;J6mCqxafeP~GCBpVn}x;I+E|?}-?> zZ`3^WiGK*Mpvezq4L$|QLZsnr_yA~sZdECfoHROPlYeoV-{j$z;MzN?-Rq4Q{yJsI z%@_bLu}!vbSQxijx7DZCckHbw-E;OS^!M?!_nK>Fe=6a<0_QSNA-oBnYLDBhRl#gq z)0r}nqcA;y1ULD7K!$IFV<6&Trucgdm2a5c({rR`4A9{0_CgP>1eHs>y-;Mutj#$> zS1IL8|3%t^LsKyt|Ab)Q#oIRMb_jUD+XTyX-yd!61hrQ4767axu1^}22~BLjndgg0 z2b0}CDO29;R9?uTu$7%fYPj*xbhL!-gQ2J2A4OIf8BG+2lkA{tperQBIdxaqf|&L< znnppud0A2w4mZtP^NQRGM>8_YnV7bpeCH2(nr)E9+ynG3J1#*2KOe(mMn*#MGDYi# zne@K7LPLn+XbHEcfcRjcy94)u^R8@Tukb_d%cVVmCXaG8Vft0*e~;xy4(nnV&Wdqe z(BiqtuQCE14~RVxZGG5&@mV(iA-aa19p#sSqL4OM{ru4A;z8e@g=&sJ^pRVg_%OoKP05AFAVkRRdHm z*bgAKgsj&~r{UA&UzWIeb?t484}q_AZ4o}`VL>2_d|EK#6^!h54>BB8s z-ocOM47P9gIzHl!oZH(W@{VXJz?qLvVviE_iq$Aihl;9K6boN&4uIf1y>g>0A44el zjZj{*j9LF_aauzQ5{ZFWB?|%j5xPb1I`mSf%zgnvZ5x^-g zl58-D5WUK66pfknVXMZ2jDd_$ZnX)acaQ3YlvO2h)ora2xvthI&}AOU#hC$3RX9V; z&8-H+@yECi<$3+aykFrtR_FTd%X*xplHYgU;Q^=Tx!=mTsgrWlht3n75 z8qHsx6Fs8>iDfa~|j2>Mk{~d+qi-1fm zhHfG;IyM-vW={IE?N#2rULfIPi$XlAdhG)et*r+L*m4v9^`->py5yN4Eo{Wf+`voG zluxL;20U1keyl3bQU-2!H{KRiAtH9Wdf<6xS==||7w1P(AuJ<;F5LC<52quM@Z6EB zs;fT#ZmkxE?K}!E!QWm8t9Mgv=5TgNZYp+P9x!xT#;IOR&+?iizWLzDNjAB9LbB7X z6Zk0Y*ujtGGB)sl%8_1Hw_lVF&6bwGA@f43jgxo zE31{%ZUt!`1~6^55Nm>U>H&xEe>wRRiTq-57q#SDNoe@9fDrUFV z(@#aM&P(+eYE3n214j?a5zI-ufpK`9O`Q6$uf=zxb3fAQdGp4|4@7EfoF#o0@)c^| zvM}r!`+JZTkQ@=?n$g128DpDZN##j-!@(>`_6-WYLPx{=O$M%=FF7)e)^?lktG!GR zXNN@%<}d6;H2Ej|J|{Mv5WzqxN=Bi4?dY8ILS4p<7DQsOF!Nu4+W}-ly0~uv0+Q(U zOVmd|(xCi2JBqMFATDONfw6sVb&jj4z4VLse7~vq9V=-pAI=H_M7#)x*2M?`2UD@Y z!&_bUWAK*yatuV3f*X}lV0?^>3CBRgd*ThE{y-3(b$VL*_^OEY1Q(%0oF-`lR$!_DzuV=Q;8@i+)|@_KP?HNtHOrb{a>UD`9Vgw zu!)ex^3id@WM|hY*ACQn;E=)I$SpZp+!W_3cD~e=K#d(>seyi=G{2ALhmZOO+NG&V z<&A0xMK;Q4HLbN3GmT{^Ina)FW{g=?2;_fIJ)*v%zP5r@@BuX~d+Nc;Tuup%a35F% z4!jSL%@TI_3yytvJC@XG4Kx0r+vQ8FIBW6MqRnaaRZ8PhdprFdKJ0_4ox9*)68MPD z35EG`Kd$pR#pKWLPs)(qZhsJdeNNU_ou9mQAheOwd=`nFgc|Rg%aFK`p%CLZZAQ6- z*xbScwVSd1hZp?UJ?Qn;PefcT$zG+5fFkJh{0F)rhog}tIKhcKD&pXri+sO$e2$>M`LIC??w8@C*5b^Us!`#a#2yf>L35LU%49K$v8 z{{Id!Yup*z^|iL|y45gf8|79q=HhBV$?;r-rR1kA=1XAt%Cq1rX&Wwuo0UY0gB9RPq}>8K}q*9;%5QrD@$PQ(Qkfb|>mox5Uwt zuuY5rdq%5_Oe2TZd0La(L(coJvcvEWCwTiZcgaZ*yasnpC%j~|)pR{abKQxC1lF!b zi?@sm)3XQQ9;@xOjE#*h=i{-sa+@kxxG}(>CBwldww>9En4brxpOf$JmD){IjKN+; zbo-#aP#`=tYOtQU1#BOjuF4hx`paBC)1A!TJD{L*(DY+&J26X47H0#psVorb%(GL= z#A4|-Uh^J^?8I9Y5#>wl8co0EU#5MS_acy0>g_1L&>TO77U{fD#yOJyzU;(yX~NaL zfGBKn@qHs;Q}Uq1XrUvQyhB@Aiy(I!^m1&D_KOd6n;4U5a0b~mzKFh5gpy&W{jC+` zTwEbO$4*YsB>Cq`!X$L;=QURqN0gDIj@??6bqAOA7^{u33AQctsP8%7hA^?eyy(}< zs=zky(T`1UlDK+IEmDgZ#}ZU zC{GEyoOYD&heW&P%@kEAF0W`#c~1A)htS@w7(qjP0)H_DK?e)~#{=icF@O;lB9;88 zzc~tu9A3lLgye}y|~n`c%##z(kxFe=ak*+*cFh0-Zav%SrlH2demM}*r3qPQ@5MYN)US~V@Yl7-3#rj^WnuG0%-qbG4}7h@*}Mr?ml}zUt&PpJkLsrM4Z(mOb}LI!?Q^W$9Znx zb@$1ks3NZWRtdDtb$-vHa-NMcXcXAm_v+lR3H@GFY>_H+Q#8hOPVV{wz9n@Y1?+Ux z|Kq2|kAB*Z6$`7;ehc>JMo<=5#4>q%8%J()k}UZYsWesB^2folrDe{MZ8>LSm+EYb z@I5{bKL-TvZ03 z7#7GjMlmcBuJh=f{Q5Lu3c>=zTh_(N-pMQ$rtm?IC9<&Ev2t7UM09MDuLt7rQ*#K# zX72G^y_5FfMmNtp$M?ynh$~bB}CzD&GE=dFi%q8 zA8|bzeQlJ9xx~PP{@aonh(NR=om3`<@eoj|P&w}e6p_(HD;2_L67l}jiUmt6X0}a1 z(4Tx<^KmmrZt-IWikOE3=CC>WIey~-<+M)aH3`Oi^C&c2_n0hdV`;8~a_b+?F zgT2SFtBe$55sic8t;d~7IkY9<+e{XkJe3Z9`HghGztF$eU^mZ%ZuERozoQ`|@F#~I zo=lZl3alY^J!KKSxOzj*fttdsxQ0Qq00(8|y1JG~LQBJV2)jbq?+9KwJBmAef?yI( z2O$5JQLR6FMGR1pMfgVVzgzN10lU5mbFh*>g$I_w9i{f5!%h{g8_7k)+PdPGdY+Sh z&UlD&w4CrPSaUoGGJ5vzRC6po+<}!X(MROeLK$~8PiHkJL)tfC&=gbSp&uYwyoEZ+ zW}+Qtoz>7wW@h2q5Dg}5qaB=LAJQyUy(dqWj)zWwAX|+q#mQRHTH|98xO{$I4OR{I z%W7VG-vJlta(%1t;{UTz39aA?B(Dy=K%A&aS=I3j>dPGx(}W|6Z22dyKh(EsX`FK~ zA)~L~ZBlgNdJeuDqoi&Ej)9V*SX1dlE}OBI0iwh99dcYTen5f!Ka27Y2j=_~FYN z3@Bc=vYU}=QUuvP2>H2Y7O;ShZ?fDsbvd-6UBn8LPe?tr9csAboeq_%TD2lO#7!VD zu+<5!9$tES4R(oBa;h?v2;NxcuXmVv?EdO;#UCIa7^MsfKWvOS`ciWGq+`aI;>~i) zq=jFSP7%s0y?Ohan_SbE9Pmc|$h6AR=69SozAF=4luH5I9UeAT6@LZI9+I4|J$7o6 zxGGG=1ku3Vd_|O)0!=KeH#!+kb{N!Id`V(WAj`DEqih&gh^YDX+O|YkluK`aNtx+? z?YJ6aJB!Q)ODKH#`i=;-M;460p9l6aUp21;R ze<~xG$`GK9t;~2po?LN*=_Fiv4*c$3#PP`w3c`i{m{Z>%b_}3u4hWi@xndSADl0O= zrTl@)10y|b!7SQ4#EJH!V1T%2Wd4W1nBNS>UJE^d00w^*Yl%msX>+q4$WK5U*8cbl z5x#i@>G$7%PD4H{=EK}wEf2Bm|HiedJvDV1PG`wv{HA9z{t`5dzSIx&cuz ztpWSFy+woK&5;2MsG@R04J<>rmXN)3S+dqr)?0-v>bAM$h=06=jW_y`QmR4TG%Xh@ z%o?-`G+o6jsDCgRbIV{xF#3b+P6DG8I(Uu;NhFpZE^2Ue{N>$FWA=NY5A%N}C?)z} z;`|5uQy*W@9TA1a{K`|8AHxxeOCAYzoLm_rNrax>I13M2gEN98y&zIPMVSj zaHc}%O!JMJ=`R#53R{^zm>dhGNFyEh_sq<&Y61h{K*z0L{BX(}*)D~_rR=5;d)+f8 zV)k8DhMG}sju(hv-XpwgcmSRuEDph^lXsx$uz8}4w;&AIYw07+HTcKxmV2Q!gyOrr zBLNJ%XS;#1L{aE7d`GYjW-@h>`FahN4!v zvKHe}v;#1(VjAIBZco2{%G0ab>P_~cWziR+JS}To#QI^ATXek2&Q5hlZj48C{`k!# z5ghyLB)17t1ThF(k@<~7%e-J8ZG0D4B8Bhg_;Psl6CrBUJUg~+2>V`j_G6uOx@*#V z+t2cwr$tbd@y6-|HJ65kg(ZLP>9xtTyME;y8w3^oL^};}Ch1UUX2mdzM4*Op&{VwS zCI~9J+o;VFR&+`gk+Y)W)1jIR2wv*3?|-xK2sqrcR?K*Op8r0gVSjuR|nZlrkDRE)$nYplZ=4l~+g8>)0*Qy=gG` z0R;Qba$~Ia!^;TCFK#cYZRd{jiO;OB0xEt`3F!~U=4sdR>pgjggf@H1d#!%vBjMhb zx}`@B`Y;npFcA_^Z=Qy3CK?G*&@x8Z4JuT4meMrv{#&wY$G9kQ?1idvh;?0}VpmzH0RQNJxHE!t zeB~#~nB#DYR4cQCe4*Gubq0dBuggncp4{3uG`Q75JRSOs+C~nB;!U;2My6&aIbvgl zFsc}E7GOE@>cA1(LBHvwej1hBBBrLmj=ioQQ%RKl>71Xwe6+j(-E!v=c)t0jyf* zEy~WdAJGq!U?Y@e@Hw?f@rOgwh<*i>T+X!`0IT%GhR3>#Q6oY$g7xrtfX@oZpgl3e zjxP*aqaS;Y(fZ*Kt{k!r_vg%1W79Xz|J5nM#Y8DDyFLVkU1Bc*Bml+#o>g!wegReS z_p_^xd)&H-l3e!zP^fyw?%vrPMq_a&&vE5v9Dp1*g~=ieO8*eHlx?21#DM9T`K9T%iJWMu+*?P3KXs`Og#cW zqJ~V&H-x&sf?0$=(z!?vz;b`-`OF~hVLJZRG~WjbvnYi;_uAvBU#k(94CYAGl#q8H zlS6%%?2h8bB=hXYcDh@ozY`FXhyZxVhRRLYfe@o@-J#RE&IMv)J8onx)62?Q?Ga>5 zL!93G_ikY{{wK+PC9)BrsSw@uvR@4U$pu>o^(U zHS9-5Ik4G`=^FMw_h`Z-XX6oNpxZ?C)9u@>`X%#E--f*p#7}KaH5r~vcYZHt{d%|c zYL+WHLq{ML$>)8|-`~t(%p?8g?4O(T`4z6in7PC^rqJ;XfrRd#9pS!bV^osWwV^=@ zIk-8e4!$o6%auqe5lZFHt3o3Bihg=mvd0mAdER5Y5!1s#DK;f1I z#%ST!H105$NAVC1uK_~^{%RmbD4T%CeCO?ZG4ctnr7Cy^@`hyw$j|?qxgZD^_MfMH zD$(6&)tY()dUTWnaI#}~MUoWTK7<$g)nIN07}+3ce+^j+Hok-8Z~>ll5di3myB9uXG-d?HQUkLplkk~t!Zr2b_>5$BWZjuO&w4o+9CY~& zfYC|BM_Z6;GZ(%LL+l6hi{7l_37wP(l{$D3hYQR$5OTW(+R`p|Ko$n7j9F`6*xkCG zL}vV&w`>107&($=AN^TSV3O=t|IR})(u0C%ldY5Rn_Z=#FS4Iz#YDwCLP&@=^B*YM zUfd$>EKECMyulndU|uvlW4~Haa4S3XRn!)pb6$S`$oZkBgponcOP@?RUX@bHM4D#M zUr#n(R5?i#x7oDUyEnhb78Na*RsIOl6TyM2;ZAGQK_NQCgzF zj>EeL{IzH=5z5o|X}o4^4wj6zjX!48;F^zben?02N1t{(9)Ow3%hP#wAS(>+PPhwL ziSTf~EdfI;7HETJnOr`3$BF-fs6^&mT9s))*vu#A`?Z14jF0d+L`Q8Cp#Zu%f5Yf` z`sR;qd(Sw+lHvqY<2@8(kqW719}pdvkw{8pT=GDRMCN$|J(H3E=pm&7ECv6s0_sH2 zk}t$@9~{DLeUWt*h@If4tOmVa*Vo-Yi+REApt{k6-i8W z?isCkg2IIKaT+PPex+cBCPu_FaMD|wq&~8XBY1gT2nEtB1o)oA(8Z0F`zG5M|Tm*Eq1gs-iybaJr z8@gujhL-u3TX-LMSX>HPviW6-AJ)^a{>Q(k@@tmXpRa~37iIRzPMhuLIiu*CibN~Pf%~xR+!4`a=o1PU zH&aYZS-7Z$P4k?mN{QUV*F+vF?_hMElT`{x7J zi)OHWcIQ*E;bT$i$a+9qPwn1{b5s*Pq@_XLp&uGRsHydtToUwXtrEIvT#=H-8W=H< z3&|c>u2OcctP-g{G9DXeQA<`9?5pTtZ18p!HurbuxAj?T<$lby3+``DxV|j*R&w_P zvTgGM1hia5J_SI7ku8;5v5qldFfFyP36;l{r5B0J;6znTZ6(?_GKi$yX)EH>n;x1} z5?to^&C74bD+d0!E*>sMS}t*{bTWz)ou)z^hBajvL;Vcvq8^PKodtveE1Pn>#j!}N zvLq_mq6T%2;m7Fey%||vH=~>H$m-JP3B0}UP@h(`UjD3FlSmx>;_f7| zq+e(YBsEUn0P>xRR#6Y!SF_*9kporx*W?%}14O8h4Nn}q=2G=rv{QKA$#a%?N8$U( zK71C?;#aTW=e7!O;u_)$mrpjzRDSVFStw)kPpZRg0G|>t_W=cP6TrW=Jdnr_YRJ0?PzuJ#sf+3ZySyOB zp;73wpj!^BY}NuU7k$GVbT(6dSd&n~?P}2=b^W@155Ny;JyfQYqAVq`X{+bOFp7+Q z-Pii0SsMbO!=If%WEAH33!ps4@qBZV!T_8kyzIhd*w_U&ky(UXZkIIjaityQFj4X; zVy}el`ug-DFo7f>e}4AtB{x`aOxbH+ELDG~^D?7u{ z^Ibmc=fR0LtJYL4~BF<6`zKV7vdAy4PuRT>OsBAAX|p zD-17;O91I4UeXwz0cjG&*-cZ49)TXqr{;=_Ea1vVhG`ci80Xr`st*oF)am7}am%`@ z+WW#H592DwcD6RB9qrVO0Q3KQ=?9z(r)~8O81%`90LZ~}9_!^hClu0J^|M|n(FE+o zT9ex{nMNF%Sog9EJToW{jX4P%2{QMFt!)S;sEnV=GVd;^i~*S5L}8`k!JN@5RHC& zsp!M+i~=vrWg_}OyMXPs*{v^`{B_dlc4BD=z%4Za-r3zs#_aq|bcYB|JJ=N3mVtK5 z`#imYtIn(<$Udc${U~6F(a3eHS|w#2r5CBPthF2#P)md34H$A-sLv^L0Do^_rJ<&5 zC5pGyc~o}-{xRv(@C;2aJqk5CB}M>7X@I*3A;RWuwI z7qP(=Ml`M)3jP;{arN>*L_x}Gc6zC8k`vVCm&3M^nbsMDR9=m_eCo!1fxNJ;epBkS zp=L!=G*!32zL)veW;sLYJv9KU4~=62wBM1$TDDbMONrd}Y9nD`n%DBg?t?$ZaBOo@ zFUcIh;s!6VK+#c*N;r&tzXTr5?$k8EjoBK>i@hHfxw}ZuQXw*jPuovb|86h(n#;DB zIuFH6O0=ytHCd&!Ug4BBQ)zPz2`M`u$Y4VSBPKwt9dl&Ly9Dy4>37Wv1NgPDgwsy9 znumOvaU)#($wQzO9ze~G7$ zVT+~z6*R{ zbM$cEzV5a$vU?LiSb9x=@V)=l!NYUfAbiOSXs2!i5rMi&10>DVZ|nkTq-vWt;~8Qz zhRMy+TF0CDaYsVgcmd~nfO&_ScB;O>7oCAW9+Gg#d^WII+*Zyo(If->@hf|6ORHIZ z;?KuqPBFw&?XfVd$AmMdeNrI6p^M)Bv6s&+C(k&zMK1T;5y5VFj%SWzEgt`WdRO=gKW2M2gCT$&V zSC&(;p&CSeKf%hhUJ7hmCAz!fN^hlpM3uQ8VFt+YH&j0*1t7nYBn=JMDSJWaN?2(p zC7?@$!gW{gAWCN*z7LIaI;)F~_aIfqn_EW78BlAeQ>Cea6=!J$z{&g&6DxT)Xr0P7 zEi6W=(n`!J#1REW9)UQr z?i0E|2bus71!E>)K#0Fv?L(b{#nV%p&GbPLk3Fx}2*F{_g(LR#vt?p)XK$Pi2&$&0 z9x7UG9P2o1zfb~YtgR_hnQ<_F#S-kDj35}l0$Y3n%mcf^W^edUH-1#Yk?8zT|BC38=b8FIx_#f?`a-f*#_8no_hL@Z}AaZ%} z{3IRlJX(AU@|Q5)Y<)|He(Nfs$`qXsW}{>$-TIuVql3bnm=V%z&Ze4DgDi*+6~P7R zU^KaeT}k(ypaYoGCvvHl*}ex&*L&ax!Br``;EUM>!UJGgp2q5U3&B^jlCS_dS3mtw z`rdu`Rrpcq%0Se0Jz2EsC*gwPXy@n3mRoE7UcqQPEW#U(3q7075ktivw@7*bjl!cm z(1@$57kkZ_O6RqsxyA=?o&)3HD(Ee)gXHpw(Tbl@eo|=@Jn}N~%v`|_NNje|;HNoj zS2F(fnqK6M73nYF$^@+9Z)CUY+gm3jxU>n;z`8J9piAaYE<4O)c847AoLp-TurHR- zJu#ggxDbsVR#<4}76X(%i-&Zmr}_aZtFl=}C2v-YTwye)G-`D;nG$oVH1>&;#}u_z zI%Qg6Og(4fM`6rB?FJ_uwFV54ajh?ovL!TlQp+c0nM6?6Qo{=Sx-hH&4NYu_zc}CX z^*)>@LeO+-*T+&#?v{?dj?Lia=i9&HM$yZ_@d1QQD^Rv>Xl{<>Txc&?nbdQQrsL^I zB^oPnM1FC<7C;|DbxMAd5eWgZB&z%*Rm5F5&D5R7F`yEhOc7b@@rpC~cj8KJ&661IyI3L4wHf;gTS8dNCyhJp_BU`h3(V^&VdH;$^MEjR6*~U@c z@|1OQRkgyVcshSCIM#Ce$mdxsZ};+)Y4WRb(xikc9EhjIqd4OKVO^FhKLP)T@@|Sl zHwAiBq-ZRD2bsQa+2*6^QjOTNWrj6?z?RrchhKf}65|7Vx&xx`_DKGblsBhVSGwf*=AAQz?p{XTJ;Kp$xlnEo)@CTiV>%O zpq|WgSb!Y=zlPaQIY#tEbSa8}2|k;x${hLz7U3{d)l>xpKhZcSC~CG3$Qc9%Vt<8T zs1-XMY>o=6wX24-W0ay)mI#|M5Abp|b93Su5Z1X@clWL{4Eqf(Kd!c`hWjO(v>h<3 zq$1TOaUG8#vBAzU-w)4Tg8yrN80>fD$EzwYD;#yR&pC^`_YjOvGg{w;|9T|l8>T|x zVR*Mnwug3x69_YC4H?6}*+pOr%&fW7;6!0fr1S+zOfXCS|Me2`0JQ{*0-)S$kd9Jt72x+zHM)k%s}bF4N}?Qvs^SYd(sKNT6-74h>;TVGxHlD(DJ`ENpF^p?p% z(^6WnjRJU);aK<1oLm*K#(m=oe$2D1BJ-A_uoz%^jIgG+y#VoHiI@JL9bso zm1mQdZ;)h_V&jlzVv=Q+l3|gPVri0ws64iPqlpdaXLjU4u- z@FEh4EH^ph2}QMh0Q6DqiI%r?Zx0p+Y1>ZQKY|ZwHpvAG_eY;;Gsqg?w^LWtlAq`Z!bZTW|Ks< z;4MWmPHYGUMu#%;(==CaWMirm$iH0;ndYL*bCjqxe+Q8mF`NC9wF?oJG`3s7;+M!v zgrwlwi@;0?RFg*nVTLNNyzEAus(=wcX@rM)RTSQBWdEStACG3asTwG8rSrNKIJd8} zEV%g127E<p(E&Iyqu&h^IG|p>KckR> z@_0OPAxOBW?|o9aC>5p3LVIs;4*N{nM@X5Wj4P@%26G_umi>4r;=u&v!dLw3%_kE- z-SyJv2tM!Mr{3cyI?puYY;|Vn2jKw3ly_nYpkuq{nInPyj~jI6lwL4uCbCRTFh!p7 z#kH7Z%Oo?+o|JT2Gr*2b^#Lw89E8C%Z^-VMPz#9NzD110{!~L~6C-J`tnj^-k5>4t zRWgIz=euR{0na%&S{Sa{Qv0M#C~YCgs+86WMq;$Gjxko_oF(ngBKCISno?j>>Qq}7 zdec{^SS(?hSsj_X`q7r@WFmpKQ*v>*Wa}%k*FJ7Hw86}m06uVDehJKz`-v8g9LJX> zv1^N_cud>JKcB#8QCxs=25d3^%jpJ~&HzcqSYPN)fQKZss&1}qOP!6cCK{`K_$VWl zW5;gu;udi*iobzUWSV6f3C=Dy7dD#G@(_H#efDdMb z6P)u`m;=}5K}<4>a|8atgv5^r1{Ha!<5KFpW#J4Z6eC5FH?brBRVK;LqE$hE$lI!o zVnKr+6PvQvbK@Z{1NNp~YmZvLOnuBZS5Z-LG8YH?l&R4-b7{Ss4BWl4?%(1|1_@Z@ zq#R5zBVeM<%637AO~>rJg;70~3q$EF>Yz!=Dti+XdZ%yld|*5WXgpQaUpy9i^u`<= zA=dH&i189^p}1I+A|_BmaF)T!X4yk-tt41ee5E9I;i5|8kQ8giXLO3+T}`!zKmuHd zSUxU}Bhd(RnUFi@{%x1mA?AGNa>p~*2g!I|$JYklE#j(bKU@%mu3sv9pt>2!0W)Dn zc@P4K;DBbk%5Ok$wE08llCdm^vxpFe2lqSPhJT1@Q>HY`;i)LYT>yqq6ee5Pk_gSz zk;I753mUObiaKUx#sq%Mz2WG1#??%Cy9KB(`$83N`HxdNp8{ZGH)Q_3J|AD)aV?>2(cW}XNAB~QnD=p znH!bPro~T>q`y7rz&OZT>6~u4L?G$`yFc?fq0At@r&3{u7z#7M_Nunj#_&AnW%@Ta zl*z{^T7EUyZqGSmT+-dS8}c>L_dwqsDegvsKDWW+nr1zZ4yY0}^|W#wk3WQ7c@Y8v%!132kReOS7WsWJQn_SgnKuFUVMfA%_E#y zu-#V(H;N4-r^(K2%j?1grP{??%cQ#eW#tHsD%#b_e@)(0ZEVsfJJZfjx$JQdTi_Vk z_I)DypaIyS;9N)94G3Klo=#DV-7LJcEfrb9>JG~2^HkgW#D20lxryvFrRo%^_~BSh z{mEo9a~dV|x;76IY#~`Go?U-LVT?l6#Qvf2m2uBSE#BkhrCywC!&{p@kOE7~&6od` zA{k(KT4{pJH$ogT(A3kvnIy8;Nr*=+24WWo1NIc#Wv5H-c9=nZxUw%uUW2ardN6l& zfj4~D{j)adAix#E7ouV(uEd6#Hk*5*PCmLDDdDEo#$kUl5#WC?l~AIFqG6iILH2u| zlcEcFD69h?r*P_k)y{0-7rQr1lrwKNVP%)9q>`59%stewG&{+b-r%`sGp86NXWzp} z@{zJ6YojTg1gk-*`j+YQ%J1+)O88HXLwt#;&9m_wL>h_pK>Y2T4FAa*`>SV{#%?UO zRRdSi8rzy50z`(bR71^TSXKELF)|bxw92@@{@1=Tw3C^%>8Y~LX<{lBOwd`8B-7UD z#4K3V+@gCClaa?a2Erj9%PsL5Z5xFPErdWb)oRf(|H!zNwqvBSw(~|MS#fWzj64<%`@k7nh1z0Ft|Z)YiDB<3Dabxol2q z0g&$&b%jkJAPYTO6~|9JtIw9AC>w!^MQ_xz4S*N@Vn*l)uj>w2Q`?uN)xMS;yp!^Z z6dWGyOa980>xpO23rt`J7El0WM|xvz@B!Z&yRBjZoFIkAqaO^es2>PcB1kk`e!Sjr z;Dqp7G?LX@*>;)@Fn8gVqCW;%q{+dqZNS7-SP9MsqAnug%9dfmE4?az-}?f{neSC4 z`eg=k;e(I?kke!Thse$IL{rZ^J1C!z3JMAbcLPoASXn?>F<%L=x)R!xmRK36(^Kog zgYo@asT7d*4Eo0eRV)HkS_5b5%EJ7y zR*HGWO<0Tl1^BVeLa>1PpR!80X=vND9WK=!E2o)-^>Ipbu=}#T3o7m z7u3$ZV0$jkYR4QXJ!`ywp=g@-y@clLzP(UiT1AoOc5}IsY#4hxFQ8yP6o-Du%cgjJ z62)Ez3^FSDBBCAh7qM(}F<3|Ee}0j)HjhMaDUkiN(Vourx^aaZNd-34KJuNz+a)J^ALluv8RW@s{P=!L*cN*^9~rXx?4BOn|Hsrj zIM&gBQNOWm+qP}1vDw(RZQE+t*h%B$#A@8QjcwnP=Xc+G-~V9F%zXFkv-et`HCCAv zCkrJI6#Kbj5s#>!0+TyeX>g0fcjT1*Zx22tY}LjJ4fe@T>Sv&6#KA8_Kp~=$(>wVH z+vfL#=D zo(Q>9?+Z-|v_I$HQBSKutc2_YtSiXDQzea77ja)VP&p7hd9mDPF}zN5S)SiR4zQXeI2;KgJn~U-6M1a+22PMn>aSxv5gW(VG-c0`&m;!Xb`N!aI z1oN@FGfB~bgK0*PaYe+sDk+j<=l@v{g6)C1j9iR2db!(nS`f}PXwFMoUe+_STfC2N zU*$btUSC;mwoY!aUscCixxIPQ^uxYv9mPXc^o8gCQ3Jv2|8ErJ1?$BU-|1^TJI zF$6N6++66e)CmkN!hxbaavCfnP?S>aiy!=d_-bGA)37#&ksWIhk~->QbTqZ`?*s^{ zXlt?)q#cNPap)|vYviWK0Cr{e?bN?Cx-)+na^-zf0X)nk5)7V_-&1&$n>m;vS{kdE z)RIrk#fLDD*<+Z5_9Pa5#CfI|OiDy4Ugdc9{j27LTJ$TfGl1W^SLg5x>=0iZay0r~ z_K`<)B@{>W=G}r-kV&_5ZAYluUC)Reh-v%pt?5HNdk1znaW1rk==Z`;lBqTN3_>Lg zrM5tvUJX1<-a~_zROSWlsyu)aIm_RH^^0LKG(&h*ULOuf~KZc2oPh;?gCo1Sjw!6pkC ztlb0@oF=w~YW{pT*4CAfFR+v`uG?K|N>T2K>eMST_4Gg-K4g_oUkfU{{LpgsXD6_)*R6XC6_PCzt`l3`wAN`p3#F0)sZmGC*V(Bc; zdNMwZd5^J8ddbSIDhBTXFFnO90BiQ%`2&p@cDZYOTA+(3kLEd785w4gus)ewTll5l zA$Th>+CmY&EZF2+TpZq&#}8D;pWYIPI*I?Uuu1K=Rl;6inr2Vg2E|^2&W=g{f=T3(Cbvw-<3{DftHi>;t|0&Gl8_iqye1X*Ca?a=b14 zMj%qfRA#P3S>$4QtkEhGg1AR#Vrwt++7D_bt8b9l-)vLml@}7ghx>j%aE}vj!`Qd2 zy|PPmLs92%=DBW)4+{aQmZ|VWPz0O^GoF8;Hwh%pfn`GFzqZv57dPn%lpef{ww#t6 zUXL23JGX-pNRKJQd`r|~-33DiVaT6t^5@n^>9JWa)6|c+`oxAFFf79F6sm6C4X)LO{lHsPN!n_JHZ}05*8F%h}K;PqI zy$RzdO2)ZFkxoV~6rk+z873gnJS z!TME?F2f+^$4ptFeV3Ok_}j>TD4YP;fySxA1Lw}+hc&+j$9#TFZ{%I5ii^>}CmWhM ze2dE}p}N1!yQ-;eTjRWN)DgmzquuPEVv7vDpYa-*BoO>SuZ+%>gTV~* z*@e)!+&H7+q;QTtSNB8Cd%_Y5Pc(k*2nvJ97;Pq+wpuQo-_5&BKBZfZX{zlHNxH$H zI&BT1P;{X|`_W{oR_88= z^$3R5RXI}gE|%e?ha&mhb5V;_5qU5(Zuf~ZSV{8S!#6IA=tUxZczQzl{-D{Z#lUSY zn|7bH~+bzb>2LbK^U;y|WUgE9%l|v?5;1x9`gtmm>5d8KO;z6ph}* z%gn{)n<1MWZz#_Co@!PM8v5dr!N*vRM+p81>hHkOEs(nobf za@D1~Xw@6_Ma~G-XhA}Q3xANp!iFd_e$O+3RVW3E?mECBpIymejTTE+kfjWRKoqze z!@k@l?1&2gPLJu@6bET$a_C}XAUS{m2`uhaHla&xeb!cqj{#0Hv)ck~{`QL4e~iPP zuNQs20owto7mIe8c`!T_qe=(dS@l-qb14)XDT7KClf_kvn7yDKY(nI~4m|C@$iE2J zD~u~bmwV$jS^Gr-+wz@amAE^hHHDP)bEQ>-&=|SJ5#sT5~aAIMUHs zx<H{9`NV>oej1XOK%hsQ2^VPJ>_~*Q`hnl>{*LS%a708%_P#H6K+erhN)47R+q6vOO0u(}g zM?%)8kF&IAWCme{!F~-@k|rnQdv|MXUfA4M zDi*WuE2-7BUMvM1Z8_mk(hAb7-AlDmG_u+|dYrz!r94mM;jICain@D4sx#et6HG8% z8^C&(Thd4z*MLbuJpM8AJJIOO7$ec6VOs%ttOEQ!a}R{r45!=Kg;RIK+zUxZ8U4G1 zTZ5caBRbU71dZ;nWRyRurJsbM3uL6TkZ_J$F^Dc6uMLM_0wS!DAR+_{+JCv$s;&Zi z+T{P`I4-s#_Y*X-CN=N3D2_IoOI=Bw>+L~g^oOLSD*d`U{xGWS zX23r+v7*(J!=pUWRU7asHJ6lBoM<&o@5kDRkZ&|K&yFzqX4GuwT>3X6nNv@LBXBb< zjN!Tz+;z#g_d)XP9wKc7pa}aaUY$Hl(hrTeDI5Jxa@67sbHumkFXp#T9d9fixc*b=6&NTvf zd)({1AtgR_+nou2N|+(iji_WW-cyNhln05GNJYy=Gu_P9 z?(3E`X{J4U(L#1#=obCLj}2!ergNegqaTu>r%1p1J`kFB z!-2LtuD|dCX9MwS-9WAm2BIx?KruZUM|3LRvGxL47#m4B-L3su8PrMw0kzyS#uIcv zQg|+s0Ss+MfzTPn4kPS>M1MD7bKq;CnuztMxgju zN8kA=HujeW+RNv}V$PYRED+J?OGk{SG$#qtKJr71b_lP7JL(iKY`%3B;q2Q7UN1iU z8HGEhI@;Kcu>7fA_2^I5hq5A{)_k1(30iBu_XS`E?i#)pcyof4Y{cS$yVtp*3;rkQ7Abu#0Zaj}2yQpU0PLiD+_hpd6G;6ADu~G+G>Rh$Ys05}~`; zOT!F6ND1MTAQEs03TgbEX)e80Toz_LxK*wE;(blgl!Qv0h>O5zFF=ZCIQ}?XCLU z_$uX@vmA|fHuHQJDwD)Zpx)&{#-)e*T(DH#VehArH_ID##wZid?P+;n#mNgV4T>kn zihIk_Z|HxF?5IlT@+`upLmk{u9~6tYsV<{Ep!8{FcucBz7l*U*t~gLyX8w1Bm#-NLCU`Xmj0fk3UC^SmVShLp0-iSmI|B3&b^j8Z5b_`nWg3VtagsB6=s zOSG!TvV?JLh`DC@bwoWtqFM{AMAaM;G1$N05mAN8fCkuj{%6w02;b$cIf5!v2^KSr zi*qYM*K)FUoaFS+ilOTAVdXPBIHE9e3FvnLiFUE7b}yFrQ=Cz5z0t*{_&Y`lF`sQT z>P&);ucOf)>{2G)4!zGbu%Ve~{4d>$y(U~|eK|_FIX!I*SvTc~Srb9X^3xLnlsqVJ zM05r9BhE#0N+d1SR`)5)SoTZd0k&6vVRAEh{G`nCtmQNk>pXn~tp4RV)OS9x`x*OUbIJ`|?ciq|v zYP*iQf;fyefJX|qJA{0KlffiSg;zPaCcmBDq&u~->+U+f8_@~c%U@Nf;>Hk9vPc~c zh%%*^8S2U5uS=Oo###>ukRw!D8|z(GQ1zXELz6>u%MJLqqd--d9e>0#UDHD|*|padf>u7k zk*Inr;S4a-0H>AULi}g2gSt8P4Q+Y42vIh1NXnfaNANX`HFUltiT|Cl2>3A}uu6U2Ifvt})-h{v zYc%voHU}B==ncq)GPwn7Us^B8O*RUo)FO$dyx|XF>ZZ^lqm_JCK7eFFjJ?i6m@}&) zjYYE?+w`J~z@DrUwZ$k2BI`5kxgZRa(WqO7ImhHEZ)f)WJWX7O=?v%8fSR&gG14rrSYd^zCJHwZL z|ElpmPP`8JZLFjGlxr+vgV+_Xh3pd_@VD5I2C#imek;=ej!}BT9--3)HC8?=X6Tc?R?D1V@WLPckzdlt(_Y@MfTT{bM~|b{2DDMXSHh_1Kn$>0WA>A+}`TCzaSjkMJ*AyNIVs zWgT&fjk$#N*biM&~s#SoKR)b%oDORUHR)U)Wq#??$u}3X;Jx9h8m6|bOF%Vrk{XvZHp+yw1?-nP}vO zlKy4HJ5QfWlYgcY+ADLjrZd=A9jIT5dUm~%6b>7tBrEv0gJHU78vi}|{g0vp(MwF> zYQcUk>^iH6g43~dpe>aWa|d9MyaL1@`t*|6^@A1YSx5)Ic3`Y15i6%cKEn~I^YJoWMkmuDvk2Y4EDThwZn>GLQuj7_{8k^B$O&Z@IYbwfr zXcC`dB{Guhvo{n&qFb2WTcJV|6iENZih%Lt&obSih6NVZ9)KC>KNQjYVxg|`SIsyp z^70>8R;KWE{HNgwtvNSE{7sm}u4cAr?MvQZF@&%VReQ!_kTvIF6>3o4bv!UXH76XO zPzbPI6^k_Ii0}vYVASd6+V;pfWaKupEY5%C&NXQ2lC{n_UCL&kNQZdzXysr#mId9GIBz=-ASU_`N!{Q6}(dPSkz9oO8NTPx|cuj+{KWs>1qz0$#1q@vmM^J zfOgAnzQ8s0jPpJvH)gjMhA7lrakwh#dZzqVx+Vn5Hvt<59FF~$+JGVPm{)?GBnIC? zF?tlz;aZCQbQjoA(Gr1%=Ew}^@MlV%$`OiB6%LG!lXj{BD?FuZP?H9+Da}4y*P|@< zz*Nx*Wz9QmK*!b6_ZQc@Cc!Ict-K-*k}OkNZRR-S25qv1ECC|2+3W!M!W-!Gmd_r3 z4)X%^)YWYM+1;L&xG*O#BV3aVl~-JRs3k>DI4nUfn4a>QOaJmTeiDi@aBB`^)_;vw zBaU+_ujb0dS%x8|;xH)HBIN9w@cp2)jHTOBtC?4XRJTYY!h$JFG6FuS|M+`$!H4Yj z-p4@vbSxU+?;tGWA}n00X+UMZ`IhvRV~r?vtly5WfDJoFW-9~v`-(kL** z4bT}#4Ktd9Je)EYXI$)Bty7;(#j~p(6T&VBDKAN7E=NZ=cm>)4z6fzhF(f&Y!B(M9i+7R-RlWBW}xg0@X4tDmxQL+t}~Eek>Mtq zS7vWY5e5UMQ3OX3vsyBcjYmF~V8@-7>O{sgVC@uGg0Es@%_02DayFMloABb?RwC6c zjAIsR4do_o0e6RX4s@hP1`bCP68uFCVUT~I1p+@FaY?OV<;V*xeo;}F@7pQXwi}Zd zqS&ay%ArXPW+{i_Em^Em41=tgKF4~89!p|Z8k^zLLM8z!C$*aE`&pH`ogR_yP!v~Q zP&J)hCK4t#9AMPor~VrhV^~1aEXfg}*XsxLVc09lw+Ow}LM``wa9Q2pOLKwjnP~(Z zp=UefP4Jhd!sFe3vLUQOJi58aj)Q8Dg++hl25YWtnu+_So4 zyI{`)G2s_zX^wgf@W0_#>H?71^2i&WNg{ekO?q4+78KSM+_VF65y#Fc_q}9_B5Gri zs!AP}boB`^8&KH0f;Y*>4Rz~ZuF=WeWGF9tvYHbjSEZi3Vv~Qq8U{sf=WB=01>NB@ zz!ZLg#}z=-X>qfod+^;t%(sx%;16bXwHs)AdIno;FKV$TSZ^ywL0FHOG8puv=rD^H z{g(1QrXb&m7BSD>Wus&P_4BsF5gIgc=G4aKJ1U`ek*t8r3z{;Hbu6PG(iSU!~g zU!B0#Q}9oMAB5COduGWZU{y}z;B(7c5L)R5yh;#H++inE+jMBB@U)C+{0J+%j54wJJayg_qFRS&0O7V#5Zfl9BUwZCAZutxuqR>NTV^x z63eUxX{6^6VY{O+bEJ&u`e)6Gv<#Wim>Zg@h)~)ymD1-t_<5rIxZ7H=xn7@$zG9k< z!to0a0`78j-t`4?dO&IUYtboh1I~(&Z|54q(8|cscz8Mm3APq-5lU}Og%nC?cjyVY zBNLPml}77A%_r4?f+=eZxiKgP@8+ z+Dibh`{FKZ=OzX4fs$pDvY+!IoukFOdB$44fiZti_D+aDk}G zYdoY03g%}3Fg_!oIUksvvzbPt{tcMSjBjS6V-sEyq`M9$8pJhGd;BCtWKLcNm0trE zbl!5{XV^D>_~|tQa6OLhp;bC$EkgqD<`;(e=Qp@xKU+QXf<-P5-o2ML8g$(-45`Qc z)bRaaoHI((0C#S$;f z-}9xiJ5`{@$(%TE-A!{}m#s;g!w4%Q_!G*6O65mLI#Oih?%}$)-?L41Fu=mbt?w8L zrj}*<9=VvmVSMsi3d*oepuoC-r8mQ5__p+^Zdm~!?*?;~GOXWZwg8yk8*WizqVCqb zBArYbij)0rZV3R%12uFh(0QV zZL~SHJs!rTx&;{(e2a^N^_o~Vo8jPElYRtS@Gikp&k)oP>q@SV^fO}SQ~T-LT(*1E za$7#n%na{jj910Z>6Fk%P!3;7;KJl9jtxi>2Kn#oYYQ=A0OMav@%Km3dj`>289CB8 zt{(!lQnTl!tad7-m&f~@1>2^I(f)l$#MZZ}=QyQkJ3zC;Gp<*{9VK1$ZRHzMUudas zyKaB`JbQ;R`C*Ue85XN#GgGeiy8=BfnO85TsS+iB=r4GjkVF}dJdHA+GA~A1B#so# zQN2+eaRUhHSlV`D*wHDrk}N-P0PLPH3w#F=A_ZSDI^k?qPR=~AWWLMl2zVn}K zuCgEhSz-U^j1EpTf-#bjD)m$}#Hq42xfRQ?Fl`wLflK90^RCWQbtty7HaNLqos|AJ zilBDPk?K;;In^SUa!rXvHmp|Ep3$Y1#7wWeho9>?rM$Wu$j!02R8sQ;n}5%F)2MVm z5lP_r?B<&P*0@a=?rBc^>K-J+hOV(3el^Pfue=qwUqDt9%fI+)K|9 zCo{SoNDv0imqA_ZG31C&@Yu*p;?16f27zZM=UD3yhnLNveJ3V=aV1MxZ>k2FY5>obf2^nj@Zy2V?IR46U>&(?5n+leL_@+uym z@B!WeqM-qKV|UE(G>a5JEj@)E?}0sR>bJv;a;>r9ee8&aJ_Ohm<@}=1 zLf=`3SZaRP-iM)zln*1A&B#-=gJ|j(nWmRXXwx!MYF}_nt3Bs=Q4y6LsH4d7h~pcY z=DF9=nx4WD)`mN?!OTF@VDS$ZSBv7p6y>ZxPPBmR@Cca#T+zh-M%8VICdzuE` zcs3l>L{$&Ck0S-WMCD*f5l131W_O$;BDL*_@^j4gX(gvMfRyixg z9kyw#o-clI^7UO`SbK`_)*=Cs{ez&}k)=bzAa_rGa=%w`Hu9rHYol)`b7XbO@D@vQ z5M2$u4b^dWOY%sjQtbJqnc{Qr-^uv~Z=~gVpIAin7ZpIxhhV=wXPV}$IgUE0-Q0U9 za~l)qGWFeP%Hkm7Ya8kA#XP!buQAlq`7Slsi0S+*%7KU=Hz7s zUE*3k!+0!!?xVjCzlD2yg~vzZD>@DCG=Z9r^AXP=bE3D9yH-fYpPr(xX`hZcTRY3o`%PoF9t z*vj{h5&k`W3^IM8=P|oYs5~~F(+b&1a3I1R+?d&)BN;!p*Ntdo`e+dK6_xjuR)-O8 zqW_2B&xK7%1!H(ybgr|js}n10`yCyG6|B0ye{8`)?nkP{FZ=KHbGmG@Qnb5yJ5(#> zoEa*aA;L-W1@r(0y^32w+!Rdg>N$N}YvW3Y+kC0_I3HxsauYz34H2($-wp|4l3L zZlX{wI65GxB_?@J3KF3!?ioM7Y4thLAa{#^fg~u%M6FM+|*I9vV9n0?WMt=qo#%w0PVBJM(Dd(#zcqfJY-BlS}avYs4@TQEMHP z&4O}CF61cRMzS>MkdW`Fjyy#Z^b&IHF# zB!=|)u7tXG$D6oD_NR~U1E4Sa$YnSMx`I_Vg^ZOvhyOa^O?;R+lXMvOr*aLtrf`1+ z7f?8#pZMS6N`(IrLkE|n3O$FdiG-CTA?U_gK1oJZm(CeosskN*P?Eu7cp=pS5YX0q zhTe>tBo_mhF9F;7yIf_lIv4=kg{>JrGoRH-@{<ju({&#sh_2zS3{0BL6X8qy&g1i=i@;iM@j}uW{h#9x%%Oc)Dy| z4&_E>AG%^iD9p=>o)9@9Ek9Eo#rRC5Xo@7v=O|9#9*GQ-=J8;1S$ysgGax z*f7a`5D3_!MrdqLBkB^R0YF!UN5rG$dA4dxjj&JMo-wUBtwo+?O)|D9d)Tdp_`lJ< z^BZ1mOBy)2pLyMH6#42As05Vb=@$8Ev-om5BH@&Z`bK;!h6oHKQ6Im%W|UDUD5|O} zvVX^JbT$DJgDGQK;eb^g7;5ZE1GHSJoh7YaZx&M@*)ixT!GS{WiCnG`{fMFWiem0% zmdHN^HN{iWV>cx;do_tGQy(-wFm|8Y(pD~bS!y`TLSC$yvEps2FXGHko9=RK9(wQn zGnW~d<5Ga-LMmM?ec>O@lkaU*V0#x%MnHDOK9yt$FABK&!P!CFO3atb@Bw^DXZ}0o zz;qj3iW3?&;1m zFEeG0uC!3L)^8#M&mzZDyOXq|(k^4DxEtRT!F8S@F%|H4puH5K@Tx*BmASmZy`n@m zzIs0X1fY;2qKY?M4{jWsDj2R2k~8F7i^};sRIz!w`RZSsO^})9%yk3~731UPcf9~a zC{O%*o}v7GxspAX;IfgHoK8X2@^Y*&O^tLHsS^|H4?2B#Y|>UVc-CBa99zIMi{y}4 zEv}F4@e=fn`)Ra^~Z!!8->KD$*VyDnyM^^WVUAlyvNXXHL0W z37i$Br{xjTK~2Re;OK0~f(|8wNpO8A;qUmhZksC{ah}i{C{khwTy(lrGv4%+P4|VX zLp_SFQ|V$W_5NgSIW_dJ7ETEska~!Lnaj1WaMG z$)c^SiKpZRHs*M0qBDjH-c8n_=c(cTDP@++rjsN*tutgWAZD4(dBCL>A_(XM=^-AFrU zsJ5hp?CRT@p-It^)5PhM_CiyCzvkdJe4e!f*W=072?3=&lbtiQ$s9Sr@^Ooqw}|_8 zN*wInQi;poU(w;pgQsL47-C4<>%Y$^8f9KtU=G zKhp`Z)i!MX_^cUrSYn75MSmxoi!wSl61Z+*c#gh82P8sNMlNy1*+GwFjjO z@XjUvkHZ5Tn=ylo3bRG4YXpU9&ol814CCfiq2aGlsW}>vNHNfB7XF*|y)6x2u&lEQ zR;*EX)ud6djdRc=El=`1(#84apNt4j;St4xWbXU0YdL~xvM*I+VmrzrVGx!D|CGk0vM(^B^ zO*Qe$4;t3djO2cUYA!L^{QD;fQ2DGz!$@98g7di0hZbk8s2BBX?<7;#n9cc`GP7I%!hlJ3nV+eMlG(=4 zq!?}r43v94UEjVtGi*CQQu37CI^v08pvBQ z)4N;d7tnF*4gwe|9{~4YQ>~Z9sD8 z3{+}X8W9V@)U27~_i%@Whm~S9Y7gE$q(aD*afjfQJC&BbdE{j)P96UKSi&?kUuU*V5>{{JF<}}=C5l@QVpYwq-jBBBV;sa7Z^I0#e`V$&#hvYXKj!N>FTI1l@2e1eUH<>J z*FaF~hMGtmA-}9BD4L9$`W?RSExjF}EoHJFkrzTKExBL|qZH7@7@4j+USZF9s%~G# zP(G(l$5e)*(5S>>qoz?ev-p(%M8RZfNDG+Ib>h*?YZUM@;MvBuiZAxYTnlJXKkIVj zQ{>tAxdTR$&)ULZ3?YK|vLJ!#LnANEKPQ6~Q8ze%DqCX!`q`2o&tdnid_@{s`aj;F znNs*0fCW4jh>rkv!T-TEZbhwS?K9YFcw>O7~^O9%2YPl>5i$w=+ z138mrr%*=ej#v69@TBcx zj};kw=So)jzSrP!+az>3nu3a;WMC&m8qmj0CZ+)3CoK``a9-K7y>)mPz3KlaRvJvM zH+=ravHefrxLHX^)4=d*+X^T>tM7iHvo% zqG;C9=+dr8tpNWD5%99;`Yjy(u1@JkvD0jR72Qr%xB5)|gc&%Kr~Xb*&bW!JYys6u zOgMjY82XcN!#$%nP;O$76{$)m%0neMT0JHnK|sB|EFh=+3>Wwn_=t@sDz)I!taa4H zT4jI-6p81q5ys>vSQ|EglcJBNS+CPUy@`xq96L7$tcGF~_B?;z(P!o$KeT?2^^Xj>e zO!xZIjB2YGi!lcWCy!Wr@+AN80dj?7p8>U+#C6zZ#_4Gm6*!ZwVqQb|0Gh~>@w5qJ zc!_@^76rpMv^PiQ0L)i_K*cxaKC^)|e&)aOz4+W6 z^9aj>x$OQw+kV^XluA*-y}}2Z?G^o9R#`6aLsw+kmVh zW)M~cXD%AzGRyhLC1_;;Dp4I9#o>CUk81Yd(hkzvV-fJk4zbpQ=y>W$X$fu<=?ihfQ!?z_PUvT1gI-W0Cw;~b{ z+zn(86ohnGEri2~n;5UjyCH`xg`2hrKR^k3jCric_Ko;@XO}!}IeUVIri3EvY9CDa z?kZk#@;H{C2GN&?i`U8F8I4P+fY<;X(Z-x$hZdU-=PVT-(~sq`(*ot6HvVPrBe6Yz zT>>!#yBKB7cPtITI3~&E!*HPG&=PJM+9#VH`1tBl|J%hz&^J!fO8p@f&94X_Y!aXl zAt}acEL=|=-dP>+c;Nx1=RwrFh)C@RGmxsvvWPwM)}N)&@xE!hbp zl49YSEILuT7|SmOX@qBFR}>BM+CM7O(DBeaO96>mdVlu_cBqK`(RKT|WJeBA0*;MS|>i(wf<;+|0J8Hx;MUJi6Y zF-|DL0gsT#Zf|84JO|zgg&6I5iQ6}y$f|^BN;(|agNJunEo7oX4shJxa6ijQ$>T2s z>BPgtYg$%W26&+P2UyQ7-x6-mrzFV5LDps2Q;_y<{yb9HDyLJK^Y@sg$T|R#f**^|M(Zaz92`7>H@wiR^eMj zaCRJl6K>Zm}#SFIsUxpf<#Z!gUkHQ`=y*7{%50p zs0G#D*^d>Hhw$hd++2|52MFc{*U@0KxcS{#FPIgV9d~^^?FED>sH~j8Bwx1|TMRsG z8I>c0PjV0MJ=$nD1km<^;eVJyg(a)|usQ+%QaZm!O!|%AeA;>@N+<#yMvN2laKNch z(C(|?hi9rS;6B`8%4SHu9I-KQMljk zSng{cO;R5BRFHYQY`Zu;xW>fX&Vf8#sQxqxc*wPBisaRDw2<9Wa0CAUR~)r2a|M8#tHT2VJ3ysq13$rp)Qgoq8)NU8pZ`JPQ<=I^C{;;{Ki3i7- z_SOzJNr1(K-ljHxlTS(mXUu~cwhYz=p#C721a&A7Bg;yxg#@Xj5aIv2f&Xn+zC@c} z2~n{v(X4od;QQl}ooQSz8TSL+8Z| zMSun5!I{FHPf=u<@1=q?_Ad1UGW~|_Av^jjC2FUd*isXUTZPLEAPFHBz($w@HR?#B zjU6N^63HBKCE<}x)qSjr-c;a#_&#WdJ`{B9z(V!nv^vk&@^X<(Wae^-qw?D7$z@*o z=R>R+`3dkvvmyMSB0Xq##ve`-T2BO?!}<7R&v+l{ZrzlQBS_I7)t_lw=7iGdB0@OR z;&aU&heZyDItFf&y(B?@UpJ&*+i3*JpAVy|nos$f(VH4ujF%c?QMX9266dgCW@fDU zuFkfiN}Ko_Q4do-v7B``QigpnVO%(x9mlnXA*VLYg-i0rsq&4Yl43PKM>k3w+c!8> zHyWSLAmkw3$0f6UQ7Cf;HKv3g>_l!HGZA~x(Ro7XK)?Xt|GL!~TI+gfW_ics!TcRy zk_eFCt)qWxtoiw{Pot@P*yo#Lt%Ytrcz0np|C9HS&oF=J9Rd1-i6E}^gOQ5)2A zJL@XAMazMnk%7_ehQy;&d{!*%RLbQv+QXL!`f68zUIrj=9vFt%qk-Vm*_~8M4lZ8q zVd2TF!~#J)VW4(jyrb$xl_$d>1I!uKc@ci!vRm%dvFZWJ-o#tNmNtF;c=)#=Zu%bF z&$|3uJxNRc*gWYxs}FafEH&1LZ0uCqxm8q^--o;F|;Mk=i5MHIB4wQ-Qz` z#KJ(_pQhu}`?2%}(#QTS?Z2iAsPIOS9OBYC8r8#EO4whzXOoG-cN1=`j7BAtPiWi; zaAMx1Fi?+5?(5^YE&Ndb&6cQ@pYI_h!%on>Opte>+aR5^iZ>6#O+%Wll8@pJTNu+9 zD}-O=zDQe2;k(d8aA@TnMGozPbo)C=N_m{ySI6!X3io3+zzd1%`D_t8Fap#Ep3nBBNz|gr;G+H2;Y-Tr%bm3Ts-9u*@?*kr2Lz-uB!QnI3 z9f>Z)TALG{Odnvjar%Upg8Z9T`sbGw=0Ev~BrvbwDg&~0zs!AgFh;UmE`3$`yl|MN zHP&q5f#$CaLD21vIt;9)h?Gyx^xJ3ovyMmhX);>7TDH9;g-s)e3w^kHYzb9)=K2r0 zOc&L^omu7kW5c|Y^;<4g>ZInXnrBk7q~HDLHX|ca*`bCycJNO7cT3`_x7u5v16Sj0 z|Hjub4!%W0y_DaOy~P?o;tpQ^_|)3V9O%9D%Q|SN5HW~!D3P_J#5D^<+Ri4FBx5|Q!`BEGNFmpUr%0}&N$39# z$fy$Wlry!1YQvCe`bJ#s`csRRCKx*8GcYB0x@L=RB8Qw#a#eS+UvVN2wcm$+}EtvSvOH@pc*jFa*9gWANahHk62FCWRFe@A40f99q|c3^`c$= zY9P4l)cd_seWITY>>d#!g1NfdpZIBzPu&fHp`WViH1&eyf%2bWW_$jHGi z$s{ku!okMICNIO<%E-cg{2x6sPVlpDZft97ZDFf#N>ONaYpgGzs-03(;5VhN022cl zSqq$K$w`U%Ny&u>l?G!;TFTETm4=6Fd};R!;u?y9dqhtArE562!D|REEPp$^$g_m& zoKLnGRZ;EnH_Du+Ybw;Dh;B+U?g|cMEADk(oWTLDv7Mz7{bPSH3cf z6k2okz=}JqCg5HEfFJY^pO&<6mW}lVlgwZs2SQ?7Gn@cja=k|YLba!OMEll}{O zAJoSQ_Ba_>b}hsja|jZ`2d)hTW=U<+SIbq><^;?JeD7~cHc3H+5S|lrIT8zu#$K&F zPH|q4!WE{AOJ&CmfIQq&86g7=NwLBtZzz`LK<5?Vf)7j^`GeQ-y@`tM&o4`9u2@ zn)y1_|7WQ6kBM4ch!gMkBPx<<#z7E(MD^`s`HB}NywQV_$J@?Ia<*A6=>A#5Q*lRI zQ#qlfo~E2Bj6TsVs*y@*mBBYI3W;Kk>>*)hu<8*17xJbD(y1fzZ>m&@s~T$I3LqEt z$9ghcT*WCMkI<9=jt~3@(=1cKNA}3F6r5tmj?;e-HHP@-wr+OWveXxGRQ8Gyyc1Z$`VQFF1OT}y%5@^RQKuZ z@Z9?qR~|jJ2m4i$`EfeWhW)gq29u>#{RJOS9tB}042dnX;8OhhdU6ipaxULa)DOKk zRAKS?E2m|~)nT(ui-Q$X?WEi%HNM3z-FTv$(fI(e#lcJEW3=p}(PYH)BE zo|&ZX8|wGKDjOoQ5Isfv#58Db9Y%p$SrAxRk+~#oufIgTn2k|q0&>U&@|F4dk1_Xv zB+fsA;6_^3Y+$4y^lUyakO&m!0N84ZJivM{2nWcC3a#Utn{Kk3kyPWtaCCRyHj(Mn zHr*!f4JHT{7?5Ic7+UZ+!ty?%&9dey(8922u;Hwr{X$R^I+bViBP zO&VdSxADHGQb%F+JYVAnMDkKIhe#(ZziWqlfL)b z>u&rhsGUqL9!y*Kjl%gAH#@kIH{;C+$WY#X+FS4i(S0g~&%E|gGV=Ti7_J;K+iV_o zxlJxl2XSkrw0x&X7!OQ`uRz>LB_f7qA5~#Ldl~3doh5j)tG13Cr5*!tBCi7-6QM9s z+$x4tdp^LPkPcuk1jw$!_GkEjoYf&VPRit27?~RzyJFR%0I==yv>+S@u0$A_xSivq zDy!edOj>ZAi1TnnKtuhOd$|D?gbp!B2Nt{@m5;BfJxxvQJHahI2p30ktIM;Z*O{g0 zWa2y0KT9>+zfK#=Jomzm=P5qS!Y^s9m7BUbq3NS;C{Z{BT->Po|6K`y)QHfLB@R4$oLg?-N<40QQ(Jfn z4i~NgSqAXZ2)p8sr?mQhCfR@nCr|EpEsL6B)rGkn^z5V#&QuwL`1hT<->;~Qp3lM% zcKv8+96Wx2!~WTS>qT5g4f~orMhxr}NlFH2|iT&pKF09hjm6lt$)2W|;tr0^lRjclL4O=7G-kndeARIn_SUYL3S&tnm=m zR7JL`g$}mQt&9*0ZD!mEz0a_kbhY7xzb`#IY-8;fh^6g3<@>M1{mB0PC54MKrR;Hp z<^hQg+1&=JKAt^iaXVk8U*fGR^{;%D127Wd!X{n)fe|_Y2bYS)>LDvpKQOc{Up(&gPq23T(oDRW z3+(r|wnbSi8B(z};N^wXV)JZwAZl3{$*z#dY%qbg+rh}n8b>!S5Ao-=L3=s)XH)<_ zZg>^^9`7QRjwDraa$$v)Se!B{_;}KZWg~7OQ~OPyg|29s-j9YyJeNqD31ipDUS<|IjTR$iYWVEYSbktQ1Y*&OO zOH^rfg^d1eocPe>m1lBKDXR;BxtQ?h42$~7b4MeN~zwTbsS=Kef;a4;(> zqS@pl2(wUHWU_x@;5_*5?PppV|3%-^C~;*OjWMKw*!SA5Dbr`EOW;JvURPyNbaB~F``U;JoqU{vpIz9nQa&tuPdGN@aX+GCoWyPx2$4REi#*I1qdaTwgwoM8Esx9u4dz zua{CTi8XU(Oa)tFzPup@TU&81+jtfBLfEQ!&dKr&8(Zg(U0IIH=sl#1L+>e|RR9ns z!myjPq|%t8%iRa}T|;Cq4%k70Vd&ouYOkOfrqC^d^*-U;sB?>z_Wwh8Z9 znta3m4&J+2zw}b^;&f8Z7)gjv z`4>240>%1YKGQ#R0jijLZxBI!bGaaj@m41$q}&$4odpvrcKM%|n)%`LTyLjvn(8EZ z*fQJAr3okCkxKN?BY40YwtbNkFP|9AK_ytA8^+|pGAHtx`Ikce3yNQr{FlUn1J!Zw zdS$8|X`QulqaoD`TwzPQ4~X$CNh52`kF|sQ;m*hF3_Q&4x*D%OkPsb5H0KG6b6&!) zEJcD-QCRtSLvgDW7I2wA5V)k`pMcM0Y}db?q*%i-jSZa(!40TZWI+K*f|nzt4ro_a zsKLSPYgJH7s7F##hLQY<_&h}yc(y~Bt91Jh?C4CX6$5(0f)FPq4y{U7F6H^5$9vNg zG%*~7^5jI6uzNQKs*(F2wPT^^R8?%UlR%r;uw!qY=W`}|f$~-XQ|lwm>(d>;1N*h) zf3mVVc6eajXs1zDE>F8(U!3(+g*<;xQ0Zucv(!3CFMc5OV)%llcqann0yW9A3INI5 zsQH1VzgV1;15Q1`Rm2D;0=4kK*L;s*iFI17-2p*)q<46thmERLMsM)8;5PTiB{ zikmAtyTX9MoLul+G~e#+pTOrsgC7t?b7P37Lb4yd;Y=GR_fw7Z{B)NO9h=dGfu~p` zt4gzvSHemfm7%c2QuSLll<2bg(ZVb}PR@#%O0hQ<-8{d*7U4KQ1dqFgq2YfZG89j18zbXW=y)mjk~FLL!TMklIq?okQI(OE z{3=3^{i38v>`#mY2R1sQqDDm>$8`;*97|YN)`70(9s(0b7!3oK*FVBhfSPn7li_uc zbW*KQ#j?=>+LyJCjpbv_ATQQirTeZoozMhL_WZm9eC1;P2UzyPB}Q+sSiB+rqk+cp z5U(`J5_deVSZHps>TG5C<$kZH<8rXW$6&*%C(LeS+#(of6Eu>=7@>a5 zI1m$)!6~hG=)139VsFkM*1KSuajmsQeRA1gL!A~}jb2a4DfT9>;D{@sP_=`930~S1 zuGq+pmj#WDSUDdg#hII|7A`PPHIrsbDB?cHaY3a<75!~y{P@K>^?M29-A$<(@Hou; zADhE!b|0BG#sWb>C~SJW>%N}_Br^mI6+BYhA<>gE{y?FILn4Fy;{$Wn^otwK(n@+M zqcW?G+RxO+nNZ}P1kE<6PzAE|Y6wyQaJ%`_59Q0m$I7{LJ(-!LaUAy7)W9b6Q?|L5 zqxb??RCM+rL=$e4FM|rArz>7CC=Vx8DDF;Uw@|FV^@si<_mdh=v8@uF1#*MT2vi+Q zE{t*rUQ_&Xi^_llzb2^%pdLpRS8+AA&g-*=9AhBGf>kR)kSrIv!Z=0N;c`2|Bz;%* zZJN1OFH?k`rzMJYF%^r974RQ-%-+2$$Z%|r{R|QJ*CGU#Y``$ZUw!T>WE0C(8;2+>kls|t90XB~HGDPhRx#0oO_+tDbeDJ9yH zxi%S9Z%9hUlmg9^yP-<49G+vXo*=y2Ax5j{rWD*)g-aC=leTKOY6EWPgsa0|t4%tR z*&8)snt@7b3z*4ax@>chnqWeHZKOu2Jqyo}rhQ+snEBwHJ~#0^s#(pgy;Ng?@8C2F z(^q&dbyRr4stFJ=Kuwor*$ScJ%`OFTC3Su%EDv;vpQFo?6p}4vu%~igk{y8C)4zOy z;DKl0(+YYKX`!;L`18z6=V%_vrb?#Im4i7HDhgU^kvfT>Q_P1A*$6d;y@yvw2;eeL zXagpg6aS)C0ktuoLPAYaB5T?rI+CNK^EpcPNjhsh>`=ErkekD&fZwHAyq2de9B^WC z(!*W^)VMahI@X3>6U1{&ExFI5#9(&e=3B`pAjJU|%b2?>vraY^C}~by%P&X?s+Wz{ zPJczmdiQqMz~*|*i#8DPn;-WP(vO7+AoRfd^&6lLz#Pia{Q#-Ovoe}Hk{P|p3Atf< zTSAp3g(&dPEmqhZ3f{$ogw#L{pTUyalpn|+l?P?%0|G>-=~z_+xW*6@#MpUcjKmF5 zm=A^k!PHn(MH?imizv#^uKL~c&$JaKYtIdZM^c)@-Ehsxtq=)e*!m>cs?#L$dw&7) znh|%07#usbPeqPbEigXR=e;z(fvc#Qp#i7UFQI>77Jz6DDzi;7Vr_)h4O5JgEWy6H zFG=imm4k!?F~aE#r*PaFr?XN5{Ks&tzq>ZMUYeG{e{S}gDP(>X%@|iPr3buLP8T$` zBK#scY&(9da-dn$a?h#AQpZ_y?X2u0N9E}KqY~rk<4?ay#)Y<+uh?BS$t?+iu1uQo zs5YI>+{IF{n0H<$Q)>DB3qxn~CRAeoa10q`i0g4kAf0OhglmAw3qjU$-8c1$WfF+? zP5^EK{2j@B;~Qj7Rpt@U$}9edo9jNMc?Pw>chiClp%$#<>@N{M=+qQQFfLjP*&UVh z+Jh*|z?+U~c9to`LFhRd@*etIPtYMcQi2}CLcDCvN9bn!=YrBp_Kx@P2v4&eG0UiS zAUI?0E%U&onwxxR&T;<6kmBd&0H-mbw|lP9)UzdDC94XG`JzF*G989ue|vr=O}2Wu zfJ47PkM{jSckWRCkzv9i7lWOk4n9b9)C8`tG6{5kaU0a0l`FUO*KMu+IIVxzP8E z-t{VI$~1b&V8uGE{u@RODWvBe#dN&K*0sus?(=XNWn1BR68<;oAza1sXPPhW^;mJ^ ziWL09U5=VCqnnJi)TdfohQJ2qrq6lFb2CrfngC0%2@}ve5Ht|5BzRJU(X+fPh)F99 z@G?%^9vi@DRI|`8KScNgVsFG)Ul`y!SSTrJ9#yNej$!jAFx)WuX%VnJRQ7;YV#eU* zA_EZ8VfD&FX+Afx%XCV&me^>jr3E3*HPjly;mowz>N=}A7Et$_CY7CtOr)D~v}u!z zW?^Geyac6~;&&I%#GwK>o_g%fMXi$a;&=k*aQs%5@%T9l!Qu+;X1NCb6;X(sg97o8 zP_IYww-AU1@@umOtAyURqbcJYb*E_K66V>z(LG&}i1n(Tkf#VpeUqq;X^uV9aK-$l zWp4E7CrZa&HnMpvj){^~l#qS3iZsPd3IXWup@4>W16d2^I z`+ECd7#$qA$oC%M&cO7e9=hr}R$Rh>VWjj?sJd3X6(q~%&rxswM8hR*jGE)DiZwa$ zW+M2R4pBX+W^u9}BBhBAo`-Hix(;X%$}J+of>yD+H1auCNZ?P+9h-->y(1-6+C@WM zGLTz8cHHbI6z2MWb7)^p#+BJ@XB(d>CPmB)^mA|SjQ@$qZ3o)$65+2Bh0y(Wc1A8jlsKjoe>_g_hw-GxM?4)3J$xJk zHZ-S(D_U6)EemLD3h=g7WXovS!c7$pk=M>LBQ_TlIg@u;XDUyVqK24)O~gq)%;1S5iUlfS*c zC~0&r)g}G#J_W@UN;>vpg}Xy(xXJ_l4L5j?u<+MmvT0;d*F*}EU$oiNviDqY+rMwX z1YntLa9KLNbupx;3Buvj0AFvunEzO_Ks-(NpmBssOQot(xqTx*SMmqR(j^s%>U}7$ zkh3Oz;LtK0Ywk{|zUF))#qgaIsXN*(6RKJ_HZ?Fb)r!)T*D@tEGO)3;vV*iTL?x9p zx-w%Wlu??!=^T%|A<0^cNUzTb{Gyx-zS+cNj7!h(A-&#$*utW#T2~(DAlyzk&*){M zjCxRZsL)}UaM<*7jzIijmkJ|&aj|KVX9j=j%v?84e}8y=0589bocW^>x}paNS5RZnX}Oz`e1zPab9 z(gGyA21G&k(Q(|usQS7tDExtkLWn=^!)5!UDg>8dc0w<9Fb5ZqL``t6z5Ug4zZE=z zALKOK0dMDjTntn=p0OyBZg^PIh$Ql_dRk;jNmWVk2KTG+vSv3^9<&#uLECm1d1Y!f zkozXqT#CzSk562%ZEjm8>O|CrDV94ai1A~CF%>HDB+QKXA~0r|XfVsOECN31xHJ<+ zd&q8|8H`cHXAfZKC-rs32VUC;NDB~JMx=zD8};2XWF}zwU5!JU#l0Gjw~w^qeU!`3{2~{ zVq`^pK6BX{nfzCAcJWJfAMFv?afX%6B}UaY-|7oD)&QPo`so}U8;pu zj!9aEg{^^AT1J|gMUF{Es*#n6QJRgFgHfK1L!R~Uzs01KV71Xd5s#&%nW0VX|2M=f zJxw_|FQd?)+#E((04qWRMv01Hz~z1T1$_;(F`=YrT+)TdJ*6puB5N zcNZk-I8-99@0c2qqnH@3gd-sj=^diztPo;lqw`03rmBpb=?m}n0)kNZ31N_l4*UUc zl;jlCaY~V$hxy9IX0Uo>39lUPApz==j@ClhG3&V!yaZ} zXF~1Iw6CU2{MyPuBl+6Oe#E~`;5Jk~_*=VHUnAVad7?10RfD&w{go{V7Knts|4fvN zxx4DZ+AQPbbmOj1T+?-WjA~=u&cM(gGxY}0t>pfpIT%qxUid>90=|VEe*LiOG6ctw zzq@+L#^iD{p$I)x$%j>cJYSS#@hbiZZXH3~Q$kWCty%)z2ZCfdb94wON3Cx|wF;Zj z$EM{9%@9ZtVA&pW)FL!Rx_FpsZdl?fe8wp+ZYs70+mV@{UHSMuot$Mnv-%uVn< z_!fWrvkjyDkl|60cYuTWtQPvOdhhwSbq`@VrD``THyxL{npp=iq3KjX{z}>~shSWc zXz|S;cG)N(y9*2-yl-FMGH-Kg#z#EL`aun6ayiFtx9c^esGefo?MlBQA)^g1K$ABy z+}TM*)8)_GCvrXE^pP8su!MDlX{m|f$iax^sm7EkOW-MQlI!;jj>RKAjE12T{X5zI z_8y zz%cx0wu&WS#PI9Csxs`>7X|?CPbpz#8o3hU^JK)i1;snVgn>8ZST1Y3@%r;L`|Zn; zA>W}_p|^`ehp<6|Ij4o&y{s%%kOORt5TN@gPA~CuT_%t#F>6hvGvN+0cK{AmJMDB- z+^q*GI6=9os~4qEGy1Rt48aoj{sAW)gzU(3J$#JD?vGA923#^qoB3_S9Z9uEXU0nv zr=I5rG=@c{`G$kZ_f`F>&KXY`Ov3f<8f2=p9RvSDqaq9)j~q@_#xnHFA@=-9-7_R7 zk}e=50>GV94gt*Y=SeW^b3cG)+^D(&MqQsu(~hAR*kK*>8Ep-ZmY%>m7p}CP?=NKE%Qj3M^(|Z_$#Z&OcGC^16GKi+1~r#Axt@jBgdj$ z7~C=p#_ig+M`oyZ)}w;wu}9bQE5-;V4#yQfJ(=ecy)>6j@WfwHs6HTcbg5a}5zhL( zl;Iy*7hQ;(yH)4*HpOaajVj0#NVxw>SMhucOQ_-l+$rJT%0kk?tgep2dvKoORTt?e2UE3-Mo?fGD8?doT8E$Vq&JH zh5z^>BNdXj9ITWltKrUko@Z6aHt@S~bcap!W#0(QN6y367)@za3ngzvr7NdnuWj z%vuA*->umO$#)GgkoP_76EY<_@0X)5I=}wXNIOJrjSio>tUSRiW16d8_=CC5SuIj+ z#{_(Wc_*P68=}>5&NA`#Y6LgY4dG@3L6Ty@t<8~qf?8(LD52p}x!97IbG*iy3$w&w z12!`i?m^S$c04ms;B(_NSccyqC}|!8j>Ar7gaFi*03p*JzpdQcrA$pBB<~TYuE<*O zKwC1lp2RUem;6Eh6CXln_9P$_OD9au5L4k&kox%)aZ3BS4o4$qY7Ysu2_ENjEy?KX zXZQ*vB>xy#Z2n66C(z|YF&h9C5Ig-36%cak8FdXB;4kcefEJ{Vb`k2nR?T4;4d_zg zkFT|1()7Hrr(;eQ;}^G{XH<->AJ{I?TxV8Xi@Y0s0l_AA+gQ4IA5;mFaX=fZpa~F!g3j9F>zCJl~?~%SGcC% zUd;DY6j;mTDxmHKaSOZ+zVPK$urx#D|5}-&cpVHC>Fk@8nsG>Q3Tb0Fa85wA&qp|a zdV()t&;zVzQeqqa6+U8z8_VN0Rl%j6*hy1Cdx-56w|r6HC=o4t2MiY!8R{4k47f8+ z3_3)mv=WqrYrmMaAj!igI4`pss)II|FARVJ0$tQ5$_AS56b)#vs=>=OATmok&626w z79@!A#T{*C6OJ{`7_xh|6tvv^?!M&^@IR7o^GrSOkd4?G^l**yP`2YM{@V5e&&moP z0=^>ui=1y5bt1IOW=BA-q{JW<<;oxMHMU145g;D@^-yq!gZm018|`IWGCyNsroJ(J zz)AqUTUhR~%w9;?L2p$ex^6QhSAx9(rAJN&)p0=Vy|RFVyHAwQruAI!GeGpd4`a8z ze(^WEYo?IBuJ3wo`K zN918<)KX~7#ebilL0RTLRwPruvR`uPD8@f?O9d;66+2POT}Tu!Dk~?&gSmuv&>MYg zX@JGnOGW?Yzse_ur%Z4Q1s^8QxvmgNVAys)TrUgR|Cx+w zRKVO<7$;lX5$8GRb6@J!ZkE97chxtC3P;iTYso09>erV4GSZ3;Dqz8RcnMF3;L=RM zy+LxkeIiOzV94@IY&N!i$v!4K?SW5bmGv@=ofUHMv+D(^@Q2LhMX#f^!%Ksg4 z`36I| zCa)xdBHj8Nm3LId?X?#d`&&G1OGSuN>Fj9;Q+gUf+eaUof6Wxvkm7(9hS%E8H+_$` z3gg=>(xYYHTO8;lne^cjB!*2XMQ{<{&X#Kd_r?|78;mKTuyk4Rp1ighP`+ap^B^k5 zK!iF@kCJYc{qL>_m;Wv4*yY$+q*(y6G6lAJK$IGr3=4;he50%k8xsp-vm`4=Ju5qF zi!2L3mmLdvF#JCyouQGDiGjuc=(7Jemp4l*Irjq0EO=?xz`!6TY;715bm&Vk%;x_| z=S{S7Er$j&_aeRm)VMLzfT0em_zN$%j4tOffmKY#)X4N1Pv5a{MsssP@kpD7gvRbT z*LXNH*PVe5D{fMvQdqHs9bO}9&59OgxX{lBC4-zV`Q1$Y6A%>N_V=2)O%mS2w4~MV$vMd2!q8G?_&3DmXN5+YmK+R~emZ3ULNXaJHC=dBMaAzW~5FjF|tnAoYsUju?npb7p$UO zBgyort=FFSmmGwz$6Y7GrIP-M{-5uTKPYYYw39AsE1?l*W7@tjGngg0rkBxwn|GA#w`FKS6 zF>b=UD5gg>QA+VuBC;eC_s`k`1-JLu?>Sg$$j&R&wd$agJwm9gwNuW+iSOG*2p(^RT+wW)MVBu*B$PvP@tXvA0h!s8eB zAF!j0se}dZS;b!v?ijT9-~0)#;YD* zRbwxV{5|YT{Nonk0wIq!Y^n-J(Eo4&g>CQi z;B}2b)^-Y$-pXw^oxPa#_tF=c*qG;Pjg2{&-w1RkiPiFUJM}Z4nxmPVVYg3sh@t65 z)j5$w;Vs62_TQtT#XL=YcvyS#6386Pj|uzeQLog5b?pd2NP6+9=%*SQ!lQ_MSoHlt zVfXtk=({Qi`TR}GF8ZWB10Ow=${X;rWZPHhoILd^fz-EZ+CACD;A{I-PDdODdMh(O6k$WJUCwCLRP|gs> z1cjvI(g!S-|L~aEkFdvg)@GAH@^AGcqNt)6@@?4wpg0Zwf+9q%bA~Ry3#qZhgxQC? zJfUyW3FJQ=AaF*-^u`=^ue~n?O<14H79a%oA;3OtMXg`zjz) zlWc`#nukM(*+`E`o6Z^$86V@p-%eoa`L{nHwC!)w|KTLbMvo@ zzP7jF$rdHYEJHj~6Ee7v_)D@yr_W_ojl~m_9TJmcE=W^C?wmiIPSI!Yw7}CE?_Dzt z<>>dpNgDBz6#3z;_oYjGD_wYKhrts#FV>S#5;ZhkJbhbJ=T!yR-&cCw`qoKC!R2PJ zb$Lji4YL9Nu(gCQhkm^*fxt|3(5Qc1oc>?E@W5Sz6dsp`F18zfvxaVnLRCg_G&J6e z>AGz0lMear9~XurBb+_XDv4;Pn5khFYdRh+5-JWi7AAjlJj@`xJlj`+!S~fr_4~i6 z%D`6!B5@o!l2f>zS>1^qplOgR9mUC{T+5{g zEKcT=k!8}$_KNS*PN+{*Ri@6`T8mzE4x~+7gmd1wa(OFP{OSXuOXYb;U5C2*t6>;V z*@laUwiX9MkKRO}i|{KSAdH`NXquIR$BPlh^w_1f0;pJwczmHAL9+bZLqBYpvnXQR zP2qns(I(-h)po-$tG%sNcK=e#U7>E0?xL__J3(kSqhUKiQAr(}8+%Ah*7xz08t0hk zEn1(KYD_Jr9EvP2l}ZgrvpPr>=Uom;R*+2mH5QD35;b_&RzExl#ZpjkKAm`- zI>c5#Sy(UH9vYeHQfq}&bb)oDbSy2ec>Brc9E9-{1fH6hjDJN?YG3(EP9952w<|q6 zvrHJu0@77X7z&#$^ngaoRPGWV_KoW$Hei0iP+U7iTTK@qH4vLsFNl-_2@Mze7Dn`H zxwbZC${*^vp+hc7D#b(+`26!1BltrLF)uuz(=eTnn$;UbSyrA5TlETUO1ox+M_LYB zb{n=uVdy30Q*zv1nc`Z)SggPyA?kWApD^(CD0oy?i$bRV`PAVr^>e+|g_rbBGBeKL zI>3=FBR$?wA^4uIxc0g)a*w++;J4fGbcA~1nowvH4(a%k4~5NIL63Erf%i@gtapzR$mgEjabnuON_lu_5kDM|x0P5-);1z|Ar8o(nA0n)$IqWFEGz$Dn7dC67^0w)E~Wt3>%ybk&M#lk7s#z zjPAu+jzir%c^auQ!>Bx7OgX2B zy6f@t*%4d&02kt%j>v`T%4ph}N$TFp#%c1*Zq%6%qPN3U~-#S z#|LQd*I&j5!R?5D5Fug1jt=KF<67W+u>Qmer6FSRVHs@{c_7?yn_(M>&ePwL1vo~z zh3ItyBQl(tmRxLKKnb`!3Cnn=*u*C2%JM_{`y<- z8NZK9Ay%Jl!YsolrgRB6VuIBJj_0l8H}`x$^H$Fp&iDrLL51A|2sxPS0{AB|1^2hh z9440xXmfg0FJS~9P=IJczNYnP7R5J z0PxUKFzZ%=>MT00{-DwKr1n8F^eiVtYp$X|m~qOakp1BN5Q9~l(BtB1K`&dq+0id< zOXn=4OpeV~Rg#;(Ms4=`#^}s|vnxkY=pReGSVOO$O*y(>ka6`1m8xfs`URX}NUc8M zI{#$lZwcb{!ShclH4W@*Kv1Kk8*1oAb-5|gLoIMZWFr#%Y!vhD1p-9Fu^NQ-4k*md zSbA(+$O~oXrITKCB_+)~DI(i!mF0Tv}J( zCl|-lA7jI;3=c!MDNy%$9*&>kM}&Fh%!_AMu?iDDWlpO1dSGdj@5CFcl(Y-%OI^ZnG9<2CK zxyI-9PviVQfAeL0u5MClQx}=0QnR*dT9%NNqNiFo8MY{|l>cRh<$&Mh1_4jp!X;erNV7gzRjh7|sW;mU_h5)*jjGuauY#zedKj6wf}l_Vgw zF31ch9Fvs*60{$qqrnV5Q9bX3;G&p-gl_}V^C3Z6_sF{j?h?$|LBEX9-X^5m|8*pv1VcWH<_IW=!2A6W-y&5Et7!8B|ww zC6{|HO!>sDgr3p+Ws|jA_m%<4N{~Rpkelp+LW7{fl_~2*?_j)7tgfH7(3tNAh@5JE zQ_zV_wx5h}IF&#pE%zc5$z7N}OhyD)Gp-p%Q&D-5p$8+Xz2f;jTYL7NVR$V*`as5ADU z;XTL9ZSTO?Dj$t5RRoGyBlBN}%qc01y_yJ$%*F@Eu7*;@zs!ofpz(ydfWnyJ+V{EBsbVRjTkj&+x2xuka+xAWM0dj~uR`Pw|ZG$QZ9RK>E*#9kjvQa0a}w z3q9l>_;U)WoKCEtiJ^y;qJff@jY0sc7!JszU8wM1zd8@d{Q&4ryz>SyEV#Fq2#E{N zDtGo}r{$+e+L_iiM=Prcdi{YcUpCz82}slXX{uUo2b$b*MNGVDk#q>G?@2G~&LRjp()C{#ApMmdpJR1feO z=DIBEG->J98fPM94$!v8Q0rhxYabK(U?TYu#J}Tsia$^?LJ@Pxdz*@KpyQtI!VPYM z)3%=~4<~r;pqu@Lr`C8xF8(lkjdq*m^u=k1k9}xrvc3s+$cq? zFN}VI!TD%wBT0_T`KT zGFj2QSEAUZ66NTkN#YnTmGmfcu6P9;N(_aHGzfa#8b4%kRUD=KEx9ABbg4tuh#@9t z7PK*Jpq8{%SF}q3EA)ciTaSm=mUXonyFl?Ehs{0hA@hMr7@MY!n1;aJTBH2?hr(|+$26w4m~xa z0&1`0K3!rxFPWb&2{gLdW1ir@*ZkIcZ!_ZW{DC;?>E=PzX9UB383(ek3Dq<=WPYX^zplaMb_8;%iK7vbZ z``_TY-1?)Gmz%UE8uw7tVEW%9JTYt$`Y}6u!h>7`onXdG%zMLf*=K=j2CpR=X|@6y za=hdBz3M-27DDTS@OXzv-VjD3$|U1Q3_ky~sXT*Fo=g0*o+SK_Jzy}itUUp4=xvoW z1`P_jqMop!u*w%YY$(>IjEo0V0T^)@c3+V+#K5BAX}xpt>!!(9=&qws(US{#2@1i zLC?Rj!zjElK|lu$=$f5yc1(%zwIXz+O)D$7Gvsnt#RRJ094$*Q}S zZ`+MET+$n#6U0^})MAwyC;O)z1=s7c&MOoWrCqx6=)8K2*D{RuC!^n5Ui?|#HzOG1 zLu7ylI_1A5G=Q`Q0Nn}ZU?cM&3rE1?3>6-Opm-l3G>)cRi#|OUhk!O`y?MUpn%!A8 z&Q*Lx%)sT~vn zDblZ1@{Ft3tESw|-@CW(maBSIIbPLj^>FS>M|Tm9OqYhoV0zS9@y%RUm(~GmSlf9A z|8h>Y0307P{Q$Kbps4G>1}Kyy_{P>CHa)=VthzBMIg4=C(UJ8=Fdj{}mdN%0lG`TL zs_$-4q#Ti9AggJ>hO$NBQ`&PD#Z(1So7l$HSiEu5>lZO?D3hnyWJ*_j5^8Fe?tjF2 zt|DEEgOuJn$_JV)K|p8b4+?+6lar1*M;#!r3|-owbnI$p#OXDx=Qsq=|16tM-y{mR z^rEf!&B^Fje*-O~eHe|{7RK5LI8`S9-zW?TZTv_k?u)4eoOTdmxekD7uHD<#&DB2U^)p2WJj98H1g&tU9Sb(b);$qDDY_NZ!i1xu>~@98D*Z`$h96 z7_ua;z3D9EuH__ua`Cew0oaRR#TH~FBoJI@;lZdO^)y(Qde4W3Z7>lAA&ZTqT5#+< z$@BfzA2j#3Ab`416aU}e7{>L8+LZ}~vuWZX3Wz|v*Ao|li!~9!m&zN2WO0O&P#7WC z&t(1jT?`+jP(yAdYf!{8Voi>Qp-s+KT6hEpUZr%AoCYIZA@bYjVT-RWq>464mMlm# ziUpm!%F-SOrnJ%_8#}X#eIeg5jy(I*heZ{fOc zf7c|u)e`co_x%$TKex<0$J7xME4WoTF(oh5!Idg4~QPR-=nY( z%i0Plj9gJEt?8oDUr2!&N71jwTsuN_$^fNa?RUPocu7dQ3zBr}?s!EULpMYOmjxse z)h!q36@x#;q>|CFp)hPZ&-8IA)fh=*`B&E&i3hz!VY5z0 z1AXO$AUab{_umHOKhr>{=6{Sd?fBn0^FyHJjsne~EAgqxVSPPMqIyGtoZ~O#NgTIg z^Xy$I!jwvvogpAVs@`+9VOY|UmfF-6QR1hbBy2-ZpM*O@N~NZ1$81!aX%#>2&(Pd^ z4-HyIEOjk-j1!9B$!U4_a9?vsJ^PzoeIo$6>~t(PZNBG_@wHf8-2j7ZJ{3&9B4#(0 zxx?>P`g$Z#oNk=C7nujp#&+Iwz_pIa{97VJ07RWk7#7*-U_8p9Kl@|V7#L$H`j_qr zM?;>T;jJ*fMF@&E8!or&%W8Y|BC++gWx_i9H%1I5&$L_BbwQ+tux7BzFwY?J&J{-d zIb%`6ekRC5E@NKmtY-N^609t>WU^R}7mXb8G2HI6h7D=qZ$^5>t3Fv)UBtptyTZ_T zd(e6L?7d4b!0HVBGfG2GQ?MH9zTi2Y2@o20#i@;%EO=K_io{3i~8H^)9;S z1d*_^4mh~nj_xS-@X|?CmK@K-ce34Rc0!r$gv$%&ld1mt#1iwEk3!7yjv5rMxkK#( zMrv0VtW~g{S<97ur1~SK*ygG;9&agski<0HCrKG5Of%5Awiq#IgVF}xdIYOb@xq1O z>gXbOi5tk`3eQvGXWVu&2=N)`qHBsN8ZYzq58&fo^EAu4nxGQfE5dleEykaX1}$Mc z?>b2w?OmhsDy(cM3bbwiI{6GLtYFaap1UhE{)Oa*T*=wn+YapJ5*dsQGr06x=fz)V z?W-Vyz5Ks;`Ub{0x3=Bbw$Yf4Z98dfTaDG&wr!(HW7|n%+qQWo-S2n)!OVKrx_Lni zm-QPDk-YC)r)Kv(^DI1sfcbZB+>)tCg5R^ob8oo4sTC1`XA%CNEZk+gKcYId1uW^H z+f0V;TQ`VSzk)fX&B^8bTtZ2j3`Ejka6q6cF8or2>WCbX`ZRl81*c(`I0=peKqM;l zh^!B(-F-@UE&Meo0k=D3v~XMEL0e*=$Q*4QT6fWSG`Q#tOT^0l8KmGASp$b3MZKqC z9DCVo*M^pFpvMl{YMhQXN>&!07R_lQ3Jwk} zJ{;vXp1IOf+EI#0_(nQ`Szt5;=$erz8Jb>_mU?7dT1`QmQX%977{~_q8-UwgH7_p> zz+nMhW%HaV-I2Q4y%%WB7&S3saiCFf!_=Jri87XyT`_zo^46WL!@nc1@e`MT;@6GG z+;KN*!~Qk~^vr|+j3F5b?I5w_zki0{hIV5-0*J4HsejjY3L-Xct91)fuLFY~d2W7c z-~}^V-3Vkb0jZz?6bs80Dd7}Y^N&Hb1fzN+F?VEhp%pdMe)Gp1Tu$})1fi?19kC_2 zfi3UkL5MyKcN?Ux)I;Fp9Un*H=pdK#5YDuMsK`;vIh=hLn^SVPqH7?A#!Z|`2&6-6 zF0e5oB3KPJK0CU<&2^Rqd1x MYI6p<834+rBpHT9gKIv1lK4_DR03=YI|h?Q9T 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/00changelog.i b/AndEngine/.hg/store/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..a73d9ff30b49059017a8c79b190d8b29c1c3a1af GIT binary patch literal 50240 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Î|az*AU__<-`!dyPBn8+@{J_-6Ns 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 VYFzr`RsVfmVTHU$nd^tb{|CxqzSaN$ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/00manifest.d b/AndEngine/.hg/store/00manifest.d new file mode 100644 index 0000000000000000000000000000000000000000..9002f6bc08c226cf0c1fe5626ac236c326fa6c4d GIT binary patch literal 279750 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�iWFh4nm{nL||`H??8cEh*I7PU+i?^@$a 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
  • M*@B^p4}zZZ{TepxD1jLc`SuLsmX`Q` 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 #I{#9_wQ6ca!zPSk`&(js2 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 ~4v*vei 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 }OBv3u!3HZXx>z?mv?-5~BYVa4koEtG=T}WMPWU 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/_android_manifest.xml.i b/AndEngine/.hg/store/data/_android_manifest.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..8ff49fca083010bbc00d37f753dbeb7227b5281a GIT binary patch literal 1301 zcmZQzWME`~fV&I~jG<6A!+$8){-pExG$qe3{~q6r_7nWHvFu{eLYNv5T`?zhf`9g5 z1D>PjPcApuXC9Z>E;y-V!*9LT*!HZ|D?N3jPv?IBxID*G@{P)ud;EVZ?>^K%^QvuT z?UK0nv(?v5$SIk3EH3_Z<@ZJW&UaZA>fQ9b3Lc4_c={rCz5dcA*Ce)y^Bg$4%G`{N zInzk;=9*dSR)DfR zzLJ-FUSHm?8}q8Jo%+)-;nEvjkwE!1+qplzGP?87WN~EG--2|DhdO4{bsA52znq-1 z^UYeT&*^hiQnq!ledYZiSJDUeC@@%nfCq@bgIT~(0@0xG*}?W`@7K+JKACZR)!S{C z)vS!&_Zq4OMgjSZo-hu>OE4=MD5eM%+Xti>L1wK@ox^YXGnt`HzdHO|aq_|~>}jju z`hbjzImrnL7Do;o_#oBMY?3VeL&&q9HYF=Ew%3|i2b+WQr&OF(v>fktmfuU)FoEgX(Mi;PU zF$kwIvI0ezKu$}Z-yp{M%j2j-`k~!DF5j;14q?s!tA-MAr)iuza6sTpW^mM;s5Q}Z zCas+?V|vh(`7@KI&YmegXOir+sE|1`=clhuS+rz9{_&%klOqBqOrAL>f=Q%B+t<@q z%h%uE=alExP%TX@Usi2a2D#<3i6AQ&7l17?L2?@?_?SU%+jL%Q{z+MrO$QFw+H=l% zFZSB!r#o0Rf;a?Zz5-$mPMgx=)MDM@lx&5>yp*E+%oMBK%)H=~?6B0L;>`R!TP0&9 z1${d%kXFVkAd3RDR|T2pzbc?&!2Oq`b>FXq}u8Fa;55tNz1@-#PG3Fawo`ECMgifa1`hY zWgyK4qyvC7E6C>oZnITAU61Acyp#L#if3iqZ-M^zAjL2M%$esm_8l_dVSBK%vP;97 z*Mn#IDqUu4?n`gg3>C8;yA*a+{NawNKJ7cLu71;>@5{qyJQX(n?a^$trCN2O&z5<2 z7ECL;U%T?M#xI5^?@zdf`Q2f>DYIAh%HkXSFpTDIdi(ZPm-P<_#$+4#8tLN_99^|h2 zRb!Tx;?kSa8m9jai{*D07tDTra+3I;2XXnW?mwB=^&|y>Ji~M!>?L3_WmE#PfPuht z3`BzhfqCB){g&VQ$6Z97xzAnB)v{bD0g^)oZ-Dy5fdX2bHi-oVIho0cCBV3br+}2y Wq|)^C#H5^5Tcwhs(o`j20ssKUNb7L` literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ant/export_jar_to_and_engine_examples.xml.i b/AndEngine/.hg/store/data/ant/export_jar_to_and_engine_examples.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..76a4bf44f3080d979d93bd2d9973857dad764cfe GIT binary patch literal 441 zcmZQzWME_f1I9`Q2IeLRn<45y6d3F*IWUJaj-|6ny!Z)$2X;DSxG!t8G$;_Zh+kB4xf9Dx(En9YL`Q#_NpUzQ> z%HwjC+TbT8d)c+Zg)<}3XyxY_cJ{I7{51+iuSU!CLW!NqWox~CmcNfa-(R+dqjK`ncx#c&`mUGO z%l=u-bqV4QO}`+`!pMDS!T!niZD-GYWLC@h(a>=ttp19??48#GG~V5*yS!iVa_ro> d8B6{vwfVljF8EsNSv>#i`TW=B|5?rd8~}#Rz#9Mn literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ant/export_jar_to_and_engine_live_wallpaper.xml.i b/AndEngine/.hg/store/data/ant/export_jar_to_and_engine_live_wallpaper.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..2b094a905fed2d8b07780edda8232f21b0922021 GIT binary patch literal 682 zcmZQzWME_f1ID8a49s^RYzEE$P!M_e?ukXqCfD6braRE_q|bhHRH#-m`ggXT|A#A zZT|av`tBb&I=LSoY=|@L4Bvb+EH8MDzQCqRmTm*y=?{&(rgukb#h?0_DspyR)UmFI z`!=lm!;zPKe@0GjQR)Y`t3P>D@BZsPfSM zynC@ObAAf>u-%gK*|G7@udm&OF&5SRn^H6@&P?&HI1t$uy`p4h!Ak+JJ?zJ4Hp*`N z#WQEe;x-?_Q|y~oP2HT<-WIXtfzKaKiwoED^X+Q(Mc3E=e_3`ml6O~@Svb?uuvYhp z&0$h+S&x>4r7~+tE(=|^(d}+_MYLt-^I4OAewLaezhK&fBAx0ei9J#baxDLuXJ}ns zeCyZyB0ss!W~JRyJUf=^efgmvP|oUc=Rh3i+91cf2g^7dt!KJ*8D8s@EK}ab~{|+-UKNUn)p=zUdUHJ@xm#+@ElARWTJaj&*4|PWVI(mM5KLs`pHY1XH8U9%{;yA$9>zES<4Um{Vuum`EHe; zaPM?(SFH_xQnHr=D;zj85`$K5o?&Mn%iFJ6$a-Bf+|Ai%>%zyE|L)b;p2oLGA^4rb zRI_D@s+wmiR(8$c;@;C>xqV8;K8I^F{eu<7_&-ixVe4qT+EWuA| z#r0(xLH{NGmizp>`qnjwJ9OCv2^L1~LkoWD-EVsu_M1^SY>%r;&f@!-9n5z#HAKqu mw!geT;or7%VJ4Ss1P?DXecrK_{aL<1_Bw%U^Xo4PY5@SX1IKg# literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ant/export_jar_to_and_engine_playground.xml.i b/AndEngine/.hg/store/data/ant/export_jar_to_and_engine_playground.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..77ed4fd2b8d8982bb5cc021d5d52733f57c81673 GIT binary patch literal 443 zcmZQzWME_f1IB6w2IdwBn?d_O6vP-@;A?a;49@<4F5_{_!7tMfPhAdG1EwnG^ae+J zA2txFoA;oeBhf!K`%ZVq7QTsHO^Yfjr){y+mW&LVv@M74|8Di%waAWceI?-lYuUo%?TW8&|6B1x zZTqrIO`0=}-UyrgPBd25_u}}tX|137uiTz{Wg>~4&Sky+KF4p*eeG@>(X!|Cq4ly| zCi{<8bno2n=RWbu%vCHUY>o$-3|{0t?N8iW{-=dA`<}AWw#)J+N6O?(&WM!1+wk)K igpd2q#hF~H6+FDG^mWHp-p}vbOZhoo`>*^Ua25cPu+Q%R literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ant/export_jar_to_box_face_stacker.xml.i b/AndEngine/.hg/store/data/ant/export_jar_to_box_face_stacker.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..5e75fa5a61e0b2896eb302265b906377b2647417 GIT binary patch literal 517 zcmV+g0{Z;`0RRC20000000G4S00Y+m00000005`||NsC0|NsB`*iIcE67so^7tJtV z$FTF#FQ-HR00000000000001ZoQ+doZ__Xk*B)Dm?_gPds~wl@IhPG%Nw^6NwxxC99e4NkMipOgm4{@z(Zi!*dWCONgY(LojGiT@ zlzWaQ2Hk0RTR8#88k70snmgY^4crwFI@(z>>jCZr z{{y&Irb9LL-{qXxXN`4(>J6A<7dm{Bu-A5b%>~>AF1~?dTCEwj2%1SG&3K|7AtWm9 zBwD@SCKw$DDV8{2-&kaH^t3np(aaPf-&Gmc9z~izV)TTOf1M6eWrVIIv4%J%xbhS2Ie*hn?dtG6a?Cam3;}hxqQKj&0@-1ly`USY4m`q0aF!odV}wJ zA2txEpZDOuz@d4kuI&&P%#=0K;u1c}Uo&OP-l;t%nx4_i4*$RF9c?XJc5Au!`|nqG ztIfzS^2{;_%MiUZv)+kwh0AiMRK?o5U9;u|CV8(5(%afJLCg2K_;Gi~#4l2lCLOus zq~+sL>lGC7(QBHbFV6>|Yj*+`RrIa#p6aG0%%xG}-WSuLdH=#HF}Kw+BAY%qaQ^1Z zczH3YviQHm-njdB-KJcL348a{ve~8U5Yy=$B0^t8lBIMnF-{eEq%}F9`HktCbv{hO zohRQcd3KC1z&p=Kqx#kvds&8UP5&8=IelHR>|g9TmECLB2Ih7Mn?dtG6#T9}A2w?m*MIMa)-EOsRwZg&x}6DC1EwnG^akJc zK5QURKkvbRfkX3-UE3ipm?>+d#U*@{zh=soy;FO1G(Dr19sYmUJK9>d?ACJc_usGX zR-2Q1ZBj_WnhRQsESuR2O2Y-T6Nc*bS_n-RgI{oUk)K%$%&fpgx91lEGdd@bd zxpl>ZR`19H6+=y-w#7|V%8q;0)_Ze&Jk=Yr`giW+dzAu7oz>g6hPt%hp8L^#Z*S058;-@&r-6t$R)G$RqLnx;(Mv}x6v zJx|8IAXko!Y(QzNefJ%Nk~J#bc;RgS{&9!T#=;i&4(b(|g;5;MAlioWWqc_kv5?{A zb~%3=E|-yr-(~YKUWB1&87l(&!n*PccN=>RT5b4V1^b;IpN*3%e3KfSSJtF-7KD_5 z5mqXbr}XFM(?v{)FS(IiTLURImR`MoGfoO;??99!;~u1PDGex*u;rC5Qz{(r67IO8 z#PA)mJ{Y++xiUbJJ8H-UxbhyYYUQlifk757C}Gb52m1Qs*UvY%>tEO3zpW{$xvrYc z6$7DF;eq8`D-HGnV>+wkfQp2y$~DxWdkt?ZC*WLTGJjrk=Le`IcR7?jZ5AvBfCs_< z0A|YcsJ4Dt&WU5zrfyM#0k_zN9v=kkY1mAwjA3)2ok7qJrcokfVA_33a}4{F;~$u? y<~<@|NBu!V?BT11LUZq5H~lwca;kF@jdV}KuxZ^oVTXn_mxgt>2J1if;w0tzJ?wV? literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ant/export_jar_to_heli_taxi_live_wallpaper.xml.i b/AndEngine/.hg/store/data/ant/export_jar_to_heli_taxi_live_wallpaper.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..c74525e2c4ab47608c70c5f6380dda5f503f59a9 GIT binary patch literal 513 zcmV+c0{;B~0RRC20000000F@O00ZX$00000001ff|NsC0|NsBucvILI5~jC|ge1BD zjVy6?NuBTj00000000000001ZoQ+doYuhjor;iEjI|z}d&{{SHHw*U47#ZE@*w`}m zIL^}5s3?+=Y?H3+yYK9H&KBx!e(_2A{qvo5HkYn?@Yt@IOc2y+wJH$P6pJ*ziVKJ@ z@eW?XRf2^~B&0E1_KY>dedT=p9{kqbpwU~{>s#I8H!!Ax3VpQSnfci~yQVj5(Fg5p z&XXwS46SrZ+cM{0w{I_2oP`>!0^=;^+&X^!>cu>(yt_wPvjPGt?QYPiD zP~$y#&MfSR_1db9Ewx2X+*wDa2=xP5wc0zoLrW}La3=l+9O#=jx9>iE*?hnG_+i6Y z3#REd*8-){RX|aK(FWZG#q>_A2^ED!QyOg1j2gi;UgEi-WZ}F8A10_Z_!8@pmPF|U z@F4gfz(U&*)z?qUd3ns*)jeu5;2m{g#7B{Ma`M9HLQto$A4t?ssgq@lb;1XwLH3V9 zcE+=eN*Z(MopQc-Jo^6ZM@x_&y6V<}MEW0N@kq&kpUyIErD+rn2Fs;bM$6&5x?|j* z9Dk;SEsTgv9Q7v+siDsrN&_K0Z~AY@;#B7(8XKNWP}7EWCJqhjZjczR5Y@i`onJA4 Dh2#0d literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ant/export_jar_to_heli_taxi_shared.xml.i b/AndEngine/.hg/store/data/ant/export_jar_to_heli_taxi_shared.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..e1cd76dff6d34c952c4b919b2d8af1b1f5457972 GIT binary patch literal 511 zcmVAYuZ%_6GBA;Z340K zj2!zKJh^scCsD`5cjugjlvQMqmz;CIf4NIe#=@454w@y|aFCKGdAzus&Eh1MSDSc# zDe}b}=JP8^USG_xagnr)C4pUOUGwY>qY)_kY#zjFsN+HLjtWSm~(oiyOQvL>VF zQA`OKVWl!fM!&A#pDify6*rP=YapY>((5;`#%by71Bi;`+=EmuqY)(%HoVqVMuh`j z!2@@c7`{c;TO(JdPzES+M}b^|s~*v+QO=qz7-Zpr680Rhr?1}Ke)xR9`gZf_ZbeDM zbsZiq83?UP53Jx?X|QJ)(^(}4R3zkep`iiYYj|5b0jC<1`O}6wKR~UxE1>FW=TR~M z+zb8(FjuBWwe{cSoH%3+b&DDdxWOs(_$Xq}SI)G`8IB0rO+@W_f*v6xDDEXXy+1Y> z97idZxL@B|WOVX$F#Or>6d^xU8O|O>+Am`Agpq%DN2xMG*AhB|>6A^QY4<{*4ZEZE z7fjgj9+9$x{-7aF@tEGeDq-|G B?iK(5 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ant/export_jar_to_high_rise.xml.i b/AndEngine/.hg/store/data/ant/export_jar_to_high_rise.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..32ea5bb31a755fb1a17fdab6d351d153b164bcf3 GIT binary patch literal 440 zcmZQzWME_f1I7vl2Ifi#o5A8g6x98j`O9RU&cF3$_rBck)6ffJ4)2Ak0aF!odV}M= z4;u*7&wEhLk?5bAeW$x)3*W?3EUq(u=|mQnE}-=9?m52Yk+rdltC;l)xn%8lZu+FHFYaUx zDmqwT5%6ANjrilK9Ex$P6}NlcFMGb1O>o+d$nfstB|Gj$)?T^oa$@(Hzc&|p{MF~# zF7a)(b;lCFP|XFV986*@j=wec@y_1+O-49ukF!h8^848x#x@xiDX&oXJg^J<_KFY1V zm5eMYNn57k|L&!$oen$g)1~+O>Rl7g)+@zov`!iw@o8|x8S2zzQs)tWdc2&RaOO(T z87QMM;@a@p+2KK0ShK{mWOHzsNgMHivkVtdsWRfJMJRCzmNN}2Vx8+O*16Qki97J* z0&V$9R<*Q7uTT?<4xEXffDJvqNUrZ5;+L!2o0zj2ROMfu3QUzO9Eu#2RA?p?(;Aue zsAM>=a)mXjPQ#hXrZ`rV%#CZXu7_HJ&9Urg)8M!VxDosZa4vO+YUju>u za6wb(@IfFFs3Cz>k;odKL8$_WBb1yAniMt*37Rc=S;m+b-YB)Q-xleO2O*WTX4g1H zeE7cg{b*K8kT+TQvm=q_#~8j-@~`e7lsZ*ahONP9Bu2rg{Vw0e^-lYq64uZmLb28F rHKc*=HB1#ax8L+{$Z%I@CmL&?P|(oYb0{_g^EXJeSBUCQ55y6Ld)e2Y literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ant/export_jar_to_super_droid.xml.i b/AndEngine/.hg/store/data/ant/export_jar_to_super_droid.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..7b55bbfc88605df5cf104a813ddb58e89d6c7c05 GIT binary patch literal 440 zcmZQzWME_f1I7vl2IguAo5A8g6!((TsSiljaGi1VP_xf>#tF$dR;Qy&Dm$`!q1xzH?P=`#=1yFvwVW5 z^yLYYc&614Z&|g}w2D_MvSLBYUzROj zo;>>YEOFwVnEUrtr(B5%{r6Opd11=KhNm%}tZ7|_YbV}p@M6oHs=dPTtJJxWumdiM zM&>JbmNH+NbX(@sJTvZo_J*|&>>E~Iv0b&Ye){I5*;lXgW*IyXT7Kd2;R(80M`C_W zG*At0d)%1Dow!+Qy(`DZEZx1Ae{HjUZ`QTp$lYCTcFP`rUwhMivwzE;lZWQZcA3;4 z{vrFguGD?v6{k?i5;n&JO$IOQj%`oee7WvOi|Kno!P~F+r5=fVm*P4)_jdj-^OQZS fHw*Wc_#Y|AxNDj8_Q0R5iFfxN{3TqP%>e{!>Zm%h-#fpTb zLg}~x@e1Dn00000000000001ZoQ+f6OT#b_f1cp~5W=3y*0>iDX&oXJg^A+lqh#r= zWMoN6+A9Es2U3$N--Zjy5y;7tC>!i^!orFh}fEFf|I*aMkl)P? zaDh|k@L|ZFjS^g&nXKT2E0uGkFeT><2L<&$!g@(wl@Q`}8=+S9+aA5|Ai@&2>}sQ! z4mVrdk9xBRd6&6AI~1w^i{S=?e{~0u)Iyahv<5-If-q=5%eP^@)4s=q74Hxc+v@ik q;ym{n3dNnz?WLrJ}00000000000001ZoQ+f4YU3~vrH?lBAB4zLXl*ByGzoUfvSispmzG|h zi!4pNDvD$z+w?;JeMh$I(o5QX@3CfSurf0CTAaR9k;8 zXZfpFU$>~w0LCPsO+30|wxbb3JhA(gp7ydPuNtHX#SOa3D`j-_)QdjTwjHF8 zvh-(%^mgH+C-n5v4N|GOss;4Y<8eHW#=T?ThWmHzOZ3*T0g=Y9`a1`rr7s6^#hm+k h==YG(dz}x~(ipSqG9_u;Me5%~+&>De{{d@h7}1cC?Ir*K literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/default.properties.i b/AndEngine/.hg/store/data/default.properties.i new file mode 100644 index 0000000000000000000000000000000000000000..a77bce96cd9506c3cd5ac1b3433b1697b459461f GIT binary patch literal 738 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 PX_fOj17Rm0ql5lGm$uX+ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/export_jar_to_and_engine_examples.xml.i b/AndEngine/.hg/store/data/export_jar_to_and_engine_examples.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..e7dbcb91e2ec542750367ff9b52ad62fd37dc689 GIT binary patch literal 1797 zcmZWndpOg382|Y(%ue)(Q7V^%Hh1cjGKH+nte6oF*<#IQW@fb1y2xdc9Z4jk+!CU4 zI9lncoMV}WTq|AV-l#+u9UYwCw)*2d=Y5{<=Y4w?|2(m~a(a-I4xQQjpt~^X?Ur?w>KkZg2;MFU(_NVO+ExJT){6)(M6BwtK+OU;?Mw2@X#^Wulm|9vd zws~&4Zujn-P2TO?H7N5-m&^(#-)o6hAv!nttAu}$)UJNAU;kZgFoBQGt9g(F=R3H2 zfbPfVc`KTF)`XlC4Muothlx(qrH@Y*#va;{KOcH;$OauLjA|L*t?DKoRI(K2Xh>k1 z(OFjf%Q`orJYm*XmC6dqB}`0H#Ax63D@hFehn<7eg(VNN+E>GqmR0FjImgy@p1%2n zxjlFoXcFmq8J|r7P2$mWhcS(X1l*R+{44a!T;aH1?R|UQ!_Fs6Q`pt&DCe=uCZ2BH zrph<%_x&ECr?ZCJ9?+cm_iRR7OW$v%U*oqu|Gd%JXQX3^k^ESUmd=)~BqE}7$0tPU zb><+qI6dn6qIsp#e!NzL;i>Rzi0O{6+cy`Ky$t8LV2u-pHXuDf;?ZKOsx-oJnN<-E^{9Nip# zVIY}*{z0sP{$BzwQufWIF72*mK-f~3Ci9NWZ%{yPg5}980K6;9GUJVMux)cs`2*Pl znnVPx|2VgITc(1eK#m}cOs*%B$y3lljW(cB?Y17)7FDD+yoAu`XMwZw+-ofsTiN&! zQFsX&rXiI|ohB-7O;pe(DsKCmP9Vq1k<*jm=F$xl73Im;&-L1wY>v?JtY2C=GM`*c zBtC8$9S4C;vuGdLM6gsoHv-a%Q78aKP*##@_0=3Gpc=h{r|Kb2M&H%xMtplCR&ahG z=m@<~2Yq?NF-%r0lgeTrHeyg>sLm#A3X4W%(<9^ACPs-AdIHq4v9Wb!gku@BNCp+l zp~Nuh)OcHZBb+Ml+C))UCPuc~S7-o$ND2~kOUvsf$x&w6KXvq)@?ZJfiAIE&t3^02g{tInjxhhSaB>9%N00S zwU-sHwRRJLD#{DZH4qdA2+jtjRC(iEhxqvj!2X3}t4xLRX}Okq08mr70|1}O+A{qi zs}`TxIlSO4ll0dz_%6uPqG?Sz`#W$1=er0R$u9b$S#eSFA>P2Si<=jQ82t9FG&4taQMPOY*#$&je3 zwU_#n$k>AF;XiXMH%>b)L`6FVwk4#3M_ZcpG@TyovU?R+b>!6o3F{OzmROnI@v72k zWSxx{kDqXCqn4K&oV76dddCpFBbFwnBMug~-zru^d{nN>V;k&_H9mU1Q6^kP;U{QY zHL_w6a75OYZM<(`wl;x3YsjBtNdk6dUbIfzvO&T5fhztG6*_<}`w_+Xr6kVMs?3a7tK zy`$SfKht9(YF$HdF48Qd>@j7}Oz|krFZ9OrLrlaxcKqtvtc3&4YU>wBv7yZP`1Vpp zL;RvPngX=cDtxjN?{vr;M==rq4LKl4ec ImrBe17d>R%nE(I) literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/export_jar_to_and_engine_live_wallpaper.xml.i b/AndEngine/.hg/store/data/export_jar_to_and_engine_live_wallpaper.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..18b36a5d80365d08067d0f95885c4470a7b63d53 GIT binary patch literal 440 zcmZQzWME_f1I7vl2IeXVn?dkD6r6LmKff>h)zz-TjT2|=EZ(CN&|v~q1EwnG^ajU! zA2txEpZB1gBhf!K`%ZVq7QTsHO^bH?)XA*UmW&LVw9V(}`*%y%&gHXydwJ>i-`97m z&B{0Lx{@&0#A?~*4=q9$4y6P=H>{0|^FOaqsCr#8+|Ai%>%!07j~B1lkjA@6MYDW@ zr}X6slX$}R1f}}4vc?^n742nmU*UC7dgr;NY+ZLIs*5L_4&SnBsc99nRAj}1mcJ}p zzC3yL?pxu+J$G#Gs86{P6Z-F|CG*0RhYe3-JXzDa4A)M)+2F;NIaPaw<5#J3Az=qx z5{=AP?kr`#GU>L=sd;AH{_G8FAJ{jnykfg*W&QNcNz<=h=gl&Bz_t9s-rmqZT_rKp`H>*_XiLcndHvvn2 zN*;SZ3uecDP@$OFI<^76} gYv=CGSW>Oj=KT7cU^e@+eBRgVc(2XpTf}n^06I3$ZU6uP literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/export_jar_to_heli_taxi.xml.i b/AndEngine/.hg/store/data/export_jar_to_heli_taxi.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..a2563882e2fa9ef4ec44e140e61022b3ff9663b5 GIT binary patch literal 510 zcmV#9%OZR~x?1#I|UMf;r|pN-RNe3J&8SJq@SjxH$y zBdk=W$mqAthl_*~UvVS3wgxh4EWLjFYMhqNK7go5&OJ!wG8$1LVasb>WmGue6+Cc9 ziQzkBy)$xc3T1#IcNEAaxatwD8s)6nfk757C}DpB4)pc=+mB!F*WYhG->oTWxUR$I zih9!w0k_zN9v?;Q2DA#pW?JP8n*;3(qINJri4YRB4&+Yhx7h`+ zQHmu_*0$df9=+M`JOFHD{>?61>Ns*KRJgw9|(Wz%TdeM&fn{mJoH zOxW-qk+P%ypdt3~MMI&v_b;3N8!|c7If+KPCuP{QZk@72!@{Lu-L1j;CyL)DsE%Iq AwEzGB literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/export_jar_to_heli_taxi_live_wallpaper.xml.i b/AndEngine/.hg/store/data/export_jar_to_heli_taxi_live_wallpaper.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..ec9a210d115557d574f5bb112d84130ac9af3c0d GIT binary patch literal 449 zcmZQzWME_f1I9)M2Ie*hn?dkD6dZhYqhsH*ylw2<3+#T)DtvwLRKjAY8ZcEcr#Cp> z`>=sP{k#X|9EtwP*>}1-w(w0n)zZ00SYFjPUsc)L>(aE9Kkn|`vh{M}^4eWr>i$<< zZ`u6TZ6ep2$!_i?QgZ^BqGp7=(pltx`t?ak)pZZ7o}S9+SYcLDR#+qQ?AjVf5tWC0 zL7B=@0h11OO<&cqV#5LMh+^-~XVNLLuS~AZyy7s?`oj~MoR3{$Q@6O~J1BGWPuVcP zp-nDcH}9SN{iAueT|17T3bhk(Zu@8E;ymk~_2O{$1~AYuU0}%e~)!UtjKP zaXU|B1-?WoX8QhOPDb!-9-)iFs` z)s$9$-q11s`S)@|RnhRJ^_AxoLXFA~7_D2vWPEVOHIIvnl@v6MSw&a)9iDkNOXpXTg3{pz*URq2A(;1?ep4?J7&WK#aq zN3GEUJ||lqb}YE(60rXGYeAjLVP7Ysu0>^!`z j-ns3!RrN)W-z_}t*XB82<2e&Ad+na=8hb|lpM2{8H9*l^ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/export_jar_to_space_taxi.xml.i b/AndEngine/.hg/store/data/export_jar_to_space_taxi.xml.i new file mode 100644 index 0000000000000000000000000000000000000000..0e41c0138802cc7a35edb38f0bed07aec26b569b GIT binary patch literal 440 zcmZQzWME_f1I7vl2IeXVn}Oj!6r6LmKff>h)zz-TjT2|=EZ(CN&|v~o1EMSD^ajU! zA2txEpZB1gBhf!K`%ZVq7QTsHO^bH?)XA*UmW&LVw9V(}`*%y%&gHXydwJ>i-`97m z&B{0Lx{@&0#A?~*4=q9$4y6P=H>{0|^FOaqsCr#8+|Ai%>%!07j~B1lkjA@6MYDW@ zr}X6slX$}R1f}}4vc?^n742nmU*UC7dgr;NY+ZLIs*5L_4&SnBsc99nRAj}1mcJ}p zzC3yL?pxu+J$G#Gs86{P6Z-F|CG*0RhYe3-JXzDa4A)M)+2F;NIaPaw<5#J3Az=qx z5{=AP?kr`#GU>L=sd;AH{_G8FAJ{jnykfg*W&QNcNz<=h=gl&Bz_t9s-rmqZT_rKp`H>*_XiLcndHvvn2 zN*;SZ3uecDP@$OFI<^76} gYv=CGSW>Oj=KT7cU^e@+eBRgVc(2XpTf}n^03Lt<8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/android.svg.i b/AndEngine/.hg/store/data/ext/img/android.svg.i new file mode 100644 index 0000000000000000000000000000000000000000..786678d0242535cc60387e817ef037de389b6228 GIT binary patch literal 1641 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/badge.svg.i b/AndEngine/.hg/store/data/ext/img/badge.svg.i new file mode 100644 index 0000000000000000000000000000000000000000..2c16a40b2784d512f57ccc2eafa385a8d6382daa GIT binary patch literal 3245 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 S!sYNw`U3aiv;PB(jP%WuifEPq literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/favicon.png.i b/AndEngine/.hg/store/data/ext/img/favicon.png.i new file mode 100644 index 0000000000000000000000000000000000000000..4527dc88af4f5f8a9a4a035268efee45a9f9cf76 GIT binary patch literal 613 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/icon.svg.i b/AndEngine/.hg/store/data/ext/img/icon.svg.i new file mode 100644 index 0000000000000000000000000000000000000000..61600d106eed90633faa7ce2105d6082790f668b GIT binary patch literal 7952 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 CYAk^O literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/index.html.i b/AndEngine/.hg/store/data/ext/img/index.html.i new file mode 100644 index 0000000000000000000000000000000000000000..d487b92c3325ed3ad27b6734279215b874f0b2c1 GIT binary patch literal 188 zcmZQzWME`~fEpmR0?JC|%(3k=i>-U2n?!(&jzl>RWZ~i1e=2 zM`w3R9cFYonZ@+{p-GPMpZ6T~Mt8kyzI$B}_whXHCVxXqf1kSN<^#o?i}M>+dRW@| W*pzY4zBc)OQ1*I$``O!djsgIyGfv3> literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/logo.png.i b/AndEngine/.hg/store/data/ext/img/logo.png.i new file mode 100644 index 0000000000000000000000000000000000000000..b08e4fc344f8d30e499aa33a0ce868a1a2549abf GIT binary patch literal 45970 zcmV)aK&rn00RRC20000003?$D04Zbu00000001`s|NsC0|Ns9SzEbN1sOe$kO{E9h zoq2#KAhNmu00000000000001Zob7stQ&V5mZ6K5Y0t(Wki8Lt!iu9%+O-fV@p-2}H z0qMO3jqsDINUx$ON`O#9hlom*F2&G-NRyICui+iPnfEumnKxf%GTeJ|?m7GHvi4ec zcyY&6pPBIjBLo6rHZ-_(4+5bgg6|C&9T<7og$)CLX#BJd@58_+9QN=(aL?dvVCe_u zkN^8pX27^5Qx)%OsUM~JY4!+Kipr9Zbw29T+T*Km#n<*lFWt9`+7Y&EAyCCTz64X$Olp@#}d&87Vawt*5IQ;(({_o)b^Fa&l zBbuVSpNear<4y7Jq7zZIsLALYRG_f?%-O%&B4u+arp4?>d_{$r;#yif7A5|@qFb3v z&>K5Gp2|yGyiF)6WmRXKptInrr>Ymj;IJ=39q(~rQMHYPl&mjY_EcnlJjAxIsH|ra z<%D7`4q1!EJ6P66>^vyQxSr;TPci3p!)zK8b&T0t8(g7@4Qj$}E_4+|qur~wJ+_)_ z5SG_Af1U z{azH;AW$FjL;MoQ)qg*0G9FiV&a>mATt;#17cZ-JQW;r!J{;Xm1iQoD=w;G+^4eeZ z=Jyu$zHRP#D)CF=_MSX=&b;dJ5hrnfVo8XjlF{n_I<0~+RN!NA?Nxg-`}kvbej-bI zk47E!xI&f7wyE$=P5N2F4*^pP%ViRtIkEI0Sw)q?Mzq_+a-aiSR(UPAS{sxjUxAZl z$kFelCV4OxhLC)cuZ~G-$C14@Hpa1bUbYnP7?=hE=}jJ`P)X~%`I9!`7&`m~cb+Pdm-m}7ar?ueg45$unfr(e4^ zBy7PBE+Wk$_gW1#3*n-&d-Sl+$i-*P6-p1WW;cIfsRtV-U9Vb9F8&!w`PlS`F5)|K7HzdhxmJSz^7rMG2Ncg!|Pr<$eF9FL&v)Zm!EIcaE3c4a$%kjXVC zlq67vQPVHlC9hN-B;u1%f)H2c3teuQDo8LQa>@k8pRhqwPTiV`n9P7z4}{{4U{PN* zGAU7I%;8YwD;V6VW>-U>cdPX|N@Up5QuD#}oM~f=hCkQZN%wx6zsW*O_PQ!BvNJ>_ z>$5GQZEwMjcv0{1S-LH6M$Dc0+qY_Y9VB{b4;oIW_M=A1N>Xu>IS_2u-Xw#;2ajtk zx$xk8Ev-0KXApF5;sJgu^T3OFF2GNQtV2`-NjX|Ep!@9%Q6#>r22VknX0u6?T_x*bhw4xA$j!z}f|j){mg6{vxzqJ8csfy5A6_yG z@pW~BHi+#yYVVw;@)d!aTmj8|#H7B7-&8DhRN>z0swc2g8{0l&zVHqo)lVjif>n&h zaZC&t*_LN_P3X%4JMf>;ZZ z)ef2LV94FJvf^4U=FqiEAhH33l3e=SZu>c=Ig&TEw=SV%+v=K+YR-1B$4ED*?kWv3 zJMs0u#gGZ&(Beg^nYtRpff8{XEwytOEsIZ*pK7E1hQ-FFU2Yq9U!Y+2YYu!MtGyQP#VxZ0nRssVlo8ie8lSqzRYxLRc|*$4QQACY{_S z3hO98;c+I!>5F+HY+>PC+#OXhB)D~&{%*)|EllD508jhhCQ-cprq!9mOtAesN>M(9 z#COlKm^xYTo+X6TGwIvg!+nxwHoG}fWG8}sE9*deLi?4CxD`T=`FVIw=tu1P9|&(k zi3cRSG}+gc_f1sh0;RfAl&o-w@!fE~qW$`omgcSfm)3f*gSgpbJuq`}N%PNZu$eBh zEsCy{x;ewUHvDp-#){v8lk*x9?*0s?A7~u}bN07pRj&UYvs1I{XkQ>C7-f+J4V0O1 zd3yFnGW{3;za0jhJGM8LcdQ-;wa-T4VosE%R6G$bkG<9duYc>KbA=vJ=lmWRNJmT6 z_a3SjAE9J-8V2O9xa{jFvl?5c-4i5(kY%Cw;x5e!H-GrIVj?VpW|vm;#&YmzFC9KA zLq(9e-v|Fr$p+ibi;{)fttk|J%pc=qw|&%UHkIY>*_bgDG7!D?<}IwHJo%NQTDt%rP9BxS8Z5es@Z1KA1RdmQS*V z^|5Q2Sf>fH+v>DrOR@kr#4en6UZ8>oZ@2dLVDRp+0!_H*!#=l8xxilW%zXomGL7>e zxjZQ68Eu=P`&t)iTNMK?y#)EG}N7B|2L_!&Oi{w}~XU9jA8wb?si zQ7+COGrgoOU6!K)sMpfSQMcvvR8C|M1fWpDcY})?iX!k z?rAp^;i{>)uZF(bpxe_NQ=m)wy9gl-l&lBs5H4bH1AUWgQ9qojyJvtNWSZCQKb6gLhRSUi3AK@O!~`bt3!^ohs9?)lSQ*-(>)@vdwo>L{rRk4%0q%9*v% zu54Y;K|yh2SBu|wX_K|uZt=KYuX4e{S0SKPcShHxUdARY-8*hh7l_Y;`+Dnrc4^AE zg2e|#a{*^26#V0N zw6bPN-Y3yp7`(Z>mM(Y1YDT)Ewh|S|@xVoZxD%=#=>ECYxl@@7@tI=R?Yr1BX%yKd zgnd!}$-WvrGanaE5p;0YudV7a);Ji{?7eRo*gky!1XqwALbVraCL#ZIp|rvF?`3RY z*uBp#QGMde%lcV{mWqY@P^9ch|J;K`uL&ts{8MLE#u(-Wr#A&QcT9(T76})zX`YNY z%l7Y1Me!XcGjtv)LC2Dq@!5cTS__|8>AY_NbiCaD@+CiPv|{pHIp?@&^VxAn=d=+y zmnoj-*Suz0LeFLJsBXVWb6vzQp5Kd%WcgC?0=7tD#u{_@W3A$tn07U;dm=Q`5R)x2 z*Z6Ofq=-2Z<*fxImm@0)MiO&0eE<#bQwIevH%4f166liU=#caR-OP^;h@d0sJz4oJ zL;{DEW9!Npj7njtKcFVUpxSe$S$`v2JMXBo9EV{(AJ$e! zl%1)5=d3lBaVm&pp!*-1q61s~L&!V*+*5ONN9{={ zcW3|~?|T*pjY&k`3YsG|t|L)X@$^q85?Hka%^Q7u$rCZ=QWM{}eb41gHJ!ce@;RVe z#?Ok)%Y_#sKlqKlF=Fr6`(*o7XG|zzJ~w$pdN*~zcgHFws&+dp&NbSaeah%GZ#8C) zEfoIpttFW;82!g>eds)^KS@z#uEXR283bD!_%r094mgRABaL^~s8b|uu1eAT6=-WZ zV$wN=rcVuE;mbR{^51t?wb)!Tv%S6~FFr8$3`gT zqO{4uZqti3o7+XfZxz4f3&Y=AUY?OHi#kro;RsvppB+W>&k)b?9FkU~z=7`|b#DXz@)rtX<>~G%k(8y$xf5bev>-XdkpWCRkoR*{ zuom_bZdE1h;FIJDs}-y}8+yy`;WFo;!nYA^O*Uw7ngb-+G;3wDU*N#eEI(S&kqcim&bZ% zwrw5nZ2i~rM!)#c*oDjauomkfku^*a=mES7C55aY_HVO3fi&`rCf$AVH2IRQy!y?9 z?tLWEdZa1#RDSW#tucsmjN?fdkg;l;@?vKFX97*FK9LVD~ypd7#X$T>3ST1e)wl^gQUV6x$x)+^gO+Wb<})g3c?% zBoeU7pZG}HoP6NhRRHFnPErfN)wz-})=T%D+oUi!E%}L`dS)MXe{mBtL50T1VfUud z4#?idC$lEpdRu$V-)A3=1`e_1x~G;B@_L!#Z?tP$rl5xb*km-L5v^6>A0~#w7NRt6sN!)FQth6uZt_ z5Y^7K6}0O_D^Ym?z>|gQm&aA3nayU@PIb^r&0Swma0m#G4SFY)M6D=F<9W9rE@0T) z*+&aG^e5R9|1K?UYU3_iDLa{spkmi`fvwfX6dDte=BH8ppi9UudTC+1jdQ&NEhLoO z@0Gz&jM&@(YS{H$N!F2#V4a{Wy$o=oegc^r6E`32cR1zBP`EqigBHEPq;`GLy!*5p z@f^PKNFjQbrLuVxccJ{1f;funYSZ)Orjr+UY86+dK9mwDyh0E?4XF{23{1Qj$d&KQ zOCFIh@4%VB){Y*n^8)S5T!!^rNbL&}&|vgt;PjGN`McY%g6@_R+|mH+K(eWdOl$PM zm7&{x{IJj6CCdC?hR{sp4aqRteVD~J16|z&CFMWU@zl@!6_A*|cXcAoR~SaOg9(4d zocJG=x+CB<9EE;gbfKJok;HG{PQ4oYOR74mO{)A%?RUK~b-|B!o;*$Zv_U&VwKmk1 z{W|YWXr7(jfGgN2eemaHr(Hp|Mw7FIHu&WR&sUMBa2JFNp=6EjICaJ^u#Q1NyFk=9 zWs_O^=uic%d!WPiAb|$#2etm&hvK0kH&LV`vY?2VxPP+g2|R@WKzD27og;C zr;e1FWLEr=FrMuXp`A;_)qqtzH9zcew}02toew2Zx6*|dy;3Nq+gn1hQpXohwUy3p zQ3JU@8T|!lb&GZpKCFF(N+IcDf+dBMT-Kc3lt5w&{a_mOouPfUZk9F7m91o=u3)j! zr`_1DE&oX;U}BjSoZeX523JTd004~^Q_$OXMYfM;i;3Y%m;B>$%K5j0&^(K~4u^sL zm}o3#D!jGNFEdg*j|1IpdzfWFPwYj%FvMjqRxaRqENiEc1<#KeYeDH1L$EX~qQ=Od zq_87j;x%p8MlYAqUFV1mER{%JlEN9kviz|?s@+TXg*;7zbsAouEgxs=pp)&J)Ggj< zLY+0>J*&OILj17dQz@F%h9-AZ2?+g1>gla_=4=}Y4aqXvyhi%oD_#BZCf2tT=4AyJ zuA$OI4>BF9whz9ag}C}h7-W?vd_xNquCkYFKY^A5h4S}j?!Q-GKcC7KJwmo4h#$~G z0;_E1h(mgZ{`njRDjx~&1&@+FP-d@>EsS77Azb9~pQQr--tU|X?F`Hai7@vZ2(JBy z7eh_!dl`5E=dj@qWj&6>&hvY!T7b{OSMK(!qQ|@0w9m>4m)eew56AoyEpuKC=(G2N zsK%W~ck!O@zz~Pjsa86>t<*R(rp|{@A}#del13Vt&m%j^(;&F5Ui9>kzL5Xm9Y)#@pwJL;r8HNc%tPEw`%lyFo=7k#(-u>H}(O+ve`;k~N<36kFOjALdGt0x0eUS9)AK#1OEV=eC zkt=~9W#5N7nEtY6Kn}9@we1eHaW&8f58QB->XYAnntr_kbdQ9J;I0QDM&_PT{w&Gj zi3y(g6qk7g{DVZn6Vx1L^aYi)n>`SF3=ZcKBR{09jpy9};*P{UceO~x6=IZ~7Ov7h z4Kp*{Rnzj7ok#D^>${Ey`u(?Xd+RA!DMri_Az+gEdcOg03Ozq0WIP^nf&5%^vCI77 zK`M4tsp`Y)qSS{FqYE#>lh(u`$+TedR=7=ja}N{4s^F~Y$JR*YLUI4t3T}L_V{SE_ z8QeV{l>^%{5&Y4W?V7Y79M8a1xW?+iG<73W=QwK1*k2Dy?ML&68@Pf2iwXRoPPs$eK|goh5R(qwe4#hS7fcC=6*9c=qLk3euy05iH6xT9 zzf9}h;RiW336f(}SY3m8oLdOa_QCG?4sE4(Nzl44C^=&Gq?X0_n4nEJER=ZZFaei{SvMfO7hACz{;S z*!ed}7)`oIyo#qnri6 z{ifWuP&`LGlE3dt8gKdG28LgGk1{%R54&52=pO9=2))@l-5D)QH2@eIGvGmi?WZ$W z(e{+X>jSGXc&07EWDq(nNEG;4aA{y59)=`D$fHF2=-V6>>1a%IOCxR?n?Kh7J9@NX z02~8w<%9L(r7tkgV>?>Pt&iV=Mdy094Dp16K)Coelk#P)JtXur+53Gc)M1@uIFElu z9h@D|A&y+QKu<}T&Ck8Kh_sos$&a$TWg&GClvrxnJ1}ooEFfM7m23Fe_1L*ly}(pwNAiX2ID6clP!@9rWYzZeKgZuc<)snu3jQJpuW4FY8*g>#xxT z>j}GS^6lGGwu%`>do>pF-ib{RwYTxV9399Is{)GJ;H0bm3iDc zaE_o`cg5#P6rJrvSGE)&XI8{Sbib7~o3=-Fc$4)e>9qn+JeZqrOFKS7&~6{yQbl{K zUu)A6+Q!AwM^>!n*Oqxu%4P$ano7F^F!cR*u^=tDxZnp3*Fxqe{Prv}ae-=)Z>!0& z{wZE!{7ELueDdl3t=TX604FsX*^+ek?JSF3nw8C6tXyw=a$30>xEGrql~pxx#is65 zr7t3AaW>w(oVvcn{m~%5&7N$3TR~dXsh&nz#2ICw(}OiO=Tp|gr7aD7Jjh!tfJ`j|+EKH8hOSxiQ35(8pqLT&1l{xsSsCg?d-9fmn+i&wFD z1C1EjI&QjC6L`sCYQy&*xjGn;$eGHGB2m06Z72~>2Y+G`a+;pNk>**>D#gwmHAM%% zmdr@OC#-uD4~Gup_XKh>Cq!2owG7#IXZ{drGiH6~_9NzlVvn?y+g!?C9N|>=-Raww zw=;4zHEWv>M7)9`#OJh^>-EN(oASpLsb);M&9_?h#@2vN&_TV6UIk8Yl0UykudQGF z41`k{@IAX3#YSPWjy8NT0L8^V_JB@VSnO*fAX+T?ZZ!3)wWA$@*;YP6alJ1Q))7gULepJ zG#@UY{Woh62W$>8@0>-#!^%XZS_xV9ykfyRu2kY;{EGAzS1WVj$BPt|*c=E1Hu~>> z0V>>(4i}6jqN>ZVs?p8R0f(~bf*SAK0C*%pcLXueQKKf;fd86|@{2w})&1VfGkwGw zagHo_mSF3e`RA_)(O!G$)4#-h+@4@!2RL#yxCXi!O%7(9liWgu&$9NpC>C2<>A_Ar z&uMS8hFV$ceUv=C4`S!?hvmQ<?C*ae%M@OQ5i%!v232SD@77#$%bqVs3j z@#2j=N9u*0+c7rI$8Yn;RPj>4$#J1pN78c#VQ>JZiFX#-IJ}vwVfOz}McnJ+eGRQF z)6Hg@U4du%VodwDt_`U)vd2W8zaXrlZetZPK3CSW!bE)Y++BRD^7U9PT56<;!Rt2! zc}|say1z$qSc;+g+B6;-HaCNPrI5ka(K4eAi;ZA#@)GY{Y316NE1VzPLP58jnzIJ0 zLx!gh_BJqsVa4ing?+V0NB&2q$g#L%%QPGrIjL6c(L_^U{7Rv7tALC8UxjaE;krrIXA%^u7BzNic75Bwa%WtxT9mPw zd|+BHsoD5S0WN)*7yoXWcq@%NCHzU4zzViLhFBkJ=q#sr$M7fUh_O&R^>O% zHn6CH%v|58L|?_t+ILoBNcA3$&GMCwjvhn11yfEdCc;{7%th{ONek#d`&#GBheE~Y zBo96%ma5eH%{=}h`N(jq<6p|sbT7Fu+Mz_|{=2F=c}??gy6HIj;J}G*v+LBVe)s8) zq5YhNYe>MhYnkOfBbip4zL6c}MNOhBr?+iTjg<|im3GTFkS+K4*7D#bx*?n?fT%R6 zaxMif!n$^&+BXNC;Tncpa`b`pX=}oFcF_*^#-Yd{LxqoXfq9{(n6lVg4%6)~9d_O?MvSO+p3H%q29V8hv8 zIxxOAbYMW=Pl_ys&gVUkmnm?wlTd_O+`C`96{Hp@oe;opKXPPWxzmropPj> zo3F9+R4Qy;>KovTabh-ysSzpYx;|VkO-dy?$X_+@TONAPpKZf-h$k%SZ~i^?ezd4W zcK_F}wubkbZ7dnOdzZaGZ}xw6g8yvd_ltD;^b*jeUzS}Vua(qZ`WtY{_3piA$*blP z?e=?IR=hp^LAp;g?50s%Ng!oIJYgurPu$W{I0OB+<$1NHiNY&yt6>K$4UUAT>HaET ztr0bJ;SYn6&M%INqK_&46QA;aQ*F_XtPBQy^QZ4G$mBi>X6tyJg6C%Mo{SC1AFklR zr@U49b)2W<>TzssXfYA7@Ri9h3fac58fCg+V%wN`)Hwb`l*cI0gxf```noz$2A7le zDJjB+;c@=L5 ze?Q|bF6&_trXY%M(Wk%x`FE+S-KSz9@eON>@Z0!fC?Q&TnxurFrf5 zAKj=2A$G$XGcIpOJ|+C-dg;;)Nk6YkExST#7@2eLdwewEQMWrQ-l66u?hxLy%gRDD z^?it28i+bXt+Nr#B4<1^m##3!Q%OrCp_#N{11DFH>TDl8Vm%|HiRQe#Q2Se;GH4mB-D=@5EDS3$PczD;MZo_xxrnyZZK-WIz# z?j$Kl^(fL88=sN1IrTnLh2wou$lQMTtznX3Tur8GW#|OOD3QBpn@^sQmqckkXcaAAuja@v& z+x>EEFUhuIe|Rpx?0T3vKszNCJF5_Nf0n$94RifX8yYJ$t|y1(H+xmLr)-q0UrGnB zwL90YCmv*S3H9e*mx*NMis1001PD00000j(-3Ek2nAT000000N(%r00960 z|No@1Cb8|4XXzz*qch#+`b58ZW5D*aX5D>Ix z5D@V!5D*Y3GSWX(As`?b!28?qu;5Q;-(O|mFBlgw8FhH@%NO447x);#QCiyt0s^z| zzc(b7qkd!-L7n-p0k$*wLKH!TD##g#bPT1Sy2f4^ef` z%(D)!WW8hU&CeE_^A5Rn>)3)64)WN>L~j8(+Yp6r3sRn?K)bIK6DFTeiNE)7f?Wuu zc@QFdGL6uALic!vdWIN!f;_8PjbduXO(u=nbn}-v*k>%yQ*=7iJ?uOJHaAH;N_FKN zl5`ly=d_B|=bP-;3tt`%g(h!>E^ld6Wo48E@8@O(N!{8|bBeRPPptA!Aj`lztv~0W zHNn5RPL{xxgU=slsh|S>_h0jgtG!Q3i+v;ojqc~vlpbTeyTON97kKx9^J+?h>+JvE zE|A!{4mUM>Kw))>H}i69%_xCccseszR!M(1H>+PrTz#R+*+a2PO0l}(U>Gou0`=D@ zDj>zmlXl#r&9A69t5HtSX#LB{SL!qdrH$0<$@Qk%8b3&)sVGC55n0(g<~J3qAONb7 zpj~RRfno2t3VbfEvYq1zgqnwA1H)>8PENk73kvYyQ+9R+aWfurp|0DzweAG+^eZi7 zlDxJWYe_)?mZ$;?r|5#Ou-E*(R?|vV9R{7OoROTBHhoY+UcHE|VBr1M{H!JjuADLD zhoq4FU!}<$w!z96fW0^=6TI96bxrT1wpDk>bkbk;D=jdQe+Aw`nTs4=0_6QMa|?e8j!P z5s?o1LAqln9Z4$P68F8~y+~&}Pcl#$IVG>R5H@Zw?23< zX^pBUxE}1?y%MM+0u(96P`A3O*DdXzW-c>l>1r{cS>I3)XrS=@~+kNgLClplH9%4B-$5-Cc*t zk-i@_L@)~mA8CL4_6t`BG8jVn8{01k^h>g}Y>*{HN$8X+7H4o$5UAuRDzXUwC@QG( z=m->9bYdyn%mAZzQkSR!^Y_ZSrjjrC(i&-arKhmpQT^A$w3?CvI3Q6bkFu@+)jVkR zaZim5&iR3)@3ncMm@tX=dkEB!$@I3q+uI0mT1zl9eMp49$6-_GOu-OZJTSe~3B;XO z2v_i-sDaEKaktZ0&g~Z`QZxb^#9y*2F}Bv-o63}8IE28UXS@xA9cO6-=jOY;`{d@k25&}I zu8yXoDtpH;Ps+=k3kx=@694GW5lB>WGM^q6uR%m|GI843Y>v>Y167}sWuCAoU35`i zo>NYe-UyTiZ-IwQISa*HAj_t$GpLD8gT4buP0n>Gr9q5Bwqwnup<%0s7e(okkq`x1 zL)C(DOB+C2SOKbkrB-#cE~5M8CW@u2mV3V^#Zv18O`r?l5fy~egkG)Mg-05znz<^Q z>p;9W!W(ihisq|4&4Z;%&lUyZgFh1SK~vMd7!VRC2qk7k?qwIRjWi`yJp#rM2G$sy296gl9pBxc85pb5Z(3WHLf6NT}v z_o!(JgGD!ies7f4+9oz`DEjD(Yd}0cnd9SCPa1NNG3^3hhHDT7-%~iOc}mCI1)~Wm zcAsb+s0>wbf?>%dc8}o74fE$lgy@KmYCn?H&q z=?-~5&);-JVHh_l{zlHT6&8(OC2UtyZEt#?C@eQBTKllpn*hSLoUdYG?TgYO7#y&V zCu635#!dZ1R$+mq!GHf_9ha#|Q5>=Gr*xlXp1~Uv;}k;6Rw372N3--vV`W7ZWB5Mj z-h1v8A8=l+vkH=peQ~QP*+~@8TFQ;a;i!J2b5|Zhw4Q4>Pgy5W&!p6B|AKw4EnggZ zocvuHhz`E@C|djtZLT(25id+I=@mk7U^l87NkOtST4gba4g|`x!UutNUWJ0-6U0dK z+;$?0N-bN%i>xeL<3KbBQ#)nfr^JoCXf0dP5G%C@#?&!9QOw;{*usz4BZg1?%<2Vr zJANqAC(I+|u9l<|ZK+0@syi`hVW^gA>z-ejC{>YkFa^yYLsi;o6s~vex!J0q4Hknd z3<00xjZRZ};NcW(I>;ccmVYS8B^JwrcoS;&nA`@%sM+t2B0}GoDNo^4MfAr>uxUd@%! z=GuT1iTvrDX-lJ3E-^$7g+3NnXmHjP>3%mw5#flU zvVt0Q@ncIvhK7bl{`ysw0h<;myLan_7zPz4miq<3olgpnuFQ##V%>lrD;eV5q1d2f zZf+jt+#+A0DL%`IJlj2m!l9v{H?p)+>oVqP@pNW3wpYs=?y`$)A&EC}h6w%WP4dMw zuw7F&i2mPYR98s74emi~gO2VxLwQ#8)62{$B0xb7)P_XUs;wczq`|%_s3=z*f}cY2 zW#XOAEg-FyeW;zYFNs~QL50i|HK_r1cqzoJTvWaZ6LuWyo3!5IKn)RxhN+`tLQoK7 zcz8H2KE8>kCl6!_Xro0~daM>;U|`|olvr3unUazMJ}A;-nziI$VTVn##a2+k7#ka5 z+)dXw)5D|I8XRTLIW*#7pNLz_>c1I1rbP4>_UiZnMxN;#T+sA3Rpn1RN(i+%@aRi< zuS3{0cmj`1G&naM8bDCKZ{2cGN1P66tt7qH%Pl>@f_*5b=<||cdZrY?a}X_q@I|w5 z(wG`O_X32gqKG3CfBEqU2uu$r{vzbOyuM!2O<)ipN{_x3_9Rv8|?+@JEq ziBs8_Sg@7QNF#Jk!{-7SclT0iZjeg8WKXZbgrupsTRbXH!3`5oBECR;$^W5AFL}*K z?u3!CpvnHlM8mRhBf6OQ{%&RN6bevrg+|~EsmsWKHdq=Ow!dikqygGM2b&z#Gz>Pk z;pMqMZemdw>Fg>Nl8w zlauWH{276#gRumG6d7a2M|`T`J>Jv=IyzR4v4_M)Quf@?2a2)>-@bGR%Onn4ddbi0 z^{t$IEpsF`W5)gTp0XhZAe5U`%R1^){QlLZtq}~t>{uf~G*+g1KRVaWM!)f0Zi2It z)4;saDb3f815%@sHTYs5Ls>f(R<$?l^?^l5XyWOKr_KF5ud2$Stt(46X_x2U_&6&+ z|Jd0XgI1M6p=Mdq*ddDo2CYbmkh?!5eOI6cAV=j-e)6U1PkWO5XFp^M_oP|b_uEQJ* zbq5uA78P0v^T;iO(op67dFa8C`C!pBQuOF?53wvo}b41dY}XJ8b<0dHe@Cv5akN!1|7k)0Zf45wv+LK-u^KzUc323_Hrk z67a~>{v6OPIAKz8KWN@)9^QXJ!fo)sX{hN3&G=$qT5>QXI9_duQc*qB1bqHitBtRx zOW4{e1BG&_&92Ajhm+Yq&CS!qO8>+#gip0*1=>hCakt&T;f^UPbHE+3dnnJnj-2}a zQ5pEzXR!=?-mVE;npI$9~$7GFn1IMHqZhJZ)#?) zL9Jc#1NwP8Ov=~TX?E?Sz!UAY)*JvHs<8%<)Nj5Z%sCr3#Am1oRFZ?KT=BEjrproM znP%O3aM{Z-|J?^_O|Y`Fi!)^p#H{r%t$^;wXJ{sBs$4_YpW$#vV%6BfkGaD~2;LFu zlWF<{iDHz*tvN04Rf#YBIxJ3%2cFe}QJRD7su6#SoN~O$Vpi#xOt%cmpA)8@G8<`z zbKlzZFRH1#mVGkV4_J1e+M?MZoy(_KQ=4I8&fS_S zMVF-0AXx+0K|v)sT&gjx$_RX^kk!!mFJYIKaQWTOw$7I8{wpA{(!lM*WBN-akZN*> zHemq179eJyIw}2r1~Ui9(jbrPqD}#tYZarTWS-SI>K_GMk3>2e3tW+n1s8A}A#d;X?vR5w z)8?smi(Xs=iT@uk)x5mCcy15iTyX&PsN`yD`O9yy%u3+c^}bDpH=N}k5I~`cMSsBS z;EN%kTgr&>_h#84~>VC`AI4t=m^8=iYji2AjUH=g}5$?Mf-(@4l0PQ z&sk8=(yqfy{X-f)Q6R7YISB-kX~~a0%7WDd+)(~4+%T8~@!~hrm9Oz?u6bFU95$=+ zM>p)Kfi4Q`+f(&SVK8MHH1n(GCTmQGJdbiCa0v<5F4O|XEx}~W-FY2*cYp8naHh?q z*DM0gAybqeKn=GOlW?s8_NQJ`hvOb9OL+*&+IscS@5+TMP>i`WC8a-=Rk5{Eb#!wJ zPAb1Wb;h5zE;YuQYlCG}GI}3NQWSZbJXPstW7dVX5#{gX)ftSWmZ0;rGnv2+6ir3= zG9=*7YY<`~u;Z@c46Jv)W63nAn)@#DP%CC`^+#d|;y5CirBnU>{rm3mQH=)E^W*t& z7^k;cGr%ig2C%E)MD;AcqxWaZ6;%f68VW5AQ8q|<4qk_j?z?SrZs=syfHvG};Zizc zFvR3-HAA#)VeiZg`t9v40~3>K)ncM*(&Ql?9-gtUZ|3y03YgVL%-BxFPP1S%o6vd+ zjts_N4lN|YQ>H~6!oaEqTn4t}p&H85$A%knHLd(X8s;s%AMdZcPCGn9aYUDe^tLr$ z33)`AQpFeDCNg=&sZx6=#I4Mkqo$M#2Fo&K{Jx)DT83-LDR5#eFsi|TU?5en=3Te` z_G_qPevx5@58%fP8FeBAOSkCg=>Is8oxN{=EVadX9}#RbV>dnl!S2;|AEB^+=Idow zHW9x&#lnJhD|gU5x|u_)mYb%LB~=(-Z{D^R!1=JGRqo$14h8_2@~En_9DRI8_Dwyt zjF8Xu7Y4QB)m8|q{UdFceZ9>hll<(DMK{H4p;*k|7(6k0O=Lz!`?K_PB})($n>(sX z(vpTJQGFa?_%%ZVPH5Mcfos}Dx6*lQu$G{ntv$Kti^`*@6SQ5mFg6YvOJz1)F9<#u( zl%d?JeGyZwQCF#F*kv*?LT(kJ#v!mGQ)SeSV`!~TV>2I`isjgF4RR<1Q3m=?$@SAIeBefA=Vs%3P8{4Zs)Hk;zy7sB+%nyFzD^KgVJWXdG` z=HXiQC+}pyL)|~2PXU+1iCl|1WMZD~sgL)ww9LKn&nprWvpRvhDRJK&jO;C(fNPwz z^mLQSEWt?KKjRks<>fvWOvaf?lse93=`wjW^fW8MXR$fGQFYzm4v_MY4+k{q+~Aw_ zapNyb?=!ME*gM?~M2z@KbWk%yYr}=){Noh|>h;I;vsm< zV){LAKvs;yQjc7ej*!tvcLKU*z@to+gr!2nzOSXm1l%2i7u|A z(CgOnkT!XBG9*0l?@&0N83r;TA0e-S6d1nLJBQiz(b#nTDfrGI$u$NibOq^u=;0r+ zzi%!nDanGIZ@%dvSWPkha6JytU_W9quWK^0akd1ecgc_IT1=fyf_HYkt*Wxht-g*>M@s| ztlV_~Sqh!AA`KxPThm#3-)LYFoo3j~`K|-5e0~d4SAjK?G!x$x7uL_u@ALr2o7-Ob zZ&nc>=fLP42a@3n`a&-hWI`d9YMJ0dZGFmQ=61Z$ljz1XeOK?))Het3*$kT0vF1uS zrqs43hH?#zAG$XcW=RhFawOE2%8zv5Mon(Qt#ZMzNV96zkY6O1E9xMlxih-*_&;s| zW7u7I!zJ4JN<*~iP@GDIW(%JSP_^bi>6gO~lRn1zF5p!WACpp8gvC zVV$?dQZlh}YYk2@jBZ_JU|($Rmwy*{Z+OR~-`)O2iau8BwTBXaH6@OE&$e{QN+jT! z00d%zo44Pt5x#bqla|V?OpfcGz;+ceEz`xRA8Pg3i`9N}%HLHAe$Y{107pQ$zZ6`C zXDsPl7ja~o3|tqv%_0Q{ZWX4&7ZqO@7dwGB@XqM|SDpr46)Rk;-CeV<#AesbpU(R9 zWke?Dnu~_MN8)Rr{TMV+y`6rqCG*zEU%%#A>D;t6w*^tI>h(6lOdoJ$UZvtKG=fxa zQ%hgR{^@F^Rb-PJ5)>-qQ5zCSsN~k_ZC`D}fprB;n3%DTQf;wbAqj zfx}fS#O!gtGQj{hz8*W1@>Cxcc2P>7x{GnXrb6`Sbiei$x`Y)KE|P?(M9z=p%Orjq z^M*d!uf9V@H-5sU?hs^|H_yIOnZ@F9;#X&NPqVWy*Sr7l%<`ve(`Dd8E4x)N>qFpJ zsi;Tf6_fm)jBkGbKH~R)x{8G(&hfuk3t#J-C!RmHV)FmEl^3{%K^3@ym=t^@%sOnK zNZe@XKC#e8>!Syf;&);EsLa`4%uizFZnp1;(#5%(m!zE=>}}TQm^eDZMHPA?Z3AP* zAp6;|X7Y&He~Pq3vrORitnLmq^qOJPa*F`PV%!DX=-29Gm8T5Nu~|k1;c3sRhHGE3 z$p)aZ?_@weRW#NvAchY)MlD8$Y!|9pjeEI6)T)ws9^eI+mQv*yctZLHhz}J)=?KL? zOo@9QPHaomfO01Tvd&gFJ5LT_<4CBFpvvdpCXxDWdOH2nZuf;7%fyXPk>N*Ks_t1xVR-a48MO{UhiHRD{Gu(e|nV%+&Vz8 zT(ni~yY$?j^32XI6)Tx4DDA#4XIBs`%8LIh=KnVe=F)$D_hm7i#|km=@$B5(5#PQ; z-s>YU%=Fx;=LkvyW?Q46&U^c?QSkkN;acX)9X$;%UN;TXdqLl8POwqIa1R#afJepo z*^b;0I8;@pRBZsD8_Cx-O-ZjW?H}*UKeQX2$ks+N%`wv-QzyvXo5bK!P&^+=WzEEt z5Y^CNOG5_7W!>*rG|q2NHDnrAexF-ILZi-0KTQ8yZeyUI%}_jbRmg1dbY9}!=wpEJ zLb32V6#j3P4L5d84gP-zBd50^k;C>XC1^A zr&F044U110Rj#p{?ez;*N?4{mNv-j7r>gP6Zo7QGKdLccH@#x|v?{1#hJk^aMK}O_ zOQl)iDWy)XsEpE`z0tK{1LG;efjMUt?qi15yoh(Sd>eYOKj}cABAIj_ZA#^-S>5t| z$hKH$&sAwDw#bOH*Y2iF%`b3bSyC&7C!hsy?WZ~g+;S%ZWoxtegf^h)t+Zh#g);hE z-k1Y;y_o-Gg_FGGUgQvB2#>j7!2&Vp;!F@y2R5qV(8O(HJJt5)2*EA9#{qmm#INR(B@KLHRUad5#8Ge5h z?ryMIq-ADK96La_WXz~?TyK`1J}SPz89Akt=M1?g0NniFwE+107BUif6uA-Oy4tKI z0+W4>cBJy;OO7mWEr((>5`ib!$eSf>mjS}dsQ%yXyMrn<)h>iTq(GYwb}&DCZv=Xd zXGeTCek-Z^JhqX2S+0L8E!}JIKfzSI(}^bDwtOGg)nFVeF#D*>E(E(KKP!L02m*QI zK$VfZH?W?9wyTt#QvWnnlAd_a2?^PbXjIMd_&$k#B@tS4`C^#Q=ePy2SY@~i7UlTg z$yxsjIp3pY+NKdK%OP7xjvQ0s`(vq%<9-y_CyIZS+?JnS1h!p*{}s%&uMf4Ab)5ng!87lA4~ytali z@mE;Nu=GbIYw%zCx=i}Igtk#f_n7o9^dkNeJPy}njdBLc&aXgty&vN!YDua)txOPw zs--OgM9A?FloNkf)ma28{-J)dETj6-gv#QK$>0%7GBKgIUqKCe1aL!41iV)*k-XEG zSitW7y)3vIQOeu9wTwW`7yjV+m{lUj!9h!9&c9eEXpKul=20AafZUrw-~pS1;USy%nM1?_4irKETruOJpH_4{u7Abi2D z|E90|lVQ&4@;B3b&+r9xhPTz(Gtt*#EgJ;g)kC@Ag-zq{Vx zxm_Aex!nzsz-=m(QxyUVJ~|&MSCNZ~RUXf6_~9dY0INMx;>mbDvmlyPBtg;{=a8PeGZ*S=TlTT> zxZw_fG$z)dxE!G_^_zUGuJz#_TF(kPo$r(N) z7IuBu+;lzInE9U#u>>4NC_kQARc1t)wt$UR?>b)v5EGj12flV&J8(cGDalIRB?W< z+UM{hW8ce1D&fHeERlp@Wu00*sz2#sMSA_%NcP5%pY(>ycP;%ZzxD?TbBHkN{xYmaT>p{7Ob~8;MVr~ zPB2YnQmGFd+h1<5!NGWa+{A3ByZF9{UnLocNVXq2o~Z;7_akK=m3GhEKI8Elyef*{ zb+`Wfc-L!o48k$+%<2>hDd&_P#4oU&RB=C8N?cVSFHyyOe`1R$`jKlwo9{eg&0aKc z((_oYV}$`Y@p~kzH0U@#{M{H_&ox#mAu8f{fc&x>pO5_2r1Maarp?{>4w%%>un|S%21YJGrM&BFJ=mTD z3e;vip7`*n+||`@bSPc2%W2|sZfpw>%Y)LE`r2I7aoI~ZC%LPFPAj$e?Jp-@OnU9z zPft9kLY`*p8P( z=80?_0`axX;QxvSQ45~s#GNl{I~{7*TZ}A0o1KZO=kD@+B_}68TWxX}BgnSrt~QY& z`_tkL?D{C{DrlEYGVZH#bbq$$arrnB6lmPIOUg_ROOc!os=Q$OjU+FBEI^AT#C~J zXWY$u{Xduf+%2DX*);waE_ag?s!w~=4kwsxw6~8R24j;R3Okl<{LS8U&@kV-F|bn% z`_NEECr}txO}bm+%Q=7LiR2qQ-3_xoG{jrl23=qq4b<9Y6lcHSqy7~bdGcJkAHu?( zWPImbB*3wXud%D302hJtdTaMZFBvhRC$if3Mxx;3<0EwqgJI}AAvmS*d;%#C@$*~! zID!!eNXt)hOas+hi+CuSX1SVJm`H3_xt49YoZ1@2dhR%0ntYKUo((_m;~wWDBh6kE z89r?c^B*cbaxa!dw>|vf&ifJSx!Z%@hJ+;F;R32#&P!=yF5eU({yVvKw!9EqTwY{k zjkp_04MFplVZLusOG}A-g6&vZog#|4XaW0 zFV6*KmNBsgcB(@l>+1OO^yg%jpjn;n=Mb4DYj%^Gs_cY-3v3??+5qe%(>tZTk=^OF zUPVWLl3%QphmfeKp0u)Afu*RG1h{g(&uUG(#Kr5x0~h6p|LtHep{w z@a1%SpL>(?qIk4W#(19K%`juzkFt^M^gMF0<5rkS;do)rc|uy>hvg~3IX5sFCve+; zTWc0Q*T2lWY&leR=Kc5BiSzh7yFWT`maX+ErHQmsUtHLYE)(AG1oLF0qx@_&LeIcp zJ{ZHr1*TYO_wza1;VE-Y(5DwOYGlMLz*-kBixl2bpPLrC;k^6A6;2DOF`~$u(AEPw z8r0MuVwy$x%Ok!LmH*4*U<12 z*#Xy!pl`Y2^Boxlg%!+(EiQ+o&PWQyFma*-+IfkkMtH_of(el6=&{-o`5|N}=?i`@ z2Y5aq=|z-k&dHrZ^>8G%3S`X+vLW9+uO&_{eMow4Cp}_Tq*tkUe6Y`-oaU~blK=82 za@&&{_+h>Fkx)Il2*ZhdXaxXAak_rhm#4Uf{d?V1I(WalTj(H( zn$*7jB^nN%+Y(1t_%SS>qTT+necOD1|!wZqC%B`Yi(+~x3f+l4-2c@3g-bK`o%G?^jK+xQ!ai^&n= znwF=L++!gP;_mJ)cpQxRvBT|6`24_-my)SH_!c?Ui)ahAE^ZPyr|E>$7K2SEJEYG1 zAI8A~nA;&Lk%}T)U4D)UbjP_B7yp(;dfB7cI21+=yv_b(Pa}Con~OvMZ?(ejvjE{+ z_FuP$;PyhwR&K?e2k+(XxL+Z;0e`-!!*1S>UWJj7(LC3RS}~{mH{9{7P>MOFTlb8) z`$c+Gep&q2@Jn|OIJ>p(ybBG0(?K8EDb3Qw3ln)CdCX-i`vO*|;oUkFuTEHE8>(ha z0j5CP9S&x!KkUE1x~)|;HLQb!gPzBQb$=+?Yid*0QcJw$noS6G0efN5r4|_)gqE#g z*Q`}sI=IE$G*Q7HOQs{3z*V|Qa?cCi`Unz9usmI_gPZ0Oq|#&&METqzfiQj%MP{&C z1$>?usyuaULX+P97LI(U?+R{rf_^0@>3NE~?2czBf>E{6+Z>G}ifl;kKAy^T#B@R7 zjSJc3LCD-e)6!qWu%VlfIm2CAy25FsJdwvnF^oD|Pv-yi>%>62`MWDz>iU=P%)UR0 zv`%oS@`TO#z#j^;?QP}d!ASg|RX@yAS=pYu-t5~7)6Muw`*msiQgsusKyAO9k%Kq0 zjBWG#qZk?0^y_@FCd8XZXK8>j^y)-y3SGHyy_YA>TpRn@m)H&o`V!nYBz+brC{`kt z*GDgAHSK?VT;_kSROOzn$z08;DI+=9K12w|ylpOx&@hIc08Xv%q4q(WOaxUg?eGd)PQYu!Z`8dDvFt^X}1 zgU5?oJ6mZuja#tVtTCl#XKxaIJSZxV-n-a87m7j|yD0-lFjYRzcPQoJr>}1&5x;wN zyDF8b1?yk*A~lnNw4o@YeFPjbKMIR6OJkQ&7aw%1=5yCA!R*QWY=M>oiXB}Q7S1oi zH{>Gl-!Iv-k2^PxXLHRdD4p#qci#tv-;2vG`#GlLi0u$UZK##po1=+dk)asIdT-lP z@F1e{TrpW-(2dONmNhC$?N<-5Asw?zy$g3+Tgm;j&>eBoeBXy_TF<+-h{;D_E;97A_*H#`9vrpA%OOl_T9}^eH=3yFVOBIc_zGwY`0@^?q@4@|V#U{74 zLlwoMAzvJ@a_gI6gA*Y=?ZVIWBWk6cDmJ_)&H4qsp8CB}#4%G-?1CB|(wv=Iex{G>6K)aVLJDuaC=8bZ>{(N5>qCBLv7dmMg|bLjmaezLJSOHKB% zAjc62Pq4;Sb=@!yI}tLBnHc+LX&HEhRX(eSaBDqPXdsd=uVcnSI(sK(Y9eRft6J{B zX)tsV3oe#;nPZ>ZtjGThX;t_0mkR=pm@U<~NI`ukudQ}O#y7xXcDxD|Cl!Q3%PGM( zCOMk83xE1ZiZgA{gnKDd2)KsM^8`xKZ}aSfb?3;&ijbm_G>xVEjeLgLD$z#Uy1nor}L%K z{`@g=bWD(^s-voJ6g=99F)U1JEN1^jvqhYC5t|eI6Am+8ZS5{(&WPv6Vd+n zqMe=ZDdtW`Q)KREOF>rYWnwl2LGwcUWPcY#Y~JXyglTN`j8&X)l8_W{*`L^Q01Rv# z0`-hPor^j7xCT4@F!b6z$+W59?3q~S=9~%7_(!sOw==%_AJ%`5c-icRen)lbYyG#p zUtH>wkrqeZqRKxO0iy5gYQ%|$R60D==70zj4WJX2yW(G9X_%mlT%?OKc{76(gDEt|i}^JUXt#3LpiWQnQF zUKdKO?h643`cs+*Qm<8)xhNN3R8Zg$hF)yNB@!W{+BpCNGc;D#6b(sjj)TM_nq7}o z*&FA(yo`=PBfI>cUnzGV0u4lsIhs)QSv_9{54rA_ZDO^WFaiIwB+_}iw+vz%Wpcc3 z&#(v0_-z#HYv)x$I)Fd!OU10KDtQ)X@yR~-9~{Zy~(_|HGfhuMcK%XLR#P$3u? z$mg4r8*0ToAAdI^^JsiO9|MFhJ%{+8w%~+^)7XD5b@*_Do2ikbZT-XuAk5loYQeus z*AHNVC@$teF`9aBi-aguq+ukDzZ>%Ae%Ae1b)0$aaVTRYW~whvU7Y++1T=SlDV?BysMk`~jYtWd|iz%Zei6#cp`=_(Kmh zDMPcjF3CgD(g0;WZ0RPf(Zw9Ed%rLlb|yE&Ht7O^3tmBmCXuJ3oJYETN39t*-omf1 zifa?%r^=G6Z(9)<9F6~z`pC%29XdTzDD|Wv+xs=pNc1IW(x`?{@W;@w$H?WbTYpmu zb9YK9Qp^*__J`kwO{&@G<9)6-DP)AQu+7f8r@*C2a1EeHmArCZ_6 zd#1R~U845S&o`17+m!5=((E1Kw}{W~`7*7R%g)!{A8T#UfQpp46UfKpFiL%acg9n&EzEaz`E|Ft9)CYH@Y;_%SDL*~X*2i+ld!ILG4HtzasGZ!itG(n>!&Mw^6B2t zh0}RcI5gLblhk^ZJyD>Qqt6wE7=w`VDdynmjg>> zogjLvkV*Ql@1`(5K~!#3p*$|J*U<{o7q!PEohm91tkU@Hna;0^VvD}Hs`<3jp3f9A z76Vu_7ou-v7YDpPy#CLWbWw4s;4QL2#|BhE{aDlV#Kif62EIYS^W_Io#Kr^Hh0mSJ z#?v78&Ch^`pG%GFZ+;T3{OD3@ayqG_)dli|edySYC9{X|xnFWGNnjwu#J1z8VT6TD%bw4f_O{xe2lCqF?~ zlIqQy%cK+aT6g_TizYqWRfqy~nVGwi=@f9>0~=jc+5Heu|5LmAC&2xXo8z!1BkpVG zb&*h$HdeI6&9i`8SsVz@vJ=l89>-1K_?vWBnn1d$l(l$!yBzwl^|LF%NY$z>%Nh$Z zIKoma?WS!=NQ~j44^8I`9tRAtsP!-~I@iI)l%C7-Fm zGAwDeY&7?yoT67YcjQc1dih^%!8x3AEvho5l4p#64~9sfQ5DC+@4Rx70AP_P2pJD$ z7V(AP{7sp+UXf=Ja3|u%M@BX9q70px!|b`^05`Zp{fBOaAlyq&xEJzx5vGV+!w)1A zi=rj*zmz=BuXKH0CV4 zW)M95)zlj@2p-iyHnQ^cG`+7$ZET;7o_HQjARHWMdN#Ru?E zP%uKBjw*%W=#X;KiF$z^vN%i|t!}`veVY6G+)^E9DUG>qJ#3H0z8CrhE5d|H9 z*txv~Wb!(%L50wm-Y&ZNq4yBUj^@$RREF1SC5c|Zz-mczuldVH2_li9C(MlaXkarl z)sM9k$4|cb@xoJV-s#haf@#axyH_z-nKJt@GIr88JTm(U0o;nq$;pkx zzFyQ-uN+_u;wZnB!xKqx>G$#@lmmgl%KWs`*rTG2w2%?Z=SdQ;lV>q z)u%)iGBWmeUdL8(#MigHzE;ikG2}uBY%Tl0YXR8#xSpssc)>%lvGZVXN{hlk8W{;2%0$ND zknmqyaQF=4FB0J0>&%Cn<$P+U9&TPY`gVo-`+X`x8I|~quS4p8rk^u~{zAxQWS&8! z)R$NP+^#V#dEAUwr6ViT_0WDsZT+{=yP{d zg;8kQ+PB8lQZ2Gu?2mZ)=#Q%1=65R_>(PmE z|MAM7GWP8Cc6>Z#9h_niwz6k7v&>szWKEapT0vt;t+ewwZx}XK{NKc~I9MxyiWR3H zD>m_U)ExZTm$RSo&cN!kkL%tcfd6Ep1A$_3)?ynd0Mf8Fe8n$pYX4s}U2}9K-P7LP zH@0otwylYsjlHq8v29xu+r|VNJK1cov2FZjzjMAhJ@=0}ea_szRZrFPbXVODwd2ZG zFztNRAJo7A)y;SQ?FTwc4|bB@?+Y@@5~cPR2~OJm6P)JT+-RsF2Rvx*9=#hF?GM%LmXn2)YzZcJMJAnt-k{ym4< zA1k-e61S>u*HgEQQDRV-O$JD{z;ZwDxg7bNPycaP_zmS>Ey1Hd^Orx#%DcX2rV!=I z=!ybyqRAn^YcbMSGrU{qx~!upGWbkzBjU8oIfA7c0Z5v-G>{v z^e(Fi4Nv#Y)|3S$j~N|ElgBC0KQD2=yCoMTCb&tPYWMgbN+ZYiE{hZk<1@r%eKU@uY23$e&^nIL~`M-fg7ifHU(HH%

    >6P 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/logo2.png.i b/AndEngine/.hg/store/data/ext/img/logo2.png.i new file mode 100644 index 0000000000000000000000000000000000000000..6bd42dc31b555a79f6cae5f9b20211b3588d8b09 GIT binary patch literal 29310 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/logo3.png.i b/AndEngine/.hg/store/data/ext/img/logo3.png.i new file mode 100644 index 0000000000000000000000000000000000000000..2139d41d595a89c8aff6650937dd84226d1c8e62 GIT binary patch literal 29886 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 B0)#uf?^^fQ{e9P6>wdG=%&g4poZ08h-uro; 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/logo__icon.svg.i b/AndEngine/.hg/store/data/ext/img/logo__icon.svg.i new file mode 100644 index 0000000000000000000000000000000000000000..ba30bd916fbca7b92e71915fc8809f81bc274272 GIT binary patch literal 9436 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/source.png.i b/AndEngine/.hg/store/data/ext/img/source.png.i new file mode 100644 index 0000000000000000000000000000000000000000..d46c4260b95c5077d123fa018769355d946e31ca GIT binary patch literal 23566 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 VID+(p{`wh92>$wq{|^l*ihKxl14{q^ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/ext/img/splash.png.i b/AndEngine/.hg/store/data/ext/img/splash.png.i new file mode 100644 index 0000000000000000000000000000000000000000..8463ed5b941f3ff7d4b8a202ca648d8776de9d12 GIT binary patch literal 25702 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 cD{L<&^X+y!KYSKKaGulk{N=0v04VbE!(;MvT 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/push__google__code.bat.i b/AndEngine/.hg/store/data/push__google__code.bat.i new file mode 100644 index 0000000000000000000000000000000000000000..cf9833b7a4e19ef3f6f8dd7886ed3d2ba8a67769 GIT binary patch literal 181 zcmZQzWME`~fKnh;3uWK=4+VD~-&9CEbT)kTJCmgf*Do zU~niB{ly-?AaHWXU!Ta*#jRngS)O(ACrT649(nKO`xCh;tl-(oaP_-7Q^cblE!yTP z6_9v)ub`EN?cq9p@7EbGpB}q8quEbw(j#A!uW_@V$`l=txi1;1qgr=idc&FN`u-E` OJz6h*;I})iegOdTk4p0Z literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/audio/_base_audio_entity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/audio/_base_audio_entity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0d68b7975a7d9c8e459c9056b8cd90e415688d6f GIT binary patch literal 721 zcmZQzWME_f114Su2F_&=Hp7GeQ1C$c=HA4v%o`i5B0WmBdGgKRcK3p+0aF!o&W2sg zo9!S_V4WIL@rMla@g>7SEFN)wpEb(Z&re3;5^ zlqi)a>MbmnbISLuYlFe=9dqW#pSyoZddAtkFI&sa=K69sytj({m+;_#oQbBG085+8 zVfSSpcU}0U(s5b&gNe6+tD{ud*{|{Ij6c;z{QDa!bjM?1r(_j(&9u0e#>Z8*e6gGP zDB6ufP+VuFOpI~jsWta%8UA=`9NM<|y<+YnG0|QX9uDUYp_3e!^d&Bq&wQeJNGR=| zNz|8x`#x4&ZoH{8=M?j#Q`5pz75IfL>N-m!g-bVazw9uJsn+%H6~EbdeDVEjJv&{M z7JuY=S8l$oXp8>aLboFxzIS$fa#DQi<#2t{t)^96sZCt78j7Y}seHXO>qudc-c0rD zKC?f+pI_y-aN^at&a`R$7c4Sb`MyZnx9!MnN$E{1o4v|4=;y>qns=T{u9}_1@>@GG zMOkdY(tW#j-Ch)Ab42ca^;?PZu3x*NTZBJ6Tw|8%@#Mt^8Tao^OL&Cev7HY4B=BXj z@YAG~Q{VbWou4Qbkvq?BA=}orkXN7QJ7q6^T9!O*Yg_%bZTVN;PD|~6IseIz|353% zw-_A0{wKdFTk&YJRx$7HZJRFn9@}A`_vV-*C`Evh5fHcl6VpmCi-C~~M1#^(XYuy3 z3k#mzxICxKIZt@Wp|D9Gav^FUWW}81goNybgoNA24jf20c`|ZJR8Z8E&M zUv?0%RS)`ic+LcA&FtkK4N^j;E&;Ae1sO+cv-&5ueqFcKnvdnm|8uweqHe$C{3%dW z_+)0~=Vxcz=Oq7O-p+C?kM)(x!rGq-d#BD~5$iPBe6he}N@SkS;qp6+H6pY&ZV}_3 zzx44bnZDzT6?+~^ao>~Vj!(%EvD&e5hNk5Eti_Y9)Mo74-E}X{b-F?0%WT2Dg3~XW zXvrSBXrTXYul0ky$=!y|ZyaT69NbS&I>om2dDi{=jDM3ZbvBoN{kJ&nWIJocv@WAd zHAXgUIuFigSa3Mc`2Tx7TZH6WiP|o?4^@l4cuw-FdNeuuu!ynh1g~B$x!*BaGi+Dt zo;)aH@;9fFMSQbfm(hs{xfcv?=DUeX{@k&$<5Fb)*Kpm9u4j(T3k=Wes6F|CD{r;^ zbLSlAI`_ZtmK<3-9PGR4NmQU4PU7IJPjH)6c*xbpdya}&&U-G4maQOEGvZ{DSkt&PXe?YSPYR(D3|!eeYf z#vbo4cM1Ca)8qcSJ@47tZcCScmNR8`$`;=rw*U1`)@GFf z-Z!i2*XX`jb?5P{dFSs&WWRks^S@QYQnOzZW*%}ZHLbD~i`%ik`eVXEPznJhDghHh<4Fx~Y>_?o<}6@uq6dy>}iryxXhQQUw*H3t*!2q=*+6Ci=|IL z4YPf*Gii&$iG3Siy}vpA)7vAr+csUTOFXOb{_)$_>w`q<_kK8F)9&|><67_Lr5ooh zE|lMBY9q3OH8u9r#)a(>iKwsv1RWos*HdHh|fUG01Bl0Nn<01{ZQ AW&i*H literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/audio/_i_audio_manager.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/audio/_i_audio_manager.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f14c4be4355671ff13d26b4f73145068e4db2102 GIT binary patch literal 314 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 M$zm6nJ%#uB4_SZH`~Uy| literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/audio/music/_music_manager.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/audio/music/_music_manager.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6be5bdea1c832c69ae91e44ca8fa87212c612cc0 GIT binary patch literal 451 zcmZQzWME_f14eZQ23B_no8iHKC=hRSVNznK)&KIxk3q`P+)%!ev4RVmx8=W$p5@aZyjwaCdf%KNzO1g z?w@HcxufE#ZqudQb1T<<)V1+gt8!-N>ZPZu)0gbosZNfq3@^33lY`hm*7KoMjsIwV;6c zRqhSuZR-A8A2OvcX`J}JhU0DLpM<~ZtkOYWE^4PMY|Edtu9CHm*)<~Q4=Aia0Sp8( zz+iR(vltk+gJ@7lH~Ianuv@|So>za@!!Ked4!&IV9HJVc5J)mD0OG|U1}_(o*bBr5 GAv^$HS+q$2 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/audio/sound/_sound.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/audio/sound/_sound.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b9444949a7fe4d35083b248f31a535201e39016f GIT binary patch literal 2254 zcmYjQ3pkT~AAW2$Y?OCS!xVDL-ZUbI2&I>tPmSa-uR{(MBW%fGj`JmzYh@0Ji5!<` zj%h=3oDvlcwK;c`QF;3=KBM02yRYm2yZ_ho-2dmkpXa(CKnM^5wgE~90Qm6E9+27m zh1W(SoskcsADbdFe>$7hdMv_c9e-)IiBQDGz76MKBoiH#H@iOt8L2R4C>{FJSXV5F ztp)$+(->qubSqm;WT0>J=t(SMBFAq3r4V1$CC9k83Ez*?omb@MkjQ7ptwyEyuI{Zc zE;X`>vGvsQbQpaZXew{rI1wm*=toXi>seG{Zkmh@OUgRPGB;tLbeaZ|$7!Ei(b<3+ zO7?PjhrM-p=~%MHO!Y?Dn2Jjr{)T8BF#}wWdMJ0h)HlWc7rPT{F(+G%;9AJF$_bqdS>u>p8D&kfYXH zIcciBPSd;`TyP5zOCNz|;<$jxSsd$aS}PN}%AeU35Ce??b2L z`O1`nQsE?;ZxbQGv)!FTx*=T+>VP&~Drg8Z5m9f5H5qlc&zVb&M%hpO-F7jQDZ1v+ znB-q8T2YFBquoUu^p9(%o+(?1HCI~PIE=~hICh-Dx;JhkdoelDMJk~BghyM2$T&4j z5gCP6tNAa%;MVj4CBR>g*ImbmnZg@-{u$#a%65AEDXZT#Qfha@Y_&1}a>p6TVXSdgb-@5z-^I_QACEEQ5!qX{VTA_u;|eH zf!Fa?(M3?5iK%ha9mmFXg4tn8wTEYdUpF{tl@Z7Q_^*gWp7ijhTtT>@poxO|ZXx3T zN~|cjAn0-T?J!#59%ePwe7cFJ2+2$2e2@~{`wc=-01ju?&tl24Sghy6{ikzpoUYAN z^me5bP(Liua5aET-$AzBSBD`xd#3|0?3@k=@xd$nXnp-PSQG+naGgSIThvn1$fIb? zr_C);<|}A?@tBf~e`XitjKDDzmT(Hf&efof*b3ZC$Gj5Qf>yW9xm$7H|B8X$Vj)4? z%Xc@jPT&%{Mu!ydzk4Ttn>5go@Jq8z+i~gsI9xHC#Zn&p9kkI^W@uPGx z^;nRuvo2VQ+$#%u!j1GjDj8=f-fuseT;L{nGq}FZ2)5J0tyH0Q*+}?MeN@z|6o@1E zt8t65lRR=yH2r4h^BcA(eGBpBB|gW@8qhl1vE9#xk|ci19?zoXL_$ zBGeVyG78?+<2FT~_~DxH1OTu1M-#p_71weeRhUdbPZsSJ7cc6vqIS!Rbw)-T1(1w{ zf_HhqBo_eUIpx#!qR&0Nn^jhTAu2Xg@Rs10f(gn30Es%mZVT_W7D(`cG#`hVOsP7B zxW4W1J2sbC0~YDIDG>Yyp{VW@`@*P&z-Ewb8ESPP#fQhk&7vt0T2uPwc0b5Dh+9Fc?(?d& zWy@5uo)^A+@71$2yH(gCcYhefV{JwswZ`n8lRDZV@gE~D6@F`++G}5rly;c9w~Ha` zy|~gd;?D^bOZn5uGQBvaJtFs z!@q!NXeH^fWOvbr|L`e`mHz-AaLQ&R&3VG~Mz7r*sc)`>{`HgVU_G!RKL4auY=Dy- zBMh&2-SVl#UIqv)X#* zI4V!2TT*>uP(trwh@PLeT~kYVbNlMrBh#NT=-xe>n-X(t6)Tql)+4Sor1|*V%*!rQ zkAa&P$K6q>V$uU{N`LM|*;C0XD@+l(WxDYmo#rHl6o$G1k_;}i6%-QcyIsq$ts+0% zDX38M7J~&vwlL?ZLO%73S#zrE&t;xcQy|v&?r3)A_MaZ#$6|d;Bauj1c~?jzI}!34 z_mQ)5P8xss5GE215FZyo%1;{S_rrqL^Y_Dgs?`10jmulB6hiZfS;nwX+b5A*Zp%B*01a+2MBs+94xxym#sg33dC!%a7efLc&hJS6ov|sW6EmO*V@t?&#&-0!4obP$R-+A8mcK|+s58wvhFaR9twI2yw+rd;2BOaKp;n3~81jToiQxC7KXhBxshhAl78D z#q0%ceED99jUK5J*^TZRPetf<8-u_5Nl39Vu;XOd4FZty`*voiIXAT_5F z=BD0Ssg`f6P{3$BuX@qc@$rJ9=#Kn)?kPX7`k(uoG{4fCx`9iQS{W(!sOk=}KPR?9 zuFWfDrBX;`apze=a1Pkv{BfSikqO~-!x`p?b=0$ z&w)B`;a5-{s)?6^5pAAUnX&)YjBIFFPfeRHPWI$UJb9w4cwuZStaBg6L>jnAraW1_ zlBk9GLB`(3`)!+%b&TWq_hWQYIlq>(5A4ujZ$%ro0st)zaux%X7cU)idR@{up?BQS z5$90JIs!l7{0BDd!j{*7eE|R*z^?g4pa1|FWFPu}9ed6mmo)+ag50_6Zi;>QICGwj zAos<;q6TZs)@6gPDXI733BPgK2MI@v$?OkkM@l7yl)Kp|u|j)Ds!k5BX=!^(;U@)~ z@pSJ8AkSOW2`h929edREeEz($pxZ=e=q7DTV0s2TGktBuaybQNq~-{zdTsyq!p3JJ z6N|xElPPj)J^C55g45sLm>LR>2M1)j_Pn!)MfoA0-Y6??t{*eYoe4QERCBsg=gZY< z|Jc>0$&<4uI%+m#i};F%rx4cb=yB_my51*n8B4Ovrd0m74x%A)P55~&& zuNF4xRv4DZYORrN_H&N8m$fVY8k!yX;&7-+AlnPJSv>y@*}mWpoK{`VAzmrw}p+(Oc zMqST$5J}6n{Fd$PC%owQ-Sc&c(|aoNbt*{*6#Q4;<& z1QEpIr~&c(p9cUaXCK+YAI45#jt^D$m2j2&1(Kt}aj5UUamqD|^0&E^gT&s;hi1X; zY#&r2=B(aOG~~14LF+JSrFw}b)HAPTwJXOxm#7NI#s<=Upb&>PTEPaMZC?5XAN%6m zO;Z)7NX;Y>NsFuwVdx(X13lVxXINRE2N*9@A>&2r$SdabM1TGApmaMg`bavv09q5gKik^WT|6~(9HnH}s z#n*J&s(wpo_9hs4J?H{QF1VR1dKmzOlX&v^x7i5c_*A#D>#p#PVft>U@l-}D`N4v^ z**cHI%Q&LXFPG6EJ+bs|k)^mlZXW$7{#+^UMN+&&o4Xj+w=qj!GTT`z*>}HT*>*Qs z;dkb{$TKV$svHf21S@Ll8IQ}18wJp54CtLaS8r6Wi&ojoG98oWhKNYI*{$AgM%L56 z%=7*_P1}ed#k^@1)^YmjeYE^ive0Zu9bo_HrWpF)vQ;U|%Xu5-PO0hW{&C-Tw{6uVxmn(7XJ(%~ zJloT1seMTAgBo2C$>#ZgTSB6p7Eape$1?rIox)=?bFH60zJE(3S2^zOLG5~}BbziV znwjQ>bh$r&csJ|%3Wn(Qw~oDfY$>Ue*^;_*U)-AfyoXxti()!ccWP8OK3U`4uERd} zJKK%#I*&CQ;ssB#NL>H!{7G=1{_m8h>XR8!Lu#SQ&-bU1!IoE~*XrkxZJc#+=!hACv3HD5S)E@+RkXnTGF*K;eukgR-X>qPPwU?EcdO_7`3`!3DKj_C;9#vvj3u z7XFCV>jV$9v9+)~L^{f>b?NnY8XLSsuw1@}&&_DVdp4+q11>kLnk`1iI~Eh+`u;_kdBVq{_8O%7%v9N8-@-JZJ-@?zB81fj zJ^$M7#Mz@r=rX6`V}X%GZyW68x6Qm~BU2v6_Z9M(qVk@1GkwnC{uw`P^|I_ScA&nI zvQPDgNq!1wh@PW3rp3FmPd_dXF`#zcB#MxCk_*Bv49a^C6z~JL@=&4|1 zagOvmtpE3s6@%CteNSofA~j*CE#+1g}qfj+0V`B=lt~bwC?uGtf`m5 z*ug$!MZpia+>(7HK4La38S${`*W%8TGW}PK=u=JCZ$*8zYvSV0rx)PuQLSF^Ug&};H>^DiiS<o8MprVW(M;w- zER(sv@4*Ar!>|xRn2^SA42j^=_+mwcP%NsJSBOv4s%A85ON|+7@vWt)&B7Zaw#TQA zPld1ngF^idk54e{xN|k_1NS?8iXo(R=M%h7@Mznb9kN0lbTu(Ghr*URdw_tqngnM`zMH=f9*T90!+pCAV9o661!+Oeb>v8YP_#=sfq;tYKa>|O zt8l2koxJ3@oa_VK-(+YV`hN*>Q41Z`K6=4ZxSZ3h^cYN9IxC$Mjfv$Xu@W(yq;$+7 zUq3Hu5G9i2MT-nQOwzVq!M;bSp^>2!vac5@6mtOM=84pu3d+*Gc|=Plb7KcqTlGLP z`!k$`IMG_CqSwacPv}RZ??2z)vVqYR-FZt`OlCqTp;g*OU0^C|~(Qr7i zY!@ate+i&JbQ=W~>F?3$O8CPu2DB3>c#Q31=ofeOT?q{<9g2kU&Yp9()A#Do8|nY{ z+ETo!w}6wz6|&h|Pn!JP0RIIB zMEmco2N&vB>(;gafB|KLfC?OgOzlehE3;FUmKY_53lz(Pg;S&R>l+wd(J_4z!(=Y$ zMU4$l^44lm7uIUiyOf;*!7nZ*RT7a*ENT>ipQ2@6K$B_=qkeZ#+t<}^4g0`_xV?nU z*bo!xArir5?LQ>FOp8#MNFya8J!*YL_%XgjL{{V`uHlQxyQ?_Pe`ZJYqz?xLiU`BYVN-XXE2}SCmiTN)ho4WIxWs z1?0TRU&q`^D>qWt0g$`k7?hi8rXFG~-JRH7IBAi8Wqs4`yJLi}nEz(jF#v#pXWEQJ Qz==ms$8fnEb_^2nAMCU1yZ`_I literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_base_collision_checker.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_base_collision_checker.java.i new file mode 100644 index 0000000000000000000000000000000000000000..da414a52c47b4f18caac73551648cfd0b7024e5d GIT binary patch literal 2335 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_line_collision_checker.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_line_collision_checker.java.i new file mode 100644 index 0000000000000000000000000000000000000000..99f6f96c18249bb8c0488269d6cf0ba40097b51d GIT binary patch literal 648 zcmZQzWME_f1I88x2DVBlJM}*lL~xegJ=X57q*^ye?)s?(e#zI*Oo6C@kQH;zh91mn zb`Y@D{=r|&rMATImP5uZhwcjk8Pz8je%ldwT*GkprgaOKez|YGj#G76fQHFu-7wgHt$>zA~Y)7ZXvD(@NH&U3~W1dxpr3Kxw+Lm11+?afr;a%j?;FS+l7u#tk zF1(?4zT%e2X`cd?|7l`A>5dHH5B%L9ztoWU{aEUOWm(`_PQE$&bRTwB98&h3p>%%{ zQ_XdaM?ztm+UIu9@5`-}JM;g)3A2-?*Vz_5>lxQ4E;-Kg`A5^28QMXj*MnjwtYXdb zwR>^!)Sj5W4e3h~CgcmR+~aamcFiiL&e8T5&lOl04Cm&5AFETyF{BfMuS z3mJ*8x!x<47Mf0cKxqsv2hKD<5AKnrFIU;O5yY8g42mCc0#}l8c>`#>5 z#q2r1Y|GcHGfk&C1sr)1&cN@~)jxNQmx0^6Bm0+pmbU3zyA2c*px6TfP#m5Gvly68 zgJ@7RUWxObajpLN#_J;f4|0DVSk-^={xOIe2w5>FIU(Wa@dF2{rZqMO&YZkiW9yPF z8vc&Xhc!1^T(z`USKn-5Y=7QT+0@c{tH*i`Q}vB1n{}?RjbhK|Dv Q&RyK{>?sq&&a;uK00x^HP5=M^ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_rectangular_shape_collision_checker.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_rectangular_shape_collision_checker.java.i new file mode 100644 index 0000000000000000000000000000000000000000..8d01ae1e88d610c4c28b4ceb9099993e582072ac GIT binary patch literal 3632 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 B1ls@r literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_shape_collision_checker.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/collision/_shape_collision_checker.java.i new file mode 100644 index 0000000000000000000000000000000000000000..5603dc9a17861e2ce0c1aba2ec323e736bdb756c GIT binary patch literal 4419 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine.java.i new file mode 100644 index 0000000000000000000000000000000000000000..62ad7c9ab6a1b853bab632743d0e0494894dc032 GIT binary patch literal 37478 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine_hook.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine_hook.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0e49f99dc7c41a321ececdce597775e52a82771c GIT binary patch literal 542 zcmZQzWME_f14d^C29^p4n}Pj56wLo1nNc?XlD6T3=f9&DSzXxV@A@CA2254VSsR?2 zeON)@-yDa3hil((d0$#9ziXP~=^NhmZ&-hE&xwo9T(oFez^Q+~_0)O{r>*Phs5)gk z@7JB;wvV#66*6{v&J<$$zSVK-M6S!n&P=lCOwHW#HP%4?uVQRr&cT}nGmaRvSg!sP z7F{thM*Pgd#i^-^KerWHt+Y6lVRZKR<&P|Siu*l3zy6{n|I}2$J1Katu*{NA8P|Ib ze1CXIeQkMx&m)b~55E0h%lSb;R6FCC(+)YOZ(mlWt30Zz3~-4F%3gUVTXTU?Qzg$! zsWpecAC~el5Z}B`*gI9r{>3-_Y3g(GZ#PfAGuL5F$x@dO-(4OBX>M__YHhvrD&WQIG*PZWeerb1%pkwCO-_+@X-(&Cc(m}aaEU|43dcB9t!Guj%u7Y``De9`Hxrm%REh4D^_=_LhqnQ>eZ KLJT}b7V!Xbd+!$j literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_engine_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e65a13fc75935282b2527ce3ee2f5d96fda7b459 GIT binary patch literal 1640 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_fixed_step_engine.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_fixed_step_engine.java.i new file mode 100644 index 0000000000000000000000000000000000000000..3b98038f96054a58fdc93e088bfef07b2dc0b144 GIT binary patch literal 1707 zcmXX^dpHw%7~Y1$aKtwEiq@kdp%qdq*JCCOjl$y=b6cdNO@t;Cb6+-E8fA(~Cye$V^I`@Y`~00aO5n*;0v0Jg^e+3VK-%%Xl^6?vaV z%(ejAJqKt|91qliGyKDKQ4{{L<6GVTBo3 zg9)DeE=SAKySqI<$^C9GeXg)Zupzkag=HG1%FwyJL$6tcRu7x~K3XG(NkeP~G+)=S zYw&aDSH7w_Nl2sky*l4$xRR`gj$IsQU-{h#3z-2TEhwXHOUst%g0keF>wYP$RF^i) z*GTCW2k$18VS)MzYV~2(Fecqq4yAQZ(@v+Z*W93C*Z63?YxI=^cTYw+3_ zwtyp8BJ87A(e2K1N{+mUADF(1A;!8);!)9DuBG7FMmY*ZExga*1H^OrQ zQ>^pM1D~8DP1p{QWZTt9wbIjg_mLekSh{(6+84e1IYXhn@J{Bj1ahR$OMX(8pX>sv zRFhK^U)%ISV=nI z(+viSdjQ%%IgifH&kEqTh`|B=&*-F^Scyi0M0#v)kE4_cB=vv@;wI4f(F?2bZJ-!s zIAi*Y23oV4X+Ahmm`Z-Pm-1L^$6&q5tx9rPCRo?Pf^VtjKdb1!t`0a?G++5SPk_;Q zgzCb0!tl2gcF* z=F7T`GFEGSLaIKPS!`ue6MZ#8fL$}uk7kW~# zAnz*pnG5{0dOAOw8t7VDiN-l5Z+J+VXNU8iMft#s@Y1oROLWbo(sfU$OGuIiAu^>3 zfe*9{e$cUPIbx}$Xkkt&jYqmKE~1_j~&I&ao2ut`XY80&&^6;D*E)v zN=3!m*3tIB#MMK;`Y-)btXT~NKT#7wR&VJCKR-`el*&xgpAwsq*4ebQad}w> zi8)}y21|)!3@BMY*FR_+V)!yDRCEGijEv#klxQSKr2A%DDUpno?ew{d@X>(6T-qf- zTic#T3d-@ItMVrq_>n-TXUXYv(j~pv(eXebA17MT09*t5M;FXtPy)J87@o{2PnJ0tU#nL(|w2ZhP9G>0bX*3N~GptPguu~0o z1Lwp+1ZP3;q?|nppo4pv6TwK-8t2z&F4snXvEsW4JJ6GY7^8BoV1LK)qF2VgP5nh4 zbuSQmmmb_q;I)z3S&{|VEPfWJeoIC^sk;@%hxbG)4R_`q+mekGN;DEA(u4f{dEG2l zTQ7^H%sK5^OerXOFkW~%uUN$=|IBzXwWNqznO9gurQHF1TvDT){lbSDKp4@nke%VC f^NtYt6Gt+o+%ie-1@rT62xw(oBjD6Y-PivE5kdG> literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_i_scene_touch_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_i_scene_touch_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..926008f3287d1cbc2cb69c0d9f32eaef03ca4c55 GIT binary patch literal 315 zcmZQzWME`~fZq%ZOhHh#-+w6ZSv+HEb(VIY?nW77v5DK8Vi@kLL)Cz(iaBd1o%K6x zz;pb(%PH$098*1R_nvN3D}3PWF-7(U_mY*@-A=#J@;%M?@!b+#A?wAz1foBlpZ0Zo zbgthnw}g0Y-_X{>FD7JpuShG`Zx#7=XA{3b@x0unY~Ax$JxG{2k8O#8Vdf+cMoya- zb|!Bg-jyob)hxdL{JB|aer3~moVMLu_bIoIefx%Uq1(b%>zsE}n7Zig>5k^54gXds z|M`_T;lqKwnfG$Uliob!z9ho;`?#%$jRFfBuWDNa(^~27DM3Lot{LC!XG_~eU((z6 zVpU$_G;ZI}1d+;>jdiN}Gi9@wmf0U&{x?ouombC{?`=!WpF2mCe@uJCzRzRvG5{eD Bi?{#) literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_i_update_handler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_i_update_handler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..65cf7ec594a3d4d80e2f6eabdfea39548518a496 GIT binary patch literal 339 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%0Db_@AhpX>8%=aCuN1B-sVKCD@HQ*{W8 zZ7Gm2=I0%M@#@H#kKUx9%Z(m2P1oa#`J6`+xpbeFVr%DnopIeH!<6cC<*tY4`!`&c z+`EFgm%8q~u@^>e@BL0$myisleI6qtj6-7Jy?JE4KiEX~g*sr_wUVwSL| z^rlrRirDootD2vgwBz$H3S0&N1TtB7Tss2*{F3uzjkTNhjt`Licn%XVm=EtP~C)G&(122(v`G_`tk#qJxnr0FFDkE+aDznV8FHeuAEu3y09PVfSYJ zeH8}N;)++?0-ikpv>2+HYY<2``Jrbs9MqeuPDBLNH9VYAk(9+Rt;6Q^<92uDjLJT9 z6>FA#2a%?{hc3TV#@K02v}<{{X1`u2SvA0FZw^{!_(v@d&OE$d<$xnvAPz35nZeAy zyfc|sE`;;Hfo0!XNO1c~s*FgsinMNOxmFHs-4grtNl&vbLb+-*U4Er6l~WS@PdKk% z!phg-okVceu=Fl=zRq|SY!t%GA-DCe-xDH>pO1w{vr6fI!s()oU_ZZVRwwB(wV+RQ zZ5?!M9bBM;qbFVHqr2>e?QOLM936-4pV_OQ1s?g_q&S=0e*AK!1?#) z!@mgxLNAe*Y!&y&Zy`=^7-HUQED%~^)vG#k^%2?XYANHfk9n_+5}G1cp`);%AR#D7 zK0ZSw6!x^`5%S7LHYiB1Yi zH1ESV=ZM#ds^ihqiEdk z)YxND$5*c5)Al$)7zF~fAAI0QLh`SBG|ffsZB4t-5Vy9e_gnrRVXy0R))jS*bHh~x ztJ?=+uv^7{!d8wbPKi)r{)BS7Gw5coe=ipsw)M^2{{A4Q%>7MI%Gsmck-z=}jp9m_ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_smooth_engine.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_smooth_engine.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c2501b7bbae007efaab7df62fa995873e52d6642 GIT binary patch literal 1180 zcmZQzWME_f1EwDg4BQqFHlxUYC^&xOw_+4ud{@NG=1Y~#*H6#?u&4~820~WMIU5$6 zf6G9mmQU#a!+kl69E20HmQD@TTE(DP8j^L(cFig+eZvQ)8J5b57x_-TwRIR$q^p#kumKdZdv3b)Apw zL6fH5lBs4sBtA2(NxME{_VjhB;_PSB_Okg}DDRBp;0zY)Y|)VLo}{J|wZrjfh0DU* zwwABv)mXJTzo`9YeY|e{<+n399rsRqYF}XGvLnoK2G>IIJmUravpz*QUi=ffzS5Cl z`Tu{#49_JR)nZn2eGpKZoa1T2dgO}4@t(p-43DMOvZTiThuI#fp7!q#pZpf^ zd${7idH1>eb^7kgG1s;(33ocsaZzQRMU}Xt(vLsi_%3lT`odA_pda8?weZ8AId;1q z8b!VP^}dZOaHB~b{{yxqiDm3BwVu!U_>)ETe@n&OR~*~8CRZ+LUDK5ot}^@S#R8jL zQMHulv&_-P^G+FSNw06?dAwh{yTWJdG9f#sjQ=6RC8F%Vy)MqV;GE{fW~>>+!7KUv zSWXk?@x|vnT(rF|-F!O9>ts^aRCSZyo}gYgMJ3NE>KaEiA1W=G=nyZhrV?zDx8^I~ z%@CVyiJK31e4FLU@2X|q=CP!BQcm*1p4?4;w|^_1y=LOvcjgPHPL=E}Kk&6_rRg_s z$CZq1ebWOUOP)S=TXVsh@u0HMQ6X zBnJZ(bCMGh<{m$A;MwT|2R6*xyg*~Wis?=jQ&&ZGd;M5NOGEXYCh8kiuId}=@3%0u zwAWvH!&H6a0t-`DWnE)^L-s{$4(RWXac7J?puTa3ii)vibnwDi)4L}Ndukc(Tw-FV zE^$B^KB3j*xz{q4V3 e95=YG;9h?HN5XlHaMoJZ#Sz(YdJLke(pLdWx)KWj literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_split_screen_engine.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_split_screen_engine.java.i new file mode 100644 index 0000000000000000000000000000000000000000..34dc2db79b7c1b04da6d48710fb407404c5f3021 GIT binary patch literal 2968 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_update_handler_list.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/_update_handler_list.java.i new file mode 100644 index 0000000000000000000000000000000000000000..20e4c61c3389ee18946a206ad49f7c341438e3b4 GIT binary patch literal 591 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_camera_factory.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_camera_factory.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f52b1a1c6ca2b73fa69fc82927826b08ad52c091 GIT binary patch literal 833 zcmZQzWME_f1IG6Z4D8dOZ1w+8a419QVd}5xB~m;m@|oj}-wMb|RzuW4$ci~saWthsShRaIKv1wfljoRGp}Mp~`DFX(s8UEoUV1rOK2& z@>JfgyH{a7Np$zr+~ALQl_yPH^i|Emi|49gQS0`w63e*{@!+dsz_?Vwjj=y z$(v7ifBE!B|YEDvhuI*E1c6 zT0L#YqB5pEof>yN*KAUL^jOts?&ZH75qFgZr7GCZ|9e`|annts^qSK;-$~N3hl{T- zh}>OoQ5i5T>l~}x#0j?dGdaG>W=D6u5sDIParFD4vOn=_%4v7UgNEmqJ`&~m%sT5~ zF6+U`;j@HIvP(AA{#*OC^r8DfogK$Eb8Pzf+*HKl@r0jt&ky;pW7K$Z<5Z8=?%bZk zdu~pDeC%$8cjqRJm+z~2g3?7a?tIfa+ivt$fv0l%giYNwTi0K)s`_&9@#C<)S49ne z3;G>A(HmN0(Z(Eluj|9|;ved{v6}2V=3UC+Kc4eUe5KLe+9#*(d8X|vSQdSzGMsl# zQ?7$VdgLFi*s_ZEUyk};6z2E3c{6Ff<&MCpw^?^@{ytv%L8Ujl@*hk5G^H7!NCzbp zAaDdGm+4>@1LJ-W4N5WB76{hqr-3vh$N_Ho5&cJ(2e>(Dp402yW-GJqUx!U`{z`Y=8g& literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_chase_camera.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_chase_camera.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a28a7e3a5d8cc79ff52692be50c9aa7dd2873a35 GIT binary patch literal 2328 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 Ytk^{Br9Si)=6@@cxA-x^8%P@dA1*>hX#fBK literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_smooth_chase_camera.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_smooth_chase_camera.java.i new file mode 100644 index 0000000000000000000000000000000000000000..db6ed9e34e10e5dd9ab904a9da7bfaa9cae04114 GIT binary patch literal 1514 zcmXX_c|6k%9NuDKa^I43BN{&@#_N{*YWa+Jxg$rbgz>(JDa1sRCSFU(wJXi~?)?5ZzJu8y4H7{D2N`FdtzAfMmWT9kcTBmJ7S zRY-vN{u+51HsSC`_qrFMW-ak4={2<_BmS4HaxD6aak$jyG1~po6rbvt3yyj6_-TfL zvsM1!)yae`_v+p1&qZFFPmv2Tjf%*wvl-hSI@141r_5%gD+)mkHB>?hW=+!M{m(v$ zdlYh#I=K{RB?g#sqCN&8*ijWXQ$Z8dmB{>vqG>7Y|Jq3F;pqb5ecYX75@#XMzYgiC8{QRWneVC;kL za3xlxdfb_UipE)tfL>&_7*rcK4jRz>Bfj#sNN0tc>HS!Cvx$ca!J$M-n=OjoDbn-- z7Vmu?HM_+Sedw+6SFhk+a>@$i#x#+$yjqB%rsU}JVYzLlIWHSCbQ^4&P^#Z{5d<)z zJj)c{^~JBIm+qKE5~~smx%L#>BuL++2|Hr_dqxV;bSh1AD-*g#ooO{qm#nZ@EH**} zzW|YH&^yd6F!ytab`Xe5@<@TezRb%U5~uj5{Q_!K#K+WmNru2KjvT0#$?~u`oZ{o< zHSB+DMmLKJ*)fMh>F^|YRv&c7d@(X9LRq=oS5`#}Fwg{?p4G!NEdgC4zB0vUMc5&U z*HAnUH25Cz=O!NfKw#{-8%7f$7$6Rav9Y-V{6_38cmpLRe-}RwZ<48t1Hs!mw9+&L z=V6UY!xIP>py=nY25g6OK1`tw3ykY3)aZdfpv z&fm4R3K8tBgb%jx4|Fu&@gTwq3^j?wc6r zb)fgIJugYP@qvo03l_3zSdS%J*H%yRWK;97+kYb14~Xx!GZ7Sum|!81u0Hr4#h8DE z?4FYFkrB46I9+w_lKZ?Z8HPr2*_E8w_Cn7-_MEF_KS1FA-I!AIIhiU9yrm7p9A*Y|J1N0yHD|0laR%f5O2SskNZ;gAgjk-ic`N;QK;js6I8f iJ2;_MKL(Fiz`)cgGyb;(1mvV1&@`^EbJ_9IhW`f`UYnf& literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_zoom_camera.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/_zoom_camera.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6f107d8b3c20f01d5a981409d3da1acc7e13b81b GIT binary patch literal 3345 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/_h_u_d.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/_h_u_d.java.i new file mode 100644 index 0000000000000000000000000000000000000000..186121fdf3a5fa672afa4dc44f6f8e4c2697049c GIT binary patch literal 1512 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 L(8Cq5lU(&b53FqJ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/controls/_base_on_screen_control.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/controls/_base_on_screen_control.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6a0c124abd1c0522ec8bf68d09e8ce3727e6c339 GIT binary patch literal 7434 zcmaiYcQ~9u*Y|E%ELPi9f+TwHT@b9kN<@zqMDM*MNQmB|*NrZE4Wb2$C{ZGa8YP5? zkmx;pyCm=PT;Kc0JJ)sp=G=3gojGUD%U=pD0__vgYn*el!UI0-v-19&1dOke*p zeI#hywNbe%eKqlo8sX8=;nA2Ms_9FpSK*!RqZ&4+??*X4D;ZxAIFiZiyJ3_*8~phX zMS92oL|}6-ec^IiO)K>W3!df+Ju2&Sre(l6Z_<6XI80({{QYz_j(d5=ii4^BciG#e zQhD*y+R#w)Q&ZQH&E7itYQIU=w~O-_3r}iCa7oyTf?*Qg6-r-y9n28qv;yj885efdz}XC?({v2 z0qF2BDM)emI}8-^vRkUC9-2*Zm0}C1cw~|$$y+*0RR!~XQQWr~>6PP*R*7I{N_9=- z=a4dIB&6C7|0)qtkmpjYbVxZ&vCZfI^qDsNMN7xH{K$x%NNIKx!k_4eCkwY%Xdt7T zzPPx{G*x3N^k-fidotcLo%A5Xx@V(>aIO&|Z`o1@5@^AN1h+)y$amE!Is z_*)&DqU2f9`=v29vY~XyV9ChOHlrq_J{DFTs$K#utxfHx-!ImD3Er=Nv-k9VsO4o( z#y62|al)F^7zFnU&l zATyEu({hO8C4k_@A9d_3tcP0JV{SOXHQVnE1us(i9T%BXvH zG^rH6J~fuBg!67Kb$Pmhd9Z>!3gVEFG?ZGeNfkB9MDKXc8z&*lG@hqT*DFZ&6mcsK zJn{N5?ptc11dgwrJL-^mNH{NEe`oNb%&i55Zds=S9i4j{L<^f7s`8Q3TChGy{##uo zH{py_MQyJ)8V5`dHSNGa9$(A#_1HkjTX=%w?|hK z%9yd{2r;m>Hc!FFf{w}O+h6hs_`ODiMyh+8vnvvJGLIXCLw3ju5!*Tam4SBTmeY#G z9R2~*0(&1849AZ)cQOmtC;x=OqRosv$3#0hNf&fjVvbmm!vkCSorYSXSr?%jCQxcQ zRlqQJ|A+WTqA;l{$A=rb63ePO^@H1sP7BV2sL6M;zuxyXR;>y8DRuae1PyQs!;xfr zJ$l>SzpA`zE2illB-K*{rX=liua!jlNoml0q}JgUub?P=wP7+={j0K5`K3;X!f;o< zp}B+YGAOrAf3{!m<=1&=yPTp`OGtR^nOyU2Kj2PYItXUPdNiwki%Nh|0c2Lx5amB4 z<`&7|l1_D&{gciNTu)?zWs*C^dZ+(moHw@fFnw9!nChF6k}?kvk!Z4_7ee&+_$_@Z zc(AVcy`z5BLFg8PewtwDxQ2Ub$IuL%WWH=}W3-WzAoBam&ybn@%iidc5z#vjPfB{R zi+(+_R2W`Xv`A}u-9nWT_kQsb2qI^h#Ly{*g3&D(0HBh-k^n#jOpoE>J(P1%)m&?o zPOARd)S0P-FcU+QvDEQ4|7c1)7IMZggEV^2tl#PiFz{i&_w?dLU=x#pj3gpHgT3)LQ^a! zcc;ApBGB*l5LbXH4}f<(hzesR=*N||P0^W@t!D{-e8Z;yJL z2L*q#P5-sdKO_kP07x)ClY+tSR-Rt&&UDu1jviJL5PXaZ4h{x^dg#e*FcMl;L&FWs z$b%Ik z2nj)-@F+x^SyI1vd=oP_Gyfi7;47p9o~zWcWwS4gE^0k{w&=rBI8IOB-)x*bYw%iq z1Y~_v=mIdrd?U?ZGS$eW7}RlenT0cIy5AB)i)`}s!3oncoD^i%78y4Tl6mcBD}xQR z{A8T3>Bwla$^;5gXRxk*SLKoSIlA7C)M?6($UEJzls`(2mp-|*#m&6+<{VDUi4LTS$< z|FNDhZox@vkHwzdoU#(MX;(KCQNGR}_L@ZRXy;Q;u8K6Ja#x>l`kAXg?G|uN#m)(zC zUkgfhsdja-h^o7MloJ2G?@jW-zo34!nOxCR9(&1vL{>^NHwHUhAjs)^`(z!>yG93z z`8B7H&PyEkq{_e5HFLqwq+3ScC(A;lrX*#RM%Q+M`JR>;eVVjwjFth2s8r@^Rk9a@ zcTKT7H;|DLxXk>8Zjo;|yUqb>+Fx5Fcfyt^yW()wq=l6_zZ>j)?+Pa?gXZZn#m-}xcBO4ju5UIluF#4 zOaWWE8b4?4>xOS35|@JBp_&ZWe4?hmx0@Z`z(x$?2q z94cJ?;Pq=;6?|^>_FFl7GF&QZWE4WmQ#F1{sCS{3)qU*2{Wbl5;;rgwRu3V?(LFXM?$0y6iuXlVWE=mI zDShT8WGYDtLSE}!;}w-n_X2te%l(?g#Kofr1yvITh46!uwD+{+c2$!EjR&>%5c^}= zs+tG+LY7e@`}_L?Ld3KKmkYCl9E1OfDvID&Bf3L++MpX-V;O zHCT;T71IB4h*O1o*YiP*?)E-`$Nr9IB=PpqK7kt~>d3Pe=V!_4>J7l0uizHOByb)E zfzJSd+jlS$TDCv~2;&SM8`W6^rn*x3K0bmA`;4khKO8-RMJHWLFx& z;Oz%OvDg|;r83;pETOB9YC*Dyvc!)N4lwcb5WB9rL>Qr-xvkhV9kM`T56wk!h%&xq ziysX&cN=&m)o!pqcAVp@zthtQvoUU>zpawTc+)$ScAroFcEKFqkpp?JUN-o5z13j) zyYKP+-`9TxceJS4LN5nw4fQH5o`YPs3IJP-wi#mgj*Z!2>%nTCv`u(pgXLHmc%ruh zK>WrL?NIut`~(Q2aJh;Lxk_vtORNqKlh8+~V4)W>}fx9+7umd4Idix7Cb2bHYSTmPH+`aIJ$w7YZ^+FPK=yu)r#9pv_#-yg6sU;5o2Yn;Iy&&ckG`AnXWJ)m#o zF(D!2bX40^j(8Oc@y4OJ09*ilZCWFttO+us%Di6Z3ug;HzXN>qLq_qVHiaEd;2dOZ zs{C1aGeTUy#Oez!H5V+A)K2duyD4Zbn($-XkL;@J-WZiiwFMke_)j5bhNQ6sfm~U# zw!64+Z3nhVqu`uR}uPaQ=mv2r6)F*Z^dU59Bu)~Bu?Bj-P--@`1 z)EyIU#Y1EAWAC*=s!tA%`QaHZ zD^CtWqEGFrN8Vwb;eW#ErDs*i;?mUduJ!o(Q!n_j4(l2ICZi?KV`EB0fgbmH5JyXXAxjS7IQ!e)qA}_)#8if-8+u+qVpK7^*rZvsWAJ zVqyJOEB22g3j?e-$3wRF;wK2F8R;5AQA&pzG3mNSJA2R=3p9yhrDNgmISdM|0b;^4kCe<_FsemCoA4xtpgBnjfhabPfrnXW$qWSNtdotgog1 z;cl{_8^t7k1j;+1ApB98eF0fa)Qdirm~Rj+v`rv465Br&m@s4yd&%_uQ`m$pNZ=`_$^?zlqyl00em zRkrM&{n~DOaY6H&Bsq0mUu*P}8=Qw(L7S@Vf+OPQ$dOP%fwYY!k@>_txgEkfQw#QL z3H#0SR`0J;YG=%}n(zlksOG8GdrAuimzPcO^)4E|Khi%98D>B4qzt5)x%xO+ffx z7e5X?f`?hOg#!yL8(W#I7FbNRMdCh{K_n>oZ@KIKYEhnlV?_^D!Hu$iUc&38rdbtPg3*rtr(qJ>(v$a{om(TFog~8p4-*p}R_G^ZWm^Isxn%Wyt*0 zlQx|wt~A2jM&^R*=iC-+0?y`{caHI%{gPe`7z1wR$nsLnq|M?|+|$uYn4GTUE&M?C zA+<8;C~EkzztEIYIADNjLn_c;eHq;EM8~fSxi^}R7a_FQgOV8N6&V|s^!7MTGM?fN zFru2Ud&d^vUNA=#$typPD+>JliZ|J4%W}6uNz4yR>=khH7L$sdiui-O)dtv}QBL8U z{G>FtC$wC;s?rDCKUi)N$Feti*1-eoGSxG!mUoGjVtNcrQ%J3;=q@Q`+OhbQjBeg$ zI&Nsh1AM>pAjgflFDum5mjB74;5Ot8W=BXwuJ$Dry^|lWcL=zQ?g=qFNedb;i%k&| zp-#?r{?sclv4rpccek%KeUZYk>iAuJu#iQO%4RtcI6)DmtChlNfK;c0U_FXTHE}HT zXqPU#|6;w9%lbH-9^oTzrzFoMzp2h9br;HT?lem4W?szgzs6TOE4g&}zNQf0?Z%g| zFt~zrz9zv_ldn*tIoGEj-47B6{P(l}GTtW8`j90`!kqc*%Jbd4u4tO~kRpNJ1Q1sW@ zf0{2cKof=biZIsn3l5fao)Tz=xSwb4f$S*w$)@$|P@YPs@L*{dD?%M)IEm@P$|^G; ziC=~fLlltKIB1~}pAkc7Wz5(a0 zFGZB(%*;Cxf4<9APOa7Ze%$0oH}OB2h5cIF`*jd0QU7k~XG}v45g0O#)q|8;?!RQ* z@d7;;BAi#4F1#s#z^zPm+s9^;@VolpBn`kg0IWnie0J>$@Ef`(!Z6l23l6XlK>YI*xi8_j2B&dhp z+r`1o(dpsuvhoxoJio35k9DK{Ol?K?kXQ2V1N6ZP71oD2E|)ifo99@*GdRzAqAQK@ z!u>fKG|$)Nb3haid}6&POWM_F?d$zbNsqOvfo)HK+nEbSG4FrK4?Opg4<^>|9mLm? zxc$<L&nZT4AF*(?ya^lg(U{q5`uCggTU~>V`mZK>c#`V-4 zI^OotVejjE8(?#~{&Azs*6l}4*mP5uOXH`qr)Qi21yAAO_V2pbIha0-wn`k}E85GU1=theU_VJYj0Is5YVob0j z9QfY62xVbDxJBhNW{10Od#3m9TIU~LB@{6F?TTlKjM1m$(Z4tJ+-RmnH#DE$`OD8Y zFn68=Gk5E+eDzEhOD(-scGJ9g*q4HWyZ_(+7w81@aJaK`@B=!*pawFMA894#{7f>) zFf2?m1QWCLWG-SD77jN$LLbEbGhK#$*@B#Z%2Oo{{m zoX~dcUrB%)t>~Tw?6eKJ9e;Mo75^Q&Erxp&5 zsbX#~kH$#-P+JczsH6gJX#Kz~(nHZ&BPzHOuA*pNYx=}KlEzq54q9@j5SJwv9fTVR zK+X}bk&m40A3nMvxHOoxN_|WN$&}dv5Pi5B#w1t-1~Gj3KhAWZ2cQ^dRwcC_WF6I3 z9WHHwG+x@3)#oUgVYL4>U*xO5RO0mm6@+~9gFajwQN|E1qoJWnGc`KO0-ICehO;@? zS#kGESO|-Ni@vujY@SRr(C~S>`3@BxkaL z;Bt*(LT8!s{vHW4`%s56vb8jxE1bP**|B~tF*m)(cvpl(hEc`C@~#ob`ooM;W}o5tM`JF5Iudz`U{<$i zP1%WYS-;OG_E`zo+(>=5%QAwq_UilFU*%9RBRKy;44-aO$T$`B;zD!LbGG^pYS<5P zo8;cwP;%L5+vo!S>`X$<^e5Li`6mC(=_#AMcwaS1J7fE&D>foDZ>wEmFN=3JL7xxi zK)OTciuZRMQmgHAZvTAHkdD>LH%p;taHP44t>mrYK;)yqvG1FDSrh58%`$;oroIk$N8UQm$@AX0&n17v%NoTcpB1{n zpkPv{=)|Y1W8IfHF3JT0C;u`59BtM80VR@rw8n&*!r?05O8<2^JJBOB%n^|jK6W?u zNaRej60(lZ9?q&o@y}gp|Anh6^dXuc_OgP4=);l(x!;sD^@uYHvMTV_7BcaRV+~ER z4fJzO4*u6E{anAc%AnD3by9@^CEpmxFtbtAUCo(}Hsdc3VqpfzF=oVmQ%X7B|5n7; zEYQ^CFSTpdBKp7ns5U$6>+D3Ki{bvkhnktmNf{MOXg=D=p+p)dXJ&rCrl^91D;|hX zP0BII*Cfd+c;59gWakysLpz#`9G^}|O^B%>zp$Q7m`zwpP@0$x%ui-X5Jeccy5M)B zVvr&?kEx?Kk`1+pJUwh>5f&=;{Axk0nUDMhqE)r_w4!17uFAF?I(zOwfYF|1&;J9L CN0rL} literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/controls/_digital_on_screen_control.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/camera/hud/controls/_digital_on_screen_control.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c0645414263eb4c6d3f2384a1c156b498929b15e GIT binary patch literal 1648 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/physics/_physics_handler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/physics/_physics_handler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a8e39be01c0baa3ac215cd2caa0a44c7711260d1 GIT binary patch literal 1116 zcmV-i1f%-^0RRC20000000UkC01@5*0000000PSY|NsC0|Ns9RFd`C~sH)?4er|W< ztzqp&4r15<00000000000001ZoXuBJPunmMex_3Y!|i1%g{1{HO`<}gLu}(=8yea~ z9!=u5)>7NDoodzKzt4@GCQh8RplBKoq&k21`M&enK64cPLURmE%mYN@7_T-TOy`8+ zztC z7{Vn=)q)B5N+OmZ37-U7CL~&zK}l$Y;pFW6-P!s0J-mU_x53G2a5_F2ZvdlykEahB z4w3eiaBD=_paB0?n8p$sf`&i+-oa=D7cc)a1Xqkog{YDp@O2c@M}m{Mqjjb%#bX@W!!Es&j6fk-38L|2J7we42*!0sa8=6jfx@qtXa9?NZ;3_W$G>=RZ> zZJOO17Nbnk}P4rPrP} zv6^a`W3{b1Z&2IO-2`DPLD;CP2*4;a#C&UZl$G}gZw{`?9s0RLFLzkx-W|7}dUw>5 z9W%dh;`?KGhSqu>pO=hn6*xzsw-Ox0enkF~auAJKaszTw;tV-ysUGOOJ!s!tVe?#J z<6L2NuKjei$f{Jqeqs0}|BHC{4{6_s`~jgHfxFM$(ca0cBHQ+rd!73?go|ljiVByj z(j9bl)_RI6yxYt83)cOzZfa*tjAnu@;cj#DUv2u|(GAtt^9)6}qXy*i+X@RoV(c_i zS;`nSz4XAQ=nh9r_uAJ9;u6Ql;O|n%Y~b9&)_gD;!j$u54T*j(AW@W}E`T8G^EIfv zB&f0t8jjIsr_k#Z8Ydm5JHad6DZ=Apg<)gO71ZtyUB@oRu$rWa&oQhzhE0y9q)NF% zrtDy4sr-qnm22ZZF?p!q9nE%e1HFH~Gi8pk+%_-S4&kUaaZS}>gDhJTt*Ta~E8EkY z`N3fgTr7V4k@@#j-=?KwO<*0>p!NC~ zw_F+JvD*8~(+W9U-j`PQ$Ke0-;=Z9&zmfDC4W^XQ^^&C$vQxQ}!&oQoFF}cQqyPW_ z00UkC00000egFUw@Bjb+00002%K!iX0RR90|ND4cytI~1%2W^ngKU8HSKACtWdHyG z00000000000C=2ZU|>Gaz`*>Afq}u0v!FC7Co@?gAfvK4Gr8C!F)t-2wMZi^GcPem z!P7ObB(tPap#VZ_Dpd1wF);AN0PzB#<^axuqWqH7 z-!>3fCZBwweuuv@=aHgWYG+ReMIE}v`i+VEH)B_c-Es{I zy&F~T-(CFN@BGU{$y%0KXT%OXJ7_WE%>@4!6-BkS`xaSnrC-jpm>YPkz;0gOvpIor zE;n)MJLuTH?`d-er(?C|Ey)7RUcltcBCuA zNTS46;()I2TgS{F8Z)|9G*xbyiY#IO|4(7aR_$Gy*DUrSYSEXlgd?{fTrSLC z&rRf$gV zD*CLpsMGPD{;dtdT%L>5MVFmtN#j5CqxZ=)-z5{iJ=qzyGJ5SSkNX|(BUW74seSkK z+@mv{B_HTbTl%|pbJKy|!-+@NTt4vT;x`xj{R-L}j{muQBeErA`m*Eur@1UH47keX zKk1k3Qdh+-rOI=jPSQxu{<+`dJlfC4Ur%GwG z-0!+4dw%|%dM$rYk^v<%AeaP9Y;j-~1LJlO4N7kUZB=&`CCu1i-#k}wvTUNt#WRQ7 zA!;CG#hl~>hGsR6qg!S-HqK-{@!|2)M>-m(bi8#uLp@HP@jeq+prhrr=F3SPy^Wk& zXHR?kobucne4^E`TQo=XQ_$&+nwKtYdG<6ZA>rqV0|!=dnB45yyud_L-8gcgj=iy~ zqP_kW1=fsCwj-0a%=vRfsI}?Al_!7pOi8*v=Sb6|DR zgvg@@4m>y$88BpC0sP*5rtQIkOh63^;olXp9)+k-rX)V+y3hC&b4Hh0K~heZ~}K UW1(ZA8Vwr{JY!^-8*Y3T0Jm||TmS$7 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/timer/_i_timer_callback.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/timer/_i_timer_callback.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a551fef9b2f2cee99bbefdf14e2647ce13b3fc02 GIT binary patch literal 346 zcmZQzWME_f14bzZ2Bvl>+u}bI2>-}YvH2h}w<@W7#~SXHKRvX+i$c^u$ci~@C;ECH zF%W3Gxw!FPyJgnFCBARBMGLYV>~DT_(B8mz`Rxod-OTM9I{x3?66>;lljWHwkLR|Z zwANmB>)nG4odqgWDy5R=q@PUdHJa>MyL6I`-o$H_)ACYcRc9%(Y!tRH4--)m_pR4Z(Rq(}I{AoYj|MJ8` ztp4atLzy+xy0H|Hh&+&E4x-EI@U2; jT{?c_`;}JfpYK1v&rYwo<=yv}hy1^2C)_`GZi^xSj_jf4 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/timer/_timer_handler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/handler/timer/_timer_handler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e96cdcbbb9d38afb016f55b8cf9e648d06dd217d GIT binary patch literal 1895 zcmY*ac{r5q9)4$rv8Bc~)(~csFnlCOm^q>-OBrLU(J`NtC1fiS2{937ETgf;G{p7g zLg7H5?b8ikcj()$X*xE9~?BkrV_DClKzstE;JfWK1*87!w^?)VG{K=yQ{; zk#LJ9`o%^oiD5Hqt2H}_y6E&qv{|8+>Z;-7xsD^3r+kbsMBI@U`bXvzm03?`S#>cU#+0VG+}98WsOeg;0>1ZIQUmyM03VtxuCCBh*Pa7 zhDWtOCGfY2W%J$?uh(^6L6a2m1~SG%3GN^h+}-ZVf^mvJBy$2|AlO(kaW}`I?(|r?e#E~DdWEA6LhVh7Vc*yx8EPxa66OUxP}ir zP8z;Ea=X>f|H97e-ICXFV)%$X>{Pcmk$WF za)rr+qei93en0Cu;YK>f&6#K7Q7$WBUR%Z1ibx!_J~COiaa&^N?sDsvY{w=q|74_i zMb=gszNj0IF7mH&mXD2aBkn>^xvhq#%DLz^IY*_wZk#zyj0RFx)MUgg9X$ za*VWCorP2#K^-29@EstU;p^iw%3-s^QxXzz8FeM-I=xyQ!U>F(70LwbbYiHsUdIaE zVAk;Wf;>t>LWA-{Wq1gjhMXlM+ZFua?SxzYx~}VCp<(cfTpD~9LnD*ni>3MP9^Kud zI;BY3>mE-Eq zKS8q`5T;Of7?s*M!{#@|n@LrYtA-Y$2A#7{`;%XTu;Vj(aT8Hde$`PQ+?P|arhn4k z(?evLUE*S2Ak02qH}|tytEKtZdqwE1StF)?$EMT5=-#CE1nT(qioYbcTH+jw=c8W_ zxlzJJG>Y7@mbSTz37_fp&wuXVgLPw(N{yNn%-#BmJm?Pd(z)#_<~@%TFyuvCRi2CT zYjFizLt`aKLRpJjqkj{fuZ1T{wN}F{%r1- z?~xr7ACCs?^6GvJM;Y3$N*`$ci_o6{ASU>!39r8xzpaP~uJmCu5DgOQ{`XXe`7@$| zwWq!PHAwr9%{@uH9f}BZi1LY+C{!PUFqaGDgKYY6J)CKz>;muXg0jq9dS3qXN#$(% bGtU`DK9x$#XVhd;+8X9&!N9Qs+2Q{H;*0#^{h7eO=92I4R%jNnz<+#dbRVAJ&3I;$(kycF*=*YXe*%y$CpFnhS!N_&$mEW z=cl-UFd-#Y?lKWnfHS>?D z1vGjsa7?>jfeUg$x~MiW8eb@LoFPfo!IlxF{xYfSj`*}9dC_9?)7GA;ni7D7xybj=@b5~?@xdQu~BY%VV8zKf8}v{%-%k?L$-JExC`anv9$A^maM z^ViiIZ_6vA#k+Dt`ufhqEBG`N-0^}{+QV-)4{;>d8GlD|==YNlGh zId|N(+XPY*p+3gnvUfmG2RV{$z@ls4{4uB0J1`V_#j}zThxEJdhNlvVvZAdi6ci%rzX%7L5aog=10m?s&2Pi^#!Rs zrgjt~*A%7#VkqlB6-#w-7sB^AHC!8(z)=O~n`Q>IDZftl0KgbzaL@~_3$`P)bD3|- zl8fx3I0axEW$-^5I)#}7}AAH|YDAbT1+8Y~z!`6!y zAS_A9Q;4x(R@-r+6Bk#8v0e#_G7NB);HQFdpr7f{xM?Ls(LDgb&=>-ipv2!}=^;I7 z@J5(fOJUpBM)P9)-XF~$g4F>4tbz6bg>!(fpcD`xd;q{@26{B>ryVF5&EsJYvO>gg z$>dRO1GvPsv`pGIr z+lE!VuX&#C-L=~CF=z7byu5V*lclw+tRLy--V}C#xHbI66vB-+=m|^-o!&VcHh!}% zo{v&7M`W*8dhX}e5`D@9n;H1>OL(t|aNiq+*7Z$GurbW+AVTB;fLj;zXhxjkX?ukPVT&oECE-8w!IWTt7 z$yt1Axar1XBg>Ul+`Q?q@Ukc`VV<+` z5Xb!2$X?P+xXkFN2J{^g*p>#S%yGN=0|m|_2tG@syjrIXrLA)l(K#l8LP_BT8wfW| zJKvR%7n2*Z9*67Qy*c|3cgFK^&?sfBLeMo66JR@RwkA;fu&?(rDtpIKSgBCgO#MrN zI{HPdQ`PIiNk{9KXSmzmMc!B36RzvrE`VP-RJuOICD&Q_RQ>sDzX{;C4B)u3f5X>Z zY(t77U_eCX-f=voY}U|18phtx0e1d^a}QnC@Tb~Fj~B`wHip&ogul8kpLF}F&5wG4 zc%hBx@%pll%bdLF!D(RASk&pQ^QCp0#AqT!ipI=fw-schdqkU|uX!pyp;Yg&I1A&x zZZk9t1Q*i9+Z}LYHL=9X564xKT6*))iESieuW(}d7_neXBAZ0ab4_$|&uY}idTX|{ zCDp1a2r@BU7GzfW84H&~4h~otD@kd$GaD7@t67U&w(&Oevcc<{8RMEoTeS65G=0K5 z0lg5#c`zeO6^KwtTCLwek2WQGG++U1ZC3VN5!28LziR00_u(!=YT#?1KdAW6!b)n; z-B(8S_@C68_WCn1F@04Mw;>>8YGpa?Vohs|%%oV82Cs^KCT#C4v~tS2&RNAm7P(h; zAr>i_sWHi^p*k|d+EeGC<}zio+5gN&u03-5`#ZjQI25B*Dt4{;Hy+Vvmjj8Ba_8On zE}1HxqZM6ZlFMxiXfE#@-o4YjT2#EABbgyno-g~4p+uQXF5B#8@db|9RTg>X$uHYc zP$h_F{FdP@F29ip-DIa{KI#iSq7qFN8CGOu;ax@KrYf_jm{gC&%bhltwV$j$4h@KG z2u_F^H2y8R(C0wYBWLEKfP#b~x$!Z@>SNT;WOvmwI+3bJbi*SqY%RPndC{fbOqjqA z{?lw1CAp;kti>`^vR-H)dQ#JI-t43v?#2MQ9{2u=NI_+x$MPj!1EBzq*~q9%FRyhg zF8*kYB9>+Bga&-?Y3oIW_McA9Ad$+$upAojfmY6n-`}c{p|g{n7oK{|=-Vf%KjS6* z>OMTxnYo~IDt9mePcY!a}ll7N1?go2QNB<;SOg} z1P+Oaw|Hwls@!w3bPj~jUgt(3$#-}*R-JJ|zq;9f?EEeGF^VrA^qRFP`F+!=cNSF| zy_u>UR;9+5uy4-KK;WuGgyNQj-rEDVRUxJpA`dVJjcRl;y>nys-A$f9lagkCc?5_4}d(NF)KJ@!y<*FxSR2+KL z6tqS5JF@ zyZV2NnzK8yz_lNjN7^OQHkBVw-_$fH9O;9VXJzfk!g`SB~Y4RB9#WWsqF8`O{-@LF1c28$l2t3!_5cQ?^`sW?5Rb35*(`i8N*dtM!08 zoY1Kn|LnZgwmU2^BX&kqCy1f>4|&{Z_abOd!tCr8=PV6v4bE8`{Ur|PU}v|sLZMOT z%+O~U|G;dW^gBW{eLUkfbcn|6V4fkaG)l2%g2>~~{rUmMgm%+Gsv|@5AJX%Hxw-#0 z&!5Pnbk!~`G8;n=1-}M3z{pDy9T_LN23iVYlWft$ZoNN44uvr^3=Au|n$v?|QsPa5 zZMg{i;%36Gh>kom@~k+-sXuX*GDqm08DkC2S2W{9T|as6Nvs0dAZ*>&G}40U;9}0s z;yx581J+?1CD#*wX>Tp9CC8cI%vKYM>e~9Bboebdz|GzWRCAr!Pg0i+F*k0X*1+a? zRRtzLpf^4)Kao?xBt~+P;$8*iiAC0}px|=t-8hrP*X-uw8U$@YFbdHko z$Q84yS=s*la}u}Vke1}wy-QVEJi)~udpY>D-@E^MZ|0kE4ePlUfUNC)L9Mp^rB?By o=XfChH@EeRVX@x~H`_-l)BOi#OqxfH$v*kpI1`~Uy| literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_fixed_f_p_s_engine_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_fixed_f_p_s_engine_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..de12e55e431239a649ebaac2c87fb4010125f4c6 GIT binary patch literal 635 zcmZQzWME_f1IGId4D9hx_O|~}5cZ)Yw|>*SH48N5SH0^0EHm|Khap4_gshlzHZ(B% zwt+xh-@*S6=Xpt4-PTMl;ccCIMXzzKVd?jnke`z}ZcUo-#d%-!@`YhMw2e<2cTwilxKVyln;8jp0gAxW1$N-Z^ESSZ>xE(};Qpn94 uVlN)rOjUe7FXOa$^WU>=X4kqPYG5SOWCjMNX+RzmFBby?s}>OJLU;f`KpJ}h literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_fixed_step_engine_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_fixed_step_engine_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2ccfa1ba5d0546871dbbded71120f0e702bb2876 GIT binary patch literal 895 zcmZQzWME_f1IC984D5+e_Ll!pFz?RR^(oQ&Cp_ZN=(6VXcw47l(QI7HS^C{3KfL1ziZ|DZKL0RRJe3gr!RqReq{Fdpu=k)Y)WIxGs%v*ugen)01LNHYdHMrOSklWC^4!+;M*UQM3KppPoMZ_Um`) zzFoh*J(bgYnEZ@es^zp-LTsCY(aRYbA5ZA;$*hVp;`UwMcXN^61aGawir=+fOp9K5 zn5%Hl@@2Lw*)_9MShB8O+xk#yq96Od*81BSjaNK1V=pwmHvRUXtD)+3CGXqyDl6{I z>+4#5?5OQWT|2|IPPVd&Hf>K%bRJez@7C+R%RPC|#Pg-|tprLw3He-+-XdnYr}>b+ z)7Mn}ocPVMw+x$K2AK73yUKDrqh0l<=v{`A%PS{Yt=*Ed-~~%`8MAKeB&bhFkVSA16Ay71fk_Hd}+3e9^76aop5DiKr z={^SK$5ke%yuECGQg+(snDYsulObv#WW}7+eqXLb4m@tn_T5}^jvO5e6e<{|FM8m$ z@ljpWVxFFv26MX}IqvDTexJHLYQruLMR|Qr{so2X88!?F0-cxBpK|ign(BB~&VQr& z$!kxNyma3$zsu)P%zojODEE1fPe)#ei2ri>?QrhrikV@Lwm!}IVK+G<+r#jblDV3< ztYE*r{G*~MOW!x4HynRcxIN3OLnx)-bH`ZM6H6=i@2WNJsxirbY1eHF2`1N z*Ie#}b*dsalz&>;>UY)oE^{M2~h(hnWg|um=5GI@p3URuxbFYHiQQNNVj|K literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_render_hints.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_render_hints.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1715534dcf89593ce57f937334d164c0af5f2ee4 GIT binary patch literal 411 zcmZQzWME_f1IB0u1~y(OTlGH_JT7!H^eK~)i+#1L!FT%`xA5m-)(|xivSQBJkc(c2 z4Mb}57XB}o@4~+Au1HI7qgClUM^^TI%U`|~%gsOKYo+#R|Lij9cV`tVBjP4acyecQ zG2eEvPtH05Ci+Q^m3^zroT4-iRan2grRAF@(i%A9OI09;?GCZt*sQj6)ly9!pU9A< zlTM#q7^ounOZ@N_`#nAnWiC0+i96c7W&SqtNg8WrpNVCEc~7dsHGGo1Xe4udpo9u% z&wqO}2I1p3xY}PZo)=!q-kSQZ)BkLis*cmL($1y@yMoO2x`+pDACe?7F6OnDfl;R`rACjd%OA{%wD(d8QFmX2DjQcZ*713uX_IRbLFXg40ku)V7BQvlOHO-&1T_iiJgs3#X%d^CEUAm xV)8a-72_f|QKv_OM>9@;ui!Y_5wj+?x=s4hm&ljL9MtEFU!8N&eqZ41tpJ7Uwle?# literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_render_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_render_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4839ab34fbb462b97c7c3491319f5d59dfd92fff GIT binary patch literal 765 zcmZQzWME_f1I7gm3~X&sw!?oY5C~n6<V|%C}cKbkraBJoVb8wJ1YR`t-by z6=_?o<-(t?UUrowV}{Ge1c{?IlI{{0HI#im8uV;7QIzX<=Tu$%(I8hq*kG3N(&s#> z(=M*kQ+e(r6fGVawQxxy|C6#WTPIv&@!#Q;e_VT_{o^?Y4mOL))f{XtjXb=3-}CA< z_rKe|IBXbJw$S7b=Q=Kvf~AF#9Q!iNdne3Mkn%f}A=F;L@KAwca)N+cVr|3ExX7jN zEDG99FTC27zrNA@{%b=v_y7N+nvC7kF7DmRysu9smP>0>-a@e*wjn)duq zLezz$-Kv>$CigGV-8(0&^4%Wa`5n>B?h}#|Gj84NmYQ68bnT_+C!a+ly`{<$ul*@W zskpsq|7_FWx4-QDyKHH7nWE2zM6Yv~td_+2PhPvFMJjsz{d%pRK5;X6J?umODBSTl z^L=eBOR;xeRtj6u(#UmJh0;Pjf32Cv^u}%1ilQf5Tzj`%+ilyFx1^-^t((al57qeT ztBfw(xZatq_kur6=5QA%mOwEJ1a}!2*q4G?3{1Kp8WhD5OZSIAQ~g|d_mFbM0{*#j zlCJF{5H%38V$R%vjai2cL_$2oW>=iz-(&bq;O*8$3ss62I+vZST&A@uXNfw;6rH~l z|3&U!+I454^FlTLKJ_DaUzYSd?YtaS=a(RVRAQ^Ctj%KU#r0ArdGr{pmg>ssx9BbD z7OpyUI{D3Smy7Ff1m3vzA#SSc!-Qa^R?CdSuhE7ylcPSrdqp1hhj zx%+Eu-IK@qyZ76hn9nLa)g;H(ed?fv^QU0vbHB}+`F}@ld%JdesBPm`*8EvtcuW)) miA2e52)}r#`9TzyoN7m&#o{w(x#pdpd2aP5>1CIev;Y7;?^%Wb literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_split_screen_engine_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_split_screen_engine_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2cd8d3f06fc66629e3a224061f04053cb38bc753 GIT binary patch literal 2129 zcmXw22{@E%8~(;J%;Jn?q+{QTEMbreF^Mu`lre;G#BZq_vX4Pb)HJ|Vas2A{&rJUNy58r$ulKs&_kF(mdOiRIfB-%O9035T@k;~Nd;1vf z+&;HD5CIDz{fJ`oFMoc|1-(ieBOki4~by{PnnfkqPk1A#6jCp~V-^92W-`mRuUNzc?_x@}O+#>;4f=D9=YG6<>%b>D_<_FpcR43e=^yKTbs ztxTpoNxzgICaCsF4#8&~~xEt4{Js=F}22xVK(q(J;lQM=8I z*k0XFJ!>VQ*-0)x{2Vj8dI^T=_2;`u_wl;Z&L5%NP{4 zdj-^n+U6D!Z1LCEtaN;jU{u!l;}n^iUX6%HEqgQ92(tMx*SaRJwp&+5XLQKX&8DDO z-=o+<<4hVn9(q><9Mq(9G=l+=?+DS0D=0_M!b6ja{0F% z<+f15R{-G5We~3gmbXbkXLzZBuHLF^%+?ii`yZ3R`yM{=TJU<_)!7+IC6mdw^3us< z4@8>STq|C=Dq$lMw01)|E4e;54+a!n5zgWr5$NI{oaVl^$yWf-%iHF?wse{;i-rtD z`^qyiqlv8mxhElD-@_+j!GZ%8`cfa6p?Nx)l%gZuO4gPTMiVMT^pCxfOw&_Qy3m^R zlv7}n-c1Pk(zoy+f7=hGQo=k`5}{gRfNA(>dvC-JJ6AUi%nHHCHKX>L4Q*|fhrik% zfxzhxNk^8gjy*c$bW}GJ2>;e@^<8drba32@x)~KfySaSp@005}cP2q_SjtP6i@!x^ zCAzC*F}0Qi65iWIe~u&Bo7#G}fk)C6IY*XKEkjb?^|KnJZnsJfucV;#;xG95wv(T1 zfCU0VACamK%DCiQR$Gbsj%c4s>0p9%&xvXBK2Y!xuYwQ&0PEx_F6OvPke5w4D|F=x z0X?nQgVzm4(#MgJENQ-Dzi_j`V=+Po;<^^1=CcZQ1>_g7G#ED>g<6mF{1SN>ih38J zIe)n|`6=hX2Uf!}ys$Rpiw=@vJr+aVex?OnVgT>;fCsBotfLiXbnrq2_3US#hZ3K< ztn1`cqPm9D=#Ah*uqa9fq^O}bptvbu9&)0u)TTL@F1)=7O*E$4dQ9o;YEEDELz`2= zHc>DNqE^hgSeEMR;f;MFlXg=6FfLO4VWfzYG{wq7M|R0@%BO5|D4Hp1vzv)&eOhC( zdQwV+Hj=Vc5PT}0wAF~K*e%{bp8MJ7)_&$WD*D4teFx~HhIFC~k^;j9K{E$JjF9IsOk~0nM==)1{BhY%xf_k?>sSl0MeIxKilOTQ=ORGnE8jssgI zDw~XVtNuCGnG@*kMA@iX9VPyXGyYUhjQN&Zx8f);JNgrRq`S=O2Rz2m5sU%~)WsK9=&TnIm{5U%&iQ zPS!D$#Y;_ihM!#ncX+|SQUo!0+q|?VlSZJc4P#px?^n<0KqJ;nRt;AXmUTks zs(@KGI}ZbOK6uDO#qErngD!-@w#DVThUYI*Oa3#t!ub}Pp1f7rxnnDNG4LlSegGnW1bh|`ux literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_touch_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_touch_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e9cb8f77d82a65292fc7b618966733ccbc51e29c GIT binary patch literal 466 zcmZQzWME_f1I9@V3~Ub|Y$omhP;ioMQd#&1BZJxq^1OFuMw8c#~%y_+yUSb#BQ*$8AI8*HM%?;v?N9xOGZ|mB&C_`@6^w>!= zE!ES{pSc!e^GUMl(&mofd5Sh{LO@&8ZzuAKOs zn7v0@bE|OJOWB~}rfZAZY7Ly6<*B;6(#JK2cx%7!?hUt=T6>vg+Y~jU4D-i( zN^X2zezEeen9}rT^%AV>&-g3c7FPZE>aOcow*y@c&3j%NO5}P<)+PQqxN4@Hti7Vp zbhXH;M%MDFvMM^>!q0*{T22|pzL>fp?Y7J2{{NAmr#uS}%FXREoi3(R(OSpxjE!q) zn8v_57@W> literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_wake_lock_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/_wake_lock_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2fdad6fd556e6d0ffc926da6111070d5cf188b35 GIT binary patch literal 776 zcmZQzWME_f1IB&^2DUX&w!?oYXxZ`e(aqx@#IjeJSk}y6>oY0ZBLboZLRQQ1;J zfA6`k|Ex&~&PptLO6?mAj^yrB=++x8?u;DZIN3)lN(?x!||`#om6mtIqaw zYSMSU;Mslp;uZO8dZm}{%rD(N`RV1H3-y)O=j^!V>Q&42_+NYRx4G$&OpnBq?Cqk4 z&n9qs+IAIYc=&6*n5NMpnySKfNw?-BByBeO3+J8j9LYav#w z!dp%^q^uPcn1<7Gedf-%3sCMn6{bE)cE|K-I~d{H2;bAPcy%qK$i(Y1%+nQjcer7 zZPrh%h|7L_>FZ&IhO1G^S^{hyjGF_l1TkG-RI`n%SJI)!+Rx|tft$Zv&A!{8(#*?R zc=5o5{(0*jYj}%2u8{a7xM$J27Q?0x@um%zzvW+gdH1h#zGw6m<7E+@RRzCisNB51 z``^yhb6@Qc^<{7Le92)M(KM-{>ygLFV;6hBJp1&n=v#Elbuq1N*$O*XXr1|g_Hcaf wWsObR9jLC;sJy-Rxws-u!&Y| zdo<2XVlA;V`=%Wl{QGX)Y74a5!<2{S!LjU=Oxd*a+LTH@oJC<2s;V}YfIqTErSU@HGQMkvYZR`rIIB^5U@{y=Aq?TI zXs9q2Zj>~oaByWs#caiD(Bi=-C=8MW&j0^e5lq+`5?rGPzMdq#S6HSyq{mxi z8%f6Qkg6*rLJO~8<|n%&>>4>Bse{beB(tW1SyQ8(wD&xjYL=P_i9H!vTSF)bQ{YQX zoT~+=7^tvj`AOdx>ZJJc>&0aL@!KF%T9lwPLH$LgRCFM(p|kk`RbF%n4t(Z&_}0Pc{fD$6s=w8J_Du(th8dz*^q-- z(uM-I)rtQT{ZtLtUMs805a!~{%;oXRnsg~UU`ujz$ZA35lgFm~t3LkPQ9-oBQ)zMJ*$rK%8p?$(r(?nfm~KAkIjB69Oyt?o@5d=>lz zCi`7$IAU}&YOQYG75|xPK9(zH-V5?8KD(I1rdGFfkGp(@g))w=x*E$m|>Ttp`=fZN1%jVPf zpI#Im`r+yS<8lwegeGj+bCEI5eabPh*jlHWs7{O7E;UYT)Mf}7?P)%K%|bRQC{}xw zvQEcp)?ns-ONIOI{#BZObt+xRTc+~l>vvP5+fqmCG*=vMVm-V$= z!ELQ&pH6oFx2aR_`yD!WB>hp=YxP$=^_N^a>X%5GmTo!7K4-%wrTL%DQv;9X6y8ng z+5J>Vzxa=%;v?}>)BZVpJ;M8PT5p`y=buyO>e}q@kdvurd|$sz6Xap0X0W$A7#P^C zApyXY1f&^3K~=;u!BJ(d(~BIT>&xHF(AAH2QcHoTfshq*k`oes95`?wGa>ve?Fc5W0{)Rbg`vu;!D(ayIEMZ|8U6?X-Qu;B}KvW bg@#DQlC)*%3fkAUJbU`+DHDVG1Unx9o~gEf literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_fixed_resolution_policy.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_fixed_resolution_policy.java.i new file mode 100644 index 0000000000000000000000000000000000000000..723d2525d2a0c2235635d1ae3a76215aff78b05d GIT binary patch literal 930 zcmZQzWME_f1IBv{4D7lPHiPSbD0pzlOR{0vzUJA}ChYf%x>@pO(yv`mHDIb@&e>4k z{M!aRw#OU(Gy6MBmu#9mFHG5?ea%azoY;$eHzGGn&Yq#mIpxh6iEsCp-*9`ZV9RTF zMZDIg>yh&O4CTx5M(!8paIf6NGy8CZmU?TF#FoM(Q$>5irhiS$EAh;n-Qp+_kZNN6 zp*cS*1L9y=HPrv%g9IlS26Zp6_;#l{O1cBDZ zmGxD{9)BabrGNF_yv%*_c%RCT7hY=uEV*wRfAE($vxp@ip zeaL9GhTP#R9_<^HRlOCSF8Jj*Q+v|&jpscoA5J>CqU7dNtI}D^m9D&g7J4*BX6B5( zr&l{>zuXyHc53F%rZq2u8CM^)vSix(ma+2Wi8t?4B6qq!pYTxDrhM}D#WwfNx#mXR z$m}ayqg}C%_tUQrZj0A`TKF!dOIY;Nx9H|GQyy+y@i>iHbFujIifoPdnf=VgyX0Qo zo;}Y(=XkfM#+~^O#Faf`4o0v|pKEaJxa+;`0q@f?mL=7G|M2(S%FQVyrmH9aUUv0- zz_RU&XRi&4JO9s|Nq%Zr?$T`Txmjw0-Trs%cm4dI35sG+x&VT`3=C{{!7K)*1P~2M zAR3c?+s_xCrPyt7Ew1UmkFHX5V-!RUgshm8>hH*P$UxxCQD^PHhvlL*em2Ch@W-)i zT=4wHnzv4~TU6F|z5gWn@2I-O+NMi~H|#dvyjdqX=b*%H)-x+jZ&h8`_Q=Vz^Y7{f zt2`91tC{e==k%}XZrtXY-oNNbY(kpnnHwomA2=+(pD1Z>^LkTmz7gQlH}Gv=I>t*b5a)YWp2%3Wg@9~3|N z@!Q{ie1{F5q&?iI{;D8F599@=*jBY8dvD8dNx{LAVGY(7Dgxvu4(jWjFx literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_i_resolution_policy.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_i_resolution_policy.java.i new file mode 100644 index 0000000000000000000000000000000000000000..900fe511fbbd0c2c9e70118350471eae18f803b4 GIT binary patch literal 536 zcmZQzWME_f14batR0m-*xc-NNKL)y?uMK=&3QhZ+#xwKwnV+-19EPd^Qx$X82Kjm) zF%YnoK2bkov6zp&82>vZjxMDYI{%t)mTi+gqo(LNRq0>(<+n<^D<(htG->Aa=`$+} zBlahIC)BRKV8UD5}iXtKI~YWE|VjFl_lF};fCvHH~Vm%cp&!sMkN3GnCMsVDo=uT)J=YIKyA|fBqjU3f46PCx1BLQXwFm1 zJAdkZnaVRg1bumoUz`mI+O%NvSszwex5^yREAtF46~3rB&1O31A7jDt=iN^}ZWpoN zzGlZBP$+)m B+lBxD literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_ratio_resolution_policy.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_ratio_resolution_policy.java.i new file mode 100644 index 0000000000000000000000000000000000000000..14e33af8a888607664febc9a97ad48e7e7aee50a GIT binary patch literal 1466 zcmZWnYd8~n93GC#rgEG6<&e4OI@2cCNn>*zjk)Xy<(e)WmmDjtxs{$+$yjM*#i&U{ z6FV*^$=#9Mj;W=TLN3W8J7%3v=l$?|f6xE_et6&K{Q*P(B7j|pq5%M@5#bJS<^RMB z*@cbfV1w>4_y=hhC-UlIe`Ur`%`T=qaGP+& zWx3OHk)~W!=r18DFYq>G_8ao!=evexx-gyZ%-LMjhH)a zJY8>%a(SR=x@=j|`IBHlL9t}zSbh0R;|t+L zqUEjj^y2f{BZ*dJ{fvC1oreFKH*;TZSL|!7`sBJ%cfPdzfkRjIKo!R__HRKo4xicc zlFx6+ywUfN{t6|tey%*J@7g{4B@@ z_)5Ev@ja{LX<6#Um^UQSag#^BM`ZZ16ky!4B*t_0albZv`{Duf-cMhSTpfg8aG7$} zq^=gMs9Q@Ywvf`ltt6L>5$wqxut;ndwNP(rOtJbXbZ$8)uv*oVbur4B+EnS}@V4po-1Qf_OeT9VAozVCz3Rq?)cKUd zlkTa9Dw>tr399RL+1|)J7o)hn2^Q&8RB00`^mxvS;G6_E2mpu>0RZ5FVB2{K6HLJ| zF08aodF*Ez4Yr<6O8C28^lj_#ZNcAvNTp@?vAsGhz%a4ekfBV+rQ-6Q?-w{1Iys`% zK|q{G1|<-^(0!)olcP%U1_0+ElerR2u{I;!*qBNjK(rRgA#Y02PqCfuQirn)HGTCF z*`D7;RDnSM47U)@~pFMyjrG_?>qH--cj6}H7DZ~h6||Q zuGX#C@Pt%$NHiC7;?g6ez7oQd8Orh=x}#u4Tm1O{ps+uA{f3J z^kaok^O0crm%VA}u_&$8p3gqTxm7qakI*){_%h&$^(HdaW*>Xk~t&NS-)PtkPH!Yl6nEVDl7d@|XQAA{-Hsv^A-qv{#R@d~{5Z0s(8;7+IAvz7P720;tN{E;{5=H0e!l3qI_&Ns6 zTp2J_<=`N&^Na7UshFK0jY4~(UI#tW1DFN3%VY}jf=J`p^8_NxL03~Gn^p{+O{lfXU@J1leriso3AfJR$F eXf!=lYS+2uFgfwy$XlRI!=Bo-W&pR&+~!|Yh=PUy literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_relative_resolution_policy.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/engine/options/resolutionpolicy/_relative_resolution_policy.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ca236741b0ca14795892990b6587a12deae6faf4 GIT binary patch literal 1212 zcmZQzWME_f114n#299zFo5A%z6hu9XdGyP;u0mh~yIua18EhOsgcYD_z*NPYv!VC% zZy5;G=?VQmZ0jph%6DP8sA6eSZu^!p4z0I0z5AY+9Pc~lCo${W{_`p?Jr=CpqRD@@ zJNf?l_wVfH8%zG1VA%99!b8?I;*Izf!%UH{Nk;B&(FZenPksMCGf?E+vcGZr-80i} zG@2(lPyCRiYB%xhlsk79Cv(01;<8fVPM7sG)}41(mUsvD_}$s$^RfHR%sZV~kzVyF zr&k;-xbgm=z`E3TLWe&%EDXHVR6eUJ!&7z366cnWKeCD{O{ET2&!`bt>}@F7>t5Zu z;Qr}P@8e{h^0O0Ly{xnfzM7v;ovB{Yz!iMu+@VJ|mEqTK?*SW2HgI@i;bFv?u^$aJr_C8EFtkzmOPx1VBX4Qxc{!(S)@t0HwENkG+lpVEvg>dDY37mNdU5xaCt_Y+<%d$@ci8_qSIuBAz-dFsGYS5lY{ z>qS19e0hcW!QcYJeNH9`vo;xr?LPf^t?JgTzaKPD`2X>H$6JnH*UXMf*9sNYyz4h# zUXmf8zu@ph^BK)rucD*=Zt5)iHuvwv@Z|qYRkBYHgF= z6@Gp>tG;*{b$vSh_w%1m-ZjC(-QL|n&D=qgW0hs*I@c(favd@b_A;8FQX;}-6J&hZ Uc!Fql)aRm)MT`t5W$k7I0FYZKQUCw| literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_dynamic_entity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_dynamic_entity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a6a8478cfa393669d82cb9db5585bea2997f8dd7 GIT binary patch literal 2066 zcmXX`c|6k%9R7{AC|8bTiMf|hF|w2+N3NMWD_1SqC`T(t(I;}Ia%^VgijXr`Ohc2( z(ORVSy2&|5ks}!|ujT#z@qC{@oZ&!o?U+ zaHh~T`X$vDo>4=M(Yu;m49P5a8Sx*`5iyg+!nS!gG<7k)eKys~CwXeEX!62t2~vj{ z=QB?C^6zO#^BJf z+sI((_`tC-(L{GQv>$uvh%0ThWl8xL^}M}pY(lCrW$vxUmT+&U_bA}d+^;9Q_UL*T z=jb|ulQ!Qz%7Q7b7*z9!BcIr}*?rfwJmNk5;7<-AG*sU(jeWMSL|c-L&RM!|zJf_Y zjrQF3A?fGeSN>?T`Ia%gieDZ%P z?l%;BRm7iPJI-0CiY);CJ4LNJaX^o}-h)2VzJSB8f zcY6G}r^2LjfczIq4fu}Xc%Pg&(^hBDKqLTq<2>QHboar@;}t2^>Pbi?&^wIsH??>v z?j~V@ipdKTxUnTP#9ppnb>}!TRWV4V z%BEspO1@*2Opivme=*6ErbDv zH>tf>F-_C|0UlSSR<(Z%Jliw6KANuvyF*zf$Tb*2y{uBjW}aZX273lq7l!J+F8`2TUvo47SMX`2wWA=}Ae*>jtQ+fD!g zY6Sr33YYEh(_G}%)N-X!8R=ZRxVJ#D$R~n}mSJ%G{~E3W0Cqac31!uK;*b#E6$mYk zZ+PsoZPE4NHo9Ck7>s#R_30YS*D^yehC?{Bk+>-)vj<&=>QAqodp$Gim2@U_c=}&8 zpbyP{(pFIZ6<(D*h)(6jIB9nzl`*Vtwpm`sSXe__fO-{GqRfWF$ClB48HfVonW|!1QZ$_3K?nIGRK;V}(BFLgTI4 zA#bsIQrj<^tNxVNN~SV4N~`16z48&_*3OjmVu{Q5C_X`9bX1l%+U52_ALY(e-b0}( zH?@r~8W-?WZhwMOPaJ+$2ZPk?4_u|5rj+l?-d|BhYbaCO_E~FKJhC}{dYk&eKx1P> zX{&!RtIuD<&+X>cL4M#zFd+11wQZd3aF}h#x8a6(DBo<78BJn_zC4Ck8?G2)a z-(-yRa_H`^W*0*;v7Vm8@96ZfoQMb`Voff*My*QGN$#kDfr|D?wA`s$7`R=y{e>FS zTEn^034T-+^=fMJil@lWy<-E0D2+^Tfdw+XBj9ZMdw2!{AyE?Apo>hfx3WxF61UXU zOjxyj98FmxM;Iwe;M_rs#_COmc=Xs;QOBMyn#-bu(IAOjb4bzDbE6xrR|LCODV;4r z35C3Yd%OHFHcSRWQ0-1jArBB6>h8$(3+evr+Gr=~*sgz&{?6v%CanvQde%A~&fBjZTL#8Fad5M@L6GIX#V%pF}3+xa1{K(%dtMF5=`2VooN; azSy(WHYFKTmNpls>i6j*7>MSPIQkz4o5H{V literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_entity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_entity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c5d5f3c16d1cf751448b16d0e1d0684d2e91c385 GIT binary patch literal 3502 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 Ef0b_SzyJUM literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_static_entity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_base_static_entity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b870ffc9100696b1865cf6356fc8c752588b4651 GIT binary patch literal 1104 zcmZQzWME_f1Ewhq4BTQ6HlxXZDBz84dZ+2F;ryfL(2p{~&OfykN}C{RAY{dyvti!( zw+(pQ`VA-iKX7@1*zC79v#xS-ZQ?bYrlhL}=d!&ZtdG|qs19A56*t!`m%Fo-c&fK&3vxI(zLsP?-Cdc*l zfl6)*RKB*vRJFJZK0C_)N%ipy#p^!#duFQ5x;Xn&|L>_!j#w53IqjdQ+H`QI*mJuF zG2PPJ=WaWEZRG^19zQOzotB5+zngo(=fmtfGp3r|yBT@A(Rhc_%s5WY`4Xa>fd$$p ztrAO8r*;)~U3lC3=V8W$_VNpFch%j0`!jaG!G~LZvvhkbC$wIg6u^7MBJe|_#+|ba zAKKmIB3)ID0@Zeyebkuo?&iN7Yu)qBr?1;zJLpodwDaTrhW%|$zfKr*N_DAEbyB`6 z;dsWvQ^Akr;s!m5dHwyb4}V<9zS{aoL$QW()S7Tia6oclX>UCF%jIMgD9KSQ8;P zS@fZIkJWO03!638HftM z?>xRm+pBdR+AkiL6!?W}6<69FuPxtM?QTT(zk2n5@~pr1(hz@9>xst}sK}Hh%H3G{q}L z?*vX?hp2&&6?2jk7@BQ3jvDZGlrwD1Ov`hu3+!~N3)~f#6zAoYCE4M1*8BV!@2jWJ zXlv+R)IO>2d+q`^v` zHB1H9*qFL1>l*7Dx-%|}T&Q4SX{s-(xL{?#+0(2HKTGspgIvKZ0(Of8(ET!C76W4{ zkY)tAU-}Wx>CdNfAEr$>HM{n?{NZ;|=gT2#;G_nS6${~UtYcu{gyw6YxjJA`6$S=& zQ;0lcHjrilnLF>tgv9@SQ?s70{?4<+=3Yg_vya zF= zrgT)QM8Kz2)g?C{aM3X?5wXVoF!f-QTyflKv+!abn_w_b(CAOBq!MsJM5+6&o+j$u zOUWi0tUc`+ZBw&Lwui}Gq_(Naf!T@V1f|Z5@OOIXdkk$&eBPEaHP%&DRA70me#7F6c*5COl6^x1XP~Jny8+Hw(Tk zD2!iNyzc&zY~b3IsY~D{AY7luWYsv*kS4mdr?!v=y73_hjc4O{u}iyEkg}3++I;B4 z8!$J8zElrl9!+Ce5iouiM&YZ`r<$Kvtm5j>pMJ)A8e(8qpl_WH=JbX(2&Xcec4ZJ;BggD8@ToFh+ZT99poXb zo-E-SY$QfsS)uU^1*RL4?QFAMN6k9?-a}38=atdCLcaqBFFGxVhjRQlWyk=I4!x}< zf#|*Rb1tHHA$OSVz5nkc-=4%W+;fi52ccRgx&tq4@01S5pHfpnV^F(hP(2aR?4lUf z#4xt@LFZu@+?`*I=2LYZMf*e;-(ojHTCHU{sf)&Eo2);DRs@6-~@^9R|U-wI^qPjO#p%{Yj@C-XsJ`^U(%dt+09ovVS8A86di=>nd?gzyo z&KdE2P>JxmjHq`RH+WhLvAc+7HA%-xSFq$iKMDPcjk}ihThI8NX+2X}dSn&lbq(97 zXrxV>T*vTNzxom_B)j65!X(H0GM+M#&YJR(DNNou!%K7@1fMGoNhM5VpTSfvH(3#b z=6_A|2vEb#SMBJqG|mzXBp1_@?&XO>KZLHp`a70N=hqca_?cGk)FrC4sIqGM?mFK0+O9Mz=l#)wj1 zK5JYXC$*XySWewJ##Am4f9VBzzB!o=8=e0H|2=Fb1Hk5_RWGFoU3EjN_v*j2`se0) zO8@{0;_rQ+WtEV%KOcpScvfOAo+rU`ePa{2XJbwVZ*YW$P|T z7xwK?g*d%dA8o#TaBS`&^CQHrXE?Q*;eFJxO3G??W4XyQOjXa^oJh9xBm;w`?JY>y zC6?i;W9M06PgB)SXf(#qy65G5N3QnRmi{G^kZf+Jy?JVZvG6Y; C5o1sQ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_dynamic_entity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_dynamic_entity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..54acd4a69b182a05de87d09d3fd9b0bf3aff9ce2 GIT binary patch literal 6228 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_entity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_entity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..5c2a3348d3e658aa48f29d78d06737ea486d0bd5 GIT binary patch literal 13500 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_frame_counter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_frame_counter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b8f9524694cf8074217e3a67436da1ebcd04efaf GIT binary patch literal 425 zcmZQzWME_f1IA1S2G%nWHpBP-P_UhG>ddltJQq1uPLuGyt^cOoqhKyn4VbE!b9TzX ztiuL8ZRdHP$d*XOo}RSjf@~C*Z0g&p8)X{R4CljwjNQ$)1#2X~w^NraX@6^EvqIl2 zV$xFo{W%i#$)Zi$LXUZH*ld#yQsp#O(f^w{Q7v;)zgs4ga>T}C@>^QfPi{@(+cxd0 z*C*%tmnwxVCsX1?KHucYORzfIbvq}@r|X)6zwqTfY{d@_UO%X2@i@x-$;GBMy@#x9 zUM74`V)^_-z$ozHGh1J_O1{(k*V`S4n*3SEMnExc$rLl8sU1`LH-3^>(Wt^-+I~%U zk?O6Dn|Z(AiWAtU`zy>Ue8YRbi5B04at*^?R8Khk+OL(ld*4Que+sc>X*NGP!Y(Se zeH7yJ%Kd!lmDIOh$K83yRqt;t4l?SSXtklrZqe4D2RmOZp2lSI^|QH-sv+yrOJ|yI zDqmN*vp4D3!XJ-5${wkxar+pZ(arbw1ABUe(?@+3efKriixyn{u>7EGrq$J5g%?cC OyzH5G_{+IfNdW*P^}i_q literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_frame_length_logger.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_frame_length_logger.java.i new file mode 100644 index 0000000000000000000000000000000000000000..441f5f91586b8bdc34caa383602acbda4320191b GIT binary patch literal 619 zcmV-x0+js#0RRC20000000Juj00-;<00000006}Q|NsC0|NsAcWROi&-(nG`5L@%K z3M>UTIc2~A00000000000001ZoXu5HYuhjoes&=L;poF~v&BwY_Rxfkj;!qhSqsbd z6!M_jXGhGIj3lQmBmaFT+1c!78)NvP2BQRhy8HCqcjtmd-&l$uRT?l6$GEc#ij)fs zP#A8Wru|;O$MZre^LtoncouxX`!b#W12B?88zzhnzVIC9hkq_hI2iPMFn~)|nyplD z%OjaF4L6GA8IQKrrsg6-7+*}@o=wijFoe-XFgg#;M&pqMg#BJo-V+=mI;-KD4&#z2 znC()gDJme28Rm354U4Zu%nW`ck{PNu(BcH&`#moVVfOz|72s#Y4&rr0>6&8}cf_Yq zd`BVz7Y1@Cw_ajmrmf9{3zk8WNoLlY8dg=Ms(p7tt1>cDb#XV(@~^yfSsf~L(9 zdW^6zTnfJe?<-$>f2oH;jmEE;blL{B+g^_S7eY{5(uWA%3n`v*S!!_R@5J*Y+z*k4 FDnXlM8xH^g literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_horizontal_align.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_horizontal_align.java.i new file mode 100644 index 0000000000000000000000000000000000000000..98b3f21fc7f77b581cff3c4df53124487674c27d GIT binary patch literal 338 zcmZQzWME_f14bbR2G)ECn_<^~DEPppQ)Ml&)v{VlCNvLK)}Tu8+7^d^#dH)!nV%DXQwbmY=`Co(*Qo7e0Lc z*g11vxBoq*jLXO7%wpSrj&P@<;;P`a8Q9n{Altq@B0WWKVFA zjDCOEB!?51o*uqjw6VeZ#3qZ{p7)n^Y|T{!U;lN_U{|?+&`tX1+LMJ_gEp!D=)B=O z>A>l)&xHas-Z1TwRn&9YBl^0EuX5ws?z=K&p*vTyD=%K~Y}T5`i#PT)Zke`X7UxHv zt{!o}*_?q>U&u)9X#HC-lkbLg+s_;wnVxqE@2gEJX9Uj<5i#J8dC;QrZ?hl!3MH=j cQep~gJT9-ieDBbLe39(^g1?zJYWv*;0LDI-Hvj+t literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_base_entity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_base_entity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c048688d350895c59234d6a2d42d9255b82af13f GIT binary patch literal 826 zcmZQzWME_f111*+2CmZ(He>OBD0uMl-ICA0-4?r7cIyAnbN}@0srdnj8VFf2XKhGq z{$&G^t8(Hi{~zoRaQu8xf2FXHf!!7Mgd`?iCmV}%zS$??gxwA*oXsyS4tt87ZO(L4o19_A{cLlg(Ah;3dKMeZR+}6d zU@Ydr^{9B`CqwVx8)5bb!lpFx`vh+NJpFwc&;6iJ`|SGa9_oHOw})x+{R-9zb8@rgFofk4Zv0hb*f)n|`jS zS){0YfHwg3Kz ze7KI&U`I>VpXqbDx6J8bs+2E0o!PY{Z2zN4TBjoG6?s23oO(5L`}Wm87F|<#rzf{) z@o$~HIEBYDyVv~Yvs6#jn_kPSx2^p8fitUS-Bu6S-7EX5(DX-}zzN3(r?kT-=dM{B zc;~?ZoogqqYTmf8P3oeXo#Xv$FT&Sts1D`VP!249Z8C4InWb3!##`0z8qQujlb~DT zQ~oRdjnuBrvNz@7yROfy{lMt7(f7nYUA1db0qMzAn{L$XQnM)Emzq7{@Zr4^0=xGW zUw$Mv>+XE1ONXmOR%Snpty`{nTsN7!s;7Hz_KiLn?TgP}8{WRobT8gze&)BO-WKN> zja{B@SJI8&9R7Ol5|>-Dh6}Ayl|v*P=YG9kKOtl`Gbkm2QXdeMF)(ni0<#zx8$dKD z8A@fGR#~sz`&9eZ{rtJ7BUwJT{ayi410gHsBquO5GjSYE;X2s!Z%@n|)}@}7Gf#45 zTK?=*<$AeN)p4b!)U0a}DtEerf{vGnywnTqbIrKJOE#(ROl4>NC}6 y4pYS&S{}beCTr(6XV!yCKXmO@94*rSRyb?!wu3WtW^0Ij+`s#6S@rB(pRiobSS!oo zb2BIB1f}>}s0G~I(P`xQqV$`B<+Dk%RCvuV=gAxmTz#=aIpYB5z8RgT9`qTj1{^MJ zJKwa~bK{DgDJ*mUE^hu7_*|fDVeO4G`>WsjRkLLr4g6(v=HY>*3v*g5e>_Xl`Z#m* z>78O1W-HFj*zr=@?!x9Sk^^SvLR5sr3!lJU6Puns1F*>HY9j>BgYxkFtf=T?ji-TRF$b zt;uN4-USQagl*jSVZ)KovKyCHRcza_w{wkB{lWLrUmPWQ?oafdq8bwRd~K=AtGUtA zvKG5Svz8yUV&AdqmEx!TS-oGSR^`lbKDy92#7n^I!LR&TPuSO+&&)bkGXKa4`KwlY z0`xgAn>svv@K|`in5Z)-PC@Aa2#x_$!#XgFfzb*?gA#<1^#3oM$Iq{`l^Z3W=@~MY`T!)sGcnAoT7<4diC5& zSy`Vw{+tm|$9be;4`1VIr;QwHUMKjD@A-0R&XGkMuFU!K#sGjVELhOS95P$rk&q3sxO{t*}L;`KVZ&9vj;=cOD*@ z*%A#53===-%YyvEGzILVNMI-|0<#zxZGki+C=^Z$1pnHv&icniHKEK}P4Tee*DVPU zH4qXM3JtQpHEM9M@>m=rNd wYC>S-oS89e7G|D3-MVmxj=iz#LW`{|p_x%>aY=l47BGo;PB3I}ZP9iF0N>cLi~s-t literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_entity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_entity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..93d39446327fa907e23a0b855dc63475b977511c GIT binary patch literal 6119 zcmZ{I2{@F|*Z7RxSZ1>CO$^4CEn7t-dn8+kn!$)j$R1@a(^6a&Y3&sJ?nkXz4t(%5GaH;zCs{$8hbS4-`;Sb9Nosb zCwxEtA%M5xW(+QT)RSwU2gD(y(z6v7^vdkn_|%&#EYiu{q9=>*B-z83AoTHYU+xJt zar1mssc!tu&L$NlrMxwa(Qm@v9a4YelrduMiITn9ZP#3-2HiU+1AomJ!eqt|w>$m2 z)!qg#8}4f(CkUSz;+OgOD49;E?p4I64)!y>rxF>(RK7Q=j#*dKVOSb`M!({2a%AN4 zn_eVe2;O4xC^FvWc-0zb8mh}wc8*&$cjJvJ+l~;&Ln~6X!uall1;=-1-M*Yg1=T7N z{=Gy+is}KnnuDJ30f+c0HHVS_ozqX@IxcbRC#9Zu$R(1KnkI*CnEd1@7bh}P-3EdL z40|9{98?Md;Q=uiE$!!>YuoQD_T)W4!kBR`|J@DxI2D*5Ax*|P& z0&xEBSXUg<#K0%OGawX+3kksaxLreWrMd7T3W zfk3wa8;}iOV#P-qre!|t{ z35iPP;+Q?2Jw(+4MvZPyS}^qwc5q^kWdy+VptSyphZ$QQVqcJ7P&uW!4Cg0o6o`8~ zdx$DcVt)=w(^Ub;x=5RYssfk+lqH|S)r1@GKN6sFy*@gMwWlM(hj0Hq5QmU#?m}vvx{*ksz2>^xFTW5{m=k^Yyj2 zmtBS^>k@U1PVH|FZV(MiL8JFluLn?=H=W9fSK2UuX)0JrZJ zdJ^Q=A0Z@H3??3n!90Mpsb|(R{xOh*{V`Y!!-vYqka0*^HAQVzMO(Nj4r1VMMOZ(s z&t}DCW~GgE^15&s!lc2k4GN+Qq>8%=P~|kiP&|N{Km#OmIwGx>9im!~WwO@5jF ziAkXG(BPf{k(imcMlHAQ}U z`un1Y$B^nVU%phSIX5Y})VWKK(6bBmJd){Ng}8aid34>jfDoFeZu<*bcN4J;V?;P| zdvHQdy_KfLYnH0|DPZnhni0@`05gN;j;f|)xmRFCrd|yjos~VP|5M5gSV;eGgpdp@ zj)4nA%^Rs)879vq%dG1{cWT68WU!-DJPuWu$K%IhK{2W0IUMJ*_&R-}lPQt`BG&)@ zDzW%}$2o4Lx&^%IYR9I@}M<7x)O zXJ3w0ebi82*FO##O`k|L{RZG_GR+CP5&*M+u6C|Wv};8D-MGPMly zL27118WI{fm#dbfqKRP zR5)`kJU1>uerj5Yck>^)Xd|h>^uwY0*a)e$*Iq?!m<7o zNwzz4?-aW3zCr6W3*XgvD0YZ{29G(~Pfm41+50+p>s+TyNiC<3IUu{(l__iCp`=*6 zzzwIlAJS|LQfC5zdhMN8f3*^<*odPxX7uXrX-OJ4?_Fxk*Cyvi-XaS> zQteTYl3v-`*+yS2Ta1Y;5$Cyd;i2_{>?b)qUXS;5z81d4G53Q0i(Y-fvFIs>Mf+lg z`^jyGJf%KF{xYpHp#0Qtv>J6YAZzZv|JGGqEI_y?!^`&&=Q+&U`TKn4(F7^wg!#Z& zn`cumDi8T`wQvZ0mEw`VHF}#dv$*{DIZu<)g&!iPiKuATApT{0TczqrcZrCV%XkZ{ zb+BMbm;Ri^rFY9K-)le58HD)#&KsI{7U=L8)l5sC`$E8XbH>LbzD(FZm2n&Ia0-j3 z48{31XP{lXE8Xi`Yr0*;+UwVd<|~6P#IuPp5oV@J8rch>YZHW`=FIt)Qmo7P$t>{{ zA#d~90YQzoGrn1UTs-e&>BY@FgUuU`3KRw@>2&-t?peIjmNI_kRAA^D;>PEf!X26q zJv`e-L;cFfJQEwf9t*fr;Nr~PxNaP7zRXq_RG5l6^~`v=xO+`)_n-Fe*B^v9vf!b6 zHI0HQru#1>BjXM-@KM&;UQe};ZXY7y$zSf3A|$jJRAGJn4Lfh`UyBE zEz#!aUI3U4l*J+%Qz^uH<1fiMPi^WPieBR#(>)pw4FYFN+kwjzC7vF2fzvCm4|dHk zz3Oc8W|4Je5f*M>?jF(iE)$A3F|o$ptiC$3@lC@0e$B@)Yw0Y6_YbXw`B{|VNsFVg zq;c+Tt>rpBpG{f2kCsLJ&Qb*|!=wCNj2Zpr9Q>cs?rf4`zTeAPeLNOKNUBuS=xtW~ zSW3{$W)&N(w|v{r_(1to#<^OSm0T!_lj9UjbCCaMifwN7^Z|32TdyRymUc~1!izpJ z*}Qjj(k&=@GZkEpHBx9^|K_N?-iwTjU8{^|yr2wrj+HyVb24*ckyw_&NHN)>g1c{Zr_cYj7o2xK z$!Zs@P$u@}i+o5*X-ag*D8cXvUgUTQoVebKjhI=l{-j5|I@XuU)q|@zSEpGZ6)*h$LiN2qZwJh4;a7IBPH*IcJuOn@%e-;$##BHkF7d5j(m9D z{G!+IpIzM7G{S5>>%Mtmn!FXeYu#>2tI4aw`XwKipXc*%()mud4z1c{=5nrF1XIka zMNKpSc@=0Wr)vZ-JGeM%EO-tI+MCTVi2_ale0#@Ax+Xv@2dJ3W z>}j%b5;DI-^LJI(aC2(Y$sUIPtvD^I0!C3n+=4UaMHj@JZ!s_khZ+SUczBMXrx8O> zqKIsZ4(n0j0uyhDPp*6txj~uR-QN5Il~wSKt~n}P)mC>;zSzUJYMhj6%yiAd&iVG; zumVoYh>%tlrHqIYhAfLCG7S|4g^aaU){nD7PmCSWub6#t6x}oP1OKyZt$DJ#f`2@Q zss??7odh9N14x7&NCBH}3jjF5c!;X@tsG^sjIsTG z+w!j7N#oY(Uo{}d{s>KBCEgu(jf9!6o z+o&kxPr(xTa0auBEuD2nH8GnM{mq*i|xBTeyr4nT}s0gwOO()jtdWcJ3g$WR+CiVGKb6_};_XlAinh!nS9u6HEDD(=ch>o7fh?PSkya$<3#)0yj(; zr!4-p@DA?8#1~47KkwMC@;&@w?HdC;d(=Q6?YV&O>_BL^1h-qL(o*x1m#4yajWUY; zHK)G>9v}Wjtt7QIVgJA1$zb@{LO}?91ccoUq=2x41sD#7Jxlgc=Z{FZ#V@0>Y^><+ z<%IJ#Kd3Bw04R<&Jr)#QgxKA)2eil=pWE69(%h1$c*Cp~1ILu^oQ{EZ+>uNLgDMx&*9~cDjV&WtXFJ|6<$E4!^X9?hD#VU zdE>ox0(jVcb*$JZI+&gRVSD(2C1`InXa%w4d zJ!HRDI?J(|)$|fyJFuFB70o<#cEM@WR90E`A96)gI6sNwdvb2iUG;+JOc!UPoq9=z zm!D*RblTqSwak9qRICwrm|(p|M7WLTCYRJ*(OKD2iz*aq_Fm=b$!TuMvC1{pygx;b zjZjm$$UX`K5#BsbkwtU3Bn5Ie{9Q;(JWu}v%8-X@^@U(Gg{P@iQugM z8LECFwfkv1>g7!eDs4t;!!u)gT{!S@AMb}rTj?tNXr5>J$)oE4Fapdn4(ig##&EyX*I)tx8HrtD z3Fn%l@z5akJRaT!R5`={dKxdQLa7=l7NV8QG!>fB8Wkwj6Me)CLR6FqSA3~JOXMX9 zdU{3Gq_b@fmc-QinI)0MdWW>D+oVruDNCbHXlkh`^4i+zb9*3t?jl70ApSlOf__-i zrM4D0Xw?w|)XDw2@CGpK0BAbfp!ck!FZ>84V8Vwl=;dFdq|aslX*z;@3F3MyhScb^ zU!!q0~1l zQU^L)e@)gyhGBs}jYlrktx(qH*sR+;PA;TjKFuxNW|&V7CCT>~ypl$_sSf zVKfWr-U65#^yT&|>)%{HeMQItIf0zuWp3>zo&OW-Nir5QIr^%lC5f_^=%mz#5APEn zJhmjBOC{zwIHfr9q+BGDrtDLRPm)o}yr6dUaD?jmm9|JT-Y&I=V*?uWIX zS6KU;)u|E`@TS=1s!C6QkKO{l&xB<>mETI7H3B8KJbb1)siJKh{#_2~z4i3yd9GTJEKThGx)G@f zEIuAL7-0M0@HS^@)q*r0&Z%+pgqoi2EXsMw*N9j{KFlu9qrudJfNfi%>P1|{rhJy& zox^L4DZ1N3&$2eohxiTMK93gUBPPtb^&k>r>R|)Vss-AHz67f5G8j_M62Rag45%Rl z`d~uTE&veqUSNh7jJm$7lLt|Ej`FP)cTC4;SfJ-a+<7YZ9-w{-T<#E8rsn_JkjbE~ z0P;B!2{y|RW73zjGdRoMng8w->d{pf6Mw_Y$<#JYnE-<-gWq101~s>^P$)GolRD2^ z^ym^_Mj>CT8sA>K1|v{p8F@IL^@u1Wb^91~H6yyH_89(uE`U86KG22RJ+Ap9M|ls1 zp~OdnA6u}ZJxmY$rwfRj?iS=uWK>jZW@YXX8EI9A)*-brRAr&nA<1f#veqjt2~}wW z2?bR}WoD_FEc+BvvSXoTB;|e8{2U#mICI zv*T(2qY5bdz)`9O;P5MuNTne3V4GP0)b(ffS%aSh!S1tIBlGgEx>vuY1Fd07V+0@^ k*j~T~a%jJ2>vHv~HxBEAbi)N;T|KOE-tN@iEeGs>0RFqZb^rhX literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_on_scene_touch_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_on_scene_touch_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..440a9fbef475e48a54b5686476eff519a0e33544 GIT binary patch literal 293 zcmZQzWME`~fTs)$O!`oE@P8*((1I|5eUGl=&NN}g8n9jXRQRm@pC@u1fc z2cEX`d}pkmtYBRpEY81MsUlD?#`XpG8NbcB1!kI;GhL6Amv4K$Fg=sc)5Ff`$NzIb z`L8Q@_hXmqh&>_cd{@7qXyN*8GfZP%EwpznS7MZH eKJ#SG8|(Z2QfGKt^PJKqcfa{~UO%c}<~smN9EN@X literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_scene_touch_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_i_scene_touch_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..043aec3d365d59a91dc5161116ed4a9cc0b61dc1 GIT binary patch literal 197 zcmZQzWME`~fL0(i1xYl-;78?5f;$zW!d-U77g&iN?=9d0y{~zsC)5hrdDS>%;ODX>+haRz= z0YB$#z0~#0wW#rJ>cSN5hqv!7o$z66-kWr(ZnNXqsV6}Pjng+d@b+_UXHBn+z7k{5bn|DCVZ5H+L!Lw2_s>;YaA!L{uu9#! zvFO2}30@bw7H@Ste6#j4yL92mxxdDb-K1O3I7E4vOqf_{Z5jLZ>f>eimhW)&b)FJs?6Yg}FL9oYQCAJ# zs``HY@Hgse;4QyTEMFL>nbj{Xo&NjmIp#X)$9lNCAY$^*1FHjf* zK^-up7l2s|jHw_R6xh+ngtq=>IKH*#^q*adYO&@rwKlgPY9M6AoaBUr3keAc9*GSN zr4E1CI(oUhCKnk^7B%|p71Vu6XmYTqO|!Rh5d zV`E#!>cDd;_Z;Wdc{4&{f~L%fSu|nVmT+Jyj)(K%of%SL^d%d}7Ubo*-`{)qh;>DrYs5 z_%ETz>|OVy3-f1qJxaNhtJ*3O8tB2un)6{&pWcD#f#;H1at~}aePzM3IMMaOmeXbX z)`%N4FVlQ|ebd_6zx-A#`7r&x5BuRxr}mkD3O`5*zx@>E%~-c&Mu_N|`NtJLqZT9)9f+qU$B?kcDnD8;x7s?U_O zpfo8bGg+Z5KQl!kKQFW(C9xz`BP}y8F-IXSCqJ=7p&&RlIX^F@*fl4ypg1)})0&qH zWD27I*eqoR1}09ZsfR(rAP1~`w0X^@xwR96CLUy(^G46oLZs*vH}2`aImld literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_layer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_layer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..60c218ac23c8393b71d3314c2f5418bcd7e8d1aa GIT binary patch literal 3441 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_scene.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_scene.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f7d84c2c28df73bebd214901ae43e6a2837e639b GIT binary patch literal 9095 zcmZX31yq#X^YF8D=h7kF-3Zd%EiJKhcPI@?%F>N=2}r7>lysMXfD%ebN(hMZ-`$t@ z{eI_sbIvm}&$Gk5Gjr$OJ2LP*W=sQA8x7wp5sCu9BIBw6B6E3Y!g z0Ij>3*$kB(KVu-4ibwIJK}S!8W;oHGxhiVp!g2RF=%b&f_QsCdcLuD znqv@yR}xd}mM~r=jk88s>XNcxin_Pfm-5-aj)jSF~hSQtpPO(U!$7qUWy-Ho4#$S~y*C=tmULC*c>um$C@LBsJ|D}xd9pR6o>`P`Zk7V|oSgbm-hqg!1K1ExImNQj%_c4DhDWoUt*D1%T#k{teXih%7dOeBRwI^QQ zG9LM(NK%A4s%Iz_XUf<9+A#(zF1fGibF;p75+R?gtxm65cDrmTwb%fk@)jEJ@cR-Q z%ZnbJKhn-(hVgZ4^KS0$TY`BGA&pr4%@!p^8pR_Sz^gWisZXxznsHX_K`4|HMh}_e zbKf={W;Y>!J`WTb>Rw1t5q@!|HolH`_2#NQOF)*zs`uPOB0`j@SW-3Da0plLOBoND zx^QfUhIOt3ljdi1^v99sM9lQ?cyE$91z^8dpqN5<)fW)wLK* zPqUk_wlR5Wl|6H7_-efUwwl!Aq8jyz+gCW&(y-0)`fba8V3Q4o(~ z6Q>9YrUk@amt1Y3)jr?og>7)iPygv(>y}fwt?>l`&qyV=Y8h`?_dMPnOO(9kKEw~Y z*sX!8KK?a4`>Uj|6t5Pk0SQU-yq>U1(qJ{J38^|EAjJ>Ya+|+>6YI}4;9Ou^aT#@W$p=DF94vO!d^r%J^gH4oowm+J)9tP z9`2gf?$!==5JOLhwXYqUy{m_{FP*2povnvE#7EK9+SA7l!cO-T7YjZP@-kvH9heHY z2o3Qy+J{Q($ z&&030L)2LLoMiVW9>v9#f!`|z=UGF-z1Z#iZy$pgN z^vV0!)8ii*5zz~6E@Jz@B;3X%tXRw?EvQH@JtfM|%l}CDV>w%+IU~0qFTZl{+R(I2 zanG8vesOMALPSIXZme5GZk?wy9=D1rm+FGb*oZclE*plH=H!$*yZ?kL7n_zQC=UsU zM`9I%&xw)^$Dm-Cx>|4!2Ar@51+MPRw1?zwdtuIv{*xt^)48l$_aA={689)DKSM`a zyfx;gYt%qzkviY}Yn+Ifs z<{={mZmuz#CyYVI>%ad50p(IM?5N>>a@*6|lv?9C+ZO&KTLUczB*<2$pwkG!r%Y}YN+lJ%Uk=lwVkRt z0m*58&z=-3c_lj(FlLE0gS=DYqq(!e1bZm-(%1S|&EnCC1T}Qcw=oKfUg6kF{C2GyGBwVKW1_dz+#<02n4B{WZ_rMZ2on%T zNZ%twpv78SS!Is_Xd1FI<{-%XGjA_auw5o|W*JA>w{6x;wr#ZX3S-;&cCzw{@79C? zqwJcfSb}^Fr)A$HXA){3FX!bPr*Gr!AFLbdWEt-hsuh}|WNL3| zgJ%#1niio!1rs)CI@-{g36a!9Ec#?ZAf!JcsH?587u}KwP=26b_S0Zz08Z#}{WN2= zXah;mhOdD=Jv}BMYadONO&1v@7FLIdj%3T=mp)p~HiQFfo_T&?=s}d1jQtNb@_mXj zr${%Y+4_wmTgRfEBjV$O?^tD$@-iGCwk{t^xb5iZ2oFfXoF;Pb3so3J zgF7udrpf-btmn0|G5Hy?<6E1J;;q7anR|lC2mqM+uonSLPj3%jJ6m5n$UkQm#M?SR z&f3<+!P~>n9l~bsw!xN9U=m@!wg6u80`O8aDgP{g9e4iVmM$sOr&lSHX|j zqUBO;t@_lGTy5t6|E$uq25g@%|Ib;4IHcgGmDV*g^L3k5{qqVrVI5QlU1wD%-9kB4 zCHqENg$l71x3+-u#i4|#e~|ivVReJ$*7Ml9 zpf-qZRege_+jxfQmpQiLk?u|SLRx9v*23P*7Nv04PKImHyX+*Wpj6@~vvI(kg}>rU z%%h`pu0|0(tLoSe@JsH~(qgtg*&D;>-Of)Lc6Z)fJ&0ttEXfZ2rT#G3MWh&`#Ixy|JFO3^e>zGSp2fccbdf_o&j*d0&yiZxiGIDErG`whUQK-PEKQ(qYC1 z=uj|23HyWYYB15C=j1e)#w!=etX|Lj&r5e4lyH!50f+LaXt*yhUc)g64*-b&jUU+U z1Yp9Qc(R1q8l7ia8o?ia2{msI(~-rlg-ibnf%$c5y=nt|1kan-_1La37y}!!j!epw z$xz7fgNb;Tk7{X#S(tMcqptM23(4fE8XSYYsIFAWQ}2F{Fv-P|@$aX;tn%*_vHA=+SlFo)> zl4)-5<_zQ?RDDg+->Jugq!-e+Ry%`^driINyET*|I70Xo(jUl5_s-6L$|)l}fJ!)6 z72ahvHyf1-OtXch3Yr^OJ*;DtjXkrO-}jL_s}<9Lkgv%u__$F+e+V1gJ(#f;Z1I$@ z`W1>f_c78fg{s56;>lV|ni-9h-m|f^H>igVc6#hK$3G9K+@c6s;as%byb)~Fsn?*F3HncnSp}$YS_@NiUE`MQ_lI)qR92%j1b7k20aBRQTuUka`1?$ z_e*RwrG2Bu=0zxJOVr(K5&H_}1d%IyWV1b*+NY4OFC);Iyood1wMTF?DGw7A67aXBdGuY z`M*JA2>XBycg=?<>jZ2Uq(Op`F=H6z@z-$%q5tk^_#eS)vO0q?_jx|>ML0pAmB=lS zWie~yE*ksMmxIKhOs$BgiXdYtkjP<>*;e^&nn2NC(kDGgjrP4S@xM|*PZ$M9Gz7sY zDOv|izY2Zo-_S(sL?h9jn9yfL_?YVIQ5L4jm+#(+f3g?b#lI2R)=WzFt1=*#Q_O7| z#nsSwZxx+TA~Y~8kdwMad@5iaS8w!VioTi;lSjc_2p@Ue&U+t6u#B*jVSf@Qx2eDQ}zK_{Ns7P;rB)2Tv?7E8iRr6 zZ|40NC>^^m6E=&tK8WMXBxh|~F!#9nSiGYL9`*ZKXKYv3z0_R@jI()6Flaw2>=eW# zHQCXdMOt{O4?KKgZQ#0@PBqI`E3Z!i9@}FP&#lnqtjYAN3Ft;kA*YRMeXrTWMpDD^ zbhRF(!`BS9?1wCbeC0O}0yl~u;n@{_y2V)g?S6`U?Q+6a^o!WGQ1MgheC|~M>r4y& z=FM~Rx3g`0nkV`uD?_@Rd5(VzV~B~y>z>p0toPwgmc>(3y+e5_FLCgO@N>ZD&toSf zBATvW7--WJu;kmObvN!bdCNBRs0}s9$xa`}2Na!+nSh79G@rSN#=5RIp4TMcB?Y72 zey=+I`?dphhynw1p5`NV$0|$1k#UgGomJZm*VM|BUM+Tr(A1Dnkh+yi!1Nue!4bh6 zJeF`^wGj;VVR48!`e3{f?7@M@VLPE1_;mKD3Y&9);>+1}^8RpQIPACo0FjAQ*@s*G z9$$^TEg_1zE%EId=uA(a7a+*U%__{vs>#ZEtYcd8IQ2DxKIB7erfQ^fo2Pwf+%<0v6_!7Zn9?rm=m1J)k4vw6fjHM7O2Bg9%{1Ng` zl}5{8=QyQ`3QO-$OH~_t%SI(xPl0Lu?rY|p>!5nO>L6x15<<${hgimT48lUf!X!1a zix>;?eA8icz&R4I60CR$HyL*jVL0pnBX7KSfhqhm+*1`0btm&D+n9LEoM9HdMV=6W zp{{!w1c7^s;JcL-0Uj)G!`R&3=2GKk=N{E(8yV(W9J`pp*3z0##~tC-oIDxf;sG@! zoc~Ngu^7`kQxlSj_XA_~^!=l)m6xWAB@aN>MC%P77Y}jqgAxIN;^2NdSbhTF!Bygn z?2vLD5V673FSncJlt&A3Zl1oEL6E@w5WQZtei;H9*?DlV&h!~AF-GGfwY}a<5sVbM zx+1!Cw**!y+2GvvKi9dUZA^6?bTn?9_DvY{ zpZ00CHc740@Gc`2x_JAsCH|tsLYn!T-ZVzJf*bK*x~-8a3$yv?ZEy0qTWb4am|jS4 zG*^rbOM~1w8^NXXm-)};;%(OFQoyk%;2A2 zG8^Siof(=uz1T68YU0~}h+TYFSe_r*Yn@rD_qJqv-caVY_j#P14?k;f=(S<}0A`72rU2Q{kc5-|?<(pY9ad zWAf%k8v1dtCa1&EcJ?)ypdndnmytQ1UFrH|l>gXSlv5Zuad2+^&{J%BXrb)NfOivJ zg&Bm%Yw`bSyJZ3ZWzqdQL0}XgzLo<)dHp<#H3Ec`b%7#B!|DqtvG6+iKR|?6P9Llm zHWLeK6Qj8u(@TgK(ASGNh@36UABV&=-HwA}O6E7`iEuSzoQuR9yqsj6Q)mr_bF;9S zGBb0svP-|F8RwXSX!A;xqNQc9;JYyjy3VQIK}1n{y30H|SB{hLqO!#~5V zVpB9Ye)rsB!7KmZX`Oe<;?F;PZxPb}Aq-e?gdqxhMS}MWz_2S5ob~S;Y>>xrL1b8M zK)(p*VBidU2;pPXQI;vl)@=;!jk_M1c_01VrMCOG&_W0X=64xsYJ>U7>sOygSAp>J zxyS^tAsds*NU>@IDv>O~ToM*<8+{kwBA0lI(supEzs0niAIJ_AJ|!c6^dm0Mqw;Jf zXRjU`9e*vkTl>|op!M#vBL<;M;&SXROqRi@Ziupie&?s+$jyEWhU)3PtZ#9r_RpG! z0@Gh4d<~`cQH!SPexMxvC3QOxyjmKHVlBhqdy!{h`@q~!nLnYSWF>{nKZj0oZXp1P z`<6%xt$oPg^F`ESPQKC~yyTU6F$(Za(_`X1t6PjKkCJ@UK(~so``q z2ws>tjsa8RyqygTts*fDPhdF*mm^z3&Nv=16u8UmuCN;KoK%J2AuZzOc_s{1RtDM^ z<#AuaR_#wtg|i%Gnf|5Y>KV1`z1--uHex(;o?)$^Ooc( z=ur+0|4q%3aHjzVR(m53?gQlba=SpYYTf?z+h=i8OzC~k`%UGCo8eGhxSU6v-MtdyjwZ{`N+l>1 zvwr1H7ECs8Uteu)H+_S_6{c(bYiC`8g1QHgI)3otSxx1f5ckqKR;@$P@1YY}F$swq zI?2_H^S4Yd&Upw4UpQSI@7b+wB}^$w`2N6rp)s=et06RM<4Hg6lWDKo^RTz(Q(}BG zPY8!1Uct8qF`{`2=)!i^0%E%WfD4Qg!FLwDac9~^v~9@y#*fs~T7;zr&tc8Z{{i?} z1SPYvg5txjI?v7RagDiuZaKfn;c-<=_(f;f&}ul$IWeMJRjsR|kaa$xtvZhRPtVJs z>iahvD;-ayO{4v6G$6Q>XBa*<@js=(CIB$--p};{{u!=Nh5V`Bc(-u;W_J%;Z-H+7 zA=!!By$piDYTM*4SRa>Qs99;ZBGPPif7V2Y^@EIWP5TR$R22=my!|2%`bnwGsST5mYS9&&iDE3C3tuXrhodPzf1wzT}WOz2U0em}XiM9K^*UCWl!YkfXv!T}`P zKMuz+cJrqlL5DbPeTy@q-)RX~vRRdyU8|}l#Lfcdl?gxtBicvrpNiNFV^&#ss-xNQc3Ei9BN2scOD6O#qu}vR7hJAJ%#6&MNRLhw`t8`Z2jK~KJP1NfV zGKck8v5(5&4d6#i?|yvSA^au@PbXp7l*POW7_J(L146-Y0ATb)Z~y=gJ5sn!7U6kr z__EqMGm7K(#E}<^jPDX)S=axAdz%1TG~CI^lJTa2RD+n7{M!MdnANZI+qa$RHlOkb zA~)yLp|`06)UX`Rk_QdVpC7{>V{7}{CKsFL=!nMieKl?F-V$wj{bI_h)MmEUvKBV& zVkX9BWBeD_`K@$R3SD&Bz3FMhmCmScW-&+xUQm#XC77JZnU7${+F|tzyC0^S%5e*(83C6$+mi&{M!R;n8A~jj77nd1M^#Vji8~ zDvWc(H^n8>PiaU zD#yBXcJZMH@M&e%^C^G|l5$`=~AN`z?3iO2k%N z+bWI*20h2}^R`&j(iQHT?Wq~{L)!XI2Wi2#9y7>MvT)N#5%CGq007pYdyCItlpOAr zT*BWQr|*u)1RO3mkXC+uoyC2vd@q9_f%)HbC*V0UEebyS`FBNa9}Op}b8~J3T>`MI zPt}my!^Q-!$^&=rlQYEdlNEW3S+Dt+oN*tf zkCNQRToR=d5&zBz*J25sn}R<_>QFYX5N86bqn}okKepAeoym!jz_&CF7UPEe68eq^ z)`PFj$f*7-nk`+94W6w9#&LGcLASS9Y1a~MoCLDt# zVgILChjTFa3wtQwYk`e%d5ibQ2?YyJPVf3j>Nq`z?I}Xy9wByE6|8?P1Obp2$7G)2 z4qI))?h30fz(Ah0WPO^71wOI2rGQycG^NY*9lp^|w8SVk?N6%vAK_7gOZ@@~9yfSN8RH%(6iSHAi? z-V`d)gh(pi(7fFnm)I#N2736})Nc|!< zQ7uY^x;TeR8o%o*N`cH6OsUJHNDrht28_d9NTCSFAU^=$fnB2ro*#xO;l6K{oIx+O zyVl79RVx-=+WK)aK0`?VBL{CdebZCd>gOX69y8cS4gW}I%%rP|CnIYIA|k>lGdd`M z$kn#{e-q=b8h!c0Q`+BZXRd|73&fQ)c$w(1{?t|u?*oQ-FiZ5ahZAZ!Mbr%J;(8zo z63ih;ykv~}bW?1zON`ElZ_ z6D#h_*=8}kr0IPF@pXc(XB>3Qwd89Z;%*OI$KG2gzQLj7N@F(kJ}gp2QorgwCi#xERz_^ z?V-5P=PHhCO|fDL?>@MO1zzB<7B5NndwlZdbA&sevK@{=NdUl00_R}701Q#V7cIg3 za{?3U)3gZvks3Cm(>l?tH}He)KM2fU)9ZjO8n`u_Iio!a*lS`ADYHA0=fGfMB9ND8 zDb0I0U(=X!Xb>5HYz?dauCR^r%YuZQOpFPlNQR_#)_s!kb3}Ge+@jPM~zGBCcNZ zllhcNPdaDEwoa*JYnn^%^30D4+C~Rg&d%h<%pim_baFx8lzNE>&MT zaYqU$&K*`XJJRQ8cykUnDq=rC_~f5WUCFBH#A(WPL%k}?SUx#8i(w<-k<;YVNM z**GSul26yjrlV|8YH0GASGB%XD1n}{lm-tcq&4VlI#caoJj49?aCoZ0EX-}>xV-IdqhcGU<@zVc!A(l_U# z3*v>?Vv2?C`D%Dh_@rUBS}Ek-lTQT^amim)J|6J4yjK-`N^I_Ow_CS(zJ0Hbz0qzw z?ZpI@nx}TIJ_lVkxgPmzFh3;b2S>ZRdj9>nGW8AS1~u<_`}Zz>_|U*u;>)hWqTDkF z&9g;gerkLWzy8qTNgzYT@<5h6iGN>q%{|EA7ys`h>oJunX-=!fzC>}oG(N78p*b(& z)0E7T3u4oj{I%EejT3e~;Zj-U#n^4Qh(#j!JrRdkriak>0r@}UEIKrR2$jK9`u*ZK^dnckc7SR)b!w}S8kqi ze&13JRsIe4eyZfO*=u}suJ+xzX}X?XhwPoCBZ-eT*Ub&-I~A$(`<|Ro+}-flo7cVy z8U#g5jrhK$HL6f9)WYM^i)@}xehP-EhxYI^t=TEl{3flvqUdMMt`8p=to_a22_2i{ zbTe2j-sR?tq~%^)8l7V^K9_uc`%q|}>yb@Gi~XN57RqgmNc=GCjdpdtZT<7AyLY>e zeRi?h87MsE`4wru<|BGP^*(N{?0qQyc|v!%-(7-);L*KkuHn(+u~SiVX6soxfRCx!ydzdTMU!fxoN? z(R`_(^bX1-KrjuMRW^cI3=C-?8kAcs4U{)6aI7n;xLmIr$FpuvsJZBDs2VU;F()}8 zAu$n%(-RUB9zA8+)YM=ha&9);5#vOgFh7N7ji3J+8*DHCt)vx#w95 z`!()fDbJR$s4suER7>NQ)|08vo@8i+G+!zH$h46mz*atB zZ*zTQR$yS7msZ3x6@hrRQyYqlu6-(MY}xTvaYiG1sOI{_|G=KgQ@{j6?01a9r>CJ1YFhK zdQ~6toD&iXD$9#GHElxxe?SJWFITSD#TDN_>@iDdQrq-n^9=jR-|Y{4V%-qM(4e$T zf9jeKt5lEs?Qqr=wGUe)y7QTjtN2Z$*27F^Q;z-MVRnkqwf^;4v{qL2Mb7`3AMJQ- ziXVUda3^h^b-Pc2iPzex3A(cs6Vh(J-Ct}rXQ!dYfhudRvX&*9^Sag?m~+>=v8Pxj a%S5;<>Y=i$;k83tUYQbm7?V%MZ3FSz{!pa;c7$`y~?6MTU`Way?Yan6YVdpM@O>Q{!yq&PiJ?O%aMh zQZBiMqf?7WZj0Ot#c_?!roGSeKA-n_pYQX&-@m?q7$630m3R^W>{$Ob1DZcYbsdH+ zTwv?F(aKc^iHa8r0OI$4k!A}KoY&_9g8GljZhiq)cUU1{lrOyR3>hS6&uiAG#N@kN zk20{uPDeR{VG4?#zYh|yxt@5}$My-xmyK{a?4Nce;>6IYWlMA;)QVU> zP|Y7#WqB9fE_EA8zm9pE;MTX|^+;S^NebGb<}%t|kmotr^(VcvOgx7NXW#S?qhdUo zJh2%tO||pae3@;>rHswI)YT{z(lHL!+PmMcxfiD2>gCfqiL1pB2xL8S5{QClWl3Gv zbJLW&%d<)`^7=Gzh}?=~GJE>*p`uqd2Lk~*CEmhNl(|h)XSkszUV6{jCw9!N6^FlEPbgH;)>CKHX>SdL~ zeatfffJcgZJ@)xoLf+14$oJW6O32-7P`d>LA`u_$xP2JKJzr>1V#U0ll|S9h7zLb_ zT@9d9iLljA3v}(4gXF*XBUi;p640yn+qm+E_HsU5>ZxfCgQg!&>MnJ1NCTL5P#4d~ zf|UWflUA2B@G_)!Uq<@OM3CYb=zD4Aa(Z_Qy?0!tRIhkurC*z?b_L^Jy}u_SQ^cdKAN?J1=mS>R{AA?%LvBJNpJs&h-HQE!D&&4s%Uj=5cZqyswJA*l4-=t zK2p#uaMr}H9xIZFR3wU$pV&++D~ z^jy@U6<@KBxsD_zo;^04zh$YyD z$xh6_v3^>PV1m%J1~-^LY2u7xhEOBWLKW6VvCB|#_JE*3uv zVOv$)X!xQq3(;>@8sh!|xjP-q| zq2{mo;l(aP^q3NVX;1At)r9Fm6gQ6S>)uXV`LV72NzJe@lY~JgC^tczEpAN!pd+L( z(MUOS#Z-3~nwvPY7=DQnAku6hg5!q`gjIe` zFAT;hGS61i@I{{{KK2LaBSP;nvP9cO6sG3^vNWmVeuMM{kqFy2e`ogvK1&b(Y zN#QZ@ukSJfANr!>L;*oUAJe@^ubZ?3bIZhPEq+9-)xvz2xkw|zmJgaxFD>~$V934` literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_splash_scene.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_splash_scene.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2bfd8bf0202c49c56be5a1045ea3b76d1a4c268b GIT binary patch literal 1942 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 Q?BX~!MG*tIWLWzA2c#KWRsaA1 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_update_handler_list.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/_update_handler_list.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7b931093d527ba0b534e5143bc7187b2cc39de05 GIT binary patch literal 849 zcmZQzWME_f1IB#}3~Z(lHiQ3vC@5!VF=+}GbZh%_yFxyC+nh>M)0(w+YemY*sUIq-y8y>GQk-s~u^+s#w&Z8vz3IX!mE?ghI-|5djy?Rp}o&F7|F zmbmZUnSIwg{G}Z3zsWalP)$JKKkHt zt+Lo=emmothjCl-*7MdZi}6l;c(EfYXrFw~w2;0DckaZ+-Cd?R=kQS_FTF)3kt%zg zW!QXw_uf@}9>IOyS5c-e#YV_Cp6kPM=g^1>-Ma0zMOEBA!AWNi=*rA~P%h!~NaEW6 z|2&*#QIYC94oLj0Fm1DHgR8*BM$#8s+<`YyZolo z?zptfs>x|LC+}|ztorSs(QPOtU3_iX*|}!wEw2RUCOhqIoNGUaZ-f7dN6D2_ZXH>A z(e%wNwzJE`gZG5;Y!$KWGdb~FUslSQ^_z%X$n8w6hMBKY&2^WG@y(KbHcRz)T-UKA z!_P)@cvRG%CfKhiUL5@|qWSjZUY);(UgkWN-8%DI-jQu7M{nN^WchDt{d;!tqh#%p z;90KgHU6!Azj@z>*Qsw-&gbLZ=4EJG>GNU17ON|}wm$GQICb~)gMSPQH0L#gq7W4C zKo9_oeJe1Ffgub;gA%};3h_Bzmt-Zc1sS&-Nb>jUlfPXKRRg6M>wqRS0y#{)Tnr2> zE=|i~jC6#}XrKZ->NB_k^ke zQx$WP6B1HW7?Rs|&e;<)hwoqNN>|sJnkya395aLb(l$9o)}?hh1!fgyb+#>YG7Xqx ztZS@q=&oqI-bGQ_P+wJj>j}&KA}2P6YMeZwb4~l)8n3GtwyTjSXktU?Yv4DVj+t^@!m0a&#F literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/background/_base_background.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/background/_base_background.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a326ea17d6768d4cd330f3fcf20f2a9445891fcc GIT binary patch literal 342 zcmZQzWME_f14c0h23AD~n}Oj!6!^^USpPM8a>T)P4_;OYXq!ri8OFlYfar=jXQv$W zI$|KucAo7MU-74a4KMQoQ(P~^mfUQP`^I^xU2DoOhuKt3kelV*mh$ZU z@%f%sx%WzXAMEfmovONzUpOe2Gk8hDVN2a4zq9L>fAZtf%(-pJS09$M_4sl_8SRis z9*mqeFYM;X9A0g@?xNhcHMft=y1eD3u4GH-zR2gZUrX<3dSiC>Q_0-5n-m>AFMf6P zVUPWB;1-KP;E}@xH@=Areo$7Jdim24hWSA;8m!;{%TGRVZX*AzrumNfYD?0)eRnF% zyQuWew_uOLD%-XOp6LZL%}*QlCe#RQjMP59D(U*6jqfLvJIAkPcD>>y9W!B~{hrf| gRsu)6d*uaeCM_<0UB$n+cJq#Jsz=Swuk%s`085IQ82|tP literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/background/_fixed_color_background.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/background/_fixed_color_background.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0b9ef386a7b0a519c1429fdfd05ba6244768fc2b GIT binary patch literal 1023 zcmZQzWME_f1IGUh4D3n}HUq#!4N1h`(RWPaOWxa6dfRxLy8w6kK(Ccjkn#x3Wy-SKGZ?Fo(Rjg*h-p5f7-a>lHB z=~OFci8=8+_OUe*hpIj7H+`AId)ZNnXOiFUHFA3_Q|?_q6!I>>$77`L<`xE>asoX zf1Sn__&?Y>Oteo*+vMB5keSMtLv~hM%~cBezGK3r?F;^|+F~U3uU%(Kwb;sQMbep( zFJxle-e1g5{KE6d`F)ma0sp66*=wI4vod#ne&K+1#L@okhwn;%d3@mhwK+bMq_q-4 zr)H=zzf0K?y0^mS^U)r+Wu6yp&$|S3)G7=YOEGeA@Km8G?+h zRX>fRS9dz)DaG$%pYyw*<=tsTg`4e+-k&#LJgIQ^gSfrgd-c;tKYgpKF`pavJNMt) zqyK)szw&*~+Ryv6Tlbf)Ke_8r&mWFGVSBb{)cm_3Gdb(PJ-+5=QPpX`&AIKeFZr{E ziYe7gE$q#|qyK;Qt2j^+03{qC@CGIyO)!grK@3ELQjoGs%{IvdHKPPe^9Ki2gLofV z`KUqFKq=OZ3=FIpyu|d>l+c2d#FA8vw9LH39EG%; z{KOK4g5cET{JfN6*PO(H;?xvPg=&RbUM`S%OkQA9{eVu<0kaqwWPvmz$SITOOmNPq zlBI25qxp`J-%5$|-U8Yl&J$_F6FiL;<6za%xeBsGO1*USJLoDOsi$Q2-<4a7_! z*X*0NLVWRrx#!nU>v#D2=B=}Q<@Y;a6;PsLPI5v*XnI0I?3n`xCY(MQ`QY8+>GK}X znLI1v$(;F<nt+?8%*fM8b+Y_U4%k)ky l5AT;dwU6fht^L#dXs*-UJ28z@(m5hhb@jy=zN}Zw0{}{nq+9?1 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/group/_transformation_group.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/group/_transformation_group.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1f31089ced5e72e3ca62150145b4461be57aadd5 GIT binary patch literal 1018 zcmV?dOX&?5s}{PdO9ikv;~Op znh5W5&9KJ2z%lmq(`)naOPC3~im1P|i;^;* zz~PtU$2Q zH1mk8G)D=R8~ioocE)2k{rHasxZq4Gtf70r>xt5LN}`|-K0Epo3$BQ-NC08Pv4T~q zew0dof6`%q(k7^z{NgHIhf|nzm|W|ESkyMCnxFGu)1{f|)Z^8b z&bmKw8h|W#hm_$cLyhyN8Dtqtmo9F^tTzE_JxNo5U_PYL*2psbQa$MA)2` zaRZeS9&+HJIv(2Kb?|e*wXr*CjPvd=)kbMbr6SF?S(Xdfc5oC8wt{KthOT{7B2!P_ zby8Gr!`Mx?HI%DqT>G(dr^fG1sW~H8tveVvlYJM_KCayxqQ_}H?&>Lc916aI+axC9 z!i>k`D-$ooKIv-&JexleA!tBK15YY6XE&JX*OuT?;6EetssZurI@3;n^A^$1L@sZz z67+erYo{Tr7H8*i9Iea4yc`+#R8sRRO;%nxNXft%qJN$HnYU`%IR&sCS&=eT3~$Ws zbe&64HrPx%&Q*Kt_hDt+J{L;f*GdJ8g2?

    jfSoQ7A7>32QM0yt-!tyesekls1HTs4~KKQAT6)F^T81poj5 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/collision/_collision_handler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/collision/_collision_handler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..cba9ecae1305b98a4c81c97d4fe94427517d0664 GIT binary patch literal 2675 zcmXw32{@GN7yrgK_J+X_*F~}qV>c19GyM^+eT}gj+f-Z1t0(fpcqvQ05G2X#{rJBbF;(9OmE|^ zAT;moK%&2g86H(rKRDM=AS8Ft(!qZQ#Su=IcouLVM>|97*%Y5u-=yUb-H%`Ern-I~~{E-8@T+;8vpBZmo z*jT%V24u|hRrFrNhHQE|2bp$t6nwl7v9FtWnHe{nJN1tFvo{wLe-$x4ZUAs0+?I_9 z4m`c+*b(wQb?BsFG$ivf^W8b&H|2Qx=Tq&z7|dTV0aGehDqrWw#O;QU8_e;jlLMzw z=dzNz2O^$@PMEYW!5l8UAy@WH6rA9Gu)sc=4|kY{pTG`EtP^+(4U4NJI3=uIwoT1V zs+~m_2JYNT<-&UY%xS%UC^?R4%o6C)vf1#fG^Vb^V^r-Jo1|}S3Dg;0!mky{dyT9b z`)oI@E{m*u;#AJ}k+WLPOAN29uUlT59ah@2s(5zR_I+{2>!!#?rtgSsH2wjaJ_=!; zRslO&lL)=V2mN6myjhM@?((-~EMs*P$%>{+sE8>vih>VL3|{~1DH6TTRb9G!a9Qd{ z$1Yk)L-0+4f#k!nE`v&LF0bgYM{lg-f(=bCaXDk+J0>41dJk$7f_iOtV3|^1%u25c z6+XG|78NDLIZywHn;BDhMU73xB0%%^jB>7?lbdUD=&C{^CuzT?AbE3f-LfWJ+gFVd zNoLItcWpS!t43p`9}m)TsH0asrhnrPP3A;6=?Uiee}36IV-Y*GcoK0Vyw_Wug z+4z;?dXE-<@zO&=tL)=+HH^NpJ?64+sUT{^gOEvGGynV()-Ob&~V+Uz>XBmkT8-eRbEd7#uMQu{T zFxUqlD`t!-mqOepq}*<|d@_`C+KLi~=XQ0MF`0>S1vVNwAQ>`)QnZsCRUP9Os(v2x z$J90V`L3ZV>=gNpxCy0sl})RE@V}jr3F$fO>QBsyoExG+i^GsCqb9#TS_dBi#>y7j zVBXY9leD|0FWdj1UxeOjO~v+qSo&isp}2uB9p>Xvetp;8VZEux;i`OylZb) z$buMb2g#yp?WstWDE{?GIyxnH?o@d1f?L$?CS(UHU=j;C#{X z<4oX5)NjI00|T@`>^D|EFeG&>=ph;8H{>TKgB!LR{$mwKLJ}#@bW>&d(~dj6oPphM(O309 z?)JYk!;f6(v26;Y}*U}b0#l=@sH zm$d1;QUo$mgC)IG(#p4YuP!@REd-&>*n%p8&p$cW{2!9Zq>H>{z5D|FgYW|WK_1dB zI5#)!Z4j_H4=)^68jHhw;X|c^JzWB@(&nI7Wnly(&{}{VP$h4^L}C90qX9Q3O`fHR zAKVFZOv!IkzRZ03tnd59a}5Q+?p~;J0bJ?AjUA7U4e&F#^=%_&*$=Rp9D~ZN zk;8?DuL{OD@0@EWKpCt_th2L2Z+rW8PKJElpDInyb*>e+qcucD8&u>qhS9R3qT;e> zyKAGCf;9@F`sN)**BFxUIIqA&EysvNEi(!0yrOhP8AN>)PetE!2Tvkxg{O$%I|d%M zbnDD~TXy?&>-6mJIacX5>Djgqytyqot&?ei+zyjLFaYJQC4ypUh!XEi+Ose0>0tm>`)evVVTF2@el z;+%pCe{rR5x-mzS7{2lJ5!a$8(C{LrNRm_DJ9N2tX$^i@-?VvQZalcIK z`MPmPpm=Mi3Q@=#UG>_Bc?)@W7zj5+Ze>4BPJX0@Odh@VxH%vDO3(AS0_85Xl-VNl z@Kh7K*yYownNZ&$Jbxirraa;~7wE16y4@OM5w6{tNdk qGS_vT^B!%^VoDuXj4$j^)^Ifqzd0BIWkMF|EywS^g>2cK#QzJ7A9+mx literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/collision/_i_collision_callback.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/collision/_i_collision_callback.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d9f6f8b65e6f4e77d2874f4b742be4ae28baebf1 GIT binary patch literal 842 zcmZQzWME`~fX@sJOgT`t$bTrPP?`2VIEyuB%DoR8l8TPscCh@&3{?ZBD(0*WJeYOZ zfXDXwgZc}F+_NWdd9$JKph8Y^``b-_8(yvGT#?OwT(@Uq{rp*LE*!qG@Q4KWN&o)k z%lY22NjC{dH}6}QSx_T7HU2Yh*zujb zFgbl@*o1@3?}DV2_G~Oj;y*9Ay)W0g?%Nw(N6UCI^V3IlW1J&rB_%#{jg(>78Fn{M zwIE@>#=5`*`d0&^ThFac(fDyGYufXI`hSv~^KLAjJU!;Fzk}t(RpCO+>VhVdf4_ci zSHPR}@Z#z2uLi$gN-bO+wQ08D&Zhkg@)FWs%eQ(*{@WgAAKkS<2kdWPU;)8u1_ovk zFpGgf5=4VStw~P(UXsOJx63DwF0T`e7Ik0R(F0WjrYh#-_B(PNG7xZG{9w`1dx_Jc zR@pYVwmjne!jx&X_23N7lPM41=5}|B-Q{6^|M6#h$5*$Gtzt=AeNWk(zr<3s!{X&r z?wGratKxLC>+}!C{$l^stD3#_ft+O(_tZsV=iexYJ^jKYY~jzfQFq^#$!cc`6N)al zp0}+ENa11i{kGs3-$RS1(+`(!G>md|P6>!oh~{44~j zc|Wu0Sde=e=Yd_#2lT2in8m=L4H5=J@aK5v);b|h#Cl4 zF(3?-JZq6stdB+eSXW$%$56awns$Ld8oz{+uxXyD-BI z<_7OuH}7S4tXOEQl6$)UVuY1;PQ;>Kf8&^wn=L~Z%XY~mn62{pVs_Y6&X)Dn#p&UB zdGnVl%|CZu#Hw$RyzOy literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/runnable/_runnable_handler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/runnable/_runnable_handler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..11d6f0ca1cd30b8422898d02be3b75cf25544f71 GIT binary patch literal 803 zcmZQzWME_f1I8B&4D8+zHpBb>P_XXGceCYJQ^oUYmvw)B;a+~O{(lry4VbE!b2cP5 z|FVI=zdIg3`M+~6ojPj^vtq={Ei0P>JHh*tGO@ zDu1YH2~LlD`J>B2#$MyO|JnZ5yLGxtKK$6%d#^%ubEL!p9zEBW{L>yx_F5~(x6boP z)YA5AFQ#}3PV4@>S^W9=_`@>O);~IW`bW;jm@5q`JYApK9!}V_zFA-PZJu&MmQ=CY z!w2PD1=4JjRT{tkx6f_pH9g0DFQKJEIk0MZz-hxDK0kClLSxK!*ncvw?bTO!znt${ z!iVF|3o>>|>26$hEo9lfOTt>;O{>l~Rk7_(`&80V>yoGQQepFyl$7EdQ&}%9%bSvt zJtIpkNM_}P>GQQ!f`qb9Zjp_QR6RIr+uKDx(GM5iNX+Uj$=|9Wb1L(4+hiZfh4LX1 zb2-k)Pw8eqxt7g8^^a{)vUl8C_VYJZ&cCr@!oz8cq}KQ`tYwbZ(f(Jvv5mF=bLH_I zqn4YC`>$--C$T%B{A>D#@W7sZ}Z;NoA6qV#$D87{2<9S4eRPznJ8J77BT z0kaqwzJO>@QrYrj_4URYTeWrakz*NPYL0~=(E zu$>WP10%@xlgzC9t}YHQ_Imgu?OWHGmu8Z8)`C?-39#)Q2?+@=7?UQSxzqG#kx=WO vMJ0QW?3psEsf{ytkdSwfZG({IO4n<9ViuMw;a!jy)yY(9>UIXu5u^sy%k+2J`Zx>Q=jwrflW=pa~`&euNG48 z+I|~tc+0VB`LcWFUm4{Vt_s~5UK%-7d%=XHS+`l(w@v&buJ++}>fS=P?2?>00AE`FkXUL3=G;J8WbKiD}$KUn&wHbD!F2+v|nrUYS~*yplYBL<1wJVlRyp= zFBe$oHkfn+3UES{FoJ@c5oFrFMXgd2#nToQ+51>XugfT%^w+8sq6R`%%t=m2usL|( zz>l8B#)EyE7no?O8%HkGu{U;AwAWWLHaAt+xWmHKRaw_q-_V^=CE&@#8Pg|Cj#?7X QaOU!sXHS_J{Cp$?01Sn%!2kdN literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/timer/_timer_handler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/handler/timer/_timer_handler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0bfc1b3c291ea76605c6ff5a80a7e45afce89d37 GIT binary patch literal 1066 zcmZQzWME_f1I9ND4D7QZYzBq@P+;a%6%q33!F7f;$Lz$SKPRuqzw{BR2254VIU5q2 zKifd0mQU#a!*{7(n|UXN%wDFnEbQv7r-^r$l-M6=yKF;j zOq>`W7u#DrkIA0)H%+z4DD_CnyvOTyF4Wn1gk$OBcZ#KXd090kQdd)1HgV+aG3+ z&{_Pma?2e3XS@o0%(3|#e3D0_cI3}`wTj`Z>V`#pIy|orCrkJ|lDIVee@#=i>e}Rx zgq9lRttE#8pCo@VUg#~oPx;n@2a`B8T9WuyO?zyb=Jm|%W%Hl1?Vl$ZFkuGYQa5Qs2VU;F()}8 z!8?H=xh=;pPS211|E4R87M+LW7mZmTP?P_I0rA3(l{46X=3D> z>96O^m^^vPj5)GFQ)bSa7d2(pqJ-5Grp*YRlhqp_JZILN`O|}BCPc*WOfzRVdG%8f zBSX=2#f=~fnM%OcS_0h)aWw-YC?7F_+`2qUJoAg#IxWsuJtq9eWnSuU`LYA78cwij zFfgzM0=c@JKv0sAS*({El9`)YxKL=Gdogm)6ag8=CF)-&T8P#IhLyU3}LZ zt&`fn-#fRjUFypHjVc8(T3cKlbGJ{>?NxOR>&Xdijeb-)Yf0xy>ElfIH@J!(3CTLx zbDRC~(}LfsYx@5h{a+rpUbAk^ukW8$b60InI5bal_Ss7;X$9SmW_=I4FRpXq|K3xY z`Xz1q%igOjm36gsm4Bbm2%T+53e_wnId`T&;QNLJBqJyyWJ7|;5O;Y$$-$FCCd{pFA{k3 z_EX-D^WOvBXY-pUygdGK-^-gdTMmEy{A|I|kDR@K=D93-8Fz4%zMuPz^e)YA!wBnh z*WP4Bw6^_N$L+msOW-Rh(_WJkw~tSo;p;dzzwBeqT+N1+J#7m2q?2};iD^s7FrD3J z)2ugB_@=~qzPC#^Xe?vTy%;$8zWyaPYqpI^t75&~SEw`J|5!3bh56hUe!Iym+di0| zEtn&i|F0=%Ky|866fB%rdRR8*P`qDqX+XCI~3o0gCY(T*+38qjB;Txi-B=F zhz7;_M?S3$A9A|l&Z%9r160|x|7LLoxYNb8Z)iPPIxRVT`NGVzr;i>u zaEs%JuEXJ(6+0PDAC;R8GMb44Y{4Q11`bn*Rg5QrG$Y7Sr~RThc*Hqwo%1Snd$=rq zBmbq&REQb~33k-2V+_Z5F3n+eotfIHx{_;Vr7G9Xz+0uEbWWbo zx#oO>dFqxnNtP||Em@4uJTLj6@2#tK%E!|+g2BkZb}P#wZ|1DDz%0+qzR$Uv;a~$lls2r3Us`Db*_2)cwW?K_-wkiawmiEYhE#s zHfB+w?z6?8z--XsDY4R3xAwHaNxy} z0|y=iK_Y9yjF6b1DKlagO_(z|A_gh$CPW2Jnl(LW&4XFtlOlswPM8@zVe+imv%-NQ goPnTdJ#b(O*AZ)p0}W5vnVDzvcCa!u{gJr}095T4$^ZZW literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_dynamic_capacity_layer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_dynamic_capacity_layer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1b17ecd0b847eaf82f43346341d42c71703267a8 GIT binary patch literal 2708 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 I{KbL)0U|EBM*si- literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_fixed_capacity_layer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_fixed_capacity_layer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..15796ec4daa0b66a537e3da3704c9b687f833e0e GIT binary patch literal 3604 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_i_layer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_i_layer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..271cc5b25b9dfcfc74586a083bafc6c4357492f6 GIT binary patch literal 2212 zcmXX`c_0)18{S+o*W4kw#V<6s63so6WR@Hygqehe%#mZtF=sP`iDYtCU*t;380MVZ zSKlupk|Pu){EXf|p7;6V`Qv?__x*eTKmZVMR7^4e0DH(W2VOe(Tct1?JazK6hgXe$ zabs4)8F+lC^0DR^v7{BGrQalk%is)jpE>U4N0&E)H)0hW=)Rp*fV-fr=sb_?lt=#~ zNYg?JIwK|buHv~ZoVY~qm+}_NMgD*rmU?#J4})Lo&t zDUPLvSJ`vuO2e_GnjCsGXXaa^_!Ewo^3@PEA8A(W@>Dy;6#tRs;Qrlrr%6WJ7Z)RV zLZ_>Jf$UDb%Bk!;M&~s-WY@RK=%W5BSE<5Z>FYz@+7$5nKYO-(;Uaj8(C0}je2S^W zVJ$*@2fQScXgVU=K7EC9zR`R53Y-rX&{>RJ`ayGfHHSz%X@BZqVSc=->$Lw5#f|Z0 z=Q;wav`))m+==^ZzN@AfexSd5ay(FbiPu;Sw~Mrg-J|BwK|W;xqQ(zDWD`#syKOPq zQOHKu1g%97CFVP~iwry`E<}#}OiWj)KzzMf0A~9_L0I#nOh0Qv`t5l7GTGQ};P+pP z{Ze5^*(l^ID)rs7309o8Y|h(BTg zU?QV4jx4t=c;!-!kx9U;XBg8gb|nwF z3-wVJ!qtjn1MRiMFpPmogf2HX^_zL9#@i${n&-;;xZ}OqXE?$qS6NP(;r!PD4io_c zsWsDIILD8O?8aD#HbjgY2I0AR?ky;G{^Ib4+k>EU>`3heAD-&5von(;x5O(UkKmxZrwd?Y9nCVnJMms~JFRQI|8hv~AYHo|!!ps1M(#bd8F4&3 zu7Ba%!2he-5#`T?gT^Z^&$3;5whjB)tofJ}{55MNLy zx>Bx}w)JwNG3`gII@T>4Ly&gT40K!Wyeeic)PY6Fw(LS;%$?BU{D3smi$}D+=dMqs}>GYa~ zc^r*6k1AFaY$bnG-{cSY(8VbwBlQM4$RCAOpquDFF|ZzOBJ>d8X{BJ{Dm(YQ>gXNO zt0)e9a)OeQ;)F}P5Y#Kp`JuQg0ZO(H`lXO5hbj_o(KK!V?~ac!f7dJ6^Mni%HZ}tg z0-J((M8IY@f};T!9o@_eco9lJXEOaAq|ycc}NXW+`Tw2}G@A0qojEV(8|A z%4Bk&X6{4x+BdM~K1q$Y)sy5&Jl*&nR%7#1cP_j10M+ab_s8{w-r}k3A)$- zMqSz^-J#trp-9&7a{JY-+pC+WrVl87g5a+A*jVzq&xDl?gj2qm`VyOc^2}2($vkyw z!Ys}O{>&3Pb^!XvlJwM%9qg zf6#S9wx+q>yZUut&=<{i|3-t9`DvbgKf;{%nN@G=?Kt=Oun1sO8t;2Xq^v{+0@Dtc z5y)VNhsSt|ER1Co5{y(Q^ag!(=U6My?v!`j_YH%NB!7XijBa=>}=BG``N`Ef+_A9gd?jmdznu~r;yNUXa6M~R^Wr&ic2Pa0miE}0~Jrz=PF0hF+BcM&? Ue&35?zvp%E%3hs~?^>$=2V}9`yZ`_I literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_layer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_layer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..361ad4ee3c3dc532dff41849c371112f77d41554 GIT binary patch literal 1668 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_z_index_sorter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/_z_index_sorter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7dbcda8a4082bb36881dfecdd134d05f09839a31 GIT binary patch literal 739 zcmZQzWME_f1138L2F`j2oAJVbC^&cMd*J;2=UMIbrp|O|s|@&hW&LJ|8VFf2XK$Ey z|78P#YjV;n|0nvb(AM?5%^{i_>9UfmYl}{M5mRBoW6$doZcThUWo^KJ>pGR%4NHX* zUMS|-em?v7^K(!AMKK}Lov*VMGUs2~BEjQ+c*-~TS|3AMK8{EcWv7oflMGL=zx-fX z+L0Y#=!l7lWeI)+4GAPO;7#cj-32LX_d#nsXBr@7T+FJ zu=m+olszakf8~}FDrpjt6O$cwEO_Ip4wa~g-^#CbgMSH>>v@_Lzy7gjGxzEq%X2%N zR?d8|Pk#EcRpP3r748Yn5*4>}`u<(>@tnO9zOSxQ}2OmUV+4e!*pgjK21c^l(%2&K^ooUxP!Bg=l z*R#^rqO9W~lL~{g9E*5LUNFAqUE-v_achFenTBq%A&Hv`fif6MtYPT3a{t~0Ad+66+*Vu1&cg%17Kdm|b$*+1FmP@I} zcJ93Y>^_6fjt8@+t`OZ3E%M}3PCbJf&wedX8Um#|AW#LSK29);f$21e1|>k3IsRTJ z4^H1bTWRlvsncI1|52>_2T=ndE9N98Ff=D|9L?iAV&=dmtS>&HRIp?HfeM*z4sRG9 LGBQN`V{QTfv#Cyt literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_i_t_m_x_tile_properties_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_i_t_m_x_tile_properties_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..27cd3e9ad5d1adf0a01629da209e9cada8eff8ce GIT binary patch literal 370 zcmZQzWME_f14bhT2Bud~_Wb`)aP?zE(B>lh0N!T``hTbKek-{!u?wOGLRQRK8V1koF5&F z%2A8i$=CPmuR()dO!C{Jj>3Vx5K z3A8#!?ys`iP?jS8;w1m(m#5E!e@gN7yk;1h>vt*Tp*BxdAj|as@v9lOuL=A)dCD3- zflm&hz9+dWCp1;ntuKw0nwIb->aykTn&q!=2w6>X@Am66b@kiW^6C0xmTfa zlP8^GEg@bXeLbf1PVAwx?Duo}D;{nBdE;|$?<(%S&*yC}`8n_VJd4wJH_kut-rxsg IUiR(70PwV~QUCw| literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_layer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_layer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..3a10f9f9f81edaf3eb4427e33ba6180aeb041ef3 GIT binary patch literal 14192 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 bBd-!&FQU|W)Uf2SL@q^Bp#h#GBH#WG?H>uf literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_layer_property.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_layer_property.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0e9c0b7282735859c00fb1cb18f4ac5643308cf2 GIT binary patch literal 494 zcmZQzWME_f14c&%2G(>4n<@K06#O$@A~`$UCu`wP@r|rK=QUPt{ks9820~WMIU8~? z>#zZjt@(ud3z;R2mcE)jWjtYA+O4HLyAH2gw|GlhpKMO5O3&ZlGTYZAAD`%4vvI<_ zBb(FO@8b1?XJV8^-QKQHvIu&O!lZaw>}HMO?1Q{M&vS}S zFPofmiSd%fs#km4n?LO2i`$;>FFRX2TWiY|CbJeR{zm!x=`y{SMBe?c_hSunvwk!y zhW~5TqAwbOPnjPHN2O#t9{YCWmCpD0g~wa3#2idLwqVzd>yDo$uC^`tbNfAe;g_qo zldpTUh^!yN6&>Fe ycjJn#CrAzn)BxFYfml&NOTnQyGcP$+!O+6W1c=NObQKJZ^b8I3j0_A7c)0-M|H`2N literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_loader.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_loader.java.i new file mode 100644 index 0000000000000000000000000000000000000000..349a1f66a47dfd40e8ee0bac908aa10ce7eae262 GIT binary patch literal 3327 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_group.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_group.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b9b7e82050d3adf1b4def03be86a9202f4258071 GIT binary patch literal 1051 zcmZQzWME_f1Ex?0297TfHshNAP;iOkX=sX{bJ7jL+HX7()@_$R3#UWWK*)+YXG3H2 zZyAWxvUUD1xZ2*i=xj~Kr7N5Kyd}9qn3oA%+ow1==0I$c`!;9C%m04Q;h$8JJk{*! z!phFYud8d`*?vEwSi1i*Z_@;6r=8Cq>eVUUH|S&8nfA+}rpm$7rD)nkDyq>pJsx;%EyVT3I6AV(b=MM%WscJ-|DTBSbL_dz;_+f;fifl4&k?hTofh5?AVswP?>a{$zJMf)NbDJ z|NoaTSSGPnhz9;TbK$$zBVn&?i=`6JT6|5+d-7PCW0}c;fAWFHOj*j$T)w^kh}#LX z=vcmIkAK-sf6L7BGwPsdL5LtAA@~YTPK*v+*Ve%e3+j4>(&ZW zuL{=BDS<1G%vATex-sLdk6WkJBpEK#%}rUZNjaR8r*f1S>2AMta?h5J>cZUfm+Ic( ze8%{7PmR=O$20pC&rJ6}w!uKj@a5S{>zHhkOD~;lOJgjYly&meRWCco;-wW_*POOp z4`MOscbd}tqbp7Uv}*KQvs>sJe}lq1aljj}hxKW(*B;4z1w!zhhrrRKDAY{dyuI(`BSFOib+~NfjeDX z`-aw&rPGo_mo3aZd-~{s1HXhi?lbhJF@3xt(ip*dh?zlmirfW|1xy>j)~se=;F<%m zkf|IEsfvACyV5egmuRp5R{!=gV;R~Ah=b0tYy;k>=3w&~6zdo}iNVbBW9Tt1;Ylxcyr<%L>~CbES6hFzlMTdD?Vt52skq7>}jPr#;x@$NXx=qAQawEwW+#lh+*0&v43O Gh7JG-cHk!f literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_group_property.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_group_property.java.i new file mode 100644 index 0000000000000000000000000000000000000000..22d83a6170cd169d89ce1e162baecc8470812ee7 GIT binary patch literal 391 zcmZQzWME_f14efS2G(K-o2mRi6x4cMY@e}h?WK>)4!N#xEqb?k%9^7PH4w65&e@QI zeuoWsY}W_#pW$0~u zlm7bXdB3wqt?w&mY)+4PYFSqzzG`pCiGYbqrcK@Bde~#y4C7U^c3X5QM_#=Z;E}y* zQsli2mJ=shyJs*f&GdQ1q4wc`tn8LXb)DaB4vMA( zPg|NZD=m}VVDC>lrIpb2vif4%zQJZy}}1dFTIs z8E%~|n~sRylza8nSNQ%z hfhf(VtzYLWoS7PyyL4{rg?(|mo~eJ3UVS)q1pp^pw%Gsx literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_property.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_object_property.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f1d75e4c543464bf2290b245a7299580512324ee GIT binary patch literal 486 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 HF8F@{(o7v& literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_properties.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_properties.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c42131ff65582480ef16af86c0847c6581f15bae GIT binary patch literal 901 zcmZQzWME_f112^G26k2moAKv=C|JGrjkMqIu%Ib74=t4c*4*dpa6k~E20~WMIU9OE z|CWJ39b4!Bhw}m)4tw6v$kxmVT^{O@Yswk+_A0OVhi5lt);gvJ|NkB<lZywoXXfdMJ12!bt6ACSJ{3oVw*NSTuXJ9dDjqa{1ks&}q@` zAAIwcYDB2!&6&Kr`svG%zx*pqy^?y>Gf#9sJ$(K4VRu%^Z@=f7eRU;+!6;0bQW!ta4QUvYMEOWXS3N-rRExQ_0KmseSIRo zUaLOfUKly|RQcw`A0!@qEn<^dc&sORWlw*|!|>&IxtwSG`yb3KBPe|!x#P~twJI#f zRQl{f-LfuRTXS%6aFG4N&!=YTf9^ME{XYF;flZyYRBTM2d!fmrH+RELGgLPDbA4U4 zaD&w8E!skx-t|P>RTQ*(acEIh<_hjt_v*KWEjBrD*)2%2{?c2=yOP{RUDe9A&v0G8`b;0e{{b#iD)XPk-H-DeztTl&mo!Pa%xYJvs zzO9?nY!&mz|!>-*Ayq`xhK3T z*3?7by});|xo2`AY9M6AoLE0^u0sX_YfD5ATAwkB-11`A72y>eVujMGYnd~nJ~P@^ zBld#=Gaf&!i>uQ)WbZi4|Ykz4-{Y%o?|=4$5!Zq@#2FtM7hwy3M{euu$@A z-SOyy51uwJd1vC9%D9lF+I6yY4c94!=Fo>HOF6ywZ_e2?dE*ME+xLi zVVQlOLhI})Pai$oVNz0~I88`*&1J5CO741d&-e7cZ(#OGd%A>Y((`=>P5k$P9L}^8 x?0gaRE-{j@|$O literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_property.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_property.java.i new file mode 100644 index 0000000000000000000000000000000000000000..185d32bfd9350e2b01275718c7bdd52df2d19c70 GIT binary patch literal 927 zcmZQzWME_f1ID8a3~Ude>^1+P;M@dDex43p-jckDH)n{h>rBQNmk@U}b?>jdI z&HA^z_iEXRAXVN%&o|=HRr@`_|P=B^>Bf`;)lJf>NZ?f+`5-dr+a6Z zXx6R9r2z?m%aB1D# zGYjW@6k1##_P#PO`N~Y0=Nr}q2kp`h^o@u+y5zn_#$nD-YrC?9Vkg&!&Qa+;c{bK4>g=PJFD$YWV-B+yynFnngR zn=5);Ry^d^xx0Y-%C%?CI%{_AE&tm*TWaMsp{U@+ZWnj=_UgVbwM$>?Y`iSPf6_7aqX;BNhWpFc|{YcQs*p*q#=l1!0=m&yqU?R8!W-%~s2hpH(@P6xz+zokh3mcYt#JHM#H(a~_eh@?rgshm8 zoRBc@?12M+dKw!KPM*A3MR{|CzPXO!a+A=5VG9pzT(U&Nc;yzAtr7aRTUm70EL^f= zvB0Aja`FOCD<7!mn0ko;`i^z=2CVM{*sUXCByN>##@u z5HrKQCg~`Ug-ixuYZDn5*li&WVEhTB89`1>S6W+}7XHt9gC(QOas%#`yQ&Q}5H%1I z?9|vZ499pn=j@4@!}l+BrK{^q&6N&ij+sGzX`7r1JOk6>b~$<4wJcn?GJto=6CE#I zP2E$$8YfTaTs!^M`;2esg|L84q2WwH0vk6RnG>{O!LCWB0nWPm;tY0*vhE;jm?nZP z;{!U-24XE!IY=1fKy}G)VID6xtnKwMjId+$Kj-cpe+{ArMzStuU|?MaQqRi;0AKrx A;s5{u literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tile.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tile.java.i new file mode 100644 index 0000000000000000000000000000000000000000..379d665b51de86d70897a2775ada585377d41ac2 GIT binary patch literal 1045 zcmV+w1nT<$0RRC20000000Qa&01U$b0000000G1Q|NsC0|NsAXY8^sf);Y(%&u=L7 z*dm_S5=p%P00000000000001ZoXu8UPunmQeQu@xhbv9mDB7H|4~fB;Kuj>C6-|IN zcr=OIdboCEJB4cMf8TYI61!>2hVnok+Q#?#ew=f1?UcrMbj(2MF`+U^*v$PfIp&fP zCM~yfBIulHV!2=mvD1hBUbolf(^P2-zv+yU3{B)nYdZhIjrGlIqpB4D2x8fT%`_vL zjk%KKs(8G}pYj;d_I9re+i*xTJ5d_Wd8`CAaH{E4@OV-f4VN*4ox$FR&wC$t;T;S< zk-;u`KiC;Khp5+0vs-kB821{u8eU&vBk-r!?L-kAJpWS!I9AeFDy?ZDUP~pNa3+$L z>fzGD^i-%@DjaNQ-;kM3s`-ps1|u%1fZW9yFVy`8>#-8qRBmwi#S=T(VE@kec;eL6 z38aF?nsVA>R%fwQx+O46A(j%{s`^WPgx`9NrzNhnwF1rBa*knbwLosU9HN&7kNy0; z=-3H2B%mD*!Xo!8x3Wa%;ijM4oHFIV>3RTQ;$|m7^4Qdo@FGf`|r0IebNe@$s=P$lt zl_@m%;c`nsxYREfwcCns73aks+sYY4ef*&75@ zqt~sN!#&;$z$%C-vJ)cuY88Z_W9+rRz;9z2O;&ODOKie7)YgB_{eK;%WzNTo-X0k$vZ$wCDPO3&)W?o{BLS|lxLVFjYP9Z(D1XT>E3hFMH+pcVMQ98E-Z^!u1jQHzu}ePpQhaVbm^saH)L67U#Ndy_0%QPlb_eh zMZ9;$+~wcz*{#)@_wR{i(9$ev+)>Or3Sn`U@)x6it;Bb=?d@%=%Db(Ox-OB21oUr&jPSFDN^Bh`UUT@9^KI1K(HuI;huv<($+89ih_& z>q1*+l_g|~L`1Q!`|2bxuV%eCOTpKFs~IaC-!QCK_KIf_i*&Ei(v`DRT+{l5Rp;%$ zlQO3y^$mZef1f9A>NfXeA>V5&)up?IuChE^zv7FuXs*Y?tk=onGvsnx68-FA_U3Jt zIeGG(yzE>Dq5kmCN4NjXnD{5+sOP2`ckZYzzN#~?uWzx~G2T7Q&+YzIr8idDa(`WI zJo~suiB?tWWL|;oT0Rock2c4;Rrmix3@aFXq)7=;M zGoI1CvkVlQpcDWEGZ+|H)4(hS#x)=sloSGHZ}_^mhs`bDYCd=BD*hXXpRJt^Q3D|> z<|HR1Y)D8*c#+c3u-V}cUx%pZ77>{)86hO{kidr|^$Ih?n7M zl%@~Jbxa9hH!1`Dl?rAtFm4CZj39q0ADZW3wbjJvNZ>;AT^0A&%n|<=2vGwgnSi0f g^Z>{c=j1FdEl4fWC~zz(DauSLElDlbwC3dk0Q~P@i~s-t literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tile_set.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tile_set.java.i new file mode 100644 index 0000000000000000000000000000000000000000..346142bc0429c90e73a6aba16e840297d0125715 GIT binary patch literal 6526 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 jn{i$J^P+s$Ohb~ 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 Yju=E001rBq+s9aFZEyji3q(Qx2lT&PlK=n! literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tiled_map_property.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_m_x_tiled_map_property.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9ad80d7592b2dfdef59e25b4537aac67de77bb62 GIT binary patch literal 497 zcmZQzWME_f14b7H2G(2%n<@K06ojdIea+Rk{4B9^>3^rob1d_AGI>JOK*)+YXG0EV z9X8;xHJ?y_A+w~_(pR&mj3G}IxX8RiJHzq|L`eK(R zS6rJMQ~2>5H%l`2vC?S|-OCs1Epcm`rLxuMqnNJpN`vGOGyXym_f2bhmQJ`frOWc( z2GNOAkI%Zm>S8qWh@j7d&g&&cVsT3hx~y+R#A#{zJzp?6N@2-Mqgb8i#XFjBHu=84 znKR4J+Cj)YwDwDZfZg?jiQmg!RJ^J9n&sO%E$Tp9K)T|$$G>|P2TnTh`2YEx2X1A! z$4q{`FwTF4mD2QIl3oq%!`N>`S1L?P|q~HV6MrEb>DIWYM*5B%l`lNyHKX~ z>$iKnLJM1^Z?Gp@IK8>>e&+q=J2zCeFKem2-dVcc{A5`5Dob&T1qXM2kmXyr_F7!T z|Gx*lr0-5!Rwi)ky7%=zEOpGP?8)4qkOYN35a=SsK{-eO6b)OF9Yod#iP|sBGM%b( zL}8v&z4bnj91^GjvgZP^qJox!Lvdzaa;k!%g_Q{q87k;17#isr8t54r7#i?$0RVTU B$nO9E literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_s_x_loader.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_s_x_loader.java.i new file mode 100644 index 0000000000000000000000000000000000000000..43d89faecce6e089179b13d3326aef5657f5c5d8 GIT binary patch literal 914 zcmV;D18w{O0RRC20000000UA001X!a0000000Gkf|NsC0|NsBVaCDNY1>joMTP=BA zq8Z=Gs#)j&00000000000001ZoXu9>PunmMex_3YhZ7H5$~qUe2N0;zSQ)Gm47Bpl zSChD{x5Tz=2U1P^@4GlZnxtVcln1Ixah&tr=kGqBPf`CjT{4h*NvH?{cAq|&SaQJ# z6PDXG3F(??VtL2{Vx#1w-|P2yq@=d+i{4YhCHWdJ7EH5XDpYJ|Rx=u%Y#B|jza>6X zmP^s{v9_}IIUz|D5=FIP+K?OfoJg_Y%UILY+Y@f<>t?6(Z0U=P&Z%#uURR;~2Sp^t zAz=k9ayy$}N*c7_Y;`IX4nksCVq?w7ZT7sP0yCvwwf5SDHTAXW#tjmXQ7>cdvvvby zC!>KwR~jHFEqOqEDJ=3tCh0S=&SbQ=*YCj|e4(*jNew@^FGFhJLenVZ z{wn)uxbPVq93CGW9e+NAkFbA4@c(K5U_Uh&^?NG5Lv!$Pt%00orr}S&w=){S`1QZc z0YWyG3Try>*Ab+1&cdK0JWBI>Y8foJpdsY>foPMchDBY85N#>5-9A@eX}?ipmub>* zdSts|Ceu}^D6dYD$_K-CVpRQo*iMJ4zYm;hckGHAQltRJWvG+Q$40bqGv2mo5pvuN znwma#mWK;wEdqK6GdFlUhvtf5l?e~mh7Ng-w_7b= z&2RC7!qh;Bnm$JwPK{yq8EJEYbLU(edlAYz8m2y`XT?{%vAI}+a-MFeT@Aplw0tOw zad~m%>elOQu%j8uP=J$ZipOgUQh*^#W?cy54cryyRU!_Y-XFoI)?Y!sol3I-EI(R1 z4jKsdu!YXsoya&0K*)@pDqBu4G!1tQyYQj1*&({lf|tjrD1Z&Ny_b+#>4891UY_SP z+g_fMMh^oJ)66#|8WX@pZD#X6F)0awgBso{w8FQ)|qSD{I*&;S4c literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_s_x_parser.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/_t_s_x_parser.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0bc9b9d249d9272c7b78aad37edc29dad56a7202 GIT binary patch literal 1044 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 W+a~5~qWh+U&(14sD&A^l$o?P4V-dgr literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_m_x_exception.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_m_x_exception.java.i new file mode 100644 index 0000000000000000000000000000000000000000..148786108dca19c4c311d2019e7b65c5a4196a54 GIT binary patch literal 470 zcmZQzWME_f1IB3#3~W=N>`VWlVC%KJk#qhV^54`CuTB28nB#klm>)z9gshlzHuSdF zVF!WQJca)T{)=2EZ`pW5i*;$7Mnrtn(d%#1Zt3NfAAaW&eWbp;>SLF=3O_Hm1s zU^%98E^|rGg#~LRo86bU>~nlR^Iz$Aky{g%v7e1vebM96wK`+pY|qz4nmL-CbG5HT zdPYuF+oG)!89wdW>V1{>HEvsHdu<}!|%EA)-haM-&JFgB|NMSwPfES=gQ@evL9s8>k3BPq=dX17 z_(vjAynoJIr+P(~bi<5C>k?NfD;75Eou2jnnZPTl!>v#Ev&@mmeij^E5pgQKE9*|< Jc~PVN{{h$*-J1Xa literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_m_x_load_exception.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_m_x_load_exception.java.i new file mode 100644 index 0000000000000000000000000000000000000000..cd0e0efc3eceaeb898724955425152d6c707289b GIT binary patch literal 595 zcmZQzWME_f1IB3#3~URb>=pl^;Eq(gp%8!1L_hwwABA|lOOisX_#tW_WW}7bq4)g{ z83@#+o&48cZRD{;TA(1o!(>4lOATZ1`c&%$8@G7h);#iKfAyaa;)WR|{5qLsk?YIv z*M9#x?bDA&f59y?jn++Kkq_4o30^p1VbLMonNPe;&Tw{e7Jp_veIjK?hheGHYUBH# z_bv$eWUFz|^86hi=^cU_r`B-W;j#o zq~O?{fw`M*WKI^pEq(FLsihTrrnw(X)139l&@igv=Ii~LmoG><_ImApv10=BmTB*f zpWN2Ic;-d_8Xdt)<)6K0-A$f<=O1f=|D<^Kf0BR76F$HAX=>HZ)|arujL*G?c}bzG zaOxso1H&r5!=i$7um0ey>RRAe(ZgO+xvheqJ-}ZxOXsiA1EgfixqYFe0gshm8 zoRIJ$Jt4t@daCh>#f{fd{=6zSF-~E@BC-kJ**?SN*5VB&<*^v9* zhYbYk;uiitYy&I@Z$?Hhtgo zYNfMV778u(P~E&I;q${szYeHpnAP&nDmYpkmCanPbZt`f42gMOg6qG#X@~R(wEYdc z!LMx5y5jU9zV1U|JBm4K^iR*9YkfrT+M&Zah39*Zo)2kYUFfA#bDn?wzHn|Pi9i3} zFuFxWKI+P0t>9BKPCCqaFmY0Lrl!brg{@JIuF5-VoRVXI_Fp#SQRs?F-`ibw#X7&- zdhd#>?_9U5Zk$?DrW~Lqx;0etvRc3A>{Tc3y?!=5=~Zu#oayZJj90wwnQz~|Z}>as zSxU?75Hq(&PUkK}ZTDc0u=j~S5h`HfsAN*W^!Zbv&E(k&qw}{nc;_}Py{LJnJf)}X zwUp0P?b4IUHcCrtuTHSGd1jX$a68TUs{Q0H9yE6km$ApMF=PofgqiM zf$ad01_H)QAQBXtz1AK%XMFx&{S#PpRnPbH2DW2okAdW1pkhvPLV{i@Lvq{YIjl=P zEoYwOQrsuV*y(z7ui@A3Yfv6Ez`fNux>* tugKb`PnjmM@bKzso;u?luJOTFSI^JK|7xJZHN72dIop^RTqn5h1OR4)4GRDO literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_s_x_load_exception.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/_t_s_x_load_exception.java.i new file mode 100644 index 0000000000000000000000000000000000000000..59db88dacbe28a8e821a656f9b7a48de968d73fd GIT binary patch literal 469 zcmZQzWME_f1IDQg3~URb>`VWlV1>H5q;m*sM0~v|UuRi2Q}Xj=nGiJ)vSQBJP~YrB z4g$8)C+cSeZ@i=yI5DF8!lJbtx4O4g#7_2%+4ZjNZf~g9|LWuYb)FlSo;@gVV#3_o z&(F@j$vL*jeVUTS+$x`AhI-fJr)W-pv2e?sbv6gXR@k0qJvMKy{@yu0{L=-~rfFBc zv|9H#Tx%V(=#HeFb2WL(ZGxI4Uu2qz+sw)p=bbL-wDsny_O))Z=M*!lzFcd{+EDf( zR{iwyCwzi$O%3FH*}9IJ=TBsqE|%)UefZ?@^Xb<$f7)&N|1XEp%1i3>5>wU(f-cK` zHbt@=+A<~ZkgBl46rY0&p841;Fmw68?|!RUNb`b=E3Up0Pt@f(WUzwYY?aug>$>iO z;!{ErtzO$~@)B45x-IkD?WHxlUiMBpX?*2raL|@7MHlL$7f-x8XVsL_i$;2F89a0Q zH^(v_H(opMMu4A-r*yBVh;`rqr=Ou-% z!m5F{{I|?HoT2NIZd>`VWlV20Db$|}dgtS4 zM_X@ToE!1s_UjVs;C2n3u21vsDn8vSw{G%o?Uy#^oEgJf)INVOw6ke<)b2|7|NlJC zgA-EzmnP&h^eb{LpQoZ|pjPOqoVtW9_pF4CmFibrtMf1K^YkamoBg`oyhA?!+qOrJ z`!C<_+}-?RPujMLm;6Luty#EBYVob9nvvHVEm6FfZ?Nt4W%A7Z+BZF0T}lk~-Y`RGXEr X*L3ooX>wV=q!N2Ye{k6wpWg}qtIF9h literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_i_menu_animator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_i_menu_animator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..de750de99d42dd32983dc88434a7e732317268f5 GIT binary patch literal 453 zcmZQzWME_f14eTO2Idq9n<4W*6e!M>V6?54nW;Oc_1$Ln{dd}ret8a61EwnG> z_{V!He5cFuwH`|}3toAj+_kBxbJtyi2E92+Z@F?G&I;Du*yP>4^vRZt*`lkbED-1C zdvx%g;v1(s;ve_DIKFp>WXGWcSB&lX*2vtn{PpmoyH*8P^IDCjhxh%t4KA%JS`o9A z)29ACc`&H(q7?WNC?}MeaY+lG3YFAG;m#J!$W_jWhH8DY03`2Ge+= zvdYu)6PJhn`nI@F+B4bxDd&vqTW&@EHk>XcJ40|<%EvzA@IN7DbhbGIOj}v5PNX@{Xrq98ZcEcXYIuE zUWXk7j=j9ty63Qr>5F%2nU~d+IGTbsRDIxFHrsQT+07PTDUCN=E5Rni3 z)AC5Ui+@FRf2Gflea8>9yWc6Dee2Ndu+mQ5JrQeU>Ws~zb446AE*p5JbMIi5EULEsmj5F;u(AEY9n~ z#Vh-+NnS}$KfmsCGo$lYXUp`3mP@yPxGrsW?AnC8I~LbhzhQq|yk8m=P@vESf)HRB ztASYz4EsPdD437+g#CQJW)J5gzaxU8C&iOKf4cA&ss>C|%t=mQXm;Z``h@iecVmyn zxu#1?=A21sUGnG8oGV9cTL0MGzp^Lj{G=-}=?e>JP+W0}y~wwR%QC1YT=!Ffeyd1opa&!Cnll3Yb_a|j@6V8vYtEG3)E@Yz zQ`c$f^s9G2Jri5!pg(0_*wnZeIT}k}v~5pef7FqfKdJKfq1{(fq&LQ@Kkazf`KzOc z(Qe6%sj4<}_8()CPP)8AR{FYsK+&R=WiuT7j4tRL<-a~zo&BGDp!xlJ;S<}}n=Nd8 zXTG<^UU$F5(mAn9>i6n_{uHixM@?0p6<-w-fsSJlM~5jKOS>YE?Jq$|Q!>MdgzE*0pX;-kh}Nz*Of`I$t6l8uPFPvV8u(-tM5& z#}elXoNKXCpsfB%Em za({jtc)o;vq213t@1jx?W=owlkZZnO&ot@U`RLT6j>0qki)6&c-xG;aGM3uW z;@1^H+TM+K9?Qu^NSD}f)=mEGo!OgrylKy2f-xU=6pg02pK48pgfmsX;X&@RDd98I5 z{g>*WXFszhL;jDqa@)HD?+T%6pcD%S0|N^;ki*2w1rlQH084lRO)~_u7#LbW!XVR* z&$8x=-)wegm9Bj!SI8&t9f3msplZNW#hm1X1doJ-gc-a?{ATWC{pqU8_0#obRcEE9 z=E_tBEmM74WBpM5{R}5gT-5eltD&jubyeHT_xzdjm$@4Ynh)4y$LTR_)RF>Q%y;YRC#U$&)gCM_e70TP-cUjf}d#Hk4`J wXyReKeL{)jh@L}c?u=dq?MuPlHnAoL)C!8kmNN044Q|L}%VK7Dy3NcM0HpL`@&Et; literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_menu_scene.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/_menu_scene.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6a203d5e0da287d28e2fee086fb3e82554928923 GIT binary patch literal 4225 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_alpha_menu_animator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_alpha_menu_animator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d4cddc43b70638d552b1a24b5c9ebe82fb5014c4 GIT binary patch literal 2897 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_base_menu_animator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_base_menu_animator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..244453836a3a1ca90dc4f02b0b92f317b30b03ae GIT binary patch literal 2058 zcmb7DdpOf=AOCHb!;qZboKF=GlQHUga?0W98PhUSM%m(_=1`cJJPwHzN#;D-Yb;M9 zddw-6R*o}MS$c|One$r`7V*-%t-XhT-|uzZ_vd@v*XR0vKlkVU-T(*y0pb9C0sz_Z zA2~qyE{So17Cr8=_pcoNRM2Viaxs_;itHGL{iRGT?^M$if~`_GAu;j20pb`w6!7Z$a|K1I$KAuiOMEc8_SJ=lK6uN!*4+HMR-bW2`4Z(aT7M!Ct- z-)BY$J85V4ugnt9C=f|3^MRr(I@CMqTJ6JL>JF^HKR(#F$aOK6zP;t{ff@Q=e2O@) zmEoetv*$K-Fg`FB6$!;EyEVI+7Gd|FtHS!gmQWjb$@#v~%-;DM()!_Sm8t>B^TESu zvc}Tmt)RGjG0LHBwv3rbbO7*@eZ}tN>%&$z&N+2XoP3h>I2>FQ|6n)ob*lRp#qa5h zgRSWHriK+e>G&X+@?1f&$KRBz0u|w~4>wC@YGFkCH@@BK?VpdWGHfr`SMLw0Sljg} zxm^3cU^DQZ^toFauUs4D);y5J7KA- z2dtJX|1&1SWCH-?Ns>W`6rpHdupM=+d9(uQpO9~f?)?*dfnY>m!Vv?hA~}zPzI;eM zvoSTt=!4#(s_mXnl(N-!isCfYD_dxZcfSbj-f{tebXu z$DB0zRqiX;UmvxKYACb*OW6vr47#=zBg-&%QLTbMSgzR_rR6-~!};3LRcH7RWx$8C zs%)>9GJcP$=s~Gfl|M6BqJ8ftvF%vL`h$7Eq!fYd!i~N6|E7$ zap^(b4du75hc~!4K8W3(T{*9XsvO*kxcE>WBTK(r7+BIjPW zxO`rxC+S$tR;Pt=slo7HoRcIRF_0=k@OVcSliB-}$>cFvtg>?d{IWob4zrM&mSVae$$y`kXA(vvU;czQpvM2gI(J)1Z|7Qd^ z#`@;$5W9y}hAR#zEG^*YQ_85As>-OkN(`@@a$*5XrUcfXsK6H8rPWr};qTN|-u5Qv zW9v(x1xovnUPFVZwwY-#kaSo#RMbzZRNU3;e+&~{K}sYQ-KcW7AZ*uowZXHtz87g} zb~4M4#cav;!?0eVVZz1h{XYzoF*Ti`*PNBuRv*7>QB+cDO04%wl_|pOFw%VDK3g*f7+N!ZB^M@dDxV_3#J;lw0)27}{$}+A`_g7{H>qC>|3=;Lv zH0Dg3Uks|z%1hMc_{PsBKp1e&vyq_qLwfx!8rEje!fE;KjnYp!7Fh`NPn~WDoIV5( zP}~=yGMa)8Q~{@se012-SK1_v9S98>&q04Za?;K6MRUl63;&eYo041c9ou882?ide zGZ@Xi|1fpR8UE%RmpAKtEIL^yR9e4xb47E#oPnDx!1_A(KpAx+Yoyo21_}QIG)YS z7|ZK8l0AqT#30$MqcF_U1p!o`7$ZAi&)O8>c=TzPb3bBW!m9ga-^)Jk_zo7*w&>zeLyA#@3m)Yk zaEbKu3)Ma7A@cRXU?p8;ZpNLIAtuvY=~xulFSiS=mkFMD^~mQr`PDmKdiT`eqqwUn ZuStf~>+~l8hj6eR451qU>TLY+e*vq9fwBMq literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_direct_menu_animator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/menu/animator/_direct_menu_animator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..43bc9b183e58ea530a4eda4ef32c81786c832580 GIT binary patch literal 1297 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_alpha_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_alpha_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1098304e9a4dbe66cbe882774c317f265913b2f1 GIT binary patch literal 685 zcmV;e0#f||0RRC20000000M0Q01F}j0000000O)J|NsC0|NsB7DeJ`EKC{_8Gbp6M zBTdCG>dL1800000000000001ZoXu8kZ`v>rRzDJn|8SosKr9AACqgx;s4W#zyG^3o zcjH{ZTd*VBp+nRD`yBH!f}rc#Y=RFYzT7?c_W0~GkI8h|2dx;9YD%bxB3$GT6jLsc zpfKDliJs9E$y`P}=BUUZNoVwaz4E`(1$8(I7k!w#i({Phx}A1Fdr=UcPdZVn%fdE> zlU^LrZWu+JeA5ksXw}L&x@y(GsBZD zw2xGyHMIZ3OfbWxaNbCxQT3n!mozgoso(==GNBr76`d!X%~l^Z7Yv~j^xHwd)rPmw z4*gc(cUtXMu0X0@noX=aFl(!!P&&Zx21TS{%*8apFEq(;oKi8)%e__lQS~Z>!26f~ zRsdI0XhVh3CE%45(vV{kolrckL@HxOs*<8wH^0#KTFeDaAWkGTkX~ns=A3InK|EA) z?yUCY57J5NjusU&qzMIv``0(a!RNb&x}|#M=RXZ~BQ5xcba(ZF zY>M{(GYdChHqdum+bwK&X?j?`&P->i4daig9RWFo-u+e9&u{r_3v-kPN*ZJaqk}am zPT{n$ECyEm^c(;3;{ui95gsYN9rsdTt?sZCnoJ20__!BMPWT@$7G@;4;WTjvZmq!Z z4b%3v!|u#oYxo+C6R$~fj2s8tKi}^sRLtIN>@Dfq(&<$}mDt16A=OCaQ^;QIU?8Me T&Sj>-QK}Rs*~0w-FcDb?^9D-t literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_color_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_color_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..60dcc797d3bbff4f5e6a41a42c37cb3ea86e1e2a GIT binary patch literal 731 zcmV<10wnza0RRC20000000Nr;01bHn0000000O)J|NsC0|Ns98Bk_$g5HkHc=LBFO zD|nVA5dNS500000000000001ZoZVM#Z`v>rRzDJn|8SosKr9K+Frb>$4hlkQw`s6_ z_nZrO3wC5XbZFXtpA%lgOSMi}MaKt%FXy}SbIDgZUyee8ni_Ib-^`rX3+w^($xN@vn zxG`-bQD`=r?|#gwW`d{QoJyr=K?SZ!tfxZ4dqzb_6bvMpg^W&@FBRhyq2_fO?T+Wd zYpAzvw`teinwuy%MJtNG8g-y%uYwG8fIl>HU%^H6 zfB#t;=nAeh;acTjFQ<_D3`75n;z=QrG1Wrm6xAyEnY5Pz#z_c4D2Rrr7fX_Gt_m4( zUy9i$^!KD=aVSeP2NH4L!dM)WCfe@|&kmFmVL2sRK~I?~?F6lyAqkl9X*{&O9mf7&LueSEDKg>}|=HrRP zoAxd^mddFui8_`XI6mw}lUxToM)PP{1Jv5Me+8rT$NBWqdo)v%nQa0goxo%mMhU{* zWD0VI+=LnsiaB-JOm;R*m<#5E;0Bl>XPS{P9k5g>QwVFS?G?>oEgq}5ou0WeV=L5Y z&Pz)Z>upQb6MQ-n@e@M*h|+B4+KkdY!@*}hNRCuFAMOr$awVGo3vj~)U(7^oCijH7 Nxe(R>_Z!w}D+Be)S1bSk literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_delay_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_delay_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..36e668cb6ed4f23e3003b8e5a27363cf9c831f8a GIT binary patch literal 585 zcmV-P0=E4C0RRC20000000IdB00;8`0000000O)J|NsC0|NsBWi>|J78UQjoKq5YO zFLznj;ZL&w00000000000001ZoXu5DkJ>O0)gFnI|1hVDMQsep0t;28t+v}0QfUvU zKVYyY;5OKi?a)m|bE{Y^8-vB^maPGTcmev*-)1vBEL59z)U-_anl)0VM;G4CjL(=kc5dIKPVr z{oyFV`*hA@3T}cN`Bz*Jc;;x!937aWEpxQzd>sa1AXm9I?yvEar)sRiS*H^Q(18am z+)^9(D7nti!n46uCi!x^X{F)>aXjw#$GrqzL2ndwlPK=?x@7*? zdQIDI4*Ozk|! zF_h7cxFc~Et#0vhSf_V@gL6Bw4pAB(3L{BX{8+%(%22t z?j7eCyd}0}J7{Ryf1eX5UxKKbqKS>w>pY!I#_C>&yUJk$-MwFQmDw6~k#RcU| zNF*qoa7$w6R3ph$BDg?99#kHu_?4zPPBoR&Vsx?|48PF@EoBWZ2Eg%(_M)3khj-i8 z{05V#$N6>Ce{&W0x}3(nK8^b<=D|gvDf>=m2p%L{frJ~7a0L=RA>1~DW*{=HjH}Ea ze=M)J)ycUN=|(ynQi}%_PPWrNUkAO82k_scTrww=EU8JW)eN8oA8798%D`vAR7x#8 z8k(ho%~yj~NQMw~2T^|zMerIr{jl8)qjslVB#>sHJ)vMgW9tlM4wx6QQ1xg4e>jwh zg^CK_t{r<1zR(mi@1uovY@_qD88iricYpp_3EV4b9rZKRpjQ*pNMM?r5l?B6$(d88 zCaQJcR5i*=E+kEXr;0kz54oX5_g=zYcw|&o-hOv5@I@UBZ}Nx7^M|j>zG~Q9dxD)= z_h#Br-&5SG_?N8l>%1#{3hylrpm+b(W5(ry=s)Gn-kS4CSig4pwMQS1*XP%9`Ty6s zzuJr^2u^mXQ4X2Im&cJBSlwL8EX-b>=L~-M1$k`qMJSrpDDF`Pk^1mSrQ zhf!E3FyAYyJC_c4XRJnUfjbccz0(BxX-TFA`k>x+-Mt6bTuz1S*+3WD3;goE5o7S~ z`9~{oqolFuDh!}E5Ykscd3r=V&4_fxtzTvgmHd$wk-SO{UoRVOn-!^l_hQ|JxJNV$jaVuKg-jU zhx$Vp=$5Q?IIm#YTpW+H7vwfPw+m%TvrMZ3mi16>>V1pNr9;h-(-E!2j`w(g=CU@u Z`{TezspPg$m4Rk_gG|ji@DFPrH2SIT{DJ@g literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_entity_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_entity_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2b7378c1a4a50c029ea5f9001558a1e1e0b78225 GIT binary patch literal 504 zcmVCOe*x1-EC^ zVQy%;x4ZEG00000000000001ZoXwO?Z-PJ&hSQ@Y{D(O;tw~wXh-g33kF>_5_Tn#C zmqE9MU9!8Fnx_A~3#hTidT2PvWf>Ued1v-z&m1Q6)ey8|M5;NVB93ucE-2<)AVFcc zSrNUUIg(7qJmILwv8^ z2CN@;oHHkN7*6ZWRh2iP8wD(B$wwsDW z+HKc?Hr&&~ETn=r&SXk8j1_dU{9&&<3_`d9zw7w}uj2=PnLu18FJ?9! z=u8_$nE_^tXs8u#fPkL{MXX_0#m%~nJFs1(nAzqujQ2kLa-9|-aQpwOF7PCUHq;Ut zsMnCB7mjIsLVBtZse&1)8d9~k#_uh?xU4p{rHi}_tQT9~N3s(xXu5BUSFWv}tUdC> z&wnBQ%Gn_+X^5Snqk%lF0PS-+%L%t=|Pv10gHsoDGTf zK5QUT8@KTPL%YttoBG@H^0ZD}F}zVT^OxN1+j=+dO;HhT|8f89u2syb3%(>SolsC* z{BEbZx@N?eGeInh!R>)Ek55-Qcv&uNUa~XJa%V^7p}@YJ)7vWII98TF^Uq&ZxW#(s z6`S8pWzW8*9GklC)sDB@avi1hB3Dj#Iwafga!kZW<+QP!u6cJ?aLa@8_J1!g$R99d zi9OCg=fLN^rA^tIa=5*vu2|6B` zZc(O<>HnNQi7yl6Sz&fpbxs7^%mpGMUgtKsPwC>Wnh|%{^2b8?Z%uVKUe9k?_`I?? zA{hqr$IC*CTFendX-V;Zf>$n%S_l|-wMu#gG(T4AY{dyC7ar`+ugK*>dKJ()=@zgnGA}*>gmO)xV?1$_1|5YsMw0{GAtyXb>EO9xC4)+?!3hA_pch2| literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_fade_in_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_fade_in_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..64597cd5ac7b3bfd927daa2430ff68776170f926 GIT binary patch literal 591 zcmV-V0~*IPv-X+>^(5=aYady&8ixoGLS;OlBD_s~5_d zkVsKF;a1ennMS%$naBkiI$;@3<^5(#zOf~%febFkkVO3f>*raLq%j}8%Lb#-AWqXE zj`H^@CWG^Y@o31?;3UwDe`hlUADXN~lWl0S4o#kdeh7mw5DTr0+wWgGQEa^lGK*w- zg> z{V0wq2O0*tOuajBzt=)j5Wq)=GP7`5=sDY3e}+MaQuz4y&l=!LN$Z$&wgtSFC`|+w z*%9%nB{C&<%Cy94bKK2?KFx(>1>}Wd4)k?tSe0mJ^+|VZslCV6+JlHhc@N@xY-A?6 zzL{Kpz58~wX8V6`rzPp;yvb;1?N5x0&r38$WOztP-~W`v(+!+KR~iWtf9!H{ zb77z1wo&7^=$t3;1|I5<<7qzk=r0!E{c~k#Zqx!EDwVIQi-Jz2rvs&UKzBenM5v}`1trcU(WAQz?EJOz#2}KnNlW`1Q*2%$s@Uh^6F2PRpS$8WqDw*UYD literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_i_entity_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_i_entity_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a1e1e8b614d19e33861e2293eb7ce5ed724d8951 GIT binary patch literal 640 zcmZQzWME_f1I8!@29^&HHq-9^P~hZ0VY9{TV#%{$(VI&f_Z|LUm2fGiM1F3Uk{0XpUjGSZH^p)%Pg-(Vao_Hjw?g%g>BZ>lC@MZF zIOq9UdV$aM-4bg~c9>-!5_z5!t?#sUsgR3?`rW=8yxOdqCeyVwc|7A@|J`)=k@>dN zYGvhZhD$EC^j|JG_k8h`YsRxLzSMdWX~I`|I}x(icVtN%X> z`x3G#^`O-=KgEwaYuz77NVQMqn>cI2=l69j6YbXB_TMP)bME_Zt_kw@Kb?-S0);Oq zPJmz;0|T2Zn8m8sG^prD}B4k1}_RcUdn;xawc`sOXqPx35s%bIAaFV4(-I+`Ob z=fRVwk90JAPo4A$J8?$aQ`gJe$1n6l$yx1_IxD}N^*`xz+DEtPRfxx04bQXQnqdu+ zsgF5>6Pd3jrY{fRHJK0`AAfLK4TI@HOZ)XZR1DWInIWYXbT)L~N>$09njwY4>AL#j J47S0gO98P06xsj) literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_loop_entity_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_loop_entity_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..305f325946b44a647017b539b615ed0da4b55e09 GIT binary patch literal 621 zcmV-z0+Rgz0RRC20000000J!l01HC^0000000O)J|NsC0|NsAsF4=^P=upv=hLW+_ z5T;y<2llQ200000000000001ZoXu9-j@mE~)jkr5f0(Cgi`qCq77@0swnFVH($an4 z3yd=Xw}~A&4lSzs?{#i~2%r_@0fdxjJU-{lcrxQVi^*g&fmAUf)sj#V1h~#0D3)9x zL7}jvGEa zctaKh-mvctyzzKp-B}4`zvvRdu-hfOy=AvccDv?%>{?xm$B9(>tiS)Qcs`zY&NPp< z&~_fuY@dhpdR+^8@I*7ck_vusCL@}{v!Zdt*{WPjxnKzW!NeU*`a}2#&d_!|d*Jk) z+<|nhBwHAFU}kR$IZG+7<^ueqQ3T~uZTwV4@C8f&5ymF26#RpYf4f$P5cquguLPJ% zk!orfTEJ^b(szzga6@{E6se49sajH1RYkKN?n5qU)Hv(|ulL32chW2|I}X=O`F8$Y z!t%mXQ;SWu+WrB`ZCq$ba?q*Fgs!cAlV%6FU)_grSH!x5+ShY}?N;*Cdbk(I)q=pc z=}=N5(-@qVa-=gRO05njA5Q=DIx7zdP|MZWRo z$%qH8N+2iz00000000000001ZoXu9>Z`v>rRv(GP|8P$eAeJ9=p@nKvt5PbYvQ?s+ z)<@%9z+12*+o40#{`Wb7u!KR?R*?n|Bz8W3cfR|4=M#&Hc-03bsUzgfAv_3hnLd!u z7)J-WW_snQIf>C(h=7F*r85>w9B&5pcd{fIjl^Xiyy;okJNMDWY3TYv7=&c%_rh-1 zKXZH356-7v(CK_QwN9*<&>v)mU<})9!}iv&y*6y;CNJt%-C~PaNc}8+bdx-7B& zya%smyQg-?_1qNT)U7y~8aPn1RzWdxfIl_zK*2y52!16|f|Ho=NgC`e=vUpUISzb$ z`)^HfEx6KzYgGYXMJ^2)M!^yJlZ8koR0~;=SDV}yv)%|9ClQ2^AR6L9B1x*aHk77^ zQY^mh%sq(RnH2T-59+a*X{M&I8_nJQrlLA-x{vw4-o#>p4%{s7g{E8taudAV?^ ziQPdlNuiNy4EBYs)DPm~sO($m%U|xx&r6h&1-L&qrs)Wdjb_FqQ74iE$EUI*>9HwL zR#8ZAQEOxU9Za&9IircrLP?v#@(!@=Cu!+Y0r)P%PD7BLy440jcb9=M{e3qon4(W$tbR nBd;o*tT4yNBf1e!tCYEY!W9>MwGfGdOmdYd%>?cbzk`kDf=x!! literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_move_x_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_move_x_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e0ec346d2036dc24bc2908a65f2d3e61035b68df GIT binary patch literal 696 zcmV;p0!RG-0RRC20000000MXb01Eg30000000O)J|NsC0|NsBn{vRv(GPe>hJQAeKP5mTFR~wp2)Et3)@k zN8=oWw_r!M!-l5)_c`HGf}m=vY$FdzY@f^Lb3UKrGl$A(*#oVpC)Ly=A_#Did{9ie zKo5oCX6fk}iO`$NfHRKD8_ETahwG91jVwrNN8zFe6Kr=WV}7&KX6;FnHQFuOY<0VJ zzs1h6Q*SWVIiJ*<&Y2St`khP>tY>%S+1+|}SDxLC&x@i{boe}y$~-GSxJ|zo&kM(f zhg;Jw5{*{TzWcGDhD(up^D3310~NR=v6)E)A32pF(Qv28Jmhq?TGU)ngu36WHF~}e z@1aq1YhBl`)oY1>S9GFyV#R@4T@9Jg0sb^70u3WBrXhYIVT_}Qh*1*mtOj_O7{5vhWR!>|e&M!Pq+{j1OSk7Y~k!tcKVZ8MYc3(@ZA z73i~i{{nSdI5sBlxwc2sp1$bt{CX!kj;#BmTREcqKXdb{UA{b}Zw1y6USg4Fp%&BT-va@BvLh=Bluz?u}Za4|khFQum zd&9K7Be1EP>s42yd61eXq$@>F{B);izLv_zcya*A%OO0VqV|$vFFZGvS$W~hF|(&b ewSh=#lD)3Mm5^dNm$8PFXu0sq2JR1Yrbj4Jvr&Wq literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_move_y_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_move_y_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e4114ad315c920a82a92c01fcb86a79a2c0ceefc GIT binary patch literal 697 zcmV;q0!IA+0RRC20000000Mac01Eg30000000O)J|NsC0|NsAZ#M_8cxNgh>z03)g zHfqFa;P&(Y00000000000001ZoXu8kZ`v>rRzDJn|8SosKr9I_9VykMR;5%(WvfIt zjgQ8;fVW^rwv!D_`|ooCVFW?dR@p{AB=PxP9^XAa`^=&uTJ=Fm>IgY^2={$V(hu@E z3B1;zmkMxek3M+aC_$$-HzwI>-fDO=*-Y_Tb&>X zJb%^-y4{)Q_0CE60-XBbdncIh{@Kf2AnmrpCl znuS}}HWG!#(7cB+rKu z-oO4?JGc>CX~MNC!Cy&`h73dhgz#i3k}=gnmV|0k{6g7l0plcuAQVJHG>9chIoE`O zcqqkkx+i-S(|SgSie4~P+cC}6QDxY7{*CygSKaZG9Qm5+q7%Ju~yG~Nz}3A!14PYnv}>pPRnRPcc`@q{{|-6 z&*}8WF`84*oK=C4PGD*alQhFO>8a+7xPclFiY0Z;LUp!GNCfjiaFdu3XPS{PJ1}bn zX6H=X+X8vt+|1ev^@C6>C0#9-%~5};)tjmE5uO}C@_YynD5<%mm${nZ*4D4Sh#NdFx9= literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_parallel_entity_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_parallel_entity_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6c58275b77dc92f3bc50c71d9feb5608863bebd1 GIT binary patch literal 576 zcmV-G0>AwL0RRC20000000IC200>|J0000000O)J|NsC0|NsB*wQRapUr5JZ0BfOx z6gpx;-lsDF00000000000001ZoXwSOYuhjo$LY%${2lJqXu~GiamU(p8!e?Pfu$Yf z6Dac8)@DmalGBE=?>_mdX}dIoVn+N%=5)II-TANcfyY(3o`TVwDxFd$;}}=91B;Yf!T}0556~|6u!LuX#-p; zX)JRY28cHh(l>#5yhl7ui*&`U(gRU->e#M}!$e4yzx?2Y5GbFU%n{g3t2-wS7bRu+ zg-)wlEm!v(ODmLYR5CJE>7xF1*y(-r`>im9_IxM%_-@|{YVv}xHd0JWI7USI& zzH&>;t>f?L8Ps-{4Z->C3bht7{;Sz;U?_=)U387M(h?-zy+&>`@wCz*)P9ZDI*@m; zXkPZ`8qU#8WH&AorD>v70gJl%m-U3DGwDzh#&M6vM#sB9Kr>liSob@G3#sI~P?dqE OeS>t(Dew=XMsR^wdKA9^ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_path_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_path_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..72f88ef13d8345dd43f178ac94a6344277d7ee1e GIT binary patch literal 2132 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_scale_at_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_scale_at_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6e97f112e22957f5c2a9bfcc1a91484c1f8a5f15 GIT binary patch literal 795 zcmV+$1LXVw0RRC20000000P?p023Af0000000O)J|NsC0|Ns9R$BXz-0nidt4H>cN zUkNaMjwk^D00000000000001ZoYhy|Z`v>rS05XR|KXk{TCpU6paoQ^Ra+{gvOUmA z<QG|wO4T}4x7b7sweda*ZH&e zv~sFgv^MP`Nl+iu|NWFx#RSj2RUGg5xZ=PuoRd^dg@g}`iijj|Bgrgcbh_9~7^eu0 zdbic=Hhp*xe%tj=+=gHGGX<~W#OZ@p2dd8|P=XKen?fEeY)%wH$T*20j090I%aOd)gg|-Udxp}uXDzoJZkbXgq^%4W z+$pi9YUUDOrIKW{trb#?`%)~@EXnW0HmQl)?yd1rPR&C#Wl7a=Y&!expk%aQs0M{A z=U!d+FFxJg9c2~!xtFQ0whD1WY_2S#!_z3Lm8`!7Z1VoQ3h0(4y1VIq7H^kZ#A}C# zw@kCYg3>xWZPwr=XUQXve(_3L-a*M-prdu<^7@?Cdd zaJJj0ZD9YZ9sEs}<@vWJNn?%3|CH|etv#oSTlfrzvmzAR)y5^Yu~A|v6jFu3jw+X@ zs<s#J2|_;mw^EDYmL z*qCN+Q0Zvl9gOmq{TU&LsOND#GlxQYq2?=$vbtVo^R+j~5Dp1NO9NP;LTeVz1q(p% zA>m|#!GJTxNW{KlwQ!GDx5i|jyY19UFDKM;;U=gI(o{G3S%XdPS*E}e>HR7FfM@-X Z@Bl8j;EywrCXg52O1(93zW^GQB+@emhdTfO literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_scale_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_scale_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a7927f1cd5d0fba2cc5e35fa485e9f73a1418311 GIT binary patch literal 751 zcmVrRv#OQ|8P$eAeKO&W22hXu9OO?-6qjZ z?W1un#apl=+hMDw{r5QrGJ--k+R(xSkjve7=kGpS=L3g|_`U~9QcuV`kMJPCS^9(g zj&bymYo_l#H6by2QxUL`q4Y+SM0mA$a=(!ou{aWEJ@6@ZDPp%39JQJqAK!%jxJ8KH z8WW%TZ?W6$jQyhyaSoiA(C_39!DM#lncXb2JJ0Mca~@Zmio>R{korOY;ko@ie%LwD zEXtr=BnnNS`5q*kY9_eN=GE&J2kLM_5Fwypl>9FpPpds>f0!6RL$Qsj5Zub8WANjFSk$NDvKiKanKWTmy3E zffQ34wPwE-)>^Z&IMfrSsw)tyVN2Hr@Fa>FkW;wZKOdZaxxB6!sUQB{X{k$VEJd@;)?lD=Ny?!Io_8PB1scG_9L6|J!2! z+kdY9rm+g11I$34Z?~7V>@sw*4Kw>Mgr}V~Dv3?uPoU`q51bcf@c*T_JCZlbQwoh# zV^GL%ey)sjkNJ}Gum0kne43$@EWizoGy|;QSglzsi8_%SIR03xCf%Ydpk)kY7pS#K z{|ZL-&;Cq{S7`19W_k~W^g`2R7^MuKrE|VF@bJ>McF8KXaBnqr3OVOes?hpFA9pyD&Wm^CM literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_sequence_entity_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/modifier/_sequence_entity_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2308e606940a113e2772c4cd9165c37bced85fe5 GIT binary patch literal 642 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_i_particle_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_i_particle_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ab6fbe1d5b4a50f383b08e499abc6248ea30fdbe GIT binary patch literal 270 zcmZQzWME`~fO8BCOk5BqBkzAGm~`*d`s+$Lp*f+q;z~c9dzdosHyczvn5vkwcH-GA zCP$v*=lRZ9Ke?e-QdY*_(Ki^#KYSAfCrMvIzuupR-?2X*>XXpAzE_Ju_?p+0!vVx|4 z__yaSTg|2g=jYX2?l&k}vU;DUvdrrR))#6Yur=8z@I}O5`_I!Rv`ex2Y`txEDPv@E GPc8t~4|r|> literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_i_particle_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_i_particle_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c323749f5000d527b82cf15ba0a9cb926781d89d GIT binary patch literal 526 zcmZQzWME`~fZGfVOs-J2+J7iWwC0{^VHCZTHIQv@XxYJ+dKdG(plZNW#hkSPr~Q}> zd2Gys{vC9W=*)?dYY+37<6tXN_>kG>(cLH(^;65HGJJf$WJ~qqh6_>C zvUNPO*YV@LZ|yFZHcwF0jJfA~DCP!hROZsq+a^(t%;h_@Z_ju*F_y>Tfb+5K2lA?A z_;mUb5~qJl%Uu7E=~?)(xLK`pZ!<5rs`WNbOD2NrDW7)5-x90Mo%5`h@yw4pdrK_u zf4+NDwHS|S(1*h;Q-o``E?jkAh5ziT`A_b+e-lX6jgerkzo79d^1Je(8%|QIKVQvf zIe#+w=j~6^!|rqR%zq8`A23jWKn55z&R`Y;gEoi;h0fZ)&u!1htou~-H~#L@s0mwp ziXQBRs)16BM;I6wj{`YOyj(zn6^J=tJRtoYtSlTTssLs&F!BOvMv&R1NB1?$o}QaB zGkwpl@O^PTtekR25H%38Voq{G!itoHgc#5uxf literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle.java.i new file mode 100644 index 0000000000000000000000000000000000000000..3e07b0e82a86a05fd56229608fddb58fa90ccd1e GIT binary patch literal 2310 zcmXw3c_5Tq6#vFB7|%o5k|LqOSd#E8Woa~HFpNmD%wV!j$U2cwFI!_m*>fOzBN-dS-b`x9Q7_AFAS$;N6}H6ti@}d2 z@n7?}aNSk;5yeJ^rvPmYP9LbcMF zoYz6gcg9w#o2&Xm^k&$ZV@K-7Q9YWO6xrU}N0hQ+P|42<9=*T@O@9*z)56fksYZK5 z$w-;%zcorH_Y)}QqHg}K(kAZDn3GDF+$TovjV8CWCuHZeJ323!9L+2ECR){R?-Uhe z%=-8sp)Ue6;gNJ{S90CcivAFtn=Ri9eknDxCI2CkZN+G&?9U0_Ezw==84rsXq!PSV~o#&M?C;Q|)JE~{&VTfyoUux_~vi8Q*fZW5m-!31-UMSYVYC{UTC@sQtms@4o%g@YyJ%>h)j2r-v;JhePAECeqTq9J{*A z(u1^9BhGIk8XVJWA)!I)1OS*3s8KBBfkOi_kW6vOJ2)9O*OhvzMj4`u6X)BDCB31w z{|7BUHlxz6)$F&#GBe`uE!=3G8%q3q!m6lu_R{=bfb^sN^Lhu^b*MTk3rXc%npj(N zAZLZY5xxZ2X^HA7CdP3#epFH5hQ`nq-8Q}z=IJq(KMJ;15u0rz5 zg2fm!*xt2?K{$p+ptN`3l5Xxjm)OLhM9QWpTb}A!ep^P$+Nht1t{FYyac4G@QNku@ zsxOR`FU_N6#wR~SPN)8iH^_g9)Eq~eOufm@BWSpg9uLS5oWP-1!g5$iaZMWn4IQ_Y zpbo-s^ZKX=b{@m?03aGf7}WV)GfM=~{rV z|1+q4;eP&MT4#?@$UbT@qDY7YZ{ksLV0;^%2LOM9$Opym_RNyFAjuVnvjcGoyMen6 z_jL8QIXs}{dy`05GKrKc)@GMiC-5Dkg8YtIj7~YPrdCQ(R6ne3dPv(z`w7s|(XW9k zL#b(6ztpg{?c??hh$MtuZZ-+@&;qJL<^F)8@eA@|J_Z0}D9;0cL=fT7K~!v&)ZP<+ z^!=2n4^?40TYHN0%WrddK+BI{m?NL+h-2X8t_yq4lq$Bwo|_)Kazm+}9zhg*q0GWb zw7sWE5~j?lX!jH02f2;p&7Xa;F`PpEL6>P0*^^;~eZK#CS-M}h3ZfoGy)9g&%?dbs ze5U^p3%+z?VFgX0uF0o9&P3Z%4b|?E4&)bGPr7AFBU!pnFPoytPunx_jq4Mf=D+9& zu8hTJCWC*sb$GkF?pC1zD7@y5jnUlOsM*y{4lpB;);4m-u@8E$m zcpd;GL!Y4o3kDkEbq}?l-mu8;UA;=Qw2Rz(a+|Xa{6b)DBH)B?ON0WJyag37TFMp$ zmIWdLie`Z89vDF-59Ph7t&N*%mOYTPb7hP3zvZg~1C4>RUBX_$!Bh%4NRcOTMN`Ey zWNH}2csq$7Z$mEth_r5P5wo+s`p=8@rASG5whD%Qp-|~poszB<$a`+i03>7r z`$70w`TMrLjw<|zk6>qs5^=}-?W}d(WPCLab=T}0CYvaT!lJ(dRQuhdEXIiWy=tEV zt@}pv0*>MDuo)Vxw0Z8=H3b+pMDJMa>m1$pk#jRf0tXwa_2oj3-_5O!--H$h^?1w4|bzv zt42QP-ysBbW7oeN&np4z)}=miO+Z!MAVcMIwEgL!-LTcr?xl z%hR1uM+v&uMr#er#dqQ~i5-~fSL!qD?7M0&c>1fJn*}%ZA*M{2l{SrTz&nn7*MIr& BumS)8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle_engine.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle_engine.java.i new file mode 100644 index 0000000000000000000000000000000000000000..86f352ca2338ddf4cb4b9af588b65a852f1f8be8 GIT binary patch literal 1268 zcmVz zGOYc`NoSj@L=qJ3#2fP8cOt1bN^-JJ1BUsFC6Rac@LrxfN*aBo3m`%*LdxS9*7+as z1>+C`*Gz9hNtI?%0w=pWyE`nELTU0lUDI%-SrVQqMK{+h(KJG#j}MOy z^9|G89l81qx048EGxEu~@WOx~XcTyykp^(`=kCsEIwiAj|5*iRf@hj?oeiLGAV}{S zB=JCaq+)BTfy^1F2`SU>P2uCWBrP5@G9w%wx;6#llP$WgihVaCW^)FrrnLCfR^FB} zR$6wds^|oLFK!{);FB}ZwY^*MJP}lr^oH?U{MbHVu}&Y|dTU3c9!Tn!$EYq~m6fp1 zS8y-xBz>@TG+ZjHRiuR)Dtl~MHVZPSyGMTBZ@5c-Dc%{!w_jPTmyIt!16wS$C*)$_ zf3=?9@AS58yp9bYjIxyk737$59EEjf)8z0-FIg5ALC2htwfGl{)~;DBgI_E*QOrCX z`NpTg0(uErgCgIPJM-}0VW=BGwns{y3pJf9k&?UI@n<=EPp>#aozn;g%E5OZ*Ps-O z!Bmsb5NU|XTCkW1{z+t}C7vxQUqBqVJeW?%2Z8b83)5X(NVaOap&VO#e6Hw&OYpp@ z5_x&;boMi-tP!Y9lCsQA;-Hs;Joj0iF2zciu|ELuVlzC!mA5l;i2nx%&f2KjxBwln zaVWUKmIE?cpZ?alevvWeakF&qAQISEFA^#`4O9!k|E2^ zfnw^9E!0ulB_WMt-_lc&Lk4Sg3I(ZH!)cNPZ9U^*>CLgo5ZbC$}{gerxI= z(*NRO-b|u0a@LnE8Rr=vi1p^bhQ+Gyhf^Cs3>>depJ#*mj%cM6-XUCTi~(sr#c|-Q z`fSIo9UA7~fF63=u98 zL$AU5@X&?lVAgM^!c?Q4oL|VBEkcCt?YWX}lWgGkfc`KCjZn5I%;-Tn`L2&NkzX!S zsW&CT)X1+_MhYYlpVJg%NRbXXBpKAX)uzj1p%lsVGa}z3fmyIIQg|~JDSn=mo6Lw; zSgLE<)HHp0i6%QF`k>vdqIBltKH2P(j#01*$f%F>18~yVYtKRQ_>jgf=fA*rV9=bJ51Q)6x$8R&bZ71}-O|tD z;;Cmu>$sRoUw12u%az_~q2k{c&Ty4LIm_7tm1$L-r0$*3OWjk;tpAUTszW{Frh&$h eE6%Y6V_uU}F8C%DtBjZ{%^)`!#Q7JOMooQ|S7^Ba literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle_system.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/_particle_system.java.i new file mode 100644 index 0000000000000000000000000000000000000000..11c2e67c2a260c5e978c7dfb69de59b5db7b3280 GIT binary patch literal 10204 zcmZ{J1yogC@b9^FcXxNmB^9KV5CjP+X^@Z*@Z%C9A>EgTE8Qijw6xMnNQekXNGT@csX9y|vz6YtPI*ch1?rJ$ujWIdcFQ00Yns8v_8S+OK4Q_wu@thG8+7mv8E5 z6i~Jz^!6T1j%zSo>!29|_4T2v`xhy)I|}oP7nmpZiLX@Oe6KP?wmK#jnFJLHBZ*uT z#3$y~1(LATZas}SKY69T^+>0F3^V*JhMW1<&*cs|xy~&d(m@M^kMzssl=z6= zj!hXEggncII1~2wO=c#horv!HwtjnlFYF{pGzvn3bsJ!7)_B85q^Ge@>42GguW^t9 zqak=WxeL9S5(M z{HDypw_6K;Gk1`mIu)4y`uBbkdn7iyHPp{6!VBBt;Uc^k75GF(=}jPaPaRw4%&YPX zJ<*5Nzb`&_MJ+{@nDa8$zGYYcMX$OXzNg-wW`LO~uEU8;|CTK@;I4s^=dn|kS$Hda z;CJ`_Z0m>5kD?N_>C2FxcJwC^`ojpPQ~uTh>Z9uBaI3KUV@h8R{^^}m*VSGT9C*EN z>lK=bx-H{tt5(daZtk9-W75qqY@I8zWVE2}=l<8xtGJ3Ln8sOu+V)HRe4>S{+`*v^ zxA}qA?!P`XTfVzrUUxZoJ^K6OK=;zQ@ZBWCQxo4^dYvC!g!n^RPm7JkFULyDzsKh^ z^o>&_Jmb`oOvJCYZDYYPLH*ox_S}*r;=s~nqKGh=U!Y4Y6iGWzzu;i5nW@k!^^C^iYG2Csmd{ z7WV0Hx}%=lpV!`~pi!OwQG8RX)t-)@@~EaP=Pw>@ly!CQ!QRL4$3FFo_k+t-<@w(w zO5f)rf77vR+Nx1+@h_2auET5O5Kb8VEp=XnDo*Xy^akTCLme^h1G7p_Yzp;PlT=*l zNhGqW_$e*ZX~QZGRD(xwj&D3UmMxkjxa@d0$64 zNY{HwOm-8~^lH`BA2Y96dY}v)Q*tB>#cRUqG-jrmz7W5W&Ks3nZ;;w>Xz|3X)+)wW z0C-cI{$b@BB`vS=+&|oc9aZQbx=ovl5e7N5YTdmx{Yj z%$=k>la){}V2cYr=;#T>POzPW5%eos0suaULqYWI(OUV@m%IK)shGP5>ZQ%B(oHknMStzde0MZ(I6dcBkj< zi>F_n5H57xe1LV(SwPYD*!=q{?!d9xV3>G)5DwzvL~ zqZ0r6;QNs&Ypu8yZ~4oU?-mUrSY{qNvY!X-o;BwXoRnsW1_U66csDpPRqh+PR{2S0 z(zZRTn6ltBOyT8b*dKo>h_}RwoH{KDGY{FTuP^=6B*?X4|W)2yQ#mHEn10N{sbgZs z$tA7rPV#TRuIJX86eSCq#SKIZ{y~ccIQUtK7WRfI>THh;m8Rk*_ap1FRYZ@+z6{?X z$D86hPAVU!T43^~nYzg>VJa6rS?`@5_yb!*CV{rngSi@6+VbxB+$v4zds=|bVIIfS z(1VM(qjNrsmkqgRADS}VUs>$Lm=*rves3Uw1J{GS+W#e8?XqakCnAv*Y57Zqo_YUs ztH-=GH*V(|g}qOwk=^EB2b8QJ0JDG>dsV|*K4(^Y4ds9A@51m|NO6Y{)@AvLP zCcz~@8>SDm<=(Z41VN4g*;4-5I;W{0_WAZj;TuVcj>kgqXzX@_8fY|!|48fX;Yl2Ls@O90>t zax4gXQhdm;^BoL}VT@xHIYj(`rNhUJYaKL0FJE(SR~O$1fFoo^M`!$m2QsA%q`VJCYe;F zGoma_Q&7_I|t(^cY$ouG`nRUVnxm*Vso;2P_!}=NqP$$4306h<%7X4IkgHX?-B>)Hq zIW7bR9-B8daC5V%{9ub|XZ*7i;#*h!wGNs=P{TU{9! zT$Z=V__a)ffT4q&$&glJZTey^55oVZ}75MMg5ICB?-wPL9r|q19!E>ZANR++S{I@VA=-bqG~E z2n>EM8WNbcQ_r9!0Dv|<9yE_==3$c<&Zp(e4FONjpT_v|Rtvzdb*>o}Xnw2+@CODl z7+lDk!4AD7pnrkSZiCcd@}RRtLlW3h!Hy3-`>8OEwVN21f{Z`0`S~#;t8yA5nSc8d6b2}^T#Q)odD{Kh^c;GQJFWB{`J9lJOqr+ie^nQ;j^R8p$Vh&4B%jPb(w<7hXtvfxsr)CrvTUyRy^O7o>$)oHy>E5l z=aUmp=GJIJ;196Zic^~K@xZM>*q%P<@N1_CuEoV_o8!jK3&A9*L$^pQ<VN!Gy{Hf1>h(HK+Pj5_ALli#dYF=xZJD-}kz5F)B^)Hx)ULs*m#C&b`c18T{^*=KDS~EsJxWHHO(^Nqp@|;5rj5&?Lyn4`} zV9142H;>kR}8@Zu%|kaXH^NzFd|t~ zvdr=Ax{10u^ikmPkzbxyX@v*+?QS=>1T+fal^KUXfao9zUdjSH5d<)S^TL*9{C)|3 z-2UA~gIE*93I_Tf=su_+P+{@%1U-smVWn|oy6s&lQ7a+FngmLHJOt5YYc^7I!FHU3 zeET?W7JF=4^~kBaS8gb@pNs;EtSkh4UpBC92a!$@zDama1?tS(1^1NiL}BU+C=dGC zXFm|S)37hc)Jpso_OTtK5reQ*CY~}miGRRJgkF#+Q8JZ7uYEsYXN8kDwgU0MY^VOP zzKY*w_blyCzih|THXO@-5u`}9}NxUz{bm*CE_7mxmU z;PYc!+kNS0dKMMXY>1K}3OIq5=t4^XkPmWV$P!U>h(2}p1kQ01(g+f@)>`Us9fj9A zXoik`h@mbvj;zVd$wfqWB}vWmWv8T*G% zfK8B-KtQ$Ui%HZ5RKI-Bb$D6z1{*U+Gv)YN2hAX$R*jFrJykri5OQ8X5!Tn9QgA*( z)iHq_VUmA~I`5jl32lZp4VrR!KK1U#K`lVS-dRlU>Wl?a+ zY_SBjb8ZRGM_(XZQt2}Ukr>*308A7B=&yVofDwZiNTJ!Cmc@ErRK90Y`of>slNMET zcj`G8r2St*pgJCOYxXLVy_yf@A|vZhPM38f!6#rznGJa#V)eq>_07#%?a!kOQ4{a> z+~rP*FOss|Z2XL!?z6BAlfc~-q9%Qt6Ae`9Vl-ANDj^G$5*YAs^&&GF~U znEYXTcMX5w)D4$tgwnA5A;S5un0s+5Lsenz*YPwVVIzCt3$;v_CKaYGJ=?mUZ+*{q zff;7$hniBiFaFw`-k9c=3DqHCW?I|K?ESHI@&Kjcf1|DG$f;ML_3Wfgc1@w>U3$7} zv({*tn7Y*T`$VJaE;`Eg4^Jk%LpF}JkvgVJ)xK2WdZ;ur_%Q}frPM_uj%;!u5ZTR+ z1(}Tm?f)=#0AN_WG9!!<@Qt09~_y3)C#=*@K24-61p zps>|4?W4HM2{L`T30h!LYTTKFvgMs;{FzRfN?0DAgjM%Bf z#rD<}#X>1~A8XuksAKs@rKyR%B0*6MHr?84H61|7o}onjNU~KwZ{YBGh*b|mo>Zg- zm|gts0dQ6bgHK_J%YB2HX_iH>1OJkcYK*{8DsO6{>fo)NC)7kijWsnT%90=Kq8f;Z zkSN8;o&C)46&Le68aPT~g&cAgLkDnuDhfgZPk~R`0>|To!s@V!PwK-XS|fTvgMw6D z##Z{l@fcdSXsEf3{@Br^&ms!4?Miin+@y3)Xw5?7iu!U`;S2=>|DuV3QdOoo1AKaNCqbq`T1Q zE^%1qYqZKWK^s`+Ls!=xW8}E~I?XC=D&Hz?@izB*aZyoPaM@J*(MY>N$5cCV1gY6^ zeJmJsES#r|G>%Mh$d3bMiH|KDG#qSn91NY4Bt>cM9nO^1A|=ZB;IxiDCKVRC&Yl`J z7JfPcx}3oHpf0!#z_m9=4-fhwW8W1JSQN-9AjE&jE<^pg9xSGzDsmJGw=7@7JDjg{ zt|$T}8GnNSdYhPZ=>F_C^e83I*i@j%g!BfNE#8ifGLg%2i(F9Y-pv8knD@5PmvroX zS`s9I@$B|^gZy?bPG`}xzC6E^yE7>&^rxRr5+~zNOy3-NtgO z6T(M^j)j=uLC08og%<{;Zj{i>>PkLKeN}t>DtGSRk!D+cVz06()_lX)R`(+ z&a}uVcFRjGmV!=c{eH$tH(1*Ky2)3*RyPCx_3!bCKkMInAM$(qgz9_#>hVz%+t1kc zoLJv|5&XjwW6JYxN1C~p!rC-V%IDEf`UvpL?8_Lcepb4k!Y z%~r6E@uHPoK z@75~jrH~RVamSmniYQJdX^^tTYiuxZ- zBPa3gwPRM-yb9AkZ>HkpSXdUM@3&d_Y;$_whyUar&mpifRqs@j+D8d>y-ImOp-rY4tag$QS1j%%<}&G z{)>3H%1zC5eJ5BWsyB>yZinw!HeYbA#!OyvmL;GA$3_Of-cUUE=Gy@6ns*oJiST!M zdEW#wU0-gKf1zene`06@&-0Hd&zadMNULqiri;nf?BSR;@p>4V$p8H-zVgUwijx_(yHKGYLL?Rb=^dr9mQs3<$husGf`As?}wB+)?H7;9q9uz?&ngwwnqyE#AR3 z!rxpMU3@XZhwSjAH@uSXEW#G6_*e zRh5Y=X1{}0J~Ay+r94fVQm(aK>t>N{TIOIDF7aJZ49CQG`M8$hAje(eow0K&rL|2lcdyalG57FM>L}(>Bf*Ie2+jFR0=t3CjE$MTEEvPvaBa zEhrEF9Fr<{DwMvy4OC9)muAowC8+LYE<*-+eljxY2K5_7C#m5M$De z6&1`3eH>nSJe1&q+0yf_uC6~B!NI{%=`q29cN=_Jq_nDeJ4{>=cJHoWtf4nsC*NaiKfaVgI!*c0GW$Q zEG~dy%Df5nekgdp!Xu^~F@440R)sGD^f7R`pDO zt4n@U8@cyAk8>CGY!ALi(N8oY{aGpgWC->u`;NtGFZafG)xKKYkkC8&!^EG3i%#`XciM+r3;;u5|**7tS7xK@|GZViu7>k065=Nv?DwtZgP zmJ(&QuHu?W$JdfP(1|+U`R9k)?N==`VeBI8)hIUd7Mwz>ShB~C>0K&6j?H&f)zb`a z@ec{7b?Zwc{L@a^+(t*@=B^wS)*_&_Gybz=RmlU+*e|5Sa_SKH$>>&N>7~;QUkSV+ z)GJipKZ%pDbURqtA3tfL2ah{+h02K8M|M}1J>uVktw4a0_G3R}Wg0h#Vp0JB2Pq_h zi=zw@8fbB*(h9n9Ie$d#Xz6)(56ic_8Q>W}t6UQV>Q$OYt#nQAA?0YcJ;8hE32bPR7WcN0XM~EySu{l zo9||BS`Eo8K5_JG`us_7*H8Z!!>CSW!Lv%!>IJ99eZlr=#G3*)$yV)0n2&2>%AN1D z)ug}QW-{_At?`Mi`BdRO9QSosyq3~CYFD;qkd$QKZL%z)$f4T75u@+J;OXXJ?;e-( z;oG9TX(Dbj54j8>6FlRzklT-7s^*xz%ztR+yxCfs*c)V?(IdnJT?XaCA_eeePC4So z)>n&McfMj6JY9w(PB>r+o{u6jgyQ+cx6YgOEOvf$rJPq-uM=NrpxTV7ozJhrHtHXei+lKRGw7XbMoj*F z(;`xQ(dY^D4@Sv_DI^_Y#rEy7HvDt>_|g;eABqv`;$wrj{G<&eF|uhU1`W>%e~Pa%0QXSQJ*gx%2m+y?~lnvHG8DZbNZ5z6_q- zE%i%gXizQyWG7Jq9~Cx?jm*n8JwDOKfLkqU6!+olyT6-0JG=OQZM6vd)zSMKe_&2Q{22SY=)0EQ50GonhoBuK z5A-Puv;<%vK~4+#l;K3`AA+~l$!inqgq~#wbcR^iV0H9=8#*q3unt->$!x(sQ{yJ+ z=Z*qjI0(+vHvOV}`T5K3*#sm-<>8`+uN%4GcSU6tNXvL$7a5P!j}dqg6FiNJJUQ}$ zA<4m45(Bspg(Dp%=A6UJ_Ej4ffPGC znr-Y;T>o&ypTGTo+gh;O!c_}fMQ9v3vc@zEyzhi~V*o1&7L^cE1`ae{1UNsNE94ke zAg6=oH(FAB&vY&M@RXhLAzN*+dj6;#+9p?eSLY5{GkCg`foIRspowmZB{It#nN^^h zmYZ3Sn7fgkk)Dy0MUj$~jx;SwO3O^oC|vq!>zJpz^b;&KFW=%_FQMTUpi*?y4s*5; z$qRm^*bZ|nTg~n$2}u?{`kb=VMR*4a?y_%n*mxWr-iESdr_DtxSYWaS&rNV`FNA)r6}G zR&X{EQHZ9Zug_RW!8vkj6*)x}Ru5Jm!p`Ns^|kjMO;M#6^m)cLj(Qj( zOA6`2f4{(oWTLgesd7M9!G-}-U~^yUrxL91L7^zsqd z0k+`;I@rS45h+t41yiei;38pu35Za{S+={QC_?3F(B6FJ#C{F}`*IK!3DQJ2W;E2^s+d z2zm=G0T{C&XNEwx2B!+^ri{6ap|F$P@U{uYLqx82=#?T!3C6EFK!UHRYVYA`Z)@#s zZwHm`!6);f)vN%3Qynb<7-t}7fu1ZM7!dw$ZEz+z9Xoouxg_(sV&~s0ohu5NgNz8Q zm4(ZIZ!qIgstv7&Rhd&|JM+x ze*F#|MkO)}0hyO-#2PmWtZB!1v#7|Q2HTKPk$f=j2_l=9@juq|*`D@wWh&ml=0ikC zH0mB;$-&0E1jRa80~T*N@|Vocxp$teCnTQnD$}Ilv;U2cUyWphbsES43O~FsttsV+ z%k5-{-U`OBTAj-Dv*jwasf|4&6s0amK-k&wl7$9*Sb?)^Nh+@o#IszG*x`!L?tcp= zXCLLAa`m|rbh~Mh_aI@@r1Lp@o4l>8*L3Q?To_+bey)|{x6N#xgeN&h*X#&>gx|-x ztbG>0IS4acA;>DQZQjD+;QT^de1oH)l{mZHZ#GEySN1QPr<9fjfm`_efVk7{oh2q=e7F9 z490S)P1F*xym2ybiuxt_8dLi3epkhasLCUwj4?g@#FBXG8C^8`%JO$_c&Uf{3I~60 zTYi6%VN6l%a$Rb%AGXI_GguV?9RvD00RS%nfa@k&0x&T_&JOJmv7aL^`7pk@tWIz( z$4SkONZIWdU+G*?bohYVg3+H4beAz?>ev31G1q1s)2u25#4m zQQ_j|fUg@>0+yyQLzisWEN~=3@kiP)`$(-PaDz hc&$f<%0lI)KiJ7iHr7RDVTdD>lhX+SoH#z>{{wjD{B-~T literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_base_circle_particle_emitter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_base_circle_particle_emitter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2222afd1bd626d6c053b44f0edc100722e6b0694 GIT binary patch literal 526 zcmV+p0`dI-0RRC20000000GVb00`0m0000000Kh)|NsC0|NsA3h<&{^1cO8A%jjne zZs(vo#%}EZ00000000000001ZoXu8EOT$1AJzMC1n3L3^Nvb_r1hr`Kpom_~aotSX z#bh_^PKqM_cQ+q4wT)3^5!*x4%;e2`Z{M=X7=L1O1f}O5lTn1r;s@niNc2#WpcgM= zngmbm|5Om6p7eXg*B=i1Js83%%W0uB+z74`W?-gSnh3tAibhC|a2Onq#>e9$IDlZ} zjRNm57zIUx-|uDlqiqNFXh<_oz%7V@b7pWVv>kg}kH4s<13nYVsOs3Pz4m)Mz7HqA z|5N}|B@Ho2#sQuqN|yqY$Pu4RD?&~fL7XT?klwLKmN@B{_KRWNY3{Q5 z2a;W+^&0J2XAhrPX+PE~h5KTMO^YMTzbdv?%sBp|Q={hle+XSkX?MGQ$AB}bu8IqI z4a*`cmf6L!Sau8YG;!^HSPtUeGYQEc1Bi!r!sF+$?Cnq$bmMAl!k#>A&ST%xWR~Y} z{rA@Zu(rmt2qhxmMcUGPjkSujA4ir^GAgKQD;Sz}kQ3?a>giayipHcDms-h|V(}T8 zXQEr?l{TUtsko8mE139NzU;ea#(V9vUxL8(W76t8SRR9&II|zo1iHh%nP0%Re~7Bl zzDq`Y{W~LmV@x>q;lB%SjWrLAZ9Vj+Me!;K_Y;?DD_ir1@+<%V literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_base_rectangle_particle_emitter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_base_rectangle_particle_emitter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4c49fd042cdbbd6e35543fe73554fa0aebb1e34d GIT binary patch literal 550 zcmV+>0@?il0RRC20000000HIz00>I}0000000Kh)|NsC0|NsB>+f3eR4BT?@Hl#PJ zmL-zEPG`LU00000000000001ZoXu5DZ`&{oJvTu915ZU7bpF^-plDEFU9h!1Y#5fq zwxcT3wlG^VB)V8P?7vTvmAG--9tIC+a&V$YK0iH@Qp5NURv;){L`-HG-n$3NLP(5I zlAwpEVVVT5?EhL2p_8(VM@Y{v&fZ+4 z=kN-WG)j}`b&@77AfC^f_RfX_yECL2C*YREz&mE}3vyzzsPJ=8@V*lO_>)j(UCat5!~joO7Tt1EdMYQn{(G+B7P*kD3fpSdb}mqVJB5+e?}OEi_=P9FCy%HUX3;12 z2|g%1PMnc{{=Y6?xWQUiuAtVmjpaX->jnC~LP+!(3w$e_ZIBXNUfIOch`@~UZL)l$YAHmq1%tzAW*<%fK~&*jm!?Tr)UzL=l@6DY#ix`Q*aXH~Zh8Dtl~FqAHuF z!rxa^`|jh%s~0`}7SAs^>99(5p;F(?TXlvTpEL=o@tFIoEI;)@xT__Cc}{eA1r<+|BOMA0jJQ) zJuWAC^4?5fGjrNAaju_}^0i62=a*+M6X}mkZZmaL(wRBa^DOW5q**GnX68!Yx#t)c z`a1T`y@b}4U9-+72!BecGu%0+uk%2McJQ|9mWMx;rk>1cS-S7;13%x|+jssL&Z(Ey zd*?pcdyn3`3AfkmP>Xyk^@C&fhhsOc-}P#$^=Mr^cME^@j?;4c5{@7E&s}|Eon6q z7%$n~dUC~?Gt!Nb(ob)3c&o@lR6`UpRLn_ENZ63l@W68BPS&5Us$54^J5^_%j-5?=!;*d&2+Gt&d77aOH$$nZ)1<>oH?xjGBb~^RK2)DuOoCrsK&_?I@eB@`kmGG z)a?qm5LR&dq`%HbU!9W-QBi9GSxP+W)-7ui3yBR#@=D7zJn_=vOplAXvCz>okIvZ0 Oq&3wrFo-o5O$PubA$Iuy literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_circle_particle_emitter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_circle_particle_emitter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..46e731c0a28c0db87622652013b93b8aa29a28f7 GIT binary patch literal 867 zcmZQzWME_f113QR29D`aw$pzo(CJo`InOlrLHeJs2mChOmHf9L!5g9mLRQQ<8ycH^ z+d!nY@8JK3cD*LAQ>@=C+#+&oY3501JCEIh!KW_dSPE`dRX({e_09hGr^+6iESbQ| zKdIeir``AF;{Lv3slQ9S*@ARAMGMbd`_|s6D&Av|xT8|hGPKQI^WXU$hCZ=7`d)v~ znSSccd2Js5lQU*r4YzsG&3s^@$gO}x6UjaE{^^}9yX|*ZCAn>q&AJcUS1vi`YPq5Q7f;RJKE0wfSD%<$ zuD7^S^89tW~RF>}l`&mPFl`Pw)2`wQkf)7u|Uygg&#?gw}MmwXaZHQupZ zg?CMKh4N`XC*^CC1lBLhUMA8Xxwy%6m%Pr*nVx5Przg!)nKd(4(#Fm)&h@o!o_@r_ z#z$wSZ}?bjw13_mpW`kIR!(iZW$QSwdrZByXMm zybaqT3w<|5nSKy7v+Lzszxyi3HqX}8Q$x&a^Orf#YTteKu=&}GzwT$s$z9lEn|Ynf zO3t&t<-qE;GY7U#c%(X+b>ELQ3!*O?3Vml6X01p8B@0ke0)k7x1oZ;UVqlsCqCsh@ zb=zBwHM2N$w(XqVdQ$Z0N%ePS2O(-8WW}7deU4m*3a*>qNJ{agFg<`@pGn z(Il-!2bW20=rjrbXi#N){^6Fc0LMELGg6r9pV>NjwA;L1b!qa+hA4prWmi(F)kYu=E}skJ;!?3PX8(2&T%O6fcfH+4Egs;XVpiGJv3V0S;u*;cgpf@s!R4A zd3G;j&N9y=)itZwvTrRe2$;5X-xUR8zuP4hCQQee_&B!awJE86&3HYP+jULR>5uU) p&t9ZO-k8s`EP2^e)>DbsooDKwcp)qqIw9;OkYWCbao?48O8`ubli>gW literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_i_particle_emitter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_i_particle_emitter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d33354f5af4e9f2ba017fb6e1cd167346edfd0b0 GIT binary patch literal 314 zcmZQzWME`~fL{y@OtBCqlhc1F_`I@i+JD-q(BH)q&xpxAa{$6D7}E}idLoc@#-z18K>Ss|Bnvo6=R zO1R|nI%^hr>!ouIcidJlk+lqYG2=%ttL#jv*{>UC80syZ(A4%o`Tth)Wp?E{Zd>d4 z+>Gz}Kiv^4)+!QkVC%i2_sTXwkJtJYh<{C3`Eq%p(shL^;@zK5yOy#p54gH&-Id7D z@M=d**Bkp%Ehn6gSbOf#*JljX#v7UH46G(UFlVXpEDV{p;a9y6d)~>++3{P{&K4A@ ztztj3?i_2$hl=MX9oqMN?3}TuI_q{z&7D5BE!VQ^Dq9Uo{XePKdw*mOxw9$(0ExPb Avj6}9 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_point_particle_emitter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_point_particle_emitter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..189d6b78d2bf8b2bda1a3cfdafb9093e08121018 GIT binary patch literal 667 zcmZQzWME_f1ICFA3~bR5Hj~qTD43ozr(a8S*1C+{=jJuuX?VP^f4?w94TP+ib9Rca z_hAQtw)4DC?9X^^d9iHmJQ2sWp;ZChU0XU%?3%fy`DEUWxgy;^?%!RqvFnS%By^Tu&!3vByrfvO)Z#i~qSU7Ts&qS((SJyRN8@zw)33Xl zG(}Hk91q$o{C9nzYR|2=1`TF&PBf(-J7lUk*^7O8SeoX_n?;u=hH>oud-&bKhmQQ; z7F-s++xMb$*IXk7uI4=zA0IB*bM4@X3C{xOK2Mmb_CR`ZpX?mZ_Wj@Q9bO>nTJYz8 zdgXyv_oXb>FPx&sak--T(@LF9tx3t!r&hV`=lfOW6t!%^5;vnKwebftj_=-(R=O!z z)bX_F&gr%7>$cTy-DW3M{7`81uG>w!vo=^(th=y%;rmHPZfI;&YuOmOl=bI(T;>XT|}nre1N39nA?Uwu!Qzxnp>gFh-O zYTw;|tZu)F|dYgcSt?_QsIc%@m@#F>X2UH1y!xVOV! z$Yt{#P_%%e5(v705xNS@VqlsCqCs(*Y%yK;@#&S{Oy5{c)zd%rqt?A`A4Cm=teBIW zkgy>oAwh%TQRK{>tUp~(O=Dp)fdogJnD0Jw!POaK4? literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_rectangle_outline_particle_emitter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/emitter/_rectangle_outline_particle_emitter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ff40a5ea5ec32afd13a674cba4c05cd7311f6358 GIT binary patch literal 789 zcmZQzWME_f1I8N+4D1#VHj~qTDDY>k4(^R{^wW1Jxhbo!WPRH2K?Ot&gshlzHpDyo zwu69O^n(8e%O~x4>&2%#Wrjo4b>A8fnMZaxP8zqbdPMEICAwSra=@?qyQ^;KsZ9td z*}!+{&5POJ&7+GxPEO}Ime%uHOMYyfrlDX zXK8y(eaQ0kNIvter`i=RyKh~to6PyNdYAW37z_WqxHe(wCk9I_v6M&z%S6EvvVSU%b`mpsesU zH?;|hcO}$4rEL9!+rQ{DzI(SYXX{;#-Iwo{HQv1b^6m4NpMJmjwYXmY{X-s&>3yPi zr#w{6dGC_;mo=lS^~{%x8}}cIN-+NAz3$RSW2QCVnAgnXyHJ!RywE#)!8lI zOup+je82Ug{ZI&>l+o8iiuZTypERG@2o$@Z6afT#f$5?X%wk}g1foGnV_!ndS*>dm z+C!!IkKXi9?k=e{_JOE@kQH;16B0J0G(51Jxs&y$t18z~)lSu!C%JyQzO3r3)YM#= zs-R`6Z)>a{x_*m_vAe#dJ^u=|^-ChoOP=E@=H)8v?fCwsm~oQewLLK*#yUb768hp7 zYBL>drZe(H=r;T?pRjS>Nx{+%em#XB+Y{z4Sgrh^PclLfB8blg(fYY^FEp+Dt(3N~C6L#$1_mlRMrd)6` z|1-hH;?mD|b}#q6KgTL=U)i+4_t1_mrI_&g6+$Z~EL8I3U-O`C$%#95(_J#!_C2pQ z(%-Uh`D3q1lCz7v_U~ww-FF}|Behd|Q_hyis~V2`-&bE~H;xNh#d~JS1>l4>6PSjIPyT~|qx!y!g*38QnS4PR&xW5b3 z5k0SP&O}|q&F_E4wEPF0ud~ko@^zc??&i8cHBH&;T`zBLD)?D$Szc+jQMz9J&%OEQ zvMO4)X2l=O-D@FJwETtDEz{^Vz5>#759fw147|GV;1Vt0GpuDUzi-y`9y`HNE)DW}Vc&*CHt2TYQmy#Lp+;zSf5zTe`?%i$0H?Mzu^ts|^t*G7I0a-)22mJ}8z!DFX=30@KG5FpGg{5{L#R zkqK#&YX384af_GOb+1tPajAU8ljRUK5VB%Uazes}l!gbEGk3E7bXDa#s@kbK^CZ_# z*OyhDm71C>Qx&vK^=*yyL)ULnF?QFtwC7);wth*(dC7BJ#k^dFy&d1b6f;f|ytXGM z#8^itLqcEtLT#pl&2&bdh^-P5H;y#)NY9zW`Y$u{=t|X#EA%=-H-u`OJfU;#bgAE2 zZBN~V*mgE literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_acceleration_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_acceleration_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7561348d05eb99f9784221512e3484ac1bde4b0c GIT binary patch literal 721 zcmV;?0xtak0RRC20000000NN!01c4<0000000PSY|NsC0|NsAGJx`Z=2>=J*sb$DC zA_oB1ME{@w00000000000001ZoXu8kZ`v>rRzDJn|8Soside$?TUDtqQ#(GeRjM?V zkFIk8Z^4di2f?QO_n8n1goIL-X+@DpCqDH0%`(`-O(RqG7LT*lZK=qG%N@ zHVuT-$N4_QFOj2DE*C8*!xahjL`e9;sPKt`dr77~qm$L5Vw@t>Ykl+7s_+qNO}pB# z>(yFyY2XyCAbd9FK#i}03~d1C8o8_BhA8|bj0b)reu zlv7Dap3aw-wNPXaHR>? zDhIrrDBUsi-FL(%l1PSB3z-wEI0-V2zvMAaeDHihGz8m5=h3kj^n|I>&O#+&XHvHC z`>#ShRUmV1l*!|%vWK$knfyMH>5%b5WQSyaaCz5zbl7{nTNMU|MoQ?Ea48}7VK-aP zBTMg5Yf~3Kz+?21Yoe}%8KX{az7%UCQHPSlG9m1#F^bC7-qCJg5`v|}kojvc36T%7 zxjC9n22M<8A7>_*3kvn_ma=cw*6rEQgUf`~#gHl9Yb3LSgqhB6ncZg;jG^3g)q~l33 zg~w%^xLuBS&VZXj>=BANjSW{{XDB6eF>&_WjdDG-#tE?ggkb%4psyd(^IvdmQ#cI1$j5W_!QpH%sAlOG-IO+Tywz}QxPhNk|LK}Fv9%-U%M5bCF zNPFdXtVHXT$cYt3s!Wk(H+i|mrB+^Hu6~kDzGIDTHcRya1o64xTu!Gmel?SmIbLR5 z@b$%&;FDR3g796Itz~o;l_-ATh9KZ4d;H`HKiT6a9e$#E#P@L&N2(}|^)HM4dN{O! zam2>sID#=;W97HT!e=E+jt=fD7P%7Jz0oNx2>5()IbB?Ecnj$y;b}5SdD=LzI4Y}k za0d}$9URjF^x#QL2OrVVO6g5b-!QM}xyxf5jTnOu|Nre1+#2mXYVQWfH&98R6y@@S z>S-ymmGH(6RMkQKW8Kd)r7?#rH|U{kt*=|5N3JS^dH?jLGliBM{d#%6d!-NYe?H^G zKahIo-l4}Eg4H|nKJ@V`Sha`Kk^7#)WQXC)jAfZM1*{rMZktJEOC3th!Xg@|5w5?~ zWUZ3ah-i%`;YmVmlmw%DCA%eb5VX5O*`1CweJ<#ePvXe8hV#GrXF%FcN5`esp})dr XhZ}A5t}vB@R>eWY3&i~fQIzc(!G8h8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_double_value_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_double_value_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1a82ac54e494872f1633690d2fb1a830661c8563 GIT binary patch literal 688 zcmV;h0#E$_0RRC20000000M9T00~wA0000000PSY|NsC0|NsBfkYYnzO95PV0%L5o zQaar`>G`1m00000000000001ZoXu5TZ`v>vRUe7Of4EN*ur&!3`ay+M+NxC_Xs4p> z{l>WgZ;2h*4l0}a-)Hi{S3#PlJPZk8?CX2aJwC@iahOb(L(qzOQq4RRVMvSB4~ZEU z=`w`#OHUf0=A={;R@Y%R#=;>vWn9bl?UvGnWdUIg>GJ zcvP6goXv|x%>^Uq4u*rvVebk~!SB2N!0q{6e-+?0ozyaEVPl|;LS}&3BpQyB4D@D5 zghj}di`jvY-%Y3Cc`*9-Pm$nG3d^c6x`uo;L3-d6hc)3zl{CZ*g%HIO4I~pTaxQPL z53b_ddbLi1RmO}|b@f!p>9~Gc5f>PjJ*8F0<1er~U-tT8zGCP|{B1iIUqff9Ew!C~ zld`>Hw_)a7yBo$~w3U22ph}zvY@I;ky|z<$Bx9^=KEX5}{6Au!kiA;0)g!6ANXZ1I zD_ZYXH-z^jEYt`Y)ozCMRkV;i1SvM+sV=}$L)BkMtI?h+4oaxhNnxU!mjx-sL)tZ5 z9$!=WQjxiw4rbfhzDAr!&&a&m*FYu(~ukOm@t?T^w0uAjj@S%Z%3LdpSxNih| zek)@eicF@&{%Y>fcc56)Zd~!Sy28Fv4=W6|W(QjPUOt6A0B!iZKUI{dmGCDatj{eY WFcwlQ6Panq-BgQ-EY3eCVzpro4MVp8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_single_value_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_single_value_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9b576894028874a4fca5db284c173f50d75c5907 GIT binary patch literal 659 zcmV;E0&M*N0RRC20000000L7000_DO0000000PSY|NsC0|NsB<18Kge-~@P%Xj>_N zLLL@4>+Zb(00000000000001ZoXu5BZ`wc*R*qQWKg_8D+IVdWl!uU#CQ8JCqzY>9 zoAnsBwRf%EwG~?BzjyJ2hef2e@}a(X@w~qI=9}fhVKUiHK`Tb2S`#XQ0JGf-#hMEw zC=54Sl2Bzhi;%=J;2}pvK2wb=F4hr#qfv?r!40Po|B1@|PBWV4RhUg77_;H0kK-W= z#@>YXePmu3(uqIt{L#Q0j{3o1G#F2qbKxYE{h(_Ei^MIExO*gSfyAwlxcpFY)^^$s zj}xg3XhW_2e2UcY$X!yi`Dzc^eY$?QeOw*~|54#DFB@Hrz0fdpH2I3_bIoGqZ zM*312o1|Bz%t+N#M}?B!mQE++f<|RaN!9NMIQ?99+RcU3G8?YlJvT5v#LbS(WlU~9 zFx7f(jIDb##%lW=tn$PEBgrM&?GH4BQjt)}7*=V5>SnjZWFainkTPssvisX2lRN+^ z4nwYPgmTu^Pe`g$ZQRAI3t3-1W~dYo@F1qb_wTD5tLJRs5uV&>jpoVTyfV%Kb-LYV z^;3?isX6eB8ayGgj=$)ihn@NY&Ea%sO3#);lPXa&<~#NZ7->9pEB?V;fiLE6SKk)w tL8rEjmvCCV3-4=Riu{c-y%54Ks-*(1g%sOZrW*2fXk-g4&ff+BfQIQVJFEZz literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_triple_value_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_base_triple_value_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..376fe2c5af142bf2cd7ccda67dd7ca9eb7b78290 GIT binary patch literal 707 zcmV;!0zCZy0RRC20000000M&m0143m0000000PSY|NsC0|NsA8TXO0UB7uCm^Adhc z_RhgTK(#&q00000000000001ZoXu5jZ`v>rRzDJn|8SosU~3Y}TcJWKrE0|o+Ns_4 z-8dKUme`T)L}gR|`%GRSyh+oPN#hHS@A2Jp=jYBB78TKY1WHmz$fZNL=V7w>L%w7j z9pswnwG$Dk84b`0g~xn`(zzoFzepAZ_>BZH&N$PI1nehD`#VWU>Q`big5kg&64&n! z2mO9;*!9~3?6AYA{Zui#>Cz-u`?!i!Ng{}h&Oes zZm}>DQiIaO*iXBNH4E%H(W|d!q3oB*)BW?jeE5$7f6f=_L8sNKThM}A66=+a@WiMH zh=NB+!hq3LW>kz*gm!P#yB=K);S$`g?e^>|x9x5KPTh*)g@FTEC@l%qK#dax=Zg&Z zrjdIYJB6@rk6+NHu!k2ZCq_=ZvSd zoZg(YlDDn3$^y%nY9Xu2DU;KA{WN^WNs#9h6&X)H!Tx@p>(PFWzdM6J+Ak`420v}4 zVy&q-GStd+$`s0BccGe_TdL_5Q}*uWU|b4X1{48PKMa*l)}go02};R4-0$WT|1UY^nofmxGDOMe*3UMd^w<*hi+PAdm?hL`Hmj9tu869x zoFzo#UMY?e$ZEp;#!{{rXn!mg0DjnD@Yr#lD;!Me*+w&-~j3kSOx$9 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_color_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_color_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..09cc3d90abc44a16c25ea7b9e4de807ad9dd80ad GIT binary patch literal 583 zcmV-N0=WGE0RRC20000000IX900;E|0000000PSY|NsC0|Ns9)ltgXXSqL7r?y&JT=T-*D-9n>sD$UR)I3c{+}AI2k^&*{=fP|qj^GuH-gy4h8~K4>IxyGC ziaYBL!p7#%Eeqg-K^f(6!*l$qDNFDhPYOJC`RO_X#^Bw*Uv+|olDXm1bU0K zMC{knyIHQRq6fd8PiIZ?DWf%iIAJ7timCNIX(m~->N-FDvX;Ug_6X`I{UPN(&EZ@7 z5X2IVvA^I8xUDwlqtrFpp=9SqtTcx1 z!e9hjMG+`@P*FQS8!@$ykhQx`5K9A$qyG&!A=Rw+EWAa{$aQ#fk<@smw^vwN>MHvD)ed;4jvv)vK# z+p~`UduDH3EtYXzCj7#rX?Lesy5l zTGM+gPSv;y$zOHk{mH?v9dPrrMqkm~XIA~w#ZNwZBzY`y*=3{HWm$oG!gG&#&SOn? zT>M3St8)UAp-{(smLwGcdybZ$rH{G|IGBUY`)mprEQ34tE_$?CNo0FQw0roeqGuO_ z&pl6MD6Uv)wZEL@y4!BAtp}D~nR@Z}#T!zq1s|n|>V^ff_$!`snbOtL{ZckX!X)yswA&)utuydPC5di>7@a6IV literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_i_particle_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/initializer/_i_particle_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f5e1eaea74ef2033e4b285cb2a099be603fd480a GIT binary patch literal 357 zcmZQzWME_f14dN_2Bzx}Hq)v9P{4Bcmy6^s#t;AhtytpKn{r3xdWbJX4TP+ivv#7R z-(dp**P}w-I}htD6e@eP&4te?iS-rJ5z%GmmdJX%JyEDEdgQL>?6$lJg%JHW8~;B4 z{qna{#Qis18O@<~YeaT!T9UVaLi9#uSG}S;E7_b=q9@<_F-d#b0n>5%HOw z^=F%`oD6d*>ytKvrCg_L%q|C?(L6s*ZF5!D**%vc`%=92niLl*N^N<+L+OR&lLHF% z5d}EBe@k=VYf@{aho9o(7Pn)ZH z;*!#3*Q^I@TPD6-dnI$)J60{hvt>6=H^wdrNYwwQEAzwW$kL#K|NjjoY&IR44vDi;aI zYr1R7dqcng00000000000001ZoXu6ij@mE~)gFn&Kg_A3sEq?!LBndLZCC1w!?snC zdY?EGaGThX?I38i|6V5q5?HF1Du>M_PG;uK^P3s_%Ht~E&cJBSlwLBFaZKy-MRF-5 zF_Ko;Ez40`!Bb+HibWzwv#-jc6-v&fumV%@leGUG*H{5+TF-#LONd8NGMNU!crr?Y zFdFf2d>tks52rkyMuZqdk$2_g$baCHz)|pb6#N4Pe@DUJQ}9KT@uu(fJ(1-~+kcDw zQZK4NHXQan7{VPEcBM3Y5?rNd;6Y=S3clJIjgXvR6wF4`+4UIS!Z`GUi9ZfTLFvHy zUS34b9k`1%a7GuPjU^cy_<)8MLM~JKhG{`a-lis7XbGjte&+1e%so@K zL1+XxkAR!=2x}!`Fk}zWf2(=J25uXNo0hpwb!xsK?Ir#2oKq|M542h+-FC|(xwF`v zm5I_U(JF&Q*{%2G*~;e9^-qGFI-1+N&uh|J#B`!+d(QSZMlJ9D6Y~A)MBWo^4{mW86 zqNCV5742^T00000000000001ZoXu9>Z`v>rRv(GP|8P$eR9zCFzeZK5qfc%F zHIK%*fVW^rwu8#1{qJ)i5D${lqG)P_6cgWl_xZcC&j$__$-ECrQcuXSM|c?GEPEjz zGmai|&Gg($h}4Y6=uJh)B8Jj?#8^->HRMb)60=_@-5+E|7Jw3GeK-XHQ z-|;g8ujwS|$e05)z6wfo0esfTLj?n(@QX0k_(=24CC+}@mWYDQ>ulmiB(gc-h<5@<5h(2$aCdX;T2SStyZGa#Dv`lwE@2Y`7cbdtU7A# z7PU6J`vW{I2DO&kQiL&Td$Fxt2Z=hB9J0i^)65_{aJEubKv)8mLl}b{5SFMfvKYLI zMg>MrV;f^8SO^Mrv5fMaU{!oU2`(**3u`_Pw>AG_=%74wP#St*V+SR%w+-I1?pN-) zN>yzC3Sn%Vw`%jY&0V6L4NxVXjkJ^C|39*75xrh*>NxuD&|Ip_r6&^7i=>#sLv}P@ zXO|>z$jxCG5sEc6;H&R5l#+$GkypWsX0*Ecg=96V=#jg6=i1*j2iW~&t{7Ec y%?&g*eW>l)l~vwUYwkF??CD$(&6b7K2Z(; literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_acceleration_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_acceleration_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..381b27ae0368cf19ccf4dfc56b5f5ee7491e26f5 GIT binary patch literal 1270 zcmZQzWME_f112EJQ3hc%^8SYco8WWK4^|4D@%ek|{F2p+S?9lHz6ntSAuHyb4Gqk{ zWgrkH-+82d$MQ}^G4%_F5@v-&Ws36WOx5yz`#3TFK=cOXOGtbGnXWvTA?l*{u^MsvK^c6YRsb_DWWa&M*6d#(S;P z75;YyGaY}iUh*&R;{9n~yxsPv{0aH~YTg|6TQ};N?}<0doS1cX7rXC{V`t87XZ~GTN^!N{+YP`BvWwu561HRdZzDc@!MRjic z|JHEkZS~UCnjLl^JkTRv<>;fHM<;_*jPkaw z)L7;8S9zDY(n^CijcXZ-H_NK#pN`vXJkzXRE=I*;SukYB$8&yX) zb>Er4-|*7LkmXIXk3V~U*8BC+WS33uELFW8=4kmF?+%Eq&y4SjbDer`;?{Ngdz#y8 z3hb_@`>YGzr6-noSZVR|4;#Fmyj}HqMs48>v+t=QUB|f3qc3UG^hUE zvtmUNm#5_|?e_N)=_WQ?DuP3fvAs;zG%z*WacO(h&h9ny`p+mYjrqCrz6Q_Ku+uxw z1)XqR=Mp`A$Ns$CMMprX0F-io;1L4@&shkQkq<w_^c8a$2 zIF|aV#9g-#d@CdK%wcYGre9=TT9;E{7U!zzmyA9O6)z|gS>WO5>s~sqNq3f3wu))M z>W!-uUrh11n)GZRE?G^Mns7rK?PScy~)K7i2KADcE>mMDbjPSj4y;NHc+)lpJ$y{Y15b9h(k$=H|>!H)L6G3akgB z4n(r10dXcsJuerC&+H5$8H$0Xy$7=xm|TD~Gsv_W)6bhC{N80gi(qPFE`Ij5bGmy6 zL=A)ldGJA6Qo@6I#||9W(71VliKe=7LV^>A{^Tzs{Rg4YQH*1+HY+RvYY^ffq ztZS@q=+1a7RHI>IiHL$xrsdC0RW8=PlP6bNu5|5Go%yp;u;Pi5spzW8ofei4pS@5$ WloD)u!PoI}=GoJ%4AxH^<^upzeGT&f literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_acceleration_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_acceleration_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..dad6f429619d6beb0d61379c25c4ece50846dcf9 GIT binary patch literal 1595 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 HH7^$cdEWp4 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_alpha_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_alpha_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b346aec19a151a6a5a030475323a3d334ea7e379 GIT binary patch literal 1904 zcmYjPc{tQ-8~zblCd*(fQ{>q9WEYOnA&f9)qAWEgB1<_nM-5V)sce&NbQxp$#zzc7 zAz5R{mQZFo801WriG-sW>j|Hk{P8`1JokOQ*L}V3{oL;Z2mk^AzXXW@AYSs513G&L zl@_P@6r+yY3>#(cYJVxFYwQ_h9%%T0%OCWaxH)bt9iO1Ii=ikMCQF1-;0!TM(&t|? z$`?d*)}dzgnyCg1SDT#;cw4^^HLO<(qiEpY5}JPNeKoji&*PS8!1A$9JRrr!M>;E= z>XY;KOjAXA*`L;C3rOhpZx!0lGcNpIe(6hNtd7ryd1w13Y5Cp_H%RI+N}VIPR3_9d zC?NZ`Qs`|HB`!wryoPt25ym}UB~xfwBU%0H3TN=4$??yZ*S+qAqO1~`BB9$;O*uoQ zJv3#m({|Zl$7q|Ffm)6BTnCIpFdh+cVKK|!7dnXDmDsi$ee`Z`Zx(=D7QrcdHJ2y~ zE3blyDoLkBb=AQS!P?@}{%>atI2;RtVH7jnYGMwE=xj{%JLy0Vc{S%=EMK>HPR7YP z4qT(k7VCtEU(|z@woTU(o^Bjj3z(6JPXC5Yst^iI}5!0YMn z&bu6$X~r-8*`5rOB99)f?~$LefBBzQsw3u`vEfn9UFh6+{eVjOxwyJ3u~kK_zpa%_ z>fE_%Ws*TLOutQiB=!a)zrzq?B-DcF7Rnd>(CvZlme3^mh4hX`BSyLYIa_jSsqD%` zPuGg;ELT@mk+*j}?OR4zXqlZB~Ow<5FsCH`c>D(XFy8tRd zy_dI^yj|X}YXAU};xhoy;~{UUi->x9foe|C`j#z~zueq=h;H0yKhW?2m#_S|L!#4I zT4?9DWJf7~m}4%B;t6dG@WJ;5&f3}Qy% zz7*y#R$9gusF!*cnx&P4nC?i)(#3_vILi*3Pu4a>t{OzGH5AMnMm470Bi`5Arg+L5&dNC09tgeEK8E=tC35We1HnUA>wBKoz9PE~%?mGrtQlvpOMj#Sc>RCb99p zl(@DUEw$&~D$iFJaFZBzwgOh9YpM(Krcy|V6E~}^BMNupmc?7$Q8TlPe?)tm z-}eX5ieIIy8a+5Y(QfJx?=y)o)0ru5R#gdjy^E4Laq7cs$seqx@aqj9Hx|TX)4UGNw>X3Vx&8)byz^QbT{}oywEjuSYK+_cUIgADZa%p3VKW@?-FX zLRxy2<8a7--FuzXt1P&c@lX1VnmJI~6SsvG z8^(t0zfws*Vv>173hVMmb>Gitmd^kI>3uxJ%g1ckCan?rKFinMM{8{aZ22iRV(6#l zXUF9S1qO}{(rEt(Cl!dpvu>JXL5Nrx0s(RiD{dka&q0|mOi%D>Q^-Xb6oq`hX)?)|NY0VX&Ozl? zWM-2|ImOZ$7tRsM`B@bRAZS4c7EHhSUDi!bobTTpvhU5x`g1rp1?5JQfg)leE*TXL WTEJS5U5&HwnFtFq1p2!@@&5ydk5R4w literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_double_value_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_double_value_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..8814434a7f191a69fcf1ef21dadf26ce22325fb6 GIT binary patch literal 688 zcmV;h0#E$_0RRC20000000M9T00~9_00000009vH|NsC0|Ns97)2ra2s}oH^TtZWq zy>vRUe7Of4EN*ur&!StU!g-FSX)<6Wnl&_%BlK4_u>j0xR%1QDvWLbuc4N1IYmK3{Uk~nVuk_;BZ&s$ITtyX zSLX+#__B>QNw7+pk*cXZ6>|DmKb?>ZjLJPF)s8Q}!0vpx*LU+3Lm%W{b#w8xbeh;w zb@(^PZpLoQthjdH7>8*Myq-`2=LxkFXuURe3U_3Tb+FW`X2P}_BBRF5u)T`bk_RBgn|P`Vu+&iX2}w2DQ^i3El{zU*bn&nzrFcL) z9W+$9)M75AgJ`wo+g|hRC7CDt4#>D@w$tr4tGM!Dn>snZMngLcyxTxQ1rIy#d^d$X zru}2m WTnZ^Ru}n4OK5E21w$DG-L$4@iUrHbV literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_double_value_span_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_double_value_span_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..34879d7d033de646bf9560f95c48fe5cae133511 GIT binary patch literal 1017 zcmZQzWME_f1EvTD1}<+1n^EjP6bNyLELhIqDH>tw9C>glx2AE(!T%675VB&<*)ZSi z#|8qn$0z(ZSibb+wz8ly?p%#6nVBaS?rxoOFSK$_$5vIv(}|}q{ogm~kKl2?Tbo{N zP!veqD`|Unk9nWU7x73%j;&mr{mFN3$Uo6OX6UkRW*x6;;H--xhkcIdB(6w1oFK8m zhij?5_>TzPm;@6!erAcoqMBc#G=3ah;o-^my(>j?@#`Yv^f^jC`{RAi>+hR;kaNzw z_Q{(+lo-v8a4_LX`Iz*;A+BgG$5jX4Nixq=jz=eM`!I6}tDfpZe$m_m_oXUhlBV^n z|CacVr`b{D;M4u}r&!FJp3f?nTYchr=Ox+0Cf|;@Yi(1MQcRq)WWtiBj1%vsoQQFK zzS((#`b7pl#~kZh3i)>fSg$($)N)w4ulz~bm3>olvWjc>6vsw}F8N&%efsZ@cgfxL zNs`|#e0zA}WYq-mOBZe}ykxa+>LR|)xiT+IPah7;f4J%FI@XmlBM;=w*FLaqGux$3 z%f@$>W}j!9v));J?byBegqLFf`?cjS_&6F*5n8zDNQ~UHZQkZ(GhDgzR;aZs;=jmu z=KHJXY*UjAZ++GEYQ6G9zbs5dYGveMw+#|3=A}io7OUFLPgIr0tUk@yv*W?qO~rE; zOP;!&!hOy}IdkUbD=+Sy$^H7S)NN(o#W#zYYv*0jj7_bRpT2s{%Om&wuXg2Xl+_yD zl1goVys*tGP*QIG)1Mt(v&5_VGx`@w>no~i>IN-dRkfdMeaHK}^V@$b@2^{*^YnFY z`1MV(Gv9^YTRF=qR^wi_Y)$LE6dCi4b=;dC+&N?aS)O;@&IjvfY7`X&A3I%OX!D<` z_7&e>Q0fAuNFcZjOqbDM76YR`hz2Figyv`EE?Qh41r?;S=fxTB%M7)D3{e9iE9R`7 zXv@W9DB!j{DEtH8%M!;g3}JbS8cIzGZzbG$j`*H9cdKLV((9i@?j7Cn&sD^6g9OJ< zwf7$d8-iFDm@qU1rp!&8PJ!cyzjyg SH87I(H3I|dJ0OpVmkR)~FTh*? literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_from_to_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_from_to_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e94b4294820d17ed68b31183ab9b5677c0ffc905 GIT binary patch literal 670 zcmV;P0%83C0RRC20000000LeB018bx)$(k03Ma699W37jua>K2=@3rFGQTtKK<+ZF2-QFhNCqEB zhF40Yx59A+!!*IvaLSZpFj)s#7d|2*8?;Ieg3&(M<582wO?GBQa#JRZg`~LzVY1 z%l+Y<`EQYR!C$uCC~cWLx30K7=kju1P5wylSr#;ngmW*+x^b`xO0(BeFS>+u!LFfo ztTXz}w8pwS#@ayI2;f5QkF`+ovA`lv>#;94mgWpLMJYW9{ z`e~R3_2Nr`O0ftVnORiJmiY300000009mE|NsC0|Ns9^o+QmM0j+^AvWXF8 z766$qwQk%100000000000001ZoXu5BPuoBcJ||NC!`F+TrnuR@P_Ia%K+VL@ zqL7v;Q7CegQbuUcN5j#O^1@gK$I>eg`!k#vaXembb>I8&t|7*@d+Hk@mCR_ zh~sz`Zw;c+uqYqBImk!HRwfLI58~jPbX}m}VJgf$AP0vEfxn~SAc|oA?@t}z%4k0d zpC&-OK#;BpRT>CSVGU!#m_nwEWXPAKe@RttM|wahpIT+e_S!OGV?$L`)2GLmaYkCI zrjDX5@(b)AH|0$#_6&GUPP{b)<~zUhj=J%w)VuZ!UV^pg2AMsfKfyyK{69QgqTln> zL1t`}S(C#xYxoy{dwX~U`^hKpxpz{>58CO4)_z5OE8tQa U{hXW9LA3}$`0sJP0?A!oCQ3;g761SM literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_pair_initialize_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_pair_initialize_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0698b775cbe748508a5530fa242aad3d96bf68ef GIT binary patch literal 659 zcmV;E0&M*N0RRC20000000L70014Xw00000006Q7|NsC0|Ns9y_w~NBZMvh?A=%oF ziw}yMFGDZ@00000000000001ZoXu8EZ`wc*J%hx5m{WymW0R;zZ4gq}REao{M2*t> z#va3{>s@PijgnUR?_Jg=HUy$1@}XQ<&*$^oHv>73fAa-`(u7MM9~241`n{Oxr+Q3R8Z zf64;qO1k@SJzA*O5~K@4k+g&-*RPZi|ajfQJ>=Z@x~xX6XxTn;bX0CdbIjC>D5ucI=W&==p|8S#jJjyK3HCF%9@pq=TCB7+V_@ zWihsx)C+2*C;=sFootp+rIXDgipq|<) zqNC9kS~eVhUY`Jk!R?Uphdh+{U@zAFT$2Ix8++gg>Sh6aZakGWpReQqY_<;7HqZyyN&CgN$K{K``ZFjspMm(3Il!{w6X*o&VRl>(|2?mKKlRw literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_pair_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_pair_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b04729254bfdd3997d9f2782bb270288e5f0ba1a GIT binary patch literal 680 zcmV;Z0$2S20RRC20000000L+L00}ez00000009mE|NsC0|NsBqI;!{tAGJlJ7N=Zs zdAds&pYRC)00000000000001ZoXu5DZ`wc*RgPHVKg_8D+Smj_3q(kPM2R?%M2Xt_ zcs+(~?OkhkjgnUR?_K->=A%+o`A{ybcV^$tJij+SbC^ut6s^b5XW^G{;FI6~9QcU+ zV9>h=Mgb0K=y$^*j{IJD+3$C=6JyYdc~UJs6hT1i%^!&+7vzyJ+`M@SD#KYsUMvG1 za#G$5H9a9$bHNSAi2tNT5puud8l5vILG}Ze1QyrLaosJho8!7Au3O?>HJzrz<3uV0 z+Mo@dKA##MxeGL_uXdr`=jp@kQ%QH6qM)XF5+w~WLji=5L<8}Hi*FdEG`l((#n)}L zPJ&g+j8t{?l#AztT3R6&7!}PVWvkOqu)kk4d9+_r^N0LdJ5yalr-{9)3crJFZ)k0p z71!>LYM4~Os|h7=mQbO-@m?GK_hgK<%LjPL7XOdR7i1@hHFhYK7b+RU%ZApQ%^>jR z!j>8$quO1toj7aB1CU}To^s9=8Y&+lDOU%oI4Pk*C%JpBAJ?Q54`{D~nl3K1m literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_single_value_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_single_value_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..8992877f030e0cad9a0d5a1fb877921f7b4b2cfa GIT binary patch literal 751 zcmZQzWME_f1Ez2W29B2yHlx6QD42TLVs@$8@xCW)0ITNSyp6zp22n1m|vse}ep$6rgnaqZsLvg=_PQ~%#PDxaXEWjdAr z>7iT3pP!vQGy7}n;gn6mGkhO%saxzxI_Q4>bEd(!_J>s#^M3q$aZA4PUP{vZ_3jcI zY?8R543)071qiatc>6yfXNN=6p@PlIoS|)-IXrck<%&X{2w&YHaHl}(!vHPO$c#nlx$EJ^q4UyVh)(&%H8vTg>kEdk6kVn6I9B zdd8iaHzCirZq2h@U>J7$eZo}vfAXGs7xU^DC{F2W@jAA_OE{$bx2hU<;>xxuiLWQw z-VvMmgwdl=rl?eT%I0-)iYxtk3&l6Q-k?dtmXXBBW07BIJrL1p1=C+)tQH1ZksYswpA^3QR12HuSE?mRlEwT z`4`iu|EzBQeKi?}^&8u#7tGqj|6V$u>ra^VUV%gFR^+nY;nFPI=wte%`$E@0-ShW9 zO_?MFN?f1>2?P?rWT^~hF)$i~Xi&<$akRMgY{M+YH~haQI*2)h>AHE$fv7{~yjzR#y-#?h!ar+2Df7%#eTGjH zYgazq{rlbLyS3NlEPT|oTYs_`$oy{HF7fMMM$WnC-5+XpNbLQ%_wvUVJnlcrwtT4N zId`gqb4i!r%4scK3J3Q5aN78UiIeN>*DjTi%yUXA8+j^D1WweR^{98!$Gv-2ue&2} zviw}*3Gd!RjbG-d zL`#$}=nm07Wn#cQ$tiG^rTA%%{g*WkS30$-^0pPVY*d_n=v?=M^7ED|EPC_)M>5BF zPt3|HDrvYbxKz3?@PgocmydI@S|)HyIZAl0Qq)V^tnBT>nlS5Gaxtd@M=uarqQkJsb&U$=mn zizSmI|GZrDfBTB9k+SXv`uzItAImesvL`rch;p92oH$Q)#ky`@&$L4Uyqbs4nKfNG zVZ!!R>zpdT16T0WnGa@NUXc@Sy0h%FQR%TbjsAeH2)`W6kW{E`L|hGfUrU zF6Db;W!=7&m4RRQmd0zodFoN8))MLZ%wD2KAZSg}%%uTb`-JDtKJ=IM-Z{rqP{IWz zb|5&+z`*SeW-%~|foM>wzdli6kH0TZOA$}D>GWNW#<}%2(;;dgWW}6XzujDi3`BaZ zmR>k$f8qsq`o)v31;SkK6!#u=nAKA8S}FD@|0ibO$zk4t%+J}*J+$HAd@s2Fq*_zY zyk!Y|!pM literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_triple_value_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_triple_value_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ab1f74ead67035ef46b27d574fd22a888e58745e GIT binary patch literal 629 zcmV-*0*d_r0RRC20000000K1t00}w(00000009vH|NsC0|NsA&3840uW?4@c<{c4E z*vhjsz&6GJ00000000000001ZoXu5DZ`wc*J%hx5m{SF`u}M^r$L(!(drBa7PD;N1e ze>m)QVF;HZ<&`#YM}d~Y!mSapq+nGTEvW$EbbLPka(?y|PGI!e8;!lQ(dj4y_`PnD zzBo9D7t2Nj41v4E!j-W2WGIpNUC0#YikO6?pJ)JI8C6(7uC+V85Bb&Wc6=WufB!2k zm}%v*s@S%0UrUs32xZt3pTua!fH8zfYQYdMNaeYlT^zKE*NwH!1e-KqZQ6>dkkfJf z^dnM2mN6w&#M4i(yI;n-w_oC~j^Ow9tBfAO&jz_zJ2p)mwK|kBIa literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_triple_value_span_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_base_triple_value_span_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0fbe76216ff8bed0d269d709b4d59d995f0efd94 GIT binary patch literal 1046 zcmZQzWME_f1EwSf25v40n^EjP6iAo3-&XM5cxv^LAA1kgJ>gpw&v_Q220~WMIU5$6 zecM2!)=%O8L%Uwp=(kI9TFpdmE!py9VXR`}`&Bh_J8n*z@N|RGxBKcpwLiJ+US( zz3|I#rup5jVlVvF7AyKZXj@XHE@ES-r8Mb4vr^%a7kc(S63aO@uMgjRdbPfI0o(KG z_r4smo_}tc*n|EyqgulP1^v#jmaGM8o=n`69=I7wJ}ehnx?@_4z1SAU`m868eLIEK z_Ar0WHj(*Z7xVwOy8i|dn~N>4m$cW|2JT9iV72`?vFmN88;7L2V9P`WsYlhSk9;mZ z{Ued0taZS!V=tfhmD{;1rerPrC8Y3vpZTq~i=(Hm*|PI*jCQzKm&tbRKZ~UA-?7WM z-s{o0+B0_9=C=kHtfy7@^&i-J`c~tV9^D1^ z^jRNVP-MH*VcGnwIOo~@y``6!vvPADF|XNt^uO`l{){_UW<+aDk)QP_F*iRy)AwS0 zp|h!qNcHTxg%h)Q_}=Xn*I_u=tEGL;L^)8c&X9TO|7M-=-fgdC8qe9Ce_vwrU%LCU z{k@v}eQyIb#TLZgUl`)iJD1fo&(~{iij+wVQ<|7!e*E{$*1vOnz8+%S6q)tBTqw*_ zYwxVj=5{;@Ynzg}QqN{_?A_j#9&%+*!4`?_E7HoI1qxj>F}fZyPyFHC=iK5Gp01m( z&;R^!UGK6P&oBRtHRrB$4r#Rt-BY^x17}p5&B~s~H7ub!d)R8R^ioq^IO5Ih5>P$e*nfl(hsgA!?SYx0?s@^e3bDxAITYHfAw73dqiW!TO0m_?g3-OGms~9kf^-Ul+=jChm>>_AKYfq4OKJel-50 zYA&5*_GH8Eq=XsYpY1))Tv5fGv7dR%t(l+0A~^LYiY=`OYO-EEJ)>LmboxTq$ulRe z+))$zvWdskH)_{6+9!e977er5Im`w&4Qb23E@y>1&J1eHR5M8Krs@UC6t!-@hzJ-MdzUOa4)_ z>g6Ywg@3w;I{g!pW=S^hOjueF&3i&R$!CJ?&*w`7u1&r&VSpU@y8ZThIcwH*-LT9drIlb=&U_qdh+;Pe|H_hWs_IGe0sHAa!>osTJ!0|se>^Vd$xyU)ClZ4;ym5H(8MeF z$DeQM>>CW;>`8dfc0ju0lDN}azYhPoO3_~VZyeUldL@7Tua2^qlu>R=`y=*M+&|85 z+R{;zGMhbi&h;#botro$cJFw0*QF%+>0O@Zju#j2U%z~_THVPE-Fa0#M{0eV^ViR; zIR5I!&!^|2xbALZ_m(~IUeS8S-?(;xBSL%m-9O0QxjOlB;43NTV6IwaW3#hsPCi`c zb!SnQ(aSF8t3Dnw9*52EZ_CitT*H#m>;5wE;I#=%hpR=m{@pAX{F~F&+FGmT?u)$N zJ)i9!FADTvpKkGG>xA=GEA;m8N`~?JUh;Qm)qb|%T*1 zKK!!i98he6QUDNC1Jgksn8m>40-`}lfki*S{fTSzTRE>&5l8J3j};geXF=3J$cj11 z2?=kL5)wA2CL~0hiwu|&KWSFXq*;psrp=$ZXu|yGGp9#RnmJ=~Ms cbfxOKpO!yer39Q4q!hc>R_~dcIobBJI=X z{@*^Pe|OQ{8UD*NnSytS_SUDc&)<@woE2daD5)!7E}!iy^zhSN-@rQ};UC1hUgwle z72SL~QshZy((Lz+d`559CZ21%>-?Pm!*cf^(>t9~*ZrcK@3&+Yq_Vy>-G3=%((?}w z|Id$YvJ8I9`m?H~MmciV^^7Z$KQq0bNWHw-`()MYznj;^Pnp%ycxl6jg!i)H@qv3A z(=VFxCkO5<=rFl3ugmRgY(l1jonX(ct?SxuNz~jGvRElCy+;1cH?jU)*)=k<`|Ury zm|<7CBYpDy#ar_m@3nJ(<_dfJsAfmi0Rx9arusLZrfM*)Niuw1sPM#_E6iK5P~}mc zef~wuwFZ}--&p)*MZ)PQ#$b&zleSzxw552N^2Yg93BRw#EAT|xxW>FGVn1yc7`8b7 z;r<({FU{W_Y5%tW$*(hS`Z$jM4A`Z@wO##>%tK{E+t52L_d`=kL`<9?{$t>MY+wY6 zMo`oPK{+r190Ri$81+FkC=E=y@bZKH#Nc#|R1r^EyE{2+Pd@U1sDY3bbCMGhOcN6l zVhxJ(@W^a?;Eh!qa91&x%?zaoWu3GZqU> zhzOZ9bI#;d0Sw76H5^hd6@3!+7U60N3clcSr#mS4^MxaG8r-t9LOvHU%6{l-Y}A!{ R(V?`aZ^6p93{e_kZ2*I@K-T~O literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_expire_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_expire_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f1c9aebe929ebcfd521c68043b7e0fa19724fa37 GIT binary patch literal 1704 zcmY*Zdpy&7AOCH0iw-)Qv|M^D#D*ARZ0ER4IwrB9$gNQ-lr|5W=#fk=hdQ$+Gulf$ zRF2EZW#~khOD^>c(=o@Ml!mC>lH>Ml>UmzT=kv$s{r;zaD z092@7Ibgi~EjFr)8o>Xu*dIj^ZZ)5E;!9%7-N{v;ZOA>PLs3(u z;-M_?ys%QG#!&EEa>}_Ob*lihA?Cc@vIHd|D?8Ule{%f}!ZumFd($Ce@O~)P&D-H@ zP?yz*=NivhhG-Uh4%*k$0NWK&kY#ExeDbOEDr?F^JOtL(7`XU{!3H5oXDh#^of-BE zvx{=!yLB)4;8^e-s=fZY{?D(|wc{VzRGJV|b@-!LC@ki^t1H@t&%H+Z7zft2-0U$v z@MAw{O1%r!h?<2+UB^XN$z@5bEn&xO@Y`uh~6F9IPb}ce8odMMS3exXXla zpI;W{@oDt43EG6?VZuTZ@?v$GG?pgxt6C+94m$+7db8=UUBp?&hK4}AE}6JjZ~V~qqLZRw3+TV z9eYu#v!pW7=%Ipi&ShJqUa8|%+r z(&o%H6kakg?CSnBOQ0?LBmtov{!Z6~!5KGy;tbkJl9rUcF^~!qfZuEUVwZ-M=lSCB z1ojm{B6`v)QkBjzGCS)crQvuUOO|WYBMZglmF8|$4-}saM*$;t;i2jAPG~{7ueE3C zzB6NQCfVKn=?cC*25My)i%W?yI_{B|blaZQ)}H9t^vcj*dgAAlr9B;hmh_2$S8e}B zPiwTyUwa8xZ%$asziebS!)+R!@lW~QA*G|c$?slINlU9B=WaaebCMY60vm!F)l}M} zR_j9^CyUAPSqawKE3`a1lAeYcvKYIo#_6XyZ zxqkG*Xfx&14A^YGCZvFhOq=%+{aV}&8K&~dq|9Es0iXPE5tO7MSmr?2QD;%uZas;c z%Kd1G;i<>>cp*Sw)If!>9&VfeuzoNxeE9hF{iU$5f6mz%m*S6-l!JZC=ene8n=$7O zK7myJY~Q{qLHLe0#5RzcH&`D--<(cX(scEro2OZ9wOZW75`~`^S-E-ASe!*%j%TXP zJ9spYWcRA-gh()uUefn2v_5VlSiW_IHhBiPG8OLZFaY4l5G+>#V_t22jPLWQj6d#q z8i0(haPT?bYIcCe4G#;eA*Y0i`^Qr^O1@`IGCP_55sZzJxZgXUuvo)r%{!d@;)48# zCj*%U_oaoWn0r(sVDA+%e>Hts4_u-wP^>I#y1@$=p7R=)s|d<;b8@8+SF%WiAma7? zE@&#r*5+^fmlugBk8#Q(lwf0{RR^>2K%=u)D9KP%5_*W}tg02K#UmHcEv=3##+apY zoccf!h1ehD4Jz(@4Zv>MY<^$+23gAxBA=}wYJf(c{ctd279rvDFw1f3>CCS+|H}z7 I)+j&y2X9{MuK)l5 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_gravity_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_gravity_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..35a749cf48127129f8d02147d4bbd47e30d282c5 GIT binary patch literal 487 zcmVz_g!3c1<{&;3l6;u4Z~V zqiL3@Y?`U$f>OOfo$AZ$lvGzShnkgiyp?FRrhWS%yET?1S#SJ7R>1A!M^NTI`VZH)Im` zWNXK3v;nryl;d$6!5H3Q<9CkXqfxHF8Um%VFlyHaYhx8bn$45RJW1d+q?aPO5LuEY zZGw!Ws@a5eP@%RfZtt_Q#v3fm6EVKp-^v2mg<3HkPBqhB4|J4KBI9q$P zz8(N?AW9z$75aqubP{o+yyJmb9h?7e+h3k{jUClZ6%NTO_{)G|dAInqdU*W&esTA3 zdmj8a`Z?Gwm*jo$)r;`Uc5^!NuPF>#n1tN1%-NN2-->h74vt*eKs852CuEl+-_s$q dvNkj}ylt?s&K^qF)X>Q{h-$%szW{`%k~p61?3w@o literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_gravity_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_gravity_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7fdb241a30f5c4de4d84e116f51bc2e36c9c0acf GIT binary patch literal 402 zcmZQzWME_f1I8c*2G)ECn?d706llDfvighL+{))lhl&o^$?m#%weby94VbE!b2en7 z-(drRxzd{d3xpSmT4XjZ<>*||bV-pXxAjO%PjRO1q~ek?F40H#3omhTx=m4x%XvNT z{Q39yc20WbnA*Z-h@du}NEwsn8h?3&~E34c!g zv?aoR{~guSUk_inUGU-RP2uM+=9pjY+`lREi~Dbp+WMbzCwSd0XA6b(T5MhxzlgPR q)y|L`%Ijr*ervzbbVB@EeddG-3u`m8xYyRqUGYrz2QOD^k{$q3+qc62 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_i_particle_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_i_particle_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d77845c28531d554e38b53917262e57311303f8a GIT binary patch literal 351 zcmZQzWME_f14elU2Byou>$;2b^5@bM57|upB))F0_Ed-(2w5>_?Zk^- zhYdv9ZZ2)ycX;QOM$f1mckQO|Q+gut4|Oc>_LX^hZayS(|88FF*JIohStrez@VWla zPh;U@+kZRMvZkh;RJc|)F}3yN=fhiOTvl4YRne<^_M}%+_4>NFb|p;V&u%>z^@?A5 zr>S+&6Q$#OvkYC#cvn6>y)w$GuZMSk@Pzd@7SHGuJ1f18lWl^G<0okq_X%?xieBqp z_jzb0*!dv$wez3Z1x5uTtA5%D8njp6Ioiwr;mk4f8wZmQl3C1i5p#BX=k#+Wy|iX7x>;NwMw-=yMK>UzH>(a*SmlAZU>mHbK0g#-JZ)>sTS^U p;!>gKyxgJsyx5-KoP}LqH`%2b$S$0_YW2f-d*P3)W#7)n0s!)zC}gp?hE&5nbKyS^P1Biy!iATAN5MRxl?zA++1^n=Xq3`k$<6$l@(XU9_gUE?=@?x zjqa=HByL$dm%rZl+j{xlBnux2o`-&K4;`zlPZY(= zpWwGc=JQ0Kr;3g$Ywk@ols&=rMO$=oy(#Apu?w@FxkpBDEzzp#f8>5huchJk|Mh$Y z{$Zho$4{B0JIq_TO7+;od8-#(UJ>oiHm7!7FV~I!FGZzq_V0JP>mL4byS?x?Rzsny zYeAs~3TYq+0*3cSFpGid6o>`|`Th7($D8II(%zeH%zL%Gdx>j~ge61`gshm8oWRg5 z#c}k5Sl3_UV(w4fULv2mFMSpI9269E+94z>t|~2VRa{n_XPW2IILD+w&$J@HRdH!? eX`X3Gercgu6X&Hfgj^9;%s6|Rm0@GK!T|uGWY*FE literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_off_camera_expire_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_off_camera_expire_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..48bbb07280d86c0fcd43076b5e54cd5878fe6fbd GIT binary patch literal 751 zcmZQzWME_f1IAMf4D7KGHp9gKP*C^8ru+V$G1UhX@&jmxK2!a3x_yPMO$xFkiVFHchVS3W2Hty&20goz$X zcO$>e-T(g2+{a6PDS5M;UOK@o`_6VYUr#pHSq=~5EKW9tv@Y548L2`v(hc+ zaJ}uBWV%V@^|=@u(N7iI&$b`jZJGC5{bO=PyIH)>GU12=Q*#cTGuoq`s{Qietkl?v zx4urE*W+XnJ@gb`_ zeWI6ZTJXbntVK>zo83!d@}JLD+q6MhpRKLH($8((&Hj{{^@c4g4nE)TcFvM1>`zqN z?#<@iBjJ3QP41Gn_baw!?`;0or+X5j4{s|x@p_x<=iW{e?v(}?KgQjCH*uzkT;+S+ z%nfPD8WYyMknYp9m-%MFVqO)S$fs&C_tWId8(Hi0W2XfgR)5=YqUn!&$j2^?*tx5||QFz$^wvUJwmR3|)Eq-Yz+`>V@3J^`iBG?`9v?Ja7@B z21c@;WME)p2J&n;IWyBV6iYHPi}iAy6LV9G67@2RgHn@A67$kaa}tY!GZG6@!!nCA zlX6lu3IY;~N-~pkQZ+Rds(HD9W+*@~11l$IEl7ZYfk_!eGVlN$rUGU$Fd74CMv%i= hIv#p!*!%2qT^0B?DQ7}sl3`jPL=BwG2eQ_KcmRYPExjurZT zwdF+2)|opwq#OJ1J3CJ7xE*W94Q32JpQKOHC!MZT$v3q`&}JDaPE%ahALJ!5M#w_) z7?sKhB{@cgPAMZaXJHTqRFvAt%M8D?i^edXOu_&raG@$$X#<}r(Ydm4ZB&s{vf2tQ zae^?Lp3aU>-_PM4%uk}}hiE>XO>2cX49e=ksYBvyEqv9Y1Q$#~DyQ!VxDn*k!bfF$ z+XjAw!6=U5{O_MFz?Ehzip6@s^Ayr2!aV(t;%O){RU+E>h-&2Cw&ufXk27MGLzZhL zP&QK1{H7`PNLFOW`^~pKxogMK&nDd$;ocB;D2EcY89237iDrCga-i1v_CfVEin!)J zg1ctnrw3Y6wmB|QddZC2G!05+7;1{6!pZMdUf~m3JA{sa=MmKAd4#p56fDZ#`cDP# zqJi^H;jAZaT@A&raQm8mcp6jB`Zr-Klr? XE?lza$3j;YnlgH+o@4G8vs6j%0D1nN literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_rotate_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_rotate_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d1ff810874906cc94ec618efd37dbf7124744fde GIT binary patch literal 749 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_scale_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_scale_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..fa3eb64c6b2f44af60d24b5f9ff03d9215254bc5 GIT binary patch literal 1522 zcmY*Yc~H`682%xeN|=g(rHmb>VMZbzsZ(aUm3W0t#I?}{0xt>R*hu54*k&BkE#!R$7NB&peA%qm~iXL5rYM_U1B)g=2^v5 z?YRMsF5M>LYTfYSr>V`%TC9CelbA?Gbq100`>HSv?`-gIJZ4U3X)g_N+_X+vCD#|r zG%G0=gQOY34d1@jVxnBSPu_bN5g6c-`-@t4OwLklMvNHuHib0ATuhskTtAB-5PO`x zx$}cZYxGK`zj`lf-HgXoC8fSJ$5GG=%=xyGAb+T@r(~w`vj~gf2qbmt_)n?d`#)`( zTximI=K6$X3=yF`_YLh88NV(I%?x(oX&b${FL32YCzvuO&cbL2v)t&;%>0@p@h(&M zhm$p5rkwZ=*O(*v!?0@Vj^r2S<5hA)%lP)C>cV~4kso&9ck^kFzJ>{J?GQZWT2Fl+ zOuK-&wDn5=OBt967^I>+6>+{&b^t^NJi$bpi;EjX#B+(-(V7K}2c;<%%URZIoHdMP z2L}d@^a_PbYH7D&Zh6s!JQS0LU@%Zgd3rSRH93VaNT4u~WOFyNoScDTBN&uqEBOG8 z+<~CEQIan! zQORBhrI^t+p^(=l6p}jqNcm@&#iy9X98y6ki<4Wb&;EIaRp`fL73mceQHpst3s{9k ztP)ejAiRo1Oi1I zY<Co%bo}SSog!z-@T~sx?KmZ6 z9b(yCxqWU>OC8aZg9pyvSh8D22ZhQ$lvqH4Gr-bp`M`W0G80d%G_fg1Ttw+p6H}&YJ5v0~-i#C7@0Jp~ z(Nxcp06Ad`6chhmrIjIWaP7=IURA-#o}-rA>Jkp_;tEJ{Spk%JD$k=<#}I>crlY?h zZ(I;;Woa2^iZ{Te(D2mek9EV#9mf*#jwY1TEt|(VmPx_OJnu~`7q3TdQJi9fNl#;T z8G-yPE|MLHNMHC}!qlbd-9?TI-VCK#(J7$o04PltFe1ezr(SyizB ziN4VVAt7k$wh{(@V-B{{r-=B%DLInfnBX`n5elQxb0vLumrYcf!=yK+|1#!3II3?d z`rK8a<`j0vPEC9jX@2uzn~^FUex9JyQ&Tk9_IQurKGwcKJSUHE}~FE|e28L)-#*jdw$ W>?z%8rDXpL&?^d?>58k07VIB*+j*h@ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_velocity_initializer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/particle/modifier/_velocity_initializer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b2b5aa62e5ade8d2320f20b7a3e3c81e03a78c59 GIT binary patch literal 1022 zcmZQzWME_f1EyLA2A=5+80=>&$_ufshq*&W7F2 zyX7DdD!1{7{h8pY3R%fchg7?!2&@$3-!f4t^kHFSe`56J?6uc5mb}_u&TE!)kWYMP zsDRMnb7yAGG_Ia$+}%~6Sa`2_Tld@5d7B^aiq$Q(y`JAU`|j)2VXJMI&3%1Zuk`kd zUvrnb^DBAEDys86oY(&O3H#5M!jcKv%f$RVmL!=tq^sFHGoEs;oQLJ=s>EFh{}qap z=0++mv_Hw>xcH{FNp)}9`U`J(&YruFw<_#v(&hk<(ix9~wRB|XMy<_qRn##vCoi4w9x&C&;`3KwH99w!fXGiam11qBvZLU3Y*qYB0S<8G* zM47SLne)f03DtsMJX`!*JcGZl&I*-b&-4GkhCz;{U*w^d7UTLQQ}!9~?BSnsev*=8 zuxg5Dt8cBbb)=UVynIZ_4d;w@~m58H~@7z!7%oYtFuDaQAXyszQed!Qr;O13}{2u!?E zU={^_>X*bXsdS2 z4Dw6cY>WI#`=ctjK@MX8a9@QC>Uj0{_IrcVoh9W`SavV)v1CON0d!PS5@w`uzdLIYge#$ V!X&8^w)%)U8_d9<~qWBBJ3Eaci0z90?uF;ktZ!Wcc? zP#nMPp|1cAT9$)0r{4*a3)k177YUeq`9zq)$ zBqn``VGCl;h*|wo%Tb+9lg6`}N@mO|JS#y?4FGmX!SA#NxGwavjXjB(->-wF42~ z?E*?!r-zny?z7l5AG&TjWVVPp^jt%3ET_U@2IlJiRw0(!Guv5cZ`w<+C%?!lo0$QA(j~*xjKNCmMY^lb z=gtjs+$~)G6}n>`HV+N3}JFZ`b|!L-NerFL2B2 zQei;_b>6}x0LVgx3IN~&7WA5Ov1dcc<_cfLGnSL!@@VyIXw~CwkC5=RU<_txYYfk0 zFqm0h5C-#5asWrLL=O3%HO!SrP=)9`=Cag9zIZC-l!Ma~0xey%G?1xZI?9vrBDspa zOf)3d&nu5Y%dhpN`OA?@^2=ywj~e&9o9MctJpVlZ0xG3Qa(DK~$hdp2p+e1_ns8}j zYN!DuB_Mo&NulgS=)N*Hk;RgT_4T4&rcI)TwKZdro?I-15X2!%dI1Al{jlGm^%z8Q0gB-NyjPSzJBIQMjX*@SEQsD%`5HU-N zXN5#`ExaTTAg{Y!m(orYUlM2p!uCPfK+hbOIqDYT;HDN3Hu++ufG+ zSI$HG`fU=R;O+tTL78j&qna!Atx3@{gW?MlDYElX>?kx;S*f_^)A~FZcn)C1*KwDb zO&l)6JEz3>dCRier^2?qsr>PIuUviiiz&wRr}X6rSWTCSyhB91`-f-m@xaLXFX{V1 zmJn(FxwZ-oEweq7&yo#Ybj(s9oQ$hu$SVB)(g4IlJ^5pj2(1CV<|ACn=Y#c5M9O?rY?dkrpYY2(&{^!<6zQ|*bY}Av&HVRi fF5MTVR?yPh(RDOtSvux>pZND5?MZ-~R(}6~8pyub literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitive/_base_rectangle.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitive/_base_rectangle.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b06bee49bd9099a7085c071a34861558a05ff3a0 GIT binary patch literal 1066 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 bNE?GY$Q6B3pzFfT?;mOXqyU`w%2M$^d-$PW literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitive/_rectangle.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitive/_rectangle.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1001a355c314c568f34ecb6b1e6133bc82d1cc5e GIT binary patch literal 759 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 C?aloF literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitives/_base_rectangle.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/primitives/_base_rectangle.java.i new file mode 100644 index 0000000000000000000000000000000000000000..509ac4a3b11ef6121d65ed7b2c6a3b6408b1557a GIT binary patch literal 891 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 BHiZBH literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/_scene.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/_scene.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9798f96d86ea86f9cf8fe1a2f383090e6bd0fa51 GIT binary patch literal 18825 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/_splash_scene.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/_splash_scene.java.i new file mode 100644 index 0000000000000000000000000000000000000000..bb23bac923ae6caeffe3ed498c7db5679a115a90 GIT binary patch literal 2199 zcma)6c|25m8$UDFxz>EfRtA;P$QVnOP?oVXL&%aX(-_7QlOfA>OQ$lgv1TE_net}-+$is^WNX*bH2}W&gXlc-}iaW_jdpo00X!SehdJF z>v%crz_;&@zxJHLsu1``0U#q9!@A(e)yNgpF>I8kGZ63dnIqa3OxC-0XsfutMRW_#6lB6MBqQ~J-m&TPl4lfO+bN?6NMF^20M zbFO)`vvztp=ilv-rP{uro*!hcWg1ZTVsqF^PDk=iOGy8|F`_Scu@#T83s3s1)!XDv zz}aS{R+FZi85;TL)|1q(m^A1{IV0RJD248p#~U$Gs9uh?f?2#Rhpgjh6TFc1dG83D zX{^;zMXG|2kEZ4rv%O8fI&0dEFMczfNTQ=d9m=ZeX=4Q{zQT7m#OIdPbi^KZh1t1z zOxDi7c$8I>q$OC~W|)!~uDfeij6QB$66E0Aq5fxix1_kW1+|%P@b;6Uw*|DNT#q!b zzI(eYJ`~+o>KC~olR05fdFe*D?$tj;PWFt;Pa_$ovJW~7&GS&F1*Mv!#n+c};U8+V zir%$K>X-CN6lW&AU4ea(v2ym32v=?F@pYP7Ua}n@l20H17%rV6)My)@*@@0uy*uK! zzOetx{GhC7Q$h0@qiO{im9ppSgZk2lyfZdeE+3{IUw#qsXk!N~RP25RtHCn#RSUgy ztLXShVVe{KY2?%~q-tnsXQEIQu@choi6 zY0Uk>w9zNoF>K;6WG~2);JOAHGo70Ou&Ypnys3+Msc^5M%i=P;+E@Lm>X-U7VhWGL z!&nB{A4v8QeohllBkIsaRxa5iS1xhZq*h&AT)NGUhWNz?`c*2X+heQQY==QQ5i98O zrpZTC^seiC1$P?oDn=NHEnBP?nm^#^%0N6?Qydn|uuTu*cv&H_^<CgvA zApA2|W;NK_Ep7(Du7eQ^L#1o$p+M*H1T;p+g7|U?GZ2r?TElI1O z$D}%p?juBwt1aYXUv|z+Rmf2Z z)(C0Ks64zweTJxf(d$ljO_7;H`JE$rbzL*4FcF~MUVo5!-HJOkrYa}D=jiOih`q4qFl+OFbamo4c3tnC)JF_euCcT;~EKY z1$XY@)q_KG=7Vh^t|`xg3iE4n%bSCezHbMwhaN+ce)bZ*(7PSiY|(8cfFpQKF7U&k?Ve=PvhB`aLN?^d zpuy8IGlxMYQiju3=%mH01eAc&VEenH;Q0v1+H+Xe!=U3xktC4_os*wuu!;Wy?w@cU literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_auto_parallax_background.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_auto_parallax_background.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9732837e18a6ca65db4a20ebdb2a8925491c292f GIT binary patch literal 478 zcmZQzWME_f1IBp_3~cA1?EL>w&|ISa?A{>-+c`_0DQUJSoU{JRw;iGeLRQQ<8|v$S z*nr2@IP?EObr$AZylRRLlN&hI_zoOlDWAL}*5z4Dv`#<%U}kjiCY#LdudLse+|qq7= zo|Vwe>OKE_emawFb<)cR?3c55Z=JZz;K%P!bqT35xtqH=ekx5ZS?O`w$)eZK00=9 zr{2nqTiK?)ZM|j|6FK4Ts?GH&F)26gR-UO_6|;#iQew^7IM)5H%ylmJCb#;|&=LFZ ze)+nHomk=|uf-P%Gx>i&Yg@>ed%ppyjVqIpMHu&TjTvc4#qOJ54%OI&MH6FO5ptRKk;9erH0X;_y;|_`_K5i ROgLCAvWvOkeUkfaa{$Uz*K_~? literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_base_background.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_base_background.java.i new file mode 100644 index 0000000000000000000000000000000000000000..fa5ae810f7072bf9369bc7a5f5ee1f471c707ddd GIT binary patch literal 761 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_repeating_sprite_background.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_repeating_sprite_background.java.i new file mode 100644 index 0000000000000000000000000000000000000000..126ddb7fbbe687a9396d95c6dd8d171faadd81f4 GIT binary patch literal 1967 zcmXw&3pf+pAIG;bx5)KXN-5V=MoTst+1TW=VP*bg;vGuNtzt#y@}EnQdnWTH%rL!@ znq11IUbk||C8A--T`4bN;6Bem-R$dVI^27Au!@cs)Oei`x zyQW@v*xYO4KK{VaVs3?M)wK4RhXxpckD;KSH&(qSvjgQnQ>P9`bsrvwiY=a?=1S7c zW4gsEE)^%KBa*#}95kb|aWy@PL+0K~Pl$OmB!`oforyh<(mio<)dQM1KWy9ybq=yr znyK)uQ^y?1df7oBoy9QkWMpg(ze?a^W`4{mGmrL|JVEok$><^7vXL)OA4)%E})&wLWBzxD=fzQ)^A{L5cc-ALHpyLtPGJE zyw+Lb6(Z5q69V3(+RbZfdfaWY!w%OEzI5rBhNRrnf7F@SJ&a-Nlr9b8zA@)?)REi( z72V5y3Y7hWP-jF?v?-t41vea4#!uJLW2_KIHgnyDySPu3XHIRqq-1&+PM43l|LLddhfRfVKQ=#Aks_r zS*CIv!BZjzb2<4==L1UQDtX+e$*E#iFyp<}8s9HuFx~c;s$I2(Q-LSd8t4Kb1rP%O zz!d;sx2GW5j&BKEKy$g>2cG$ISohdHPbf%bDy>ym`jsH}TNDO2t<$epPo^o+4X8UC zFY4y!;pm=un%ox^{6=;2{E!uc>tW!NGSHBfOo%(C8$kiOMvC%`;opSe!5n8+=ww8C z3Sv{4&u?4HpA z&d^qAr{=c{WdHy|0{TEw5&(esHgDn)zgOG6bAHxc+wQ$R1Of?Wkf67^)^K}yVuVIC z>i}QH`P>wOMV%JL2?@%epO$e|E9ja>vgMBYKl{7=KfS?d%Saci5ojP)A?_} zCvOE)rG_;oy0!S`OtA(pOIt%}-+dzqI{sjB){K(IA;Y3{D$>#`+_l^_*(ZWcieo(p z4Kqz<`xn{9U5cPwZIZb z$9%)hVgTk7m5;P*O$Eu{qA5lDZYMlH=T@IKbtOrqxa=?7bDi82;v@@mIi3UPJEP;?)*m|~Be zQtjubH29``-f~NdG#+1Cap*t^*l0QLlEU}gb#DIMKgYhvL$pKS1Oj@R6XTs)BNH0X zr^Dv_MT4)&jg8tBuCd=8w$VeQ2QlXq%_;20$`*~P9B@tJZ2NbL0jie$cVTgdMdFox z`%`_0R(izT0S&Z>8c7d7*@RvL>2P(-Y%H}DO^nFe6$td6fsgd%u7ejx@@Ytil7hgt z>}ke{aa-+MFtYgVN=eVOKV<^5 zs3LCVMZOK5(yI#L@`1D*M721^rorc1)ep(yd3_I@jc3k_eii+gpcV}>Gg4;@WH1i- E542!$D*ylh literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_sprite_background.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/_sprite_background.java.i new file mode 100644 index 0000000000000000000000000000000000000000..da7e1eef55d029f4af5ae48d2df523c6fe89d31b GIT binary patch literal 971 zcmZQzWME_f1IE(~4D9MqcK&}Tm=q;Y$C7U0dgIEo==%!0C$VqcZ30mPAuHyb4ZWRp z$APD|@8JIh%O}N7+IW}6YZJ?*oR>l#(l6=`rs%x)OZIj%E)(|pzxVO!ZL=LbHR?Lz zO|E&QpL=nlXzkg(_Y^kdOj%}ge4DX{wD*b$d%pIclH}1ZS1eM#6R@vivBjp)vyUF` z&imTDYK`ErJ5{HbyxV^0h+m;>f>%ja>ExxqE&p4rHg^lxh|;azT%nn|AiVqQifemc zp7(tA*`moZ=GC$M$Oo%UW3t$_FNS8GExS=NjmN31YF^s&j2czDa%FRE0~%_d{vt!3ay{g_7Q1oUT@8e{i?r5pnuz1n$Nh=L)pPX4Hn!D!gZNb;GG)w}27$0y?s#>#yGkNFa zETLAXhjq+9ZNF>)MJOl{0Ko(X1~y(Wi-EBgM1xYp#Z9lKZAs?qd@k`Q_WgpnryQK) z!y#%QWW}81goF(#2?-Gg7}$C?Imoc3M2JpNdzzxAt@2z&OkA5qTqJec5-U};^yT7D zr$1Y&u_SEDl4narw0At4nldd!$us10k)eS>DAUKBj?ObD9qzEEa1zekhtR40ZJnRe_EqXIR zu40M?yA9|!Hcf~tnG}IEBgj8rZoIpn_uGYx0dnER%k%bc+K1w;*mg!|_NW76j{ zcbfhz5^DXksATVvJyWJ!F%p~&!v@`QkgR=J1x05YPncBwk>lq)fZP!FU)kz zn#i`v;>ZVm9-cFA9S%PiHn7oEx8LZpP(j1g)t%Ax$X*RoQ-0qwn#)Z@)m(a3A6RzC Pr|Feju@=Ll$Q%U#baSet literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_color_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_color_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d200c5eb7881d1265e2d21b7dee51e2cba4c9894 GIT binary patch literal 1117 zcmZQzWME_f1EvxN2Hq1;w&H&%xctrN+k+zg>(88Zmi%Ol`IYy0{c4CB2w5@bZg_P6 zB?pnZwwC_|^LPYu4qjz1zxsxWTk&S7@{8X&)m*~MjnBqh=>53AIx0_BJk~QbOwOzN z*_rZlHJ|71RMGiyW*LW0G>?@0lHiADo zIolt%oV@*K!k@IwVXbO0M(OEZhoj{*4)XArcC+%Qb-Nu-ZMaZb_is`0J-g=R7wkUY z(%+l@*3Y{1L-y4pcPCo2T)FPx&$%=_kzs$-l!cA+mweJXeo1=4Mb4g1K4#0`QtzYJ zMt!WUsQr`Acp>;wgj=B30d38tjP8Q-0_-GRZ?T5GoU|$G)sh7hs*b1%3veFQQK?-X zsr6Y*X^^SeH`if>v=m>6^S!+SF|^KN-Q+-%X5 zbeZk{r@Jy+pDD^sV3^A{$BjPai$e(bHw95;~d8asGf!!<&p2=ZP}x zZ_ou%P#- literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_i_background_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_i_background_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1310dd1572f09445a01656ba0fc9e79f50301d1a GIT binary patch literal 348 zcmZQzWME_f14bDJ2A1UzHk0CiD9~<5tvEfm%t6iY`_4hA*Kl2-+20~WMIXfxV z`>=sX+j`z7_H$l0WiEf+I=f4LfykWyirMFPHNW-r3@YsSe|O5xs6>rjaS~2;Cr(%2 zQ}JK?Sv^)sB3kRLYvcL5EipoioxVLWKlN0??DPViwV68uwrXa$W;_q_a4bz;^M9^m z+2!@m?^|z~w`$+KQ(}it6^eK=3dX#=w!XL3{gm%g**np(;ZxRcZ|}2kpW&09Y304V zfal~&uX9&CjXbR!bzCp&HOq9^-kQqy$Z=1s;{oyh7>gImbNEB1f6zJ_D0BGe{oB_b z^hJax9$8hO9MLx=tMOsu|KJ5ZmVZ1Cu&lfJVVT+5=Gz~>^SN{VJlOL2*8i4c%sU&7 m*}0Ud#|OOhu>8aOZG+LVt;adPb)J4$mmk#fk556+xfcK($)r*M literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_loop_background_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_loop_background_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a23a183c6e3c9b7217970786782645662cf895e1 GIT binary patch literal 851 zcmZQzWME_f1IG6Z4BR;oHk0CiC~%56?Zv3i_`0QV$wMJ7ahJTX4kw5j2w5@bY*?WG zZ3BV2yd{6yt7k2^HOb*9^9J9XsSXnxY(H@K6lbngElaV^;rMuer;6|FM(&)iOI)Ts zy7Bz|zTI=)uS@!)9<89Uw`0Z`qdnPi8sbh#Etj~e52;2Ao>jl59cjEA$=o}Q_h6j-gZyrz*V}#{ zJ;~bNBHW^E9#k$W(c5ss?a1=diR*TT-V$CN z+Oi`#SzmmT=(+jtCfv(cPE2~$<+tmb<`(t--5GmD+LEp=tlj)oaMxw0s1;IwEIDu1 znU-eXdBCTCu-HRBPht_@%iKVlApL*-?r(B7x}SUheCbrzJj3d_x2EyL?7SXdbn{%I z)8jYCWwUgRYEB1+@J~6iS9G6SbT+3@eXer;^g}#7Unic>yAY-Hi81fi$qJ)4qCp3j zX3fx+eI7Nn;PQ_8dm%eaRKhSeN*)|l#>wa|}!pQq}3?@;NCyU$N&uf8Dm z_k4x%%I~~>uTE{OFSB~vdgCT{?DGpTKT7{UI9y^^*RBHQ`n$~V0sY9M6AoaBUrdB+bNDC%!) zyx6&Ufr+NNapXaD`~3$r4K1zrYV0@BKWc8TYOHI#)k9g=Sl`h7pm6Xp_02m}O!c>V zFm~(BnA6APQk@pp>BM+~DSg2zp&2XG%d`dAnx7O(b{=)T5wmDzz}eGBPe#T>F?`{U zo36B*zy0iuGuxj%WommO%*J+&n}>(zJ)40^rj){sT0Vx%16Qtq+{V-jb|D|oSNRaP vGMxs}j38fWeCOAeG%Gu{@r%atm+k9012Q>VAZlPF+ZP4~w(me56E7D41omG3 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_parallel_background_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/background/modifier/_parallel_background_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2edb677b3099a36fe265cf100b41c4500dfa8c54 GIT binary patch literal 796 zcmZQzWME_f1I8l^3><+FHk0CiC9MRqH$mOmmCw)T9Wa2Ef?F0 zPiMBxef}ezVeaR1@8M?g4?L%8L-&Q8KfQNTxyGk8-qRoPx&7na(6L2jR|jW>@WfS1 zPapb_rMlW&!P7ElDFdTgw!^+>H&T>Ios|G+p{9ZTq}jY zY-PB_y*U5B*ZXE(rM!#J&nr$_w){i=gIn!=lLAqSKp_-b)o_kXQ=G?lf#Bwjct3zw=+NU_!n}1y{r3Nd(MRAx34W{*!+n%$TaXl zxnOR=d{9h+Vjl>)fN3BY%wk|#0HQ(3;IiG!S(5wx>Yu2j8yRe$Bb?;mx&xvHLRQR4 zPDt2y=D>lXp2o(9+Ubs&L4IkQoE(w@ll=U$`ht^+%BlkEGUK}P>%7vU(y}JHMWw|h z^);z4>+w%3^vsIOn&`xsXDQ1%=hoLRUpBndxfY^vQsb1qe%J>VD-B!2;~O>hnwXoe zKeAQHa_a&WV|)LFv!-`X-n?TA!wZW&VacXH tkY)t=B*SJ#%dAxl>@B-9i(;owJ+6oarkAp_{5ov^+I7UT$Tx)jg)9< z)bYx_GhcN^P0Zc-x#u6uJrn-*hDd!y2-EuA42wQm@Feg&zq5O%*@sZBxy9V!ZQ?sc zK0jSF^^1(m+&Rbc{T?S*uzt)I+n;*;V_*!cOJcw;$=2ot>AEIUqZau39a&v#A9OT~;w*Bj zoIJ4?iIj3$9ol`n)a zi+ip9?NrUp{p(lK+G#s-%#y<=XQj=|`|)@|d-2&vqBmzxemW;0@=#XPi{`evhOM7& z+RN``j@{4bB9=87lng*g2MAUJ6HpeI#lW-xM1#^0tJIWrU$~X#dfgRqYn>Ms?|)NF z6`}@0R?JCGNZ5Dgz=5Kk#>R)*>5iE}ercPW3bGP2v*L9cYJbU`+iH@EwgB9QUs}a82pFL%&`p3h}Je!x9Ia%;7 zlfn)Y&h4@slRJXUHZ1g7B3#&N$FM^1bs5OPOl!c-<^y^)6XF4;(?FULI;3wT-p literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/_menu_scene.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/_menu_scene.java.i new file mode 100644 index 0000000000000000000000000000000000000000..35b04712588d31165de56dd7eb204af37b4f3c76 GIT binary patch literal 3753 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 S{YPM63f~2ueP9A~p??D>`T%zT literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_alpha_menu_animator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_alpha_menu_animator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..84557784397d6fca06653c3fc9bc14fe52e2e8f4 GIT binary patch literal 2148 zcmYjR3pf+p8{g)BZA6V+7m5_$*yn!BbtJW=EMkjcgxM%76Qz;~n_C;HeDb;E()gyx zrBH}0*ZFjjdy+0QD!0$5|MUMn&w0-|?|Gkde&_w2^8$bXAYcpt!s@vn=*ado>fo36gjiPO1SnIN2JcDIPG zgkr$J6dulf9>ZSbGL`y@%2t-F79sxjEb8&&o;LA8Q+W}Mq@~=V?QI^QL7{JppabR+ zJ#}x+h1afEoO}C`Z#82V@nKfbpegL4%l&_K*x&DgTx z5SC$TB2<^o*t_GVzvfKe{*2PtSPd8o%z zebVUc^9rLuw1hz=js zbkOHA^)!-7IQnUk%3y<}V(9otn#s6LO6x6e65u}8Am9?t^?oo0W3dOHRx0du}}c5x5L31@^f#oaotVd^u(;+ z9$Ny{%Z``n{hY^!Ipw9dAm&OMoyv})QhhEXHQEgVXbmft9T&v7YgKk+Q!7ikD*?3g z!F0A!XeX`IS+%%?Yuz=dAxy&Vnu~7rVIA@soeeg+f6wx5TPE2rh3Z!uNw;{P&jAas zw)#vq#Sn$gOqN+nEtribCz`$1awWj^-sjROVyFCNqEczD)ipesub(NNaxq&bzx zutM?j`%Z~1L#2sdm(_V+TcXZhM9x<4aojdwtgHw@U1Hip%HL;fTS<=8p%7%!MCFM; z=4?qj!EV-alV%8}iR|0n|^*OJAc16c^jRKz3<*U?^ea9#!-W9r*4P{=!I5 zfZ9{Kb=@J32IsqWJeqt_47=0+y3nf8tTN8%i_qP!@*B6o>|y?*cwuLn_GDfMJ`0VY z^au@v|MNie^@r2LZHx-`2+uG`ty*i%4tHe2P801oglBkr$snB;s}BeK$kKgoQbRM? zR_WAYS4kgvQFblC*Myk#)HgO8G?Rlx#922qlI`x&Pya3QBQt_sO9+l{8;nytMH?UJXsL|6EdtBu>a18n?x>M7i`5jVRlWC&#^-f$bf@uY(+8AzNj6uGLJ@!3g(~IEJiG{CMVs6b z{ANJ~*g)Dw9r#rffJ}iyPzttd;_F=MJ4-CVQkZ~i4-1Ps5jBFf--yZc#{e!niMJ8N zlHFk>sc%$Qg>TeezB~_!M82>+7UFw8(6>}A#Z|wetIKVOFhoAkDoIl{!lh7i%TWJ6;h{=nJk^=XM4t^P!%5B zsW{;oh+Zt=k^PwyGQpRxb9TJ`>*UWzYCHS2uOD*guC^q z&aP|X{F_Zp5B{{eZvNfFv2b~Li3Q6NCj>y6I#^_+&iQ7c7jCOVN+MO&H_*O+NU;;7 z+)dS%POJY7YjvTiWE;jJb;KU-phhY_2=DLu4wPeJa8Rxx8G7#Q2y28t<(a_E8G_fN z!r;5AKcB5mC*SrUG&IZ$yDu@$pr1D{hH{O?s2#m{z8|(yRL6r0a8;e3WwV^3AioDRW+9Dfj=q|Z zkgL>QH99e&|HZv~A73BQy?@ZnWB;r6{(iSZh)9uKF(cdEa>J(XcgO$*%KptSESkGX zVk1ZY%VpPwM_52y5^@k4Rvl9K^ot0laYcpF_CWT>{}TrQB%f`xwGE$@goFga9Ty&r xh{A=D4g}$%_TqI95OG0xQWTEp7#@X>BD+Tf-~;hE;$G|-LNNCCOxHq2@;@8=vmO8d literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_base_menu_animator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_base_menu_animator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..fdf4546ac8cf097b6639284924919fa9fa5f73e8 GIT binary patch literal 1416 zcmXw&c{mdc9LG1uYb;{!w~1|uIl}DCF;~o;<$lEL%5tA?488Uel8Vw|5jh)1CfD?m zBRLxBb>=EJp`4o>p||CIzkht5@ALeAe|^8t7XSnR0YAkl0sw#~k3CTR`+rIbhnx+{ zgQ%yAg-n}(!{?**ql%Azjv1BHOSTCaR~76UHid6Wt@*_ZKn?vYJ?(qsDGy{Wa-a88 z$uNg*kToC7<@Zykh`4<8(^_K(bSe)ihxi@yJ?7D_S=E6@2cw!h(Rb9(7f(1JaQ;+k zCokbkg9GBzE^C(67OcIC4ajxPkvpvn`kS&JL%ZTVftPd#W!st9w{eLo4kMIEjw_xs z*S5g|3~OgrD)6w~@);Bfr2jRe1*9gvx9~0h0r}eGnB?ugBDcm;5z!THJ#j(B0yAsz z<(#?UxFoo4Og>7q-N+=T5Vk&E*(lc^9D`dYo_${482*lwxw08%bHi&l1yQx3l{vKK z3N_60`iJuVimrsMw@_a#nJ}qMH4^oYun)+;ZdKkPJX8q5s%uGYD2YH_IFyhOLoxUp zs4IL>943L`jJ;!V!J&Y8H07NCxyIUqnwOB94tk-IESt=4>+ptKJKa+pI?}~KE3V&f zm&ob^@()89HEA#UWX14#ub=ziQq4m&kIEwXYhojZ8{d~CFn~u{6$#n>6`Njo9P5Uj z>b|!HQe8OW&&8*a*w%AdYmZN_xo zZg8k>vQdz;vK9pYN_Hzv|KsiKj6(*RA!CG+nz_kWrW1J`<4w?rPk~8kU>u{ViUMw* zUHTP6WrWi!;A6PURbL0^Q>=BOFD>ZJJKiS3xn?$ioeZlr<;>|UVYT)as(ADiRaxv* z`^5TC$tusMEx)>%q?ux(-5QAz5r{Q<{qkG!$>OHOJjBjD6cF93goQQ9RfEg&>lXU1 z^7wB#R|F4%KikuJ<94EI5O8tpLi1G-zAXDBC#AI7jDfG+j&cO6i(cTy_H!8{3MV(E z<>0e{K0(y2n0KMIXP}L1`~}RLQ9M}v)st$sV;Mmj`(5t@3VR>ZLuY%`Zw*Ycy0?_7 z>LbUIofzjmLSNb&^?OqB^QGD!c08cmiIH;&j$xR5<4^Dq{Il6V**6a9?q z$zI^Xo(+h%`S(&r>JeBJLlj^ygS{pI0O$z-2s~!HA3m2&_N?~(H@^3K8smclE#szR zECu};{1xom|BA|~czDUb%|N8HWI!Lg!Qt9V<3s5hEW?9}enFGVvV*(Pl5+`o@8qIB zi&u9=t|t&C>{whkX^pGg+TIEhMaiSBk7i_}rw*DQaTTyKA75P`1r5W zXcS%bG>1=O828GJ6Fl}P$X&pGE2M2HO=zV5(|GbXJ}!MlQ6UALfF|D_LuaBtvA6v2 zj*xa89xlQZ1&2y&riONcy0j(|5C}AVeo2o*+I`8?Ipuz!fSLmwS&1Uub>O~aVccWO zDM5C*H*&2JSAH$Xy}|8pt(!X5$g9Ig^TnGA`jaSNWD4%UD{+#*nn1-i z6TfK?M%4|a1FV>XZ#N#aSRDnGF_B-srY<>Enk=Ucw~08wr->WPe>Tc zWWLfn0jKq$II~oLHENOUGLTVHv znUQ9`c_JmAUoxeO%kM;Hng-@DrZ|MB{@dz_wF@EHv)~&0CqA3-#HO{iRj;8fbc`cC z6%t)DB7CgSxx|6b$TVG4j1!6+yVv>B+wGto3Vp+hmKOfhYldZ^qkq3rfPvsjW3E*Ncok7PW7Ky)5T7JOG9nQ6Dp(ot%hJA{ z@J2IEtf8Wi!ZVbb@sjxQx`M|z_R&g>qHsmfLHf@lWRJ>Bf}{ z$|h5tRY6{JuQ3WG4Y8#ElT&d$z)viQfn60-M+VMG09noJw1lbh$WVGxKax;#C*>!t5T29f&<*H}{g*e~qA9iCro zP$-qyPEJ1No5)54`_#?ivI%!^dVP0#n*qDj!;!Do%{1O?r&LO1doRg;zlJ`CXj0MyY2L(^5!p8x;= literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_i_menu_animator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_i_menu_animator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..455bc35037957aca933c45104d2da84fc7b59262 GIT binary patch literal 449 zcmZQzWME_f1I9)M2Ifalw()-`xU+5QJUhj?sr{RjR&Rd2)oY99OLd4E2w5>_Z_q(M zX+r@~cb&KPXC}H``Iff1bJDb~j%iISa~y2__e@@MJNEXcs$kcS`t|1Af(m>bu3ry6 zzBv24&F44F%huekh&rEOBfDyjQKXM%=#B}7Gt;sr`MF87Qk1f6uw6 z(dD^ZaO1pxs)?MJw{Es`SbpU80&TnRa^~T?IL|*U*Lv+>dVgDmq<=J{p@a$#TR~T@ z#@cr2wK=W4f4)S7M@_Z8k+GN~$nx}49qGgA6P)$jYczsyigvW@EE7EKINPDFbK{Rz z;ez=aoE0BDdAwTOV)HW245!WPdo@1ZD4oJ%sI&FptI)^y>*t(*zb@|~3(w!y%BNm6 zee$)pcI}vcbDicshmH47UJDa{U}O2^%J(&ko8A8|*}eWt>38*gjn!6W$NSrKw7VJa nNM3vLak`$R0qhdw>zkSu-@|QW~qTT@jo7mD= literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_slide_menu_animator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/animator/_slide_menu_animator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..5e5553e12ebf0ed7e33b364cbb54c0a016ab4ad5 GIT binary patch literal 2086 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 Tr^d7%I!;YOrI5H^VnjoePyY3U literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_sprite_menu_item.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_sprite_menu_item.java.i new file mode 100644 index 0000000000000000000000000000000000000000..378d04c3bceda144f39d47ae926f55c0d9dabc55 GIT binary patch literal 771 zcmZQzWME_f114q$2KLJkHly)>DBzpu8PIS@{@Rs`%6*&7T0+X6mvBSWK*)+YXF~(C zZyN|K>o@#if9LWEC-s|=o60y_``Se9w=}2zW?WTLw&mueiK&|nzTGe1HhCIP*s%-F zy&Fod)h>U(&-%$`k6TsmH$*p{n*8+XQ6vA!Au)O(O80HggsysWldjBzQuu zF^6T7o06pMoXnnqr2Gh=C1J4Eq|Q0xYuQd`s$LMv(!JZO`4+0ZRUSzN%@1q zknQ|W_$F=O?cwP^#UR_|CTq`pQE%d;@4PAfcJ_}m4q3+h{cp^+W8<=qO-bw>;vJXV zdzW$@Om}KldBf5Qtm-wBW<^HN#rPR zTa{N6f{Y8!JfCp#iRyBprW>-CbX~$-^JLG@U7K)Q{Lixep%rNzS$ZmLug<*om$h0h zYBzP^=BP%~Xq~{SkmE@oB=1CPwQAldxG6j9)qBQ$v!2~|V!86>sfeL*+pO+?t{)CY zY+j#p`#``Ug{jI9>zH%5i`sz_0x0nSfd()MC4pHCjN3spC>5nFU-9_sG}lH&<2%P^ z30+wFWKHNBh#C|!AHrig1vKp}kj=!)#lXOF28hqYctAmIuqp|lJ$X>|r-3vh$evDh ugK+&XzayW@e6iLS+oUr4TyrKw4UA;b1)2uL3_P3;{$;5}MVTq7yj%b^LPDDW literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_text_menu_item.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/_text_menu_item.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b7133a21dfe1b01c2692f6ee531547858b0b31fa GIT binary patch literal 753 zcmZQzWME_f1I9fJ4D41=w()-`n4s?Wd6oU~SEAW2G85Saf4`UeaucEkLRQQ<8+x$o zwt;}{@dx!Yf<2wJtQYRhiMX*TQCz;P`ouTpkjgh5x0IE8ou^-_e}BU7M%=C`iw;XE zpT6|suo^5wuKg^rpxm?P9&AXHtAG)twlk{^>~k@j$})2 z<<_4iTXi2YPmvC-3%Okse5^s~eA~y_EzJ`*Gb+twpBUK5HNi5-R=?@P>j06WhF3x# zjn9j@GG6~*f0ki;A5(UtU&Hi{OLLE|^E;CM;oB0)g&UVxZ#Z%x{CBL;s^D*bGH(17 zX%V0JF-EvP?C_`7zX5Nr3%nL+vsm}=z`Y=D=bn20jap)fG8gnuo1Uoco3*{XaC*O) zh9^^u`-UA~v?HzFO_a3V(|p*(Gv(o&2`l!wuKRX+vroTGRa5u8&6AEsPn*mLc)FTk{l?_BYZ@59tX`yExz+`MhLQEAenN&9(f)ZEYSm1g!4Q!Dfn`Y!GB`+hGd20^h7 z1hK%lcLB2)7`KCHQ1tKYe9r53{M+1u;==z9l^p(QOAW&yY9M6AoaBUrUk45x$T@W2 zz=QLrk46T}nlgFj8i7esfsba-3V#(jY1ZnA(`HVev3SDF@I?U+UM^b9@Nn1D<{t_| zYCuki>H&&0+D(ik%FGDKcdsE0`p~7D)gd7XY!6=`@gL z1Uc^8<|s2`^(BcdZ5LKe|01$hphR#UL=B8&;b&j~VFn&f2mi9vqN2={R9-FsA<9j} literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_base_menu_item_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_base_menu_item_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e18d20689ced82604eeafe691a47f609b3e6d514 GIT binary patch literal 6459 zcmZ{I2T)T{w{_?(KxopdfJpB}KxvWQ0!r__DMgXqqzWR0&_fGFf(Qyo?*a-U300)` zq97oMbp8bVzxU?NduJx=?8)r8XWeu5+Iyc1zyaU@t_C410Km_GZQ~*?{|$+m=T7PK z6t$}SnH62u8}J)7lzP`b*BAi*YCivXS{fAgDB_GVgsBE$1T7+nb!MHC^Kvh=N-VS5 zCJ(kP(H?xjO91_C4m_P#H@qh}f(Z1LvJH%P-1~LfF3$#rK$J)I4=CbOo{_AY5$65? zoF)5cM0k{SaPt%FJCL{PWW_#(D)V!Xt5~zJv$DT`%2~o2K0ShQ9~^BBFUL{#KU+DATRBrWzSuge6qi-J%Rj*EpttdI1X`9;La3HnfQ*u+ z&-7ZSDwZNj6MCzWdHeU@z2UY|qu(pL9Za^ojU!{W`VlgzCG^1Go?MDCj?5L2Gva#t z)+ZBf&|LAf8XetCU7mJfXjg^o-cA0g+Q(jAGou1!P+^_ljvlru?SD~@b~cd{9Q`sY zQ~77%0~=CVR5`bO1y(lS(t7w>-QaK;SCY^3yZI-hOw=r!gd7>`DUXnea#Gus-u#wg z@m%rTKN9z(bKKZqM=5gdmA!X<`}YW#;BzmqcvU~^#__7Aktg+&+j2f0!frbCf208q zYGt~cxydKIM`Ri|rigsEPF{l0+K)6;<{dTEszZ~20ug1%J*j2p9P6g91mh(E6V@`d zf0l4a>V@LKe{DngP^_F{U$%OthhA76OLl};uCEqoEM^fzAKT^|S?cBBr6;G69?TT3 zT1PQ+CQ;sUjz#G{Klyx6LH-Rlb?K$GGI{ee4q4*R*XQYO@{>TW*C>SQP%WGOdlv9} zHKUc@7kxz@0^Hmk0)G7AF_tCHP7FkUw|ykX@z1CyXSLKBPs##zUkOUYM0PzA+(YjL zxmE6_?47t)rlbUt_^5eA>^7MKsa6_X#HOPFb>`GCg2mBy2B|k^9v7!91gZ<4}~ZIG8FD!VhtOazbvi0<9Fh#9It=E%c=3>L!e(vTx9Oqm0!zRlV#Tfc;LU4| z-Vc0EqLTB=m3QkTTQ8!v zza@N~a(=RYaD0|EP~_*K)1!1rljoLs(-Ti?(8H)K+%x6_&EXIfSIt`@1H!zv!-h6_ggwRrR7!?2|S_#pH!v zsD@r8%}FO)7MbY7HLgmUo6d_BjJh4bkz(KX3UZPsMU6M98r~--`0}-DIC|-PcAW{$ zkfFTuQrVoo+fOBd!8-JQX5RFlwZ@pWush)qPhZ`+zfs;dKJge<4pw>q3mqbO>CFev$sAN%~*962@v;EC9st`Qf_>Es_Of6YvdPXyYumK-mX9) z37VH$a-D^{NZ}@`alvK+VcZi2lk9KM;Ptu0HG7oCi7gS>vVs|onBpRQWdU$2u`{;5 z-1FZH2ejPwv|0j~KXG4iB87xZ<)lqj%l>_ zBy|f#iq2m9Tw?&d^x?f%qoTBwG$jz3EK>y*NJ<5<>5lBMKzYRmlEV~~CKC9KiN}9M zR#ETPjk~yH1(A^=anU{T%d+9{5@fJUV{-0%!TP$3eDX3}4jinx6zvn)z94icq0ALN zAlGgUHD-CGo|h?c<5reKS7V4gn`WdlyD@AI?VE%6!=^-0mh zaYcPKDVEd=b38?|Dv7=!h!1*(_P7Oz+`Z3Fdt*z&LMS9Hh~v+ztaHl{KKqB7_xI=G zdE)_oGzCHD_s*I!VQHV`<&+-l`JHinUW!nbYjKa?z*3XOI z5iQG)3it%!A})4PBVgtc;G}=gaIlW(mqHKhZoFDnIGz!6JdpZiGUd@8aslMoU&W_e zW=xKBfYF9_yt!deNnH+X>j1ahd&aXp?oI|z1Fh5^-ZCzfivJ#~wwUB(9Pqr!OSv@e zRA@dfbi~O}Aj+iFn=hE|4zjlX6UR7J;IWRR7iYu5H`BibMyK zJ?WB1RFKp(0XQE4MI8<5Nz_z$-nNFWQ5lcj$lIDa>4#ckZ{5F+nhMY~xeP{)5K$Hn1%pu6GAd%=S*D;K=Z`(`se(Yq9hOj>@ezM~;AN{KUC+nTZGO5DBkdXS#24Cd32{G& zq$FKMV3Vv|B1Bs&@i(oOxOn0p-%z7{Ek$jJ-yby09Ph!zZ(kfuqRW~w1Y!_o%)vYw zP@rb7s}4yR_XcD>zAJ}akOY$e0010}bfiSE7KUXT2Jo;{=P%)Ri>h7uVbt%~rz*d# zBqv5;r1)P0BQaQ)-n0@ZmR!bSK)w=R1r5QYUQ!w7jnpE?jU1a9w%1>Nux;g0Ltz}x zywg<#R=`DdGIMbD6s^w%E%o#q5>CrbYu40g1;&!J+0%Dt z*?!A{tmkK!nR@%3Kf1|ge0ZYWT)g{zalYMs$*M zV5;Uas<`Gu3Qloo6vC^za9!V6Wu>N`dOOr?Qp&us1D$t*n?N)9wNci$gVFLv}BfMw~ig> zMAvSXsw~v>SRrC*}Y)yEq(JBjsawnZj!yd`z zG$r%V?&$^zAv9ZeM+akOXV?LV-J(SXZ~xf1Q#X@9g{_LmY#N{2h0E}#@1sey%J7Dt z6)UD_s;jOfzehi{Eg-Ls?*9(aHz|$2T{~{}+tWX^x!X-{p-%J98#$fH9{$0nFrruU zj`ddkyPo29#cJg1Br#uF3b4mari?|LUI0M40&8J{qZ0%8*x-2he!+{$$MX;#A|LAS zU34q>Z_NtU!T8=k6y79q!2uvXbP?{*j)m@2mA5`Ax(Qe)@RoXZ1QqX zo6~irEie;XhmzRzne49Vdh66|^R5&u*ilO#ul@b%S)&@?q#Q5D9SvugtJ~SdVZ9@q z_5^=~+R}H;a;#ya%}fHwzA{E{oE(VGdZMHwM3Q!2CBSw9B=adiMCGu8D_G3;oOGEy zl{E(5G*i~460k-X@GJ)Rb-Y=NdTI-Ud4498x!Yk}Y4+MyM1bpqRP%RuAmgbib34;f78&9d2y4G)XF_C+-Aam8UDtOMVE)2in^ux3Wp5X0T=+sP})rFJeX)6Aa{q`)i0e0i0cOf;y40GG* z{;g-}LpyZyonM%Tl>x!GDC!xALA((S#p&=mh`zBuacU8nMaD7UBYMAS@o7 zi8@12$DARawDq*YU}NH-^qkE6?92)ib7*!kJp`6z0?)94<(fjX3tYZ_AsAz%?9m0< z+NKcne2Pe-9*P<%fe$(o7?YE3B6;o}_b1449(VO41Cix5OgW_Et(I^&7|Bx#4kYDa z%#TYrHK`u-ToYEAM}B^@ag`fG+9mCW2!y59u*@ zGbkbO_HCpS2fvhvqJ+o;N-ZY<*cXy`prA?yq1J{da#(s;3lkD1s{?`Xw?Ny@KXH+f zr=aMsH%WV>K=o)HLPEQ6Vhc%7e1p=YJrxj0Z3U|Du^=SuCndJnWX5~$&L8d7OcKR- zD#v>E1(Nte+z5iH1pkV~z;6j7+82;fi9~Hkq5;e6$R7`5aA~W`RHV?L|JiYE5f*LY zpXAhLWRhvv`{+Z$!t~tj^Hto~j+6Pdgl-EB7%BNN3)5)&u*%j!BPrCRicRr?y=@tW0Ryf11h!u5yEj?s4PtwN+du zGt!>Z$Uef(B;5fNN>g{xi0^ChpeG<^UO@)C3MIkST4Ml!7{`?bz#YWQ#8`e`=A>Pv zLuXOezXcfPXW7}=iT?P%@mt9;fto=!a|@u^8QK3KNU}T~ zpt7<}OKL#p&TqW$>*Jf@=y>Dj>PgvJdQe8m+K)w1TB~X)5qiAmqVgaVezV7oK`YJU zV>x6(AZcmfn2)8QyQZ6AK5h=PPfqf9Iuk@`hUm%a)0rw@zliRTx1g48v>Zsd&;Z~< zy~!JGrePi_yjZ!qiVLNr+jE?CTn)a}7M)@6! zI7FDfx*Ka@0{$xoNU(d7{3FIw_`oNqlIl(b;A3Dp()~~ImCHZCtq8DNB~70*By|D}zflMz;Z9L)NQ)V6RDS2XcY{gOqN8W{p5EV|YE4g=br^H+ z2A2vZZ4UqZ*}5(vvMi%*J@J#pXqaKFTO~FfZ(1s3k^^aZAd1+Uc(t^z*4nW@(7JzG zy+4)3LYt8D$oBFebixs3V?u74$h71tSi$7{L1sd|ep_j6ChCn4NkgyJ4HAPkZ-dW2 zO9Y%R%#Q9RpDFNPsw2~%H(dgc3y$)B@thkxb39^mp8P?rm>dQOTfxH!0000jT$o7ufQNHFJdX+L8!7@5$^J8xVi-5rS0hoY7S`# zLHLvwujGIO7$s$*!aj}aDz@-~G1=qQ_0w^GU}hke#$TIO(U3gZ9bF=Rfi?@K{MeXi zziXds41j+y(e|KK1_`qhJxi0)r=xWO@h}r}wu9)z`ni0%K)RCO!D_tnc{*wRgU)3# zyc)Y)T4#6{fbi!5G@L{t`K`ok3i0%pG3mduxBOAXE(CaVK|viS?LR7h{9*)T5k|Ol zUQ(Rn%7*AAkv*t;EZb=4TA#r>CHjyB<=Dq>_u+T>9>Q3VHl*9U-9t2&aQSC#kJkf6 zGj{rTi&8G?GeSOVZEmE8<_}IyAHr=sXiB`}XmJJ==&+NFuQ=brx~OWCVZ24S*mK%- zNG$hgiIdiFQa+TY4s?c#_5%{!bHneo&-oyx8dS9o0<-rNS=zle?zv3!%kBA#1bbJO zxlaKMt7}FCtu9%Yn{pA{vQLs^x62h&hqJVzMOp1vZzjJx-q@jPc9#(H!~Yp8 z>4Fx|a%ucaH^p{1u+8u%gre^l4*_BHB2W0$^K+*zzWsoOyWAh$&NXhF+$fBX(!K4C{Vb6+RkrvE3S&R|w>aIJ6LGrrIDwg-p z%zg0}Uri}-L9=e!gtJ>yoU6YF&pQ$sqDZ;U(GNB4lbf3F`w!^EjoiGv;UZ|_;8Ql( znW>24Eb~Bfpf)G(??DfiOC`LiPM3;uh$zxBF+?+YSX4l_*c+4UV^)|0`^RCw`ww*d zwSKJ&MU(9{xXv4%`5*#>G!-q%Z`_W-4F?dSUXzZ|;7bZ1GfU}!)?f=FS>Jp9ir%Jm z-=8!@1Baf?`X6oB0Gzz5tay8A^0qOsA_6 z?oQH!#jeX9slHR&n-vdvYV+?(tRyXr!6nK6eI`PTK}Qe@G5_Ohk>k?| cC8rOqmP#XC9fBXq`6PJKGsyrI;;d5t54ew)vH$=8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_color_menu_item_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_color_menu_item_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a3ab301282700dbc01b32f232cad8c8884e2e259 GIT binary patch literal 674 zcmV;T0$u$80RRC20000000LqF01K1=0000000N@_|NsC0|NsA2Q7T*;;>SkmR0o{j z1FDb=UT^dO00000000000001ZoXu8UZ<{a_RUd-UgO2BYz4I_VGT&>wsLG<{WG2wL`e);Wqh0zGfU9Gt$BU@r!SrMV%$r{0s*%_H#kl7iTos!uJnVpc?9#SER7INOU z+7=5VA@x5Ita248fz$1_E$G5MiS zHrK#ZDFHZbD~g{D9H@C$K|0|)&4*ktm=40)p8uTd;KpXSO~5(;aWAo z*N~)-3HRkRmG`Q6RQe50eqs)?las);2vdJ#HVj@noi>1pY& z(;jT8I6~Pe)L&;S($X8I>|>|F-N{_$Wl);(7*-hJ1u)5ej5`=%4?LM-f-G6E1T2zQ z_^<@d1yp&lRg}V3sME#oRH(XvN(JTNwA6`;UyWIPiCUwCH{hl>m$UO-tguHk$DKKg zd?6iQiV)ny^^4^Aa#q|(^$Ep>wvGGGTa=P{c-TU=f_Wf#Zmit*^?S&^H*2lvmW}9E z+0d;v;dzM%|Gr*iBmHt->Jys0|5;^&9=)8VS#fTf*?eKbdoK7c6tVf%OIoIpPBDf1 I4Y5*k6yYyNMF0Q* literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_scale_menu_item_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/menu/item/decorator/_scale_menu_item_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a9272da8a40c9a61a17efd4bcad92a2f0808a0af GIT binary patch literal 592 zcmV-W0N}h()Ky?7>AJF3lLkXfy%>`y zJb>ezwuZ!xY$u{ZygN=pQW{!KOu1-o65GfBIsX0Gx$wBkb{dO0Od`(t%=g1MyuQJ} zk1!0UGk+3Cfj^5}YjPdn45!tMIT+2U(i_TT9Ailbv4VLQUdH%$wn1=Wq!uHs7^%fbB}PgyQi_onxzfxky%>5!Po$aB z_P+#{O%;^@9gl||jNy*ucB?de5?m$Bz=LLKBKWo*G(vKOU^@4&=HU&zf#59(0uuUx zUk1>jm*tTQ2kzz?s21F$`Op*$&H%b!}{UP)t_w5A8Wo=W;C zFo}DrC)1)}7GW(UOJJQSW+7c+g4|+U8NWCc^;McqT%VTfoV#u8Yn3%l$3Ys^t7<`p ztoeF#md;qmjLV9@fypz}qgL;-_Gn_m_;%DE6B#5aMXom9#hP}1TiC=uRO!YScnGR zH%EWO_u_0gFT?s@U>zV!%i%CfVF*{m*^Sijkx|Ksfon~+oY75lX_%l0lk_z*_SO5Y8r z{;o5Z+}EXuoSk@>^&xuNfDiIRITGE=P^ZM|d|woJa@q7p=RVnA721hCW*0^L?gqVP zI>sZsM(d-4r?8BR)0qw*(9e87oNKAeTFWggL+{SQ3@_)xQ>_Wb6Pji%-_s#97s40T awWVG7SnqsI{?0eO|R7TbQvkpcYDM3_-*c(ersoJKfwW+0+sQ|9HReocn(7``vTTa{xAg4PZVneE>jmv-WKC zFGo*~^x$Lw*IKxL;$DWM+kx09dmulH!@>~Sq&?1eT#+}@qB!FIGW?aDpYkr?UDj#a zX!XE+d`5vGZsD~^lj~+ft_62TrvAuh{^Wn(m=sOx?r*H_Y|5`n=0p_3*`K2fl=`RD z-YChcE4Po3YsKyQD)NiUCRfOcLR;3xq+FG4tchufRQCSHZ&|%*So^B*g0@)cYbM#- zG!^p<8Ht4}OZ}o>?c;l9t{6=e|Hyuo@*viE_I=!K(odp!#qaeh<@vvhI`>O6RFfJ znyQ1XerZ7^ub!yrR4ixoPE;?7#=B-6?4JSNpO(Rl+UhWVe>bM;A*OX9Qroc6B56V= zbh5KiaK&mU1<VS2|*OVIVfYoLWZ8p%!5M8c=<&sMtb{v-v_{TA3*0%9&?QHXY(s z4$>rpr10~G?j7Z$5gi+79twL9LJ?jOBQSgN!pzTq+)JLS3Nl5MCQo;KZn}fjJyg?l zD!zX{MHl(eP|GW>%pu0w;bF12;FbzaNA>W@n=$6 z1*=_&;$`{&!8BGWvM?)o%_IsS4=J&*wG_Hk@ z)?75z&tX!IAcR(F)o)>-#OJ-l9=~|bYXotyS%|xC(Q5l!I@ICd?opl@6753n$BysX<&ZXX(Y>~&4Ca(;7c9q1s z9}Anz*$$l`^fFO_i-C!O z_1h)2*vfp_J`6Pa>TYXST(BNODqRUFC_eU3Ps>&G8;rDZ;m~ zE+Ttm>Olyw^(C9(LkSc~DS5n`8^)99?Iy{*(7$~>m>S?GqlhduSQEIyA>W(125t3X zRQ^1aUtg{la7-Q1-`ZS2I_%)-wwOGv1r7!qgv5Mq_;9M#Usd zEbCCYUhST~RbB0KXgw{>32tAn1$S+&&8~I%%YVui;p%MLbaYEXAKvIge(j-Jb8E3Z zP(Zlnoux}zGU8!FLSv8_WmS_5`+5WC9pA~*qp164?TUH~c6U@9>3oxay4pWDLGyY8 zB}zjlHuGx#{C%bU;l3{)^R|ae4Tsk=D#v<8ul?LsIa4mJB^NJN=}BtB*9Xpj5!Rl) zEpV_b;zn;YguWk+XI4Q2tQ>2A0I+5-!wFT6x>_B|aapn{xyD1xBhPM`9xE^<4=%>^3`+FTzQyeQYbDfsb9GsVEDcNaH3!Z0YrNZ!0;{F(G8I#MEp$$M$ zA}qc}Zf{jaNPSE2J8lL|Lq;O>^ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/transition/_base_transition_scene.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/scene/transition/_base_transition_scene.java.i new file mode 100644 index 0000000000000000000000000000000000000000..af7f3a934e1ba98f564a1bf8ff1f61bd2b17e8ef GIT binary patch literal 540 zcmV+%0^|Jv0RRC20000000GXU8;*?zg00000000000001ZoXu5HYuhjoezw8?;ns(dhR#k(*;q?qUAC3L);(l@ zK#|Xmn0zwQd1)B^@008}NlOc5_#t|*W$V-VyYD`oYaxG&62aIq6_n@rC)|)qMVKP7 z;!Wx#`UkdxoML6@Dv6U=RkgAFihYZ4ZMS6OaT3EAK8c1`#=@PFMhgeGR#aNaRk!FA zNrdUe<@txpi;wUQChybfG(De8CjpQpaosFE9K_OjPLe_TAPznYhrf0l+phxNGg9uL zd-|KiQI^5=|Bo)f%#dS2>;{N85T$Plbv_WE+8Rd5m_wmR=&g9w9j^OQz6ANH^A{n7 zHiDu0(pa(c&~VkTjbvj77vLFBjk%Ae1#_Y&(sadhH0 zgX;>|IEE!cu8IP!M?qmt1xDu`;LS;((#L+-PxmukDVOf54A*-tt`6Z*)B$_q0eI-1 z?ead!eU4%IVKDdHA~RZe3yXGgJSX}G`X1?9S7B_{R$&orF$=9Oo0F$n2#H73fwp{) ehtQnJ7uNrj;D!usD$_V<f98KJy0P59XE-~MA_a= zeA0R(c4j*TH1XeeY^RWxa1qJ_RU6m#`Ofw8aSE2)uo)1gXOv0KVc`alGa-S3w8Gv~ zlK@VvX3_{NlpOcEy{^a$r7iix7VM7ZBGC%C-=#Nmt)wzk6{scyLyt~JaUJu5Ek7hI z2hHfj594=1=D3o9rdA+^o?N+M!m{idL;HvZui!W=y@~e;DzwNk_65*ONGx+vzYiEP zJ9W=@0_Lm$nkz0+fv)al#hjg0vkz&Q!ru~P0#mnK)70w@H#T}*vO#uPY3E9lbCIZw z8FHjqo{3~0HjO|q8EtKE#@pXE$yXA8r=tOq4WO7;9S4*OE(z0y5r`KS;m@vp`ZISwAv&n!1uSP!Q=i) z>Xx-~(f<}kU{O|U;>9$~gt4H16&w#%bsPA2>es`XpKg2g{)s9Ab#^Znpta!OXBFEQ zN^qj2L;S?<=*Z#uP&Yw}`fRDL({NB|h;K>D#`s=`Hl+rS`4aiyo)4i853Ti*Be0lf z@&zg6{(PPWeFk{%;k}e9JxsOA$<%d$iMz*!ClXyvSpqG!zdAh%tt?U(_>v!IOyVmV zzr-l_1wo-TVAF+TcNaSEV7I6|Il~6Zao_MSCa#E0wVT literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_base_renderer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_base_renderer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..379ff144b74f7edca5d42fc9a4f0ae9a21d60a7d GIT binary patch literal 1090 zcmV-I1ikwJ0RRC20000000aU601x^A0000000OT6|NsC0|NsAHyhb7}0_xO(^%}bN zo1HnSB^-VL00000000000001ZoXuBlZ{j!*{tOcT!T03^6%DYrC!H2mTA-oJsS7JY zSLMD`ZZd#x9XqleuGMY-`#SG05Xx3L=@25ZJ@d@udB)@5Vf!220^(w8VCFcm4=%vA zgn&jleD? z_AXkKgxP=w??3c^`_TU#U7~k?7=wZFu0QAp2EA6(^B=W2!jDo3Y%64I5Q)ZE!V+{A z0tC|eQE)Y%63x=de_PE)uZOPQ{)qr4oJoZ>b`5wnr8Ff#ojUSq=&vWp9xFhEDdbw* z7dDKkCUNRBJ18Y|g~qq${CavfpR8t!`Gd8%TTaY}YjZlfyIl>-5Z53TVK{I-jdN{U ztJ!=M-zQ*oswR9}aq&MA?go_7rTHte!kc;$i#N!g69-991=8CaEd>pQ@s4QQMY;7V z;X2_~YN#ENMn!=f!yaZ%CrY9+YT*7-8}Xk(_aH~24HvzQ;4ZR!-KQo&E9uRcmSTf# zsHspq!4=pFoJbPRMxIBXzk*Oi$A}fNg08Q53oeNYK~qQG&23CL*|d{}YMA#cb8hLK zVm*8{mn-vrd^eq%%f&^{JQ-x^!`#h1I!SPAmfj>w4EjS-4Q3uHSJ<=@+3qt1*Im?qC3gBmX9tcZH$f9bBK8iC*SNmoshAagK%_>$ zTiGz-|GlEMo|lJWp)8KBZz2`tm4tre7UL%ZxGo9FM&GG IALS>@n!R`WcK`qY literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_g_l_shape.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_g_l_shape.java.i new file mode 100644 index 0000000000000000000000000000000000000000..bcffbf2b60c95ccb75ea8bac8d7c667ac588f297 GIT binary patch literal 862 zcmZQzWME_f114Jr1`ZAgo3ZIX6c|RC*4~LYxJ`G~rlh48W1Y*sN8X00fshq*&W6Tj z-!>4b-KO~ep&hSzNzol6Hr`g#qn^f_Qm$m4{ALvL+v=j0x7(!4Ef@dW{Zx+KwQK{g z{Tcpks`raaOU_>`^?O{s%Vk2A=L!#@nCbi?-f9yT7@W!JjJqiFTXy^7O*+$09Vp+m zOnTDB2v46Gi9r*7Po3nHrBvMgbj8UGp)bGcyE(pvTY9YQQ)^AU!?bR~^A*49St1u3 z?NHo)H925OChMCWb=z+jF65TaNDK=)IOXW1U|wZc<8zNf{{|WhDzhBCx%5ui@r(WyRTT{IE)8@IG+)Cu4Z$IGZb!5#~SQQs_Yw;wuZhNXqccA%E-QC@z%GqbyT0bL=5?ya}SFt>il9t=ASaxyRF~dDh2hQ<$>%Uc-wPtP9 z3*lRF8Mi~Vrq0)z=@@eB>!zH{e>+lU1ZlfTcW?FHk-I)zOovZm&$RVHFTM(2m?xL4 z_@;B?f0G>oK{>{e87r=2xU!u7te!4n^&gakK*F?|6Cm!(% z%M9OqT(2$pk?(0sLLE>YGGLj=zyQJwJe&^xWvN9)nJKBfTnr3s4M5xs6lVhQfK)Pw zWUvO>0!{9WpMiWvkS#j*&UsvqeU^1Ie-pEBi_aHjc3Y5%NPy7`sI(g>pkGj$l#`jP pkeF0lQk0lnqL7@ESX`{&?h~AmSdglaT2Ydkmr|?%;Z^f;0RY($VW|KB literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_modifier_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_modifier_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f71a0e752756bd519a4a27a94b3c22805b9f4875 GIT binary patch literal 354 zcmZQzWME_f14bnV2Bx_XHbc#SD7gM3uKT!fd*cgswM}bZTW#HKQhFPz2254VSv&E* z*I@&ZV>g#J?mN8m%0kcod9kh^yd-zr{lSu1w8zie_yu7F>ccxye<$OnsAshdHdEp11()Zd#qhIPb>eMb#*rR|;^0J$Tj6aWAK literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_renderer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_renderer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..169d1e7ea4c578dd5f9f716028ae0fd561fb3f99 GIT binary patch literal 738 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 TSFsC$;YjlRVDLti@{#`mR=X3j literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_shape_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_i_shape_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..3c8bc2aa1803fa7d6d7ed88e5ec2aabbcc6b190e GIT binary patch literal 865 zcmZQzWME_f14eHK24+nuY{jE9nRY?dfT@Z(YbT!f zVm1^w_Aw*jzT)wylFc`FUCR^PvqEIe^heA+CsU+jCr?u&DJ^3T*Er{1PC8oufTlHxNz?2f9{^m;%9z!HBJCoL8N`2mW#oG%?b>N$YKVJVq&!bUM> za_TL8FLiSs-KzSvq;;+01$O@TTg6^4l-MHZVX6Ofi;hv1<4>KlYMJvst`XkQvg53` z_VQaUU$~+^CSCn{Q*wzsr)6r-y+8kX8me;_v2NN8zV{Jr``m9v=&n58 zP*`GSuMzS2jf%^g%Mr{>JenJZnnPFnt~Tq!l{+MXB&7E2x7TEsKF&E-2~`8782^Km0y&DDyj+|GrAaxN$qH#X`H3Y8>8T|yrA3J) znfZAdn%2BrARUbB!TM~0$xRTvez6j`q`+1@~J&Rku52VgywK zr5JAmO}Gc-C?o7j%FoY9P0UlsEOyJx%Ph`FO#xd5vJT`fCMJ;aP|M$d%`pX9ZUr^* z2ask4S)RFuIaaNYX|XJe!Ss-~ub902Q=m#<6yqPDi9pPt3G*hx>Y&uz{Ib;WjMO|7 GM*sk0l`|#) literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_rectangle_renderer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_rectangle_renderer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..69d2b6f76abd7b642fa7c27b47f139c1d176ad34 GIT binary patch literal 474 zcmV<00VVzb0RRC20000000Ei+00r;>0000000OT6|NsC0|NsAAHiQpbhx~mIV22$m zeKblismuES00000000000001ZoXu2CPa821J!hr;4|A#@O1)X2qEI0bLc59-ph{4$ z$n{PV!>(%B_46wN_-Y)InP#o;GBS^};&lR_H}B&&U6B-f<8?$r?$DX@p41 zhQl<0AzaEPY%Ia8R<@EJ3X*lD)uy}j+9-tlNk24J7o+aUoi!U(#vb_Ree=5PD1!NGNS7&~pi_hMaL zlYE{K$(=uFSv)=-?iaJkZ887;uw?7!2*x8gIppau_|tbl_b0EHE> zMzcOcTUz$z9dGZhfJ~2#v_bxJ&p9!9BNlhOXXO~Q)n}qkySMchZ{=LR>ieOGdVF%e z1z=^<)6E$v!oGRSH&rjXxTU!FXZcQbwSyV>2VL9ZsHrd|+aTlHi6kS%^yX-bDR&tSB(oIyC;lYKLV1~CgK2QW zt8loy8iC#aOb|N`$)$k5`h;)N(PieK)EIwiL3L!FIHFz_#?s*h~5b*in4%ehPiw9}`5B*@um z-z4%>Sa*01loYUQN9dpQn7F0u{t$RTF;RulXO3`cyQni86savo|MR6)c(aF9MQv;< z4NkKz^HHK}pwmzCKD~^1Ms;qj)o}B$>r6&ALz?ztS$K-C|IRuN&LpFpGQvFvo?AfP z{Rs@{&oIqnvHcdOgBuyHn!oAV{t=4UxqqeZaiYNxoKU4Lh2Bu?cBnD%Gw07j>i3(X z1VtUVMv^#tU2S??GyChc=b85lDtx_SW*W$-Bn|jxisp0aOQTV1&hXAedH+dw%yAyu zr9eT&3~3`oJ?-Togb+$qui0VhwkP7%k0fvM*(HmTu@xW19urBvNfFuH+U)M_wTFv* z_ff9v3Np3H5vNt3t~nLBiDuudn_buDMQF8JaJ!fHMB-6g87Gt@x8+P>3?Jx7Ns3rKHRg{Mzw9f!fh2MPm(Rhr<$Gny;PeUjWB3HxLLucP=+~|?9;>8i&E9r z8E)>3mZ8`(;TSr3i@+y9ue<15!dyes;|mlbR>P0?ch|1i--MJ+1lhfdO6{6Em_um{ zn^Y9qC3-25WYm;e=kg4NecXWtR#D!o=WDu(>2Bn<)$nZmU(4{x*-Xdt;>dC9%*VaZyM6{mtc@3yJ$m#`HVgH z+c#Ftm=LG?ZnliW=aWQ_{dl4G;cWvd`Hv0-j#hzd_~`DP zuz|tUTQmX}{p`b7o7;BGf32PlB!}_3Rvlq`GxGWToPt$d& zNrt57n&4KYX)=LDRB(X&hfx zMwX@e)T}yeWlJGcVwswoD(@pOM%kzrZb=dzsX@r-%i{09sfE8Ep4Su8FLvjasuNNH zR|a}D)tGbiPb#J5#Fl4Gb;TBBH*I<7J%bU@t#q>ICO&n zT!N;%u6vQqQC$W<@8+=k$$71v*Uw8iHseV)lVoLjhdBAC?CI4vCgw6@BEc-f9f`dG zNZS`8|Hw-gabj6o9ee1H-*yqyIUZh`N3NMYmY?~}FMaLGb1!t8TJCK;)xnV~FCEud zr!gRGxn0lua6fG7=$16akYW*DxBFL2=bjEXAuM7+D0NUOIRbG1YEdyMI*`IyfT6_9 zW6z@mCJ?V=q|8;#_~@UqyowTAzOrePW!2p1$T58GIVUF1*}=hb1kl-+(@04`Lcj#% zM(D#3C=`q47m<}vg-P6?M?tQxm9j!M6=R{EcH$tA7ZblB&?9(RRCrKA&p=$yz*u-_ z?3%GI6eUWpFD5c@%}{JgcW79D*x2VlO2$ao=U~D(YENKIm|4Tk;J$~QI3VDKXbS26 zpm!t!`G}Q2Cn=(?CxV<*xq=S)dbe+V4{Kh~;dJbrZXGZMb!PdC|5P6Ie^xG`sDAZo zwE|52x`cwzTYelzU*M>&!Kk6wyR}s(2M2MouO@|h*Z6r~b1{TBkap9k+a3jqnu z33&*?_HsJNHZJ8rAsk?9FetRtU5O#Qkr$h@!2vOX8&v5NtfLxuyp~Ntpc86-iP&@) zottg4rnO;&lU_i%rqok0a2?pP^?KrR05e!HO5xI1vJ($}J3x(TPCCRS}IMoes{INiVj{A1jb17OZ6ruLer8cB9KCWW}9gs{3n?c9I1Tj1*8kjggpx5=$<5IJMvbRmWNaqyK)+olqB7L z-?f*prh)%NU&y38J2RefB|@@`GfV3Qf?>MLSkUo) zPb_aMp)UK`g+BwA3DT$6*`3pHp}6!pC1y&I$&fLMhA3jU12PE=Hm4Rvpin|b} z@w>-2C(GNhub1VaikP_`o5>L?y`gl12ey+F>e7JHs>P)souw zpmn+BK}Sc2HJhozy|1B!GVdNQ`$>Tqk#P?-+r@5?)wQe6HnX)BE<%|V|IXO_vL1=2 zZ8`W2YTs-$BPB^Qc$O#ejqsmGkWc&uM0y0`*1;4<4B7niNymVv&wmBqV2mI4RtT6GIWa zqZS7OQ|_oKff?HToxF%=EKT4&P%aI?^O-D!R1P?kL?A!0hqs7=xX9iRK~0KMP33+D znn~wD)84D9ofo`1WtCDN&n$m|$xBKZLv?E~^s#wE5k~e7;+p!tz3G}b{ql7<{S6s7 zqApj!N;gO=ND#YSeaPCD_E^B{k|-3j-nGTIcGSjKohUWRe&o14qqvcf|Efh25)EY% z58z%7^Di{a(6&n*Y>=5r8^0B@7o2-Y?rPuk+mF!|DLa-yAysb%*5ijciVYhn`I?}g z-_=D%N68i?iv?7o)0g<9>%z9A)l|G|V<>Gk86R-#cQO?#8|!qZs=I~BCPtf}bNi|j zpghToceN@48q6g^H@VF8P^bMjG0Fp9%3iNI_kS-(Bt=W1%WL>+B=ALqj{(0F=oY+o zE9ZFIx(=Uftt=H6dEpa7M_;b)M#6%8=J#Pj$U2@=xAgW3*rp=aiA4M6i#w#4XlqFX z$`Mb4(IiF8moz)6Nco1;vJk#A+Achm7KCMj4pPl*Z`?Su`~~U2GJqn7Gu-Kn<>8^| z3=7G1a1&fvi}4izFUKSdL1l6VuerN~Zn?j6_ycV3;M-qZuu3`L5kzf-3NQznUd zY*PwbiiwVH!f~HAC&a9ER7JbhRzm@}&xPvVaV7GX$7aCS!-2jcS0}Q z?ibtqx-sPm--D;sLm(Nh@mFnvJ)30=o?|#%J78xwij@@J1^iir#3sGud>$qlX=H#& lsiV4Zpp{dmS|Qi+M%8wHmn}Zr|2TsapP3u+6G!^pe*vkf?ZW^7 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_shape.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/_shape.java.i new file mode 100644 index 0000000000000000000000000000000000000000..38f1a41865a8f3d46a994e5845dd1b9176a07404 GIT binary patch literal 14844 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 VJXa71*?Z|-nEw}6j+{|8G67u^5= literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_alpha_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_alpha_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f9c315f07ed684e74705c70466b5b0f93b4e9e03 GIT binary patch literal 2862 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_double_value_span_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_double_value_span_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c9f2a966644cb801afae64f64b1325a93931d000 GIT binary patch literal 2356 zcmXw32{@En82)E42=^jP*;1JXStCqRmO{3Xb!>5|EFp|g#*!sj#xnM4m@u@+GNHw; zX0i(@YMRis7fq-b;?9`v_dNgmz2Eb^&pF@u&ifw#1b~3u06zo(L1_*L3Ge&~nFq~M zi(0NIFWyw=XD{nhiM(F}I2sN{5(XUUNSeAZH1o{jPB7B04>fY6+~BDE{J#4m<5{Uc zgFah)QE616J-Bsb`xnCc^oVNM`+Q#J(3!dB3Hoo$0R+SAAW=*e5;wK5KZT*OXon}5 z=*$0(F1LC! zZr^#^w*_uVSI~$Rj<6u_V3lu2Or8^sh1+op%tPb0C5P02Xx{l+AX%k$hWuQtceGBj zRyxM(gIvUHBNo2Vz6zC=X*{VLZ-FZ+vSAca55XjZ#Eb4Jmxw3hzwbMk4w>4J6P%J+ z8~hzKolL)=@ZjnsGIcYI48QR(bIX(y+15x#x?e$V=|ipUfR=a#}wiB8Brl3nAVz%QLEm zjWxZS+(VmY?sK>CJcA%0B^7?~_Odyr;wAGf8UwT-FV%^I7N3*4BI6allzi0Xw{6mk zvxsh7uQl1V_2&s+y&7{989r@{%Kp<^QoX+hw4Toe-^q?nRjX|4>L!j&Upj3@9f}MJ zQ2JP=kx$Z54^gZ2k(el@M~92UjCfKiM2>90qPv|?>a*ITiInm2M-mY4gs}Rf(D?Jh zA0Ho^?N`S&xeoQ+KsQU0qP{j&U5JHfHRNIwp6iq_g;mTF@fMSQ1u?2wR5kNomkx`<3l+R`>vbK*}xyKu~sOn|(eEWkk%ZS7k&! z3iED^H#lzH(ZQL&`QTm525TP>5LqOV)} zas3oR9fdGrk8S90p-3l9rc>hWlfdc~<$#DqUk_6GyaI3(J!*e{cE-zd(iZ#~bGK(1 zWp#vZ1~i@031e@@CBjC~0alxyY{uf6Y+$$PE>$j$-8r#l+|20U9m|N^%Oy~=EBOPF zgld~sb1p++S;I~N(%bMpzR)CWlJ+ZOK?Mo;f=&cFWb$$S*Fhf2976GjDlMFn;^W%w+; zPODCf%6L)r>*e~UcuUytrI}kTcMb1-mAp`Hy7*wiLUdw$vgzNjm+oEX38X;Z9rgaG z`CrG$89V}=whJlHdjjXtmA2%b^Cq_v!|2DDhGQ$xO~)4B{e2XHDI#^-0(NE-FncWg zt)_e*^2e3uPktM0O3$j;c$hxe>Db`c)7-+ar^KzkJ1Yy;c)dAO1F<*&W{(#c&DRe=?4 z75(|-^Kdb1vx7IUg}?vXaD{lUcd_&n^=M7QzRTD3n!gPo`MxXl-Y6{|erFMwCZ^jL z92?Nhqft2rSvGJZp@Ye-LQJERCtoqe%T@`6b&d_$cEP%DzNb&z1*-}%3I-M64KE4% za{KcjY6HqB2I;!;m6aEZ^o5z}397kHZ^4G&>eg9RI}1&+c9_ni ziw|e+M~-bN$x7!+PQ=8-k76-VNRg3Ex-k?7@b(ffcz4(=OU0~MTX}}3xgICKx~>(ZOtKcm z52}*7%yZz09Lhn_ETz}p^*3$konONvPt>*BKKi(0{Gb!EyGlO0$sdRrd4`(JP zB-H==M&I!;v;SwD14`LR)IjP~wZna-&|y^-@c7o?(#q0Ql@=jdPe8RxX_eGd>aJ4j zI419U_@{^Da_s!mSeun?ef&)R-sa2?10j-4=v9d47yj36bC*=ksxL8qC~06ME_*x+ zqJvMybk+`wF717SIifO$0JkqVG3%;zFqtp;%^^s@^=q3$Qdqny(FMo z4nFO*eXv`@ZsS3>b+K%U6e1lcc6o# g`5(D#S%01bs{#w{VR;J0`dt67_*gFm-(^nqAEPfI(f|Me literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_from_to_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_from_to_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6cbc1dd916764ffd7d9da4be6280999b0d7b9287 GIT binary patch literal 1125 zcmZQzWME_f1Ex9#2F|AtHbc#SD2Q2hcm~&ZlQ;J3v|MYC6o#yP)9?kV2254VIUDvq z|FVI=RXe?)|Lwn9ZW&E7du_J#>XL&A!Kz#yvNh#zy|X=XPnT)2-TL46c#HQhX2XC9 z*Z6%)cUITE|Mc$C;s&qM^@XM^b9g6pUoM{Z<&mS%{Egk49c7lQBx=r%RVgXB_j>MJ z{$FRpc@AbsdD`}OB=CeEWj#8FyC)zb@4fP3lkF0^s*g3@W%nwwDIV#dvCd*({ZSP*({57ZG-;QE8jRnAD?Y}zjLET&Cki*%a3li z*MC(O%~q(iSY0ZO>v?B-Bs-5n+>{@xbz)|qg<-|EWk0s(9?K!KLC*FDey{lz~ z=!%+Wmm1IXTy2S3z<1<8T{Xjg>uqcHe3kffldEqrhu;6c!AvpUi8_MUOd75WES2t) z%#-qDlOT)t`)s@JL4Zh4$rmLq;=OSZt*O}?)9bB)#ImWg>6qn3YT z_4(WX+<1?0iT6d_)giAmN_!hJFaCU;wB0rN;fiG~Ny&$Gb%VOsL@m-jDe3WWmyy_= zqDep5H|FltW&gRC?^L|iV*AE_y0Z@N{t0eH>OWoIKCfC&R+M2{nx2)j2p6q z4%b#%Z?j$by0XHk`+V0<*@*NF(;{x&*>k$X=mcNZ-KFId#P_hs&s@BB^0buOJKpwH z=gZAn&s-!`^6InX+>IJyGk*VPT;D44-Fv3=hvv&C_Ut(Jmx)d1&3{l51f^RbC}UvY zatE^*7#4wOPy&8BnJ4z|S^3(07af&c$K6Yqyi!j?)qtsrImrnO&0-u!XK^0nId4(9 z(}LS;a*@$w(K$lh!FRhp6+3^b{Tys`*(kW%Z@2D=Vfe}z zm<+O-36hI8BDosKW?%%lT64ki7(VuybGu?6XYfr>d(`wY1cIqe8 zx~+#=H#k{UXRZ|36S?++ndRwy7Z;tJb0Wr4v(%aGbC=9w?oEg4!lk^M^ln_rF_Y#0 zYtEY>R64n|)Vxq<>bKYTi|%(6tSeu;w*3#Y!aI>G6XaP7Z|3XixND~r>E$f`b8W)s XHIqcd<&}2u-}%<|eZP3t<02*if#vU6 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..13b311888403b8d0972f678e586becc604302c1d GIT binary patch literal 2509 zcmXw53p~^78~@D=8{*_H$0fq3nQPlYsN63t?ToRS+h}N&Qgh@KBG=NIWiz)GnIg9) zrJ7R7okm3o<<=qh(8=k)E&u29dEf8zzMt>!eV_01KF{a#13&->5F2WCS2OX~v%0=-cwQMJCFh!LgO`v(l(%Whp0;0^O> z7ShdM6^=zwdy^4w{ZeBo%R7fM8+<_20^SN~xdUqnyt*(%jMyP5+#?b>MHJ-Od$p0BbH zF?C|1EwJcfZJ4vhg5{8csgv^f&g0duuPe5grnpodvaX3yR*O|JA-_1cde8Rcb!!2w z?aZ4!VBX?}4}I}aspn&lU|gwPSNOvCi3qOhLx_SWq#I&m!)m6=S`SjL6ZCH%UiYnt zb)#PKm_`~QGaUpKAp^76ve`m+IHpoE+2GUrgT}_y69P!O$&zZ-76pJllOJ^6_o!_R;T1Jfpl^fmA|#@JoG+sub)Ee+J7d6Q=IyDjhE$D!k4GA zw#b?XV-JqK)=5Fe=Tte|Jt*^K3^&zc^ZZ|>s`L>-l+H`eqz}<(IGty*EwCNH!LFY1 zCY>3|swekZWxEtsdKK$XCH8zzSoRy28C!_bpN74sY}Esd)EvD2C$v=V~S~Mq^wn=7#^rb>>VU zW&9ln{=zRxHTI`W28?#O+P1Bn;4(jmBqqD~ew*1K&!s7sLwTlE;45ofSob((BX@N5 z=MPRnwVT?;ONn9gE^Y8*nqv1@fJ-&vy&3U>)u5=4M9n9(dH~pBEcO6^BSKLZ@{gHx zY=f_+k>lT5=`%aHPqabsO^z6-?867zVNa2Ya%n-ZjY|+Sm6nIp-xjuG?bg6$vkb&d zcQ;=%=ktM08ryolJgu&~8_cND`)cmJc)=zIy&D(5(;kPpwsmVHH|5fqkN8pd+ukgs z&7=L*g>x65-KZ)ztj9O0H}JD=Lzc-;8;`e=9FqH8&qL2ACzf=+io-f>S08Dx(ulT` zC|pQpW(7rQtMYD{26(DSQ6B8|g>p^|XY@TAeJ`_Q?e9^EjBkGo9QngXM-(`CRUH0v zp=N8b2LLrf1c@|f`cDmJ7tpk8?h|-M^UD!4%B)SwFQBqRgMz*U2L%N*^ZB~%cnlrS z@TXPe(2I($vGQ)^{KH^g$Fr}pLOR=@^ZDPi6BE4^%6k~su4mR2TfvPiHL9%Y)XQ-D z4wYyccjM^+z5(=G7}{0*olB95`B23MKpvLJ^koz=IT&_;#BTjvmS*PC6e`F|E7Gch z3FFB?f|k&`K?@qi>wRoCldPE$G~T*Ja7POM>Az=uzCP$1%1Gc9W<*!cEsIR*{DfC% zG18j|_Ag-M9b&_e0sdM@c=6aka3)b&Q?&1h& zeH^(29XpWX&{UvM(hE=q!7WPIDQXO;^!3qbdIiL zyvc6WQE>-+*t4QQSvFoF&8q0eCjAE3?45J6A>Z5N?Z8t z7G2R=XtTm0DY`=i!z;~wDz&5wUm1{|3IIe0m_nM;Xl>PW3TN4qUJ-C-%Hp0=8cS__Dgin{KD(q(lLVG1o%SY@Irqp|8Sg|9g z3#xp2-pq5CNt>5Dr1l_N=9E*oxvJ~l513yqbDEbesSCT753)ZT+f}JrqP<6gxVYgZ1v~)e^-v|; zvx&K~aTS&3C^Ln6G~TP%Vj)4(XfSk8hw&1B8(Mu!@(pK?_qpQ6aO}z~Uqe$V)ifhZ zHJOF$$SD8(uTt~v*1DE%7YOMK;pOpT@m@H!NCK*}jo6VC9`nt=f0?26gyR?OYL7cv z1V~rL3>b_;pP#Oyf7z(I+h+4svYYc2(N5v!=pUaN%9P07ec`5&>H*KpM*SOO2bwQi zezovhl<2Xe`|7_d3GGnN?z_?I6hTlseWtjwtM@%s-?r+`K!asV2VTicc2=LY^82n@ v+dl)A+%C`te%e+ZPj^>au4b&|la-q?r)L+5|J;&&c>W&Z$%o{e&0}&z>cs-{#E>;r7m1swBvLDW|I~FW`mu+OX}feqDT1f7rB& zJ+AAIwH}AeqIjiW(JuR4zMK^b{$$=Tx$pYNBU+)i?3A;%dH(Q}@ZQ8xU-rS~zuu>f zix>B?yBD<0jMd_u&l=7twd2wbFP8Xe?QR}^0zAhLX2`I7U}IC>Z~vwF--7wp8~UcF zEi7i|>AiYFw}3rq!AzwE*5QRAa_?pTzNl#LIrwsay;lRbYOiaiFL#CR)DlgN&Zt$# zJqvrMDToOPcL=wNg~c15e9`u0&W=eJOFmiepY!QZxmD)colW_33s;v!>rU&+nijDA zR=_XC%Nebcj&HTQoIC${HT(8e7xz3~db9qP_LItt>4!?RJ+nKt9+)1`Jz;o4$Fu6^ zTbn&s+{~ZFPvcqAnwnm*nd+GwY z4YKjpn{HqDB^vp9MFs2UN5@a!G`RkxY{%`@8!zdU`5ds>Kdrk)bo0!TrN>UJ+{(K| zr_lRi-t+ZSI~+WZpYq|-HqgvFbVc=!#))08y6V+Ey4~|Xg{+%4X@^OA{Iw-pJ625F zRFePht$$=TXIb~*e1#0@o%Za~WT0=fLgH z<0PeyZ(TT7EcJiUvjVlxp)c?4eGsEnxj$%TV-i=iq@DX6{~7PyzJrn=DBS`<4Fdyr zJebA6un0th5^z}UKE8Ypp9xxWY~`H#TylNs++aOWbqp1Ak`ox3`8bZMF(2&lnX@Nm z4(n1+%b6#+{5p@WWbB;jn&s zx(rec-o2(Co}O-L8{_mm)N~A&n_TrgC^miOiB%J}G_f)TbvFf1{`@)U!z=e-E~6#W zrgJltY>u)4xq%6imo6Z=eIrnq5#;tq6^mb+-TiL(Doyw5S|tZb)8?=)kRBMQn6q|* zA=e=X0oUc1IqoHHFw%-U;N^JGuj5Al$qX^Go2u5gDtPjf^eb5VANcY}i*_qCg>lcf z|MOjJK_PR-Jcb8SHx6+eKg4@zcrRz&yZ297%OA<>{B-hrn zMWjmSdR+K*Z-?HTmc?bSKVO^g=CzUAL11dp@$Cm!#pZu|o7T}Dq%VoS^e|_f zv$M7ZXK;-|wc!FjQJ4Ej!ks`{pSqiPQ&Q#<=wD9zz3FHGUFc8j-q0TO`n|}&X6Q{7H^e6pbcYlH&*wA~u$|=<=DF7b>#P`_Bfh_HgW|j@1*WjXqza; zJED~4dIC%Hqp60=TFIn!O;ka zu(Mz~1RiopvwfKbA(R#E`q62GUILJG z|6X;uAZ;3Fq17sql`-@KkHKfpdw*3G2(K#{&$v~|#7xaSGD!r|Q*d+D8ycRPi1!k@t|Fq~uT_djDjS{y*=G e3l^nEzsSQ|#@XYRhZ4+SZ)Be9!2JSlx7;F95}j`V literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_shape_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_shape_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b4670d375ebce9e6e9747a0bbd4ce18f523b7935 GIT binary patch literal 747 zcmZQzWME_f1ExR*2F~jcHlz1{CeYLN)&l8t8vu#6nnYha8SM}$a4w|LLh6=VH zXzZU^`?)Ob-hp1x4{tO!+-TUY^f2kI{@#K=MkLGSE+PiXh$@SMew-=-@6#w~e zRn$gCO{VtlX6Fcrq`~7oWZ&1dY9Bxp?yjeEt=}R9qXKu9u|02<1#`w$w!b%T4CzvdBjFDDNWjyqz z%y@R*GrgLYo44jwZL^;1>&>2?k-BsJ-Nqk5oI)BLCLJx4UhU(#{eg8>8t1ZE6I)_$ zf2z*lm0^E(ukH#1{~S-(k_NdCRg1oO7;;uWn#{S*AV8w&d}ULM<1Y`%sfKO0Px){! z`jGRdPgDPcd(WD}X6pc@!jvg11blL}|fu>XIoOGEkO);X!quZv%J{$iWu%3V6griz#NUEOtT#p>;E zilSncElAzr^ioN*R^&J5)Js$B4(!`iY5%Ln&Gxqwr=Yl>N(I+%8|RM!eFo{rO|EvZ z+z76}SFatwA@ykIeyO!VH$ApwhBa!5^SoNObIMM=QwMm$%nwO!T3xSPaeb|Fv((N9 zCM=z&8gBE=EwznOGT>7?yoj$~dz1A7BdMO-d(E!hnmB9ktiu2092d6xGb&p;U-X}U zcmKYXj)x@sj{QCRI(+FK`Iqk^W}5t6&pclu{rHsULRt^MEefCeLHvr)lUz`;0wqNt zkOC&iNHB|maXW|xrOC}7`+o)-et7Phzt8RPrr*mZMKi93s6ioXAw0GM1_ribAe)Jo F3jh@FLUjND literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_single_value_change_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_single_value_change_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ab3a682e8c6ab22f2da8d0549403aa135061bb6c GIT binary patch literal 1220 zcmZQzWME_f1Ey342F^_oHlx6QC=ebAa2|*n2w5@bY}ozm z+Xe#5`c0qI?^u4Z<(${&&Ayr?Z?_3WY=%ho?<(`}dABuRZ0MWJ_&$D4`NU5T zYebaP5_pwQ>2OS)^Vq6>K@3MH%TnPy=QoqGRJ4z}DqWZ$o%ONI^C{DN@8Cbp>oQA3 zGEdcAVr^pY=HBpwQAh8e&x>l%8=-NV_hwSXp0~c<$Lf z*%x=LoM$pWbJThAb|&XekB`>Ao89L!{dwB?`OxcwKbDKi3NwZ4@8@cWR$aUJ(oMDx zQj5L>CY+Lfw754SxP1bLXRt?*tL&OA-+x_cZ9blLHzodF2%K!V+$Y#oWKm_9s`^*1 zufNX(s86xEs~L0s(Je>E<9V8IJkRcZSHxxHeRnp#WT^99TEMT*|L&fX8_tQ`B;pDu(uz22Y z=^3p@UrX|Sf3bYMd~2tXieVP(<~=jF{}fOSez{U@N@DV2XUi16pJh?&r#@Jaa`ATo z&r-HS?Mx*VZ!TBume9W*e=Vcu!4Bs5MfZYV+PBnbwF;Yv?l)ZU)>EM5OToSNgu2Uj z_zzmed9D-a|2rWlcVhUN`6}91cScu+zBNAd*5=%Wys+gT zao<{;zm)&s&FzM}?_Sbf)0mhr>Ce9R-cw#(d%kX^{!+iRmGPHv?N+$eYQ=8GW}fT3 zuG7$6Y|?j|bqA8|^lz0J&($cMwftAE=FI$Q)4Xcg1-T#HdZc}W?S1$GQ@uG0y9~}~ zC2iQXiO=PCyIRA9$J(_fa(8aOex&2b*bkgI=_Z*V{6ik2g zM(L{6(u#961x-sAT-?wjv_NEUVak@ra~Gexlk;K~dw=VTm$yUich*@i_<}wmDC=f9|=_3lu=i zb>LuX0|u-pB)}NGfixp1V86_DV$LzUeR9vb`t{LiPmj2~Qau4t10gHsBqt=?ICJ2@ z2l)%^E9i63f>lOB+(EHk-9p|*pFcm)T2;AILL$Pb@rS{MNfGCo7X6uY<;kQg fB7fAfm!v*ZeI~GB?}3#<$F8wNvM_jvyITVQkry$M literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_single_value_span_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_base_single_value_span_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d58ab9250937ba6a3807055b534bac1704838140 GIT binary patch literal 2527 zcmYM0c{r4NAI4{lu?=Dx>yUk4XQqx$S*H?)8pG>YqHKo{M=HcS_N+-W%$R8+gAtM? zdXZ&@>^s?)gNm$&6qAx;s_S~ce|(<%kNc13xxe@I`#k_400{UoT!jDt1pZS4MGk*W z`Da@TneJ)u>|Hk%yN4QUDDT|vpPru#qxCu1294;8jGd4uK3vGbo;4?Udlr_d3h_MB zM3}D5&%P)xQ>f9IE|&B?lq*>m0OpW}aOZy-%RXThV)I2b?K zUTY#LI3Ze>{?)R#GgwA$@4;KpJ|kB~7Ac3|&cCkwSz9p{ab@Wk45h1&cCTwp?xm@x zi4(RpF3L74@eI^lxzg1$48yBopzGWzgK}Q?=9w*A+6^EGq+&2GL2Tmb@mpL?SlqM@ zy?r!RuC7u&l0C*Ee%l;R-Q7I{TxV%?tzYqDzb>{;j)B;SYZUD)<}bu5Dkrvj>03j? zz`Sw##)3q)e7`LH(vvFxW#M;Ijy6xhtEPhQRw#cVFxzlT6ir=Gb1K?I_J#v{Mk*>a zc2+%>7}YEgjnYU{X`za5In!_TBfNFCZK-<67qV}f;j$S7M@Kd+%FM`26AU+6B9Ti& zWouOXd|Z6qSk01{bei;Pk&8s(oDbDex9vOC;dasOR=i4M&GOof@&3A%G5J;ZtTp2# zZJUU2hoD2H*6zFI(`Mm4-B>>a<)+qnTfqK(&8~$K*nB~I!BT}AuD{epGz4``Y$(oG zrNVk>)9&V*lWO*@9k+*U(jOEDCh<$S6c$J=;_c>Mj@^;)EyD~#vf1Qi)T-{#hDu=d z<-&A^ZlZoy)Sy$7%6ZR)r#GNS@M zU9s)SZ;mk*>sxq?ccYKd7Nqa+hg-&)Nv0jF;!6h9JL5mj@Rd^^W625L_jawE3D4h#Mr=-OV_QE@-N>uLSt`&#husOc!K*afOLFpI{uf?O?V$KT4#dSvd|yVUGeCYo^qAub0=1 z?(Xs%euWyx1x*2ci#o6B@CS<2xZTp*37@s@wY#)+O~yj~A_!{grA%tqh! z@`E4+VYjz#|4?>Fm0tGH_86l~Z68u*HN*6TvZg~uCx6L=LOPz&-yia9#xw`B21U~e~<8olSu z_%z1H$qqFBBf+?%#G`&@3B(*dftvUMDH(_#B~MF~wEZxu~t)t!HVYYiYysd2a6f zr<;ec+at)9gl3j>wXPaUW~LRK`Zh7ld6UUVl|F=}NFM`}AS- z;uhGD-#Gg6JUmHnv8^l6bJ#vb4J7x<`p>3+9#K@{WuS?m9KS57k}AtiF9P$Kq3NaC z_=+=*_@4L5GF37UzK^LYJa&DZG*ONUkzdZ~XQxR$@zkX}@yyH4Td{CO*#gEEqP*pQ z%jiYPDA^=lS}4e*ho>a!I9{UG#?z}mak268)C!PFNo%lqx?P}ZI_?((s+ULI4RgU;} zpS16lFf@=?$gdY3A8Hl^P1lCX`vmH{M-V^x7FS=jK|FIar`Vf7y&}<(wH>26GM%jg z31T}g-G{Dtm2)F5dt%$~8*W5G7lpPyeh3d-ymPj5TwKUg)#LAyOU$%Pcg0x8E@e3Z zMu^2XH`6_?dbz>sso;S#2f?LY-0k~Yvn^ajFJBB|oIVN3Oq#(s`vAY?kP8F=2sLul z(IRt>0OBmtlZD=_!-nu@!*)^CM9uNH`PW2$SbpK?inC`0zR?${vHG8%!>S3Jsep+C zFGgeAfYq<~iY+XhPX84`oP5*b?~?ukivBD5*au)TJc@b$AHZkGKJXy+1m$&CAmN7A zJXZ8N)El|8)JO^AQ#i)25R}~9G`ef8o%S-_?-AnpFpTsbWUmU-$6l%p)izn;nLrnL z=rWP>zgH|DZ@3J}I-NJln#;&28}MxwK?&2CpSI zu=FnQ%&evZvU?FA&iRuoSlLzawCb}syK{wDF9bh_eQJ^Eh$nYu4x7x4%C zO*QtX(AE!L4Y=LU-Q1g;&1(db#PFa4mI9d51m2||eF#6Q(62urAg4;)oC@)%s>~pr zl1kVJ;K>Uaa~%e!Pk#U5{sqo)Hb2K?GL<@*Ol)5lg+w7|=Vy?JxsG&fhI1y3`UfF9 zXO)mkF1c2UB|LO`MqZ;j(pDX)#wzc@ZK!E*^`+*U4{AC>b5Q0wHk1Qr3UY_J;!8|TQ;f9S+H$4nvG1vj0{w?!4cZ+ zlU+)faKHF{4wW(YhgPxXag^$^M7)Y)$!lm}%J{@L@QC=;uPya2a<|Io8$T@;?+H1o zQ+)y~7F2;$8jLP=c=f22X&KQQpZulg%VyT_7kj)!7p1UA;xpce3wTx=Sai7;%2w)SVNGFgz4kc4^k1Pv^+eGr zSOvZ7>cBK*Rc(LXdQe3jia)q~?BPAK<~yIRq1jcW$h%L>y7Ad;J#l95v{Sm@;)#hW zht9fxGlwN7$lML)N+2yJ(gIr-_f&60JkDrEK}ToIGj~-3;=-wZVGu*;^v(E?l-oit z8jVi5tS~;Pw0q_T)@~uwC0}R%$jN9Y6wLDSVY6gwHm<6GrD_e5nRrb5_{P0$=;Xl0 zRj2RL8pHOL0jdSoAswH?5?9r(**-h>&XQkeT^61s4<&WCzF8yR7#NQ}e)D?VKU_46 zXSzx%=ACL;IBZ-wfFNojo`mx9WGf7n?s8UW)u=m7l`C{=pj#>uZ`8u!sTnkUT+6tL zqRM}84ECQ)0QqCawuNaECKLbwA_O`06*2)g7NRh!nc7EPO>=SsEHjW{YF3Ym(kC;8 zTmLV7VXa3$y8W08)S4k0y98YIwZ5=0#mMqbzFveeSE%cuN>iKrxKxe6_}{GQKcUcg zD8nUU7=|d~1S_pyzT83qCV>I?r5IQJ(u3g0+*@8(@6I=s_+_?<%F9`4b3Ig?AD&?u z*c-l_1iu_qe91638hJo}8%d1;3E9Xkf;Sjrv_W z_OThdy{~|p#s)s{Ni6@~?c0CfaMs2^%|EZ&_iQf_tNX)CHVaXZ8Z}Y-qd6XDrWA3g z(Z#$rzg3=-Ge%kf%23uds`iH9mE%g;Ba!MaJVO-I9&G>0^W;sbTM#r z@rXtvTp_x>h;B!S(`#K9h=IfFrGB>_=RW6yLk@kfonAA_ZAt)X)Q2`Gq$1$`GkB%2 zA&C8}EnhIo;?4!Ye8DOr9A$%-rw}tre@=Cns<@PYZU_^y%V$TkgM#lVgCTtO8}?60 zdt(=Ot@@Ts!|-zzg9>66wRpi)wS-*iw*o{< z^f%9tQO_`)IlAbg;qjLAY(zE`{PW5^BXa5UzDp*e4Rmp(P=Mn7_f>D{9?G$Prgiy& z9uj_j*@{^g8PlC&;0W(RH z=jZ;nDH;V9+|-{+kSyvLP5sK{xxcRX{vEgPA=EysPP9_TiUe(gnu`R)j|3-fH&;>a z`PWz42*E#!hb!n$0SAa856LWCxWeh?zC8vuZ)37LQw2>>Lt zugHy69;uPWa7T*XDux8sH+D_^I`c~=0D*m;eQ3@xnS<*1o|_+aOd6Dfz72JFFPLh< zCHF^_=~O7I8nax=jiXoOCK~>lY$JjPQ=e^#Cbm-+z#QkaJXa~LrsiwtIrK_}XUt;& zP8s0Jus8x5pFF8utBJV+m-9&eheLSKE{55Aqae}5G%+7P`gll!h{r8-peP;o8*q}Q#A~|)Z zpqY@Agh!3H4fn9rr=M>+MCgwoN~_!*idFoYVDn|_B-#+U>%3Q2F6-*n>6kdK!SXFQ z-^7Vo9$}4h#begK!lT#L6^_QzcL&h7v{FA2F`WtZUFyIC*mLzrerwc`7aqKiEnRX1 z5tN7R+Q4Q!G1F_*Zp-e$*Dd)mXEp!k+LRa5;)K{IHdvBa*6~(-?pJax>D&fwm|}bu zxmtsTEEA_|=tT_qW07O0PL4<36SpPE23NicS5O(sGS|YG3@$&{jtRPL{Y86J+TC9& z*jJ*S3g=g<<@Gj3k2Et!0)Yo82YZgBP48*sCFj@ozxj7PV_Gg+`rfF8FGc( zM>&&NjnE1Y$^W;lp3m#`dw<@)?Y+-Fd%s`5??7M>7(_4dEf9#!gTX<2N56`tc~7$d z>(J|Y_kpTgl1SDMb}5x#8hXPMhn#KU%o@jG5ne}K#6Ob1ObM_m$GSQ1IKcR$jcoj8 z5#fGT4c)vyHvODxzxifB3kJAlw5Xb!LlY+Fll7Tqugh5~UTJ1SJ?7Msd2$%IDp1x_ z<9#2Vx?^ZN_Qz!%_jWU9jliLA^5K*|A)(}thkq3qNvN8A5JbPf3fJxID1zpUV(Xvd z3S>IB`|&tkamag)#BwyI0K(oIw_{u^7e?hTj^nQ9kwee?^?@mB+wyfs6DF{3t5~kh z@OE;0$)#A%ENW~kMbgtEJy=Ji$rSIMjFyJY-gWRee`eIJR(;R&RY-sa`4;CcuhbAM z`DH!Jgb<(h^Z|L@KZ1Nyp_%5Cr&>uWV zJ<((u#?cO?)V+UEek)c%L952IMe4!yox(Z+_n!v$VA@~!y2=||Xd%#&1F!)E;_Ra_ zfD6))7NNAcn6jefY~t~qYFtIrYrF14WeM7QzY9;CbQ-b-^1JKC>rS40^r05&QSEpi zYV3BArEO*z7G4=7Y3rR?duLB*A?nyo)|+e+MqA6K`SZci&9iar#)gB5hv7SgYFgA2 zCOaIbr&W1eJ*|R_KR>oNJH8}&&H+a-l1M=AywQVIk6eJ|fhp<}{)4XkRlCQoTWqZ^ zk9UjIblvkRORc-~aKkw;M-$x{KB>03Kl`y3OZ;Kh*I8{qQEFYTfdtv5#w4ydrp<ur+-*wN(+<_NzoqwYQy%X9uFAHPuHwF47-7e&Vn9yvZi<$SXD!9IH?5r3xkte*C& z0CqKwD3ev{wj0zpSSvm?pH&s1a69 z4)x8HF8latzKt0crA+AZ{uvdgE8r@onetP_k0l@bH zi&eMb!oI8SY!LYPgi@L?Q}pn{o*d@i_y?wfbN;BWx{~2~XYff6KEd66LRuiv4eLJ^ zoMg%B3X4mL#nsQY6$Yx`_4?Lo+r}1An#X%Q21XaU>qd5(dn4-4FZ;_-V^}Z8ng`{l zciO5lt=NkDK+&cjQU^nxFIH_K#$LKxSkY@H9(U&eM&7 z0bZ8U83+sqIup&y#O1HvQ~kK>V-f+d=UuD(iw%< zYF4(YR<;*0Z-)ETz7E;<+YH#Kj9Cs0!Uv6^P6|fv1C*SpSTIPJB>0&&f+dnZXdeXP z(q)VU7XY1^_T}&6`g$xcC9rABe+%j?%rI~7=CNjI7zjMN8SOxj$8XCg@(U&n*CFFE zIfx89+doF+R#~U!=8y=jr|S~NHBqMnl}m;U(x`8)FbU`i43K*3s6!#3C8p02b_U9- z3jZ^!)*skZ?dDmPui7S6spl$gRMxy7FN)i5ob-=;06725T;mm3!W^lgN!J+uuui@CS910-}osU%|pf z4JyH(Hp_NLbCZuQ?pPS|och3bMuM0A2gDjia{=rJ0&yQP`~VjNorUHc??#rLyx|1% z?f;2)N6Q4J?P)_o85#!SiSy3$)?MoSJenOmI~*pYLWp^A+m`i)Zan9*?xs&@GwV1p z{Q>id5|aPc8}_flQA`pY&ISihuPRij!|hGmix<^AO*!;s;^)%SC>qZ)QXp;?qpCvF zCL|?yBee=Pws%$$1DUdVByWDKYKP_$XWi47Xdb6i`hV|Njm!D2C8STi^fW_^1DC8MibP+#r@l(D z{ZJ%lQfc!>;Hl#c2P@xqp4S@MH5>)ZZ@S9yXuAe*wHSqZXHD$&|CRK%$K>d8(<0)4 zVttehL5=*py0Yosr<{k{YEE?s92%>K#v1k-7tv(aX=1dG_7rC2P4QZoV`DU}?= zCdknbPKJ(-z%vIn1ehr%%o~mJk@P`(g@#I+hM+^RwjsVKKNJ!xiNxcO!M>rA&R7%% zjdbxshasIXUcpY+yfDcBM3J=RKp=K=`dHxX;NGD#5EGI1GHo3bH^ENHxseKueDMSS z7JH{S6~bMH=08LMtPZ#?pn@e6*F=y`XzS!ap;lEiQ zs_*Xm3glI+-WO2hM?j~Xt5!cQubfd;0o{P~8*r$Rh^gz&@ziu8O9WeZA&%eBgD=@> z-kO?e>_Yyh<+*<1e*85z;2>rG!NJUYTU33--Q1+KOXoCuk_lKdt#~^&KtugJ$mS;G G#{U66>XqC8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_delay_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_delay_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0b767db8d2cac19947ded2fa31a59309848f09c3 GIT binary patch literal 1696 zcmY*YdpMJO9DldbG?!{o$|cvxC2USLa@=xhl-Z`^HfKk5$cg0ATnf2_CYPtB_(UJeE3g9Ue{&=iS!%<9wgz{eC|0@BKW#@AU;B00a;lWEKG6!4eK! z-TH2kEz)_GA8M#^2$pS%YWGO2)q?4FjToYse|ntC8Z_PcMqQ<9>zC6q25J1m?gd)q zDI`yi($M>BklnEZ`|)~k0Vv_GsQFvrcS3_3a~b;-J<~GW z!hW3a`Vm?7aQ&`15es3Yq0b_)6-=pQoWqa}JNoGVl+~DEzGx%NF0@g=VK+SUJ z5$_&6?L37zaiuOE+fGjE_3+P*?^3b_uoRmwyY$~fSRuD=48V8~;s)HNx&vokrZEm6 zlkH&>DrWn6QZbJ9McE#>dzq^F-h2X4G}i^<^3Y_(qjo_b@l`dSngEDXLp zE64ictm+&ZKl$-9t4HbA?1Y1OgPP(R^B7Y~gM&#!jDn?5yCE?>_v4KKccj%%1qmw} zn>jyc2hUGi=Pm{;z;UGI^`h1t2UewWFNb5Go;c-M(*#yyO??ckzj4RY+53;15v<&v zD(wqnSA%-I58W5M2yz>vCpfx5yp3@w+V0#t%SglZ!bwbhrO_OxQ+Fv+XIho}(y`c@ z!*?N{^i3U{CZ%-e9Q(XD-)nJkO`uPHIGQ7C4T~zP9}S6^)mZwteYWIsJAlOPY!gjf zv?icMg3D4OW<sLeai#I@6fh_ur`N9(>&%tQAm*?{Loft`S2N^DG%iijnCmg>mEx zFtS*B7>cgsiw{Q{UK0{fgD3*kd;ldxhU2;v5x6D>;!UeBli9_Rwh;v4hi&q`HMVKN zw;m6bmU3?sHB<^tA$l?E(N+5yL~qnMFdwpf_$P6t_s5?Hgn ziFS|CSW~F34mH6``sic@iiF-1QC%>{uvtd>J=c!f|8n93PlvYs^CV$medVvcz!;S6 z^jg05taFfkkfGvq;1d-cV_6TKzCV6nl69>9)c?LoB@5uS0la(tt1ap8`@(}Or!Ke1 zWU5q{U+{dz?}igqDoJ(%jki}W&12d};5@8dZ+F?Xh}y6GsB^A!{v`^|@u}ZJ_TF>& z$l^asKcxQ#%L{>8s+_x?Xx!ZV2o)2@Qb+GwwJ8490pwK#dXU|=o~xJHTS3$|{qSm? zg8UbEdkf>NTbE$N50cD8MZ?_1rC$Qubwknwhzp2NQM-Enam|qljp(pRloAXl`!fwl zo30X##EWK3e#d3A7v$2^5RwVg!jV+!|L3fTH^kzF_?t>hB$beaM#|zzSSr#5B@~Vu zR7W=}E8kT~h%)Ih;w6@D(1xaHLyAPYWH(;9n%GPPC32xaK{85T6col5hgJa7O%XEy z@>FyzN_RnlZ29)~T1k_eedfXg=_@K#3bb3VO_#2ME zI!~T~b#NaQD8(yG+O}q-J`zGRsiVP*GElMtrihQjBR<7UwlstV_A-v zd?_Bk@!+6xBOJSQsg`cW9?uo79V;U`?GAVzmC>hcZ+m_9c|mc-)QZ+178X4gp->UR zZR71GH}Ou7%-l}zjdK)edmZfT+L-7g1SL7cFMoFH0X_c3!kvk`_2GOYra{ clrZwB^e0XAK%f!L{TR_l7zP2%!;T#O7hSx^tpET3 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_double_value_span_shape_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_double_value_span_shape_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b0fc17430a9dc1e4588d4b3317166d53e5b32cd2 GIT binary patch literal 1016 zcmZQzWME_f112p72JY=pw&H&%u<2gf<0dratFTv|*MZoKh5p%3UP9DB$cj04!|vx_ zHW0WbC$0Jau&v?>w>is7bYvB-_4-Yf(0ARl``l7fm2IikSGA7(@0+|WJ9umA0uIqn z6Xc)oe!uT`(Z9lHhAYLSp4aa1SR8j{c8dw0@U`80eALzpxy4(1-|2k(Ln&pho_9oq z>z9KWZcF9~X-#5z{*?LX6mAs_o$cI7X(5UyQx66A&Ei>cFgnu5=#SH8rsG{*zpqAo zn0jty`7_N^`z~rWIrC0iaZovHgA1?Lm4x1^r`7w87prcqb-I!fW4EqOIccuC!*M%_ z+Jf(iiZh-D{b5?R!RB_0yyiZw#x1w^vFBF!b6ZcAvMW?G&U)Z?+2(Q1HW`x`gO(My z`ybVb9Q1y1#PJ62q7A~+_>O#^;(bu^Lg&U=M%-r_C2pLIS-HWF|3^Zg3R_=5&1R8z zvOAiL&&+jVb1R+le&2N^mV5txZe`gq@leDoA(Mvd0!tN->sTt&wNr=UQzz{#K;yK<42Uom2nttu380@8FIq%elJGyVmfshq* zk`ox3mrY0mrA3AU#<3wb@tSOUc zu6Zzte@XCRp<=J#W^SR+O~yjpLA9TQjV>Dncbi-?`Yco|a;fN(u(t?Tj90f1$T=k< z0WEjCJ{2FlC3{iD>C;B8!&j{n!}-O(xfFK$rxki;#br%&Vhl_4ZOw|)^E>zG64Qds z6X$e2vQbfAXu*6kOJ-U0=ORYtJW*z5c5{OdliDL695mgjCboRn)Mu*AF{=U^&MeOT Q@oGUN8&4j?&6Dpd0a=K_M*si- literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_duration_shape_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_duration_shape_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1d98e24ebb28f3e317bb652cf9eb2310885d7e32 GIT binary patch literal 712 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_i_shape_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_i_shape_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d72b4af819449b8c80a911d81c28465cc921d69d GIT binary patch literal 1073 zcmZQzWME_f1I9}X3~WhIw()-`2>#c@vGw?^uDkymOs~JYa$8LB^IeD<2w5>_ZE$Y( zZ3BU2^2#6Tcl5_bYQpfZ65AP)j2rJ zQV~w+vS^5yhdZ!&g{Nu-4wNxE&LJ6*2$vF>J|gzoG~wRkjLn97j&41@wQ;@CRo18`nsB*eWlDy9@`%qjDCo22oyOu`+xl|hWSel9jad` zP}VSkdF3wE`+F9$I+)i@;4$O)pJkV zxtprr?mhc4dzt7X!1%qT|FY)A?~6TnR%oBid*N)0BRBY!*W5qiXd>(PbAH>qYcE%R zyd|&w|M!~{{c_CD?%$XBcku!!UO{OA2sQvyL=c$8z~~L4L5V{8!2{>;8|Mup6SXfq zjrA$Jw{sy_4x)~Mp<+&HpD))T0|B?i>qPb(*165Rqe!#E>F$d|rMGIfDjRa<>NJUe zOqh3c>&nosdS-d!Gd%t3M;5=@_Vv*O6&~SoAJg{yFb_rNFMXu6~)76X$aNEl?=)?91Oo7$2$wHoVrj~ZNEm{_aW22lecE9N98B%DZTNZ5SlPSc-7 zLal!mmFzvTXUdc-Mgmi3O`kV&`l|4#Ni!EupFMxl%xN>DmOOvSof`SMh_N(}?UA@c zPISPmDU)ZenJ_baQq+`bGv=&%AUS7Z#00M3wG*NOC(W83w1(k&K67Bg@&I0=j?Vdw zjglz>0voGFxo*FNRJ5^CJK*v|ObC literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_loop_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_loop_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..508284a0a55ab6427ef5a6577689021c5ac361ba GIT binary patch literal 2018 zcmXw32{aUH6rPc2WZ&Z9WzQ%}Lu6zb%h-*bM3#w6#xi5lFgTXV782Q-RMsq^>;_|d zjYu!1QMNF~8kHro^t_ptd(Qve@BaUH&OPVe`(FSM00jIrU_SuB8SuhBKH zt6`0>;kd^>+pF=>3WtPWnqP<~4&Ap8p&D{i9!Y?wyAe;Tq*1zSaWW;{9FC_Cg+)v*Yfz9ltpS|^dO-73Wq%$s54 zaru0OH%<6^Q$A!j9$9%*`LAQ2E{71=9pW_6{{-+~mZc<}twg3QLQ5Iv~Sh0{b3O%>ttgqe4J*OLDvgni8Gz(RYPhh?MF+8!< zWhj_x$RA$e9$MPjyR}dxud)^U*vVkp|r>j30Xiekz{e`tVhGg0LJZ*XZ8>uN~+aMbF0jHFzS31KqZX-w;+(8Aj@DNq|Ybm%wctAYvi^X8neL1V6ZsW!#fydHwXVaWs~2S<5(!qXE87ce zKr-zm;Cmy_!N-@YP$geU!%v*5!+8mWXJ9-B#bK_)F=U2!%GGQ!`0&FTsrUWY5@7v~ zXoUFa*voC8KI6AR4~)aMxK{hRx%=WWfW8w@$5 zHdcf2@+DNbe8wTYBH-eu(0cwiYChy!H_7vkqG3RQaaLr*!>o6YR0^GUubl>kDSOV@yz&$Ov{hSiU%ZzVeliTSesI&ig#VpUz(PgG6F_UA(S{j80W zmM;pX%x5Kpt_-S)d-JE#2*SIdUb{!>MzW?Z5UiHd0MZB~fpnA1d-=G$99;^QT`VXB z3$kw{4xI7-LdeZ4lQ$Wox+{RWo}F(DU#9vNYBZLosi)#~BB~6sRXor26K1LEM&dQq zldU;rN2#5|1&D`T1N9R_5&4M)6g=0&yuziB+tvC*c2h*Jb86N=)8KjK?BoX{7aLwg zIp0^C`leW^mEzTv^n@29Fh5^97RB`$K2S|=M3n7O>H_!x`SJp`cd<=N`*({gtSX0R zT%w!5!#%W>o3!?IKyVT9vYC?~Pi$Xd%|3fO3xUkNDL`g1CP%P<^=IIW#UrSs)u@KO zu`P97Ku@jWspmf>zX4Bt=s0NGV<;?@tjIf{mWOc_>>14)7fH4dD&e>iq-;H_=m*WW z9TU^ zY%sgtaWUbrmJZdYIGWxZI}+w6BZkt#WbZ%|bY4lg9TLY!Uy_aLI{Di+MDkMT$C2jk zLLSX=I+f3sK(v^bxLpA;h80ws*kNh8VE$U=nvhsv_K3_85XOBwQ(C%LDKbXNq&PQJ zGp#JEEnz%)>!|Z`r02;?<2+ALwrf+k;4^P2!4fOz3Um5J>LX1EZAj|EYt?F~d&d3} zfq`sGp=n-PCDYYR+&m9hRp&VUv-Y~ocD4QL0V4~8hr^8{5WIroLzmdKbQyy z%})?L^ESQej?#6T$j8IrlhqkVBIrK({PWD>N&7cHx>+Vc**m z;(24@Rl0-=Hoi|S-_~Avck%6l?XropO?Jwh4`KXV$KbwGq!|>`pws~b{lGM`3d~|) zS^%O!$;5NR6PpzOZ>w&wHTZ{4K6}$}(u{718VFf2CpjU(FCigeB@j<}q@&?`>ZDKD zhm+^^InH_LcziwUf70i)kM1Rp(`UTT1b%Q4{Blx9&-1LeZji1oE>4*lz9@jf z=%VF*ll3fWuR0Ui4_QnQ(YqWlw;^roGAC1garN}VOvVc*cf_>55t9j9I5X?)X;z+v bR%~ox8zWfu%Na^fAj(R`lJuqK;@`_^`Pm#=`XRLzplQV?IW<6t|V2nB_+=_?C+kJ z4=T0b)O*jXeq`a)uMonn3Mj0PFZMjXl_r%im|=bljc2M*;|vbY!g=}nKBh@k+&5{+ zQ+axXjLq3^GnTugr$!2vQ0|R;rjyvg>&FOA7acoNMzBkHjhqS4^F_s0GaJo}uW0X% zo9-^JYR}qL{4MgX%=?HJu&~#3i3qvFu`^aPBkZEeKE`d67T+c!&oWUAeJu`NFSqZ~ zpf}C<+}pk8dUjpcLQylGf*)qMmL3mU3dWWq7ghea=ZcYe8}Zdg&sP|}xVc#k3uJ0g z`TV5WewT;TdX65GJAN`PtgUuLkmc%p;ohsF41T&1)sl?6pnB-8TN;0q$GY^FMxU7M z?-GlL^_J*G&UDhB2<@UGL9Nom&y>bdZt==18x!waJ}qnwzH-@x!Bq9G_`AqF6YE{p zT}ehsJ-r@as2k~9cjg;kySzWkzP+}&PAmxQD8ep?)0K8-a+9p3n5fd7y>;%g@J9= z#nAwu9FkCHwSFm0%xui@#ENM*=3!xNrUKFGJ2o5<#W+I*l5}~xdUv%6`04PU$PK~f zipQ?@Ib2wE#13N}(+>?{S4BeYlEwJ4qv?F358N1xt_p-fR~2^5Ak|eCDUaG}7%4CB z&%?{^PFLf5tn)RxTAEJ0mgZo2B7H?{#i7sslmjJ)AfTC>&kxl9u7iLA!_zt8eg6wH z3w(h=m?Z~&uH~$3ls&rFAxXcQASQz0cjH*^FbFeo;Vh9D)5~THbrJ0HPE+V^6neQG zwWOdtyF`-VI$e-YpcK$VsWeBrYi$m-AfI+kh>_!xU1JAShKb2~l61bN?&m`Y`)-(9 zr;yz-NMyu8*(co3MKVSudNWXfnv=dD6b`=132F`E?A;Cz6M~*0oG<70{-JwzQelg- zWy`~;Q~66VeA{~45a8g9ddg;34Y1i$E_U?1+=AL{My`un?Ns4u>U?1drGQ%C%FK4P zr_l2qYNzsC81s~$@Kk9CwzOL|4dv`O(1!rBSwBZZKDi7yp1*-$N;nz-(}bQOFirdu zW7t}?Xe3t;!ikVATw^!-aoc8_M=>h0Stqz~LYGit@8Hq!LN$d);#v|U6CTfRzd=}W^xIR-5oIY;BNM^C4IBs@Y5WLRO#>rzehaz9A4!zFK zCq*7=v@Tia4P3|?sIaBq>?*k_Gh{j+8&r+=%24{Slv!Lj`&zcI_W(0Frn*_NE@pPT zd5`;@3vG}6hRn{l8A+5YW5kQ9Qy9XvGKW=iY zcNnLP7G6YR0a!+2-{0-_KSkv9Sdu)`F1~*lUp4a%4v3UW8bdC)BRG!U008fiZI>`Q zC=pQX20NjdUtvXu6& zSxPv0-*76TXuk3y_p+5c*~ZgTG<*XViJ_yi=0A`A0!SG~ajD+LW~w+UG8(M>{eTADpd#U?rWIAyEL-JMHz7%ms+Xd;-Gv5QzX%onR*sdU2!m!tGM^_xy7n5uP zUi{3S6`4|q3wp8a-|?wH54XV0+p*U5u&Mskqw}Z4qn3?rk7NZ#aDPyJ;tr(*L4Y_6 z4*>k;kOu0-AVWeavS2qxE=RJ4_QZ6~h1@jpaLFrd;h5|&@G#;BPjqOAwdmq>$MxT` zk|@qH+_>=r?a21Zrk?Rv5p7z$BweB9mnBQ+4MfQX>huQp7JHd7Qy!8+j zN9a>B{_8VW6)Ued zznv|!G%a0LI4oWheIM}Hr^Xp>6q*AA+}ZqA+koJ5pyYv&FIblaHQc98Bvc3rN^PXn zmD9WbF>v5*`O?K^`$9V#|NnP3xUVVy+1HZbiHWzvLp%HKj5I$K90i_bkiZo3bG89^ zI~d?MF9c@7#G`0UBYkd6<8+&Vo5WOi>XikK_1}yHs<*(OJ}DqLC?rfaD8vWj5$NUR z9RUgNKp#?|HzqucV~f*vH>4J*0xxB(!O_ zs*Y;w@7Gk*ylbwYrm23=Oim50&oVA!SKLu%DQfE5n!!xQ>y-7i;nu2(GN-ti2Skj- z-8waoD6oLQdfT(-EXeNU97C9s2j>jiJeeMXmx|^v5TSgX=V@1k{B9L8uT8zDgO|~X zo-cqkeA+cSaBu`|JWS8$m%`{tNsaG=cbLZTqzJl+Hnc*2Qbq)hua^a%b2v z*+f&B=ks3+>zuM+!thY{RSum5CK^%}H%Utd3s@101b`iYxTf3C7*Dj4>j=kTAXG}+Z}=B$9V zS@A1(&G!(}R9Pv+S7L9hv^<7g>rrFi=aYSJB7LJ+Wu@}e*6vS@TJ>B@c7cwsb%0{Y zh5hn(>gsCp3^z;f|If80D5#UWs=9>f*Q&er4zXMMFFjtoWshOy=a;<|%CWkK(`F^h z#~hEl{6AuvuvkTnX8iQ#=A)*k5}z2{+x;i&^_8iKqJE`WkN-cr%+x#4Q0|2B_YBt; z+qvS|V$(P{>fbCl`EvKuEq%v6H=HZ{VQ!#TcW$|I--LcUy9Gk2hg!6`AKM%*{~0L8 z*SSzl>CmjI)TLJ0YC2PT90k?WJT7@o6jNWa-}ja1*|Ht+-%dSENw{dMsa<^RXO-{S zgsyk1?^_+2Xsgl3`@co)(QCH&%3o(zR&BT%aq;uQ8xua+9Vs{2q3Wt%JT+2-BaC~! zMPWTdY=g8gD9wP<84&mbQ(HBd#lWNpqCpAn`JZHk534sP8gt#<7U&hEu|nd`M2H$V z`HO*p(FVwKE+|dP$xK#A&PgmTR`AU)OO5c&PsvQnOf6DKttd&&ODR?e&df{CNexTP zDNPM7NX!e)NGwQ&E2`$@0vXCw3pUyt=$v9Oi-BnlkY)rqXN_C+)0zNp8)Ffl`>vb# zSmlpgIS5e$Co_Sp4M1$4nOl%wRHBeyl&+VUmy(iN2BK2)(lhf?^-4=JbM$hduG33R zEKb$)bOn-brFqFEnfZCvP^X*#8@m?hlyZm#ObdWC6UZt1GR}W;&(HQZi*fA`il0|# z|9!RyL=A+jn3J54urWO$VQNxB!j99C0kft|p1J11?D%O?4`7ds_(z^|9y%VaGha-OjF~iRdeoAD zhR}%Mg|nu2Pu{#^3qywGq*eoO1-9hts~10bIV)n$tFT$qc`hw^{^->+iC4mlGS8l7 o{j!9KnR&Lvg~j%4?d}g}O_;kTpyAA79i4z)rZz@~cML0C0G!j+t^fc4 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_move_y_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_move_y_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4eea32a8ad820aa55a51a24c2d476ecefb999d17 GIT binary patch literal 1142 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 Srqg;Q#%n8gGOWDkcNhTCw>Mw_ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_path_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_path_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d7c2abdd83691093a9cf04f88c6f95cc2be3d79a GIT binary patch literal 6666 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 G0sjYREYAr5 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotate_by_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotate_by_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..88e35780fd8db19b34eb76126d1fa2004955337c GIT binary patch literal 1295 zcmZQzWME_f111{=2996|o1x}E6jWE=(A*;OQLy0rzK%?-{w?YiZ5N9 zE*l73wKEI)pE&QrHl4ytUpC#&TDq5EwU>y1sQiOtldny6Tvfsnf+(2E1tJ*mFr>GE&=}Ih50rw4oY|AAJX8g4wRWH?O`2o^iXd5 zm7h`;XE`76yHAv?SituESp3@st{iv%{SRie@k-PYy=KyIU0~^Vnc`~#^2@jPo>ohV zxgfJCCW!lW^~N(FjbB+V3)+d zFAY#&4{G0R5_my<%eBIK)?)h#%kY%8b@z8no8akdqRB&#mr9&KB&9g@_*+(%WF*^lLP)ee!W-!oaKyo(PAx| zW2>izO})S8^h%=>Ws|DK)?8hsw$Sl)X;I|)>ANf0;||+Ty=u#QDKjj*^k-b(yk(2_ zEPhwd{@tnTZIl?>o>@|Y6TR=qSAU2r1SKF)ssn;4z_fQ6%wk|z1foI7Pw1guO2#as z&RZ{EZvVE|$m&k2stZ&Nn5vkQoWRhm#&NWWrAcz81-IAaBBRNoO`p7lyo2Uy)qV~( zx@;8OZF0%zvrw@?izwFxR};}yl{+mgyS=#^W*MZeb)2LsIrC`M&c4c*mMa-ox*lA4 z@@J(c*R~mH3s*B{u47G7DEgr9t*dp)$CGtap+%&krMkU-sI%~!d5f-0y0plqbaYz^R*0=6?*?*X^?h6IGdFyo0!;y8)xUP=k1zQ@KI5~ z`94!8`-7tr6J}Jf)=baNls>uX^Y87SSsBhTIw;JIZ)l$QEHXoGjpl|8BFguw6d(S4 z-K+1Ly2Gtbuq^e6rR%QOiNuI}3&)-h-j;p zkdK-7g8dx?46N^976YRIkY)k}Rs`>=-4-$YPSZDVKTG_#M{T>(<+d|oZdOUzb3GMLZg_ud;o{qO&Hi;t_xLSh`l%ly z^uwc2RB8P>#;k4rKU|~SwGPDd%nScMq5tdeyBxm? z8ka_AGRLc4w~X3hxZ|8^{8jz6A#)TY{U?`Lc|FusnOtGebJ@{og-nFG)~VKV_IDe_ zW{EQH`p#m^J^#X`truTg|NZc)-29aRoBaR(tC(XlQ)RW%qdTq(EzS0hw7| z*GzZgt*?7-zMVILt5{&C8~f4cmljNpn(KHtX61t*-Qr)z>y|fvHF>ecl zzO74NaLUI1Yt*|xm9at9uO~ONyKbgaY}NoC_zEJ<6G-)S`WPLs@d%55Bc z$@5HoLR?U=cJH!%;RGU6n(0+btUGE&-ZO<#d7zJOA{A_QsBP1&K z`mQYkS1xsV)I9vh#Ksh=07?j;)B^-%z%-N%W-%}<0@0vk6!86*Rl{+%b@_##7F?)b zJ$GBuVqK^jFjX-pIf0>>jpJyMM3ZD$k=PWqrzvXMEKjGaOk48n+47WSsmsJNm!v*Z zeYSv8OJu<(Q_)qGJ1s1`y}28tE<9b+7_`-a$A#}->PlDFnVKsd%))MqOe+5LImp!H z;4#sq)24_$)qJva+Tz_SRg^bNr0MC4GiZIYp9!*>sS50XOe9xt1d1?%T%D}2xq!{y z-QMNn?8s|g%mU%H_K(1-p#;d)3EU|O3A2wMIPl;GlZwj2%fcS;LEDqmWzoW*r@ zPmF`}c>{wD+>E?shqDY$sxdL_n{FltvXAL8*w$}Ahfaao{}v<+a_Cy+u%`Vg?-wur z^K17u@e9Twx-Vux)qtsrIa>qHdNDil@NEs*cA@-4A@@>!g?n8A7n;NN^xxIt^;3VG z5;&l>rBbM1?$sDvK>#fgD0x@H%(uPEMAY~U!qR(5_* z+sQ}D4*yMV{;}9{R&2)hE6?v}SaQAioML^0C2NuYum3(^Gk0PqKf+FUS;fl&Y?3<|ZUB~YH(&=dQNIsVoqsla6w`oTun7E7XVsxOGy9# literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_at_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_at_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..16a735ba6155333842fb72a1c3f45bdcc43cf97c GIT binary patch literal 2482 zcmYjS2T)U48+}PggbXiG&`IUIg_=S`Y%V5VAlJDWNEc z3K$op8TliihGGmNy1UXARzz@tsA$~%Q=Fau&b;$|bLY&PbIy0)eEb3W$$jj>y|liN2i1936h-!@NQ$*QH$Go2khKVDrmUn)iIZpM&ui`%cnNY4j+ zWTc(Y{>8}GVIp1$UG}~Js;=(eS4E(zFSy-Mqhpus-d8vi2~8WEcU2PUeNOG9njEdg zyNWJ~a0-+8lR~39XKXql{q}}cb#D@AB5oiny!Yy@D9w3)&698F7M}x8jhJ{l%V00W zzLooM`J+;2ll%t)wQ$My)8_1mZG%_4v~Lgif;`bw#bR$q(b%;4{)j?kVYw&LUeTmQ zC7@?+_UF;XnIAnSQ*~X9qEELBhtX6QORze<)4Nev9$Mb=_m?Lq`^17Y1|UOS5XRnO z8(N5dqQ8AxuoGS8QQ4|g;=N9tLQ)a^+&k!RX$695q=y!4_cFw zH(n^{p9>|+w>IdTMpKMrR1Y^yXB=7l@mdbn^lKyc&7K|Y=Iw%3*_1Cjc=vPj=JMBn zi4%-YFmC>;0s!$HVF!Rr1XVD1$$=g>2HNRG;HAV4>%6nC?~#5p6mdkDSr;A}Y8V|F zs*MLA3I|~@KN}bf>o}RmZmDBM5F2@9CYi;v9+Q2;qp;{Kj_MUUYmkW|((8CkSt7Wa zt=ctM1}1d{d1YhVbZdQ_kL{JH=}L_aaf$U33z>7S>5NXoh8@>o#UG9?92@IYegp$K-2r3F;1!aB+2fB5fe|L07@**L7)xnDpWYbKgyfJ4gd*uKmu1J zKlNOmr&MMC@dZ1b7+sdZz+bx}jtDdB(mlK3U?aqPRd)W@%Vlu3OHz_o9m-+aaV%^} zX_~&Xm`j?!bl>WW*T)T{OnTb_EC?k`WeO7K zw`TUcPWaR}Oz^wP<&W1z91(sWbxvp{>(@LUO_s=`r42C$DHM*e^v|``_0;N)JiK2;})07;NP!0#UkN2W@q+q&|ip-_o$YgD<&VW>J&ZnJrTDlaX0LrRqEKmG1#c7;8Y%^XxlDUX$WG0dGV^?DUSBjW zam8)pN|12r5pl0TF|~{fT|^Af=D!sra49CV3eo}qsa%n3P(8mw1o=d)yihiN$MJ}m zUp+LghN{{ZEoUR*i16P}VLU1)=f3B9JvFHOj1R5+4CQupO*NSu2&3V)*(TdKE^hmT zv8xW3WFjkx87AjfP|N4EsI%nfaZ~-#`(FqTzNy{kdiT87V*T&uy;2?p}J+I zRpAIyr9g%j0hRqBA1kMuu2$$Lff_ii`1TNBLLJvh@Z;)qZfGbti8l!OOl2ZIp^y>GVG5~JY_0J9QrJ$VO# z2wt(RSJR4i!A5n5B=FM;6ND+cQd;tE*@4`~yP4)T8YcQC_r&d~X5)q%3MvVgl_sR< z1z%Aw|IDND$ed*|2TAPVv5-Wb^&93ObBBYR8f1}K%sN&FM|hS*7a8=Vp;Hs!M$qxu zP5}Y4!#|J(DxqUSt&Mztv%(GlqXpXnf0hAT54?~!yz=VL8fCQ?(~`?AAR>+kGwb57 zbi+psk&bsY*_SfI2l`4%%9KwWx3Oif%p4OpK>z1f<7dh2uF58h42xg?2rk2|H2QJe z8(u-ZRWB2tC2v@BlO)23;D%O-GT4aN(7w`0?h~?yc4}DY#j`c7rKY}P>qC;>ime$9 zEc5GD%HGoJP-VSblvsk^>!ba(F5~CVhgnJo?c=7?Wze_19|m4qDIz@J?#A8Ug*-jr z;4V-Jixz6--=|VjBGuqJ!M4Dk0ejeM$KC2$!gTLVRjP$^+e}%ii1RNJ_+1zOu_44K zC8ngQB&I}T@CgwSkr{##nGj7#h{U9)5zb=b6C(&wgvb<3BtA6~I^*gz~6eO{JEve6k2|{mImZRsY4S4P8$5Wyg#9Jw@=;7;GT06aI@?Gepv^d zJ)BZ8B)RUZEzR?9YyIoi{A#NaxVF{BwH3uRIU0fgBSSpg3xk!tW_Ti$tD3}T3s7J< Ublf@?X4>(P0l)wg$F21L0m{_xp#T5? literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_by_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_by_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..53a436e8f21faa7a509a7bab0b202e452827c494 GIT binary patch literal 1054 zcmZQzWME_f1IB+04D20Hw!wcWSfk5*Vh872hT=y&cCk5kE_FOCehpCrAuHyb4Gqk{ zWgrkH-+82d$8ydaV(KLZ3A3(D%?y>l<>`ED_v4tR?FD@~?V`TF-<$erY*@5%)+YzK zM=xr=-~GAo{Pb>z6-A2+ZJRHucv<>SI(^c^<>u~(UuuP1Is1+mwsm$azw9}uC+T4A z5uP3~pOY# z_GvANxHj8ul0(Pw%@r2XybpDcTsGLn(;g_3D;r_1vHHl)=7NoEe>N^z^!FfxyiQQo zgIUrs9;dkfoa^R#?(Ju3SNZoHo9wX%kN?}79*CK^an71d#`Q}l?eoyNWW4J5c8~Bw zT6cp&ds*g9zJFTfBhx0QLhh%}y?*~SFG#u9`gJdd)iSNv2aTWa9ela%^K(~8{}&r- z@~qEQB-PLV@anbH)@hpmw0G`i>DqAp`wFStrJNk~bG0t(EwyaOZ@wtvi>PT!yM@~%|t6~2XzyBBY|KI0Q}uzcM6L$^}5Wj^?6Q04t(%CkDd51k^pVXKTD z{LE=}yS~G{&{y&ZC=Gzp4G?q!Qx7MY#lUC`qCp90xlTrC-ED<8PnLA>E?DtcDsDqr z4MYuuteBIWz|ic*adZQ7M?BNUz_dKay1-7Sy1-p=NpW6YS&|)IXT8s#@xJPPR{NyR z$}8IEJajy+e&%5dytXHXhi6T?gv1S(#$9_YxVt`i2Tk@43Klu_$v9Z#)8{$HLZ2@M z9~LV13O2oD^jWA_L_tcF>%f#gCKm%;b^DDj3mMk<1uvX6ott5eu>N|GbC}w}j&cHe zga^!GVDtvkj3AHPUOI2drQ5S_-8In?SQWo*>BnSSkQ^L2umg_maoyGu~$oDlH6X&|J1M;OuEuhX2#${6I!A zodg>g3UmQ4#Aqf(kTA#vUoS?MJ#2paqu{7`3+wuOE4iwY*db~lB-jNv&Kx-KfxTld zm)GPXqsgL^iiNtnMVmf(3waxT{yayk_H(e&WuxG3ksxiapwB^FqD{u1FBJ!YLuoEJ Vz?zMPxPu;^T2;A|;rM0Q-2gfa#0&rc literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_rotation_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6fa6cdd9a1aefcf7cdd33c69b5ac5b15b765891d GIT binary patch literal 2427 zcmZ8hc{tSV8lD+uh-7WCWr>V!>>v!MJANTb<_xrr>?*RY-K)_*uQ~-b@Fm?`9KlmN0 z?iC-&lAPCI(Ef?~$j47hg1u>M4I5)hhh1ia$JGUk-V}65+>r0%8aG%h#WdM$dYVfEu$NQYSf|lN2%eR7Xv* z{v&7Sp;?<{`~xR5HuX$DRg**=U>yUTHx_MI^v%fB*80u$8Tb-9ad>ztnEX zuh1Q$%3PwQa`_;103;;!jwh5)iqlnJtbMY52<(l&VPR!2@T|D6m$o2KW>%W=3Myd{ z>U-O-k>!`w_uW=a2AcL&8i>8YX76O(j}m|wfokU13G z*AX=i^0FZkI2TrgKh7g5HiSY#=49L6aL=x$j7GYOYd~d;YhbWp`t=3zhN6eQy$tus zw7;h<2Vf~HYe1dSU5OEsqS*J*vg><$Mj}DIj{c?}T%&m3_7=BT#IW(%=)`i0x2wR5tN6|L3!b`4eB_FWI$C2+0{r6x>yM%tcST7feG9%!v-|y&PY8 zWDxdX^54&FaYc`Xdhc0pN9rigIG?W<4GXLj<`1M4$`ce*3xyP+D?(a@Jv>9d_UKA| z2YeM9xoJf;B6!hcmcOC3D1J7J{ZIX3npq1Yb*tbEbH1%7m8C<~^^P4`HG0bfr!LE|Z z#JG+2WM<3trl+PY-sOfXkf^$?R{6)}Mr}rA=E775!+lip3K`Y+X0P>xUGRLl7Bcs4 zCUyHoo2z-?d)Z;M?B~Liayf)~vE}jRT!i^1&q^b0jUl$P`coyF(5xGmw~rQ{-IS`k z>^F3?ZD*=8dGtdC^z+#nd4rYCzD{Cq#SVQ7`6aXSrw2tPORFDXQwiunPG}V5=QdqD zr}xHir+g;9Ase5oz42(fsaxt;Pj1yd&=^{|#X2;H_~Frwnd3@7%m6?eCIeaHLd?b3 z(d!mQY69X~>i7~T#YZq`wuX%{rM_r%GZu};T|uKaKB+)osKM=Ea63nCW}-qH8r>Rp zpxM5(RUNZ>Ib<``EpQoXeDalZ?cxFm;I=4X#Hzyauftl?%+(;tt_mz+GKkgRrIwq& z@jJys_mpP|Evfdy`6un(Yz-S@N;?rxd3uZmJf!S64UFcj!EkxE*J36J-fb@XaQF#W z{D2|n=G{HPXS4wBK?9|6xob^Ok?#zF zw>ZK8Fsx-9U5(c2fdcbjn`*Y2$JY(pLw1{Nf)jIus@{0dMonYg9k3gqkc~xZI3s=P%4CoB9@0xp zq&D*nMR(>+5Uvo}Qa#gf=^(JpJD}_9&kbS2H!U*h&-?Eh@D$gyYM&Cf9kl+IVx?gg z-W!&k@YZ!$QhQ&`ao{TjEt=+pZqmPPw8IhYl1pVx6C86m(`e=`9AQrv_=w4ztXtTf zr>=gx*6uAHDWeNP{NhN-J9mt&VdLS?@xH68tAm`Bl$1%zPD*;nmtlapVDBpJ1^IL* z{DjB?iE@@ip+boZ{#59vC2&nqiu@vx8c4w|$}d7=ApUYEC`uxUijv?AG|E1~C)3o# zIM6XH&4V4lO8eq5;o;Iw!4a4UTrj~d z*bjFFhYgd)#zbHVe&Nzc9Kj!ty^O&}Vv!*j0x|#-g8d_k=R0%&F*&Tx+$_8xb{|kF zlOczLgszGRPXTp!*Su~wYmP|8_I%Z2YyKdPncZi8M!2gX!C?{7!D0R|48hM28^t0l z!5>G!!XhJZc-Yn7?qFC|XRv_#Kpb92)v8>#TA44rG z*Cq*@UgZ*Y21_R{Z~WiFVJ}1IMDKjJd~*5Ht@3FvZMpJQ@3V3Liq>ZB^Rw`Dhrrvzm9MxmL`pjgEbOzDlf{EOm%p4sRPnD i-a11d7Mmtw$3pA|6A)12MMte#1Rn$<2&nVyOZ_jc?*HKc literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_scale_at_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_scale_at_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f5ea7e1483193a79fcc7145648fda35a0ab8ec4c GIT binary patch literal 2618 zcmb_ei#yZ%AKyhA+c4W`SP0>SnM)m!tdYjdC5v(wvlceya)?|)5xR_Wn>gyo+lmjB9YD=J+tBo;Rk}A#l4p-p4MX`wb`0=Oc|b3WDTva7oZq-B-cG zZN0h!KR3M0da=5mko>5ByZzo zV-k)zp@|wC9BdCqz_shM4#}-{5VxOexb(E~0H?~qj0Al(Z}jmHM{gi{8=wO}nkXv+ zRJd8pAOL`H-YN@7k$Rx40kt^2Pg<{+D`Ux7zLUnMj{!>cQ?_EZFp(GUZVm&PBN5&P z(LtAsU|g4`CQnBp$t3bFBK(1$b>U?{Wm-yUrR6;|rt?Gz{bfZ(NPfZbJeBM1aQ%Si zS6iPEE94_Ds$q_i?$_22YKc#kpXBDc5=Q48O{Twa|DKdrl5=7y-_KJ2sY0knn$`a0 z{gU6+bqe;m9|!Y5ZBA$@yj8A2B7$R5?Q3^vyqoj&tH?ZlTwlB^@O$S`HrQ#yvB3E4 z$SVhrH21)^!nBT;d0TsOf}T;b;d|5d&lsa`ru;VT(Y2 zj~QRSRt=wz{DEZ@@-r}bvf0Lh(6kQ-7Uk^D*q&jxJeWQ8Uaz^~(#=p%-r&ImgA2o# zd6{<0FKeURIKh5%4NqH0--;wQ%BpH+P>rw#Adh1iw zVmO?{tZ+<+q3N1fJJIWe zzO~k9eHFJCRlixq5aup_r+yfGFKlTvI$7*=!_0LwWEM*fu-d(A1)tn*S~>}Rhavu0 zHFkr$-+4?)(-o=2W zJA2&>(f;i1cITBWd$Pmk@8~%VsU$n}wLmNb_K);%llcWV=ghxF%i|Dx;Ybxlg&A^A zji<>~$=ea9Q7FrLy>u&TxFm5u*a)Y>;;!Us(J4<9nS4RUaF*85Mhcp?_6+e@Z)}+nZ+E$S}sG z+3;szHXUwMzSoLGLvpyd-mcCw@XOz@+^Adwb@_0VFrsJ}U#2>se?zU!!QRQ>c?j;s zL?^WKj?y=>Swb8)Ct4*H!Ie!00PU1|IhhE8ys{@_14=qPS7VA|z&BT3l_Xbg#cW|B zFRGv!CKbVBHYX=TCe%kQn@kX=?ueC5ZKM5?h-YK48ck=t~%p!Xi`hgMB~ zb>muMphp(&TK2`*Pu(O&L6_I5%o`aV9cvxOMnsV(g;sFz>n}bHLu9Wr&xaaJdPsHS zyCefw0uL)FM3JBr9cYH%lQ-uYLtMi4+cjzA6r8Woq&nt&5H}gz+E+cdaps{fD-~ca zAl{Z`3Hf6)SLqT(k_pAH@!1hBN6LJUt|qj(0vJMW=XHXdIKx zvQ>o1J_z01Xh8V?w7N?A7$QqW%X7sdw>-t*+Ir~GSvKMJ&dak5**pKX&0Q8Rz2G9G zCvMurh}zTb>Mif)*5@2=ve@t5?b_>VIz;a6qx5-_d%N9DJdL8iF?BKN?h_4r5>*n6 zdqmqlIG~lgy9{7zv2Ojw&ZZYSOjQ*Mm%c8VuKzBY@}?S+bQKyhoSnj(A>4>70XfmC zWt73lE>_0Hv$rBn#MJvS11+APwA=3UZI?$Sk{S_+4<@e?2u&N?&V?^7$WsLdVP?h{ z9SIp8z1s;~Z`>gi@pCgWx|Fb=&(IW7mnXAqumRY{1E{vsaZ^C*x{A&7bz+PyH@WV* ld7?iSnElj7@m3Hm0N_XO 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_sequence_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_sequence_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c1dc3b4487e11ce3bf081066387e6fbb26e641f8 GIT binary patch literal 4328 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 bH7zr~PNYe@eJV%pwT0{L7S;@r zlhbPT&(D>=zw_B6>+^zJPD+Mnc5P2|nCjiiGj;O2#+yyoPiW0O<+I4Ld$Gl&(6znQ zE!T47+BV;nx_7cDb^h6p?e3}{cD*)`?0?L0tl->U?JbS#gI-LE-eI&yYpI6V?6664 zKK_39ef*c_KNR(e+kDcx%xI=xlY@}^*8Pfw0!y+Ne!Y^AbC>a+b;!%A?RP8ocRW=N z&`=E%S=M@U*{kywQmULa6~DF{6s(+DI!A^lAz#5`zUs7>j1Mz|QuY+w;%Uk9?2QYO zNe%i~^m>P6azOr?8_5N&7t39GHXWHWU0m&Zqvrf~tk?Xqt_Gx})cTrjFYSD>INrbc zlWUZcuHlB{;=R9w{u%vQxB9=p)cr5F-VD62{IOqni}=|-8L77c7Cz<6HtyeWb?@op zvnN!$Ui)``|J_A~Mn`R*dy0l>+eAs3zt|JF;KMuq4Y7*51Nj0K)?KhX^s&jN?c~Fd zb=gb!-2SRwRy*0VEZ~)1JJR5y-PwAi}A#8ltX)Ixcq!c}v7RbyS_tscs{#`=ct2ZdcPsBhk( zVyeH@VW0Z_(HY_b8-!MSP4V8J@Te!+ImvxnaG>HpS#{0bytiCAo?eI% z@=v>0ZCv*)RK=%uOG$*|ypvzHPB~pUZK=`1@avyj&%CTs+*G4h9HW!|*~ZiGy;j(R zH4l!xvv{>=f%9*ry}`3AGS~l^xZC#H5$#}&l_x&+zsR`VX11K;cNcrlxe^nlid8RQRdH6YOH#dXB?`|`ExJg z$D$U^iwEZ(T@{ja|9^=Wcaurv+0CK58m3Q3(TUs?IY}*-sekdVlg?HN@AkMpbYu}= zZ{EmI`+W&F`*WpxUwrp8UvTyeeR2L^Rm3;tKD9ZAZ~w2aYKUGu_qc-r(>;$#cA8q< z+?Ou*o-jKkZ9Qq#WPLX4Uw>S;FBiUk<*m|>f={1crmQrXR$uXGbJ0PsgVJA}e<)ft z)Z0Anxh&;>DEOns+Y6mv6Ml;HNhGsR6qkB3V z8(kSsXgtu-@I7_XCye8qhmObBv;HT2PW$Ly@;H6Q`%K^m7r`$lb@V*Xdg}&h9MD>` bGT`j#qbDO{q8P69J9nDui!;2@)lvWe-gPj2 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_single_value_change_shape_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_single_value_change_shape_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..34c4f047374f2a6d3f25f2b4547127d9bdae4a02 GIT binary patch literal 745 zcmZQzWME_f1ICvO3>?-FHk0CiD2VMnci}_1lZy0&aBkOodd_V^w?nIZK#bB@{{vxgq$l4*fL$3;FG@NlXN)?ZCI zb0Fi~lsLmFnO?JhxfZFa7)}bip=+G2(dDa|L(gF zr1LK9{^a%Kexd7wlIAe;iYvTPcNbjb{kE%o-}CB48dJBar|3@m`g)!H;!R5RSNN-T z&c1xJ;6=4TOL@f2t(QKy7EE2-Sl#QY_hZ*x6Q`o4LX+8Tn=@JT6KjNf9wit_^}k|x zR-HO^N5O$35xsYq%9YsuS?tzKa82KXLzM)7R;Vb6(EPJbn06;#ZM(ulFyJo4RDx0^8Lvu_8&ac&K`g2bCP-I=_|20GcV~}Ue%C#cWz~^ z`li;B6_Q1}7OcGYF^=zo(>3Ksb=e={w07!-q%O$3AGzz9%n#{zeJK*4=msSbAZTD< zU|$brF)%Fv(V(;vap%t{wIA-`{-WsIDN+ZOrXc< zlm0q^8U>oVUOFewoWC6CAn109XYxlE!=vh(cc_@^Z}nKnuzJHXCsTcK_4L9_#tTj= T-T}PF7G9qY>5QXk`=E>t#&-i{{&%{sK`0AuHxw4ZE9v z*+AgBoV4cu!?ubm+~%mgy;j!H;JDnYXS&io+vk_0gl=z|+r{;9|6`T6zZMFHi8!8g zwmVn8|M%UW@8%fydv3k7L&mv6FxI8H<>f}L+0tXq82|Cv%#_~Mb^B}7 zhgQ9n<PG984-<`N1~Qw^dM26PU3IbGpunOE zncic8Eaw-Ra~-niI20G5C2&9Z=-goTs`NF>&M*}#u<_Z1N8Z@M{wFO^g-uFh-wNUH zTrmeEpXoWXE&Hu;zjnPd$DTi*SF`Pyb|~VN%$A1hLQ6T1>sTtUNWw+DiP3-3q{cSE9tv|#6WPXZjZCI%1agkFG-zL1db@%nIZ7=@( znEl4=(q1+8t-nis7@o5)`>!|8_6h%;9cAUbtG7K``{e|Ke9I4grri3?^4~t4mb!3B zY4Z#lHS6BT(WYzP9lx+*=hJJ)dUiQx%kES+SRLn=UU6@cb^P7T>0Z7;+b0@m7Z=CM zO-|90xjMzjW?|y~XVq3M%NFHmeV@;q-y*U)MvQIMm#vdb!yD}xIa|!vfRYF(Sph*9 z0|Vz@FpGg{4u}S&uZDmvX-r`IedbQnpG88ge-@SOJ+f!Ylq*I8Q)f+|H*@-`@Tf^M7f+u(f6~lpGozMF zpA|7@)$^BJDtEm;Px3bU{CQ2~PKFN)q+CE|GZlkvSPM+@u;jl0D8dMG)udaBWsg^N z>R#RUU{NcxLw~?Y+~Y5XH|IE zb*)hEI%zlasOrkfm9AW@5v``8t15R|Say4JH}pAdlDKKq!fJ75!?UMMRo^6-nQ!N^ rvAKP8e4DsK?fQ{NA=@wQNtv*hi}i#}R!b+}tceE{m>6;#_RIwU#BjEU literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_triple_value_span_shape_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/_triple_value_span_shape_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..fd591d97d089ef45bf62b763a661bb1d3c6b1930 GIT binary patch literal 1005 zcmZQzWME_f112>F1}+UKTk$^>yw};0!nx&&UkFc*VqeBmpCZZQygRszcCJP#CCNZDSFwp`?XJ$b5iuS;6TNH)_#}PhvY^E@Qd1- zysUWk)i}BOj&{H2)+;+C4l(3UvRJk^PloMp%T{a087$_18F`y_G+(|~a-d40Z2jpD zMTxT=SB#xpWgai8STLiok)`!%ndg}~S}HSpDh~xtuFm@4Sv>Vo_^f9Zfgv{Qj{V6m zaonrzANXzVIe|H=;#dBX4&5L0)jPC)ZPo2Bv*gZCx$;di@Zyq+JO5mdRLRN9?v<}C zy8k%F;PlcT%|3aRyLjy<*34we+&W8c%LC@KZ)3849GdB~vXR|)^OVh%rWrdDINqN7 zu**2-`$OIqX8RYv5-;#^v0wTUVpsakVfnGFQ#uCfNeTJSHgUav$ygsDvawOPBY*Xw zz3kHqx@NAP(70mVr_C=-IU39V|69r879`<)mnHpzweY1G$x`tG{*g*^jkUkdToJbW z*%htqk!I`$oGJDJ0pZ!)g%f5un-_YUDFKf&UMXwv;LJw@LKhnGnw8ceb+uVT(eptZlD>jw|u$nqTS!_s7~?l z724ilpn1wjD^FjDvwc=ToA{OH@IBL+MLHjS*tuW6Kz&I>nvr?HwD&rp#nvCp6^(?K zfYJ&meE~rj0|Vz2FpGg{4u}RNv6LRQR4PGD%3 z<2d?ZYGdO?wnHg7jR|bO&)jMHvq-4*&!UpONA^saa>Yns>a6MWW=>xf9yMv^;_0*J zPntPxX4I1Dvm)lKdj672<*wJ~N!~`EKd-6W$?#!;lncmgrW&vf8-cEx24*oZEdbJt zAXmlAy54`P=*HaB=bmi#xXt!K?&2N;h#Cl4F{gBbFV`Uh0XOB23r_D1yjk-fc&%l1 z4A*^^Jok}C`bJT>d~`x@IQ6SdCTy2&)a#%SCf}|zk5u{|X-M-u=4dN8 z9JT!-+cT$mhnxy@XSVK4+$vJD`Sb>-!j?aee$~{>eO|!!xVxleW}o}d6Y432SGH(- zvHKP4-nlGP-m)e@;gwsGuZNDvy}uW<-nE2%kaKU=X?}Tser)5+uxo~^aML9PD;CkD!mhK;+h`TUtq z3=E5bHr)iX7#Kmaj3ApN=9^xyyT0o4QiJQ~(%T#pXExuM3{e9iE9N98B+NW{;J~VL z2M(M#6B#gT%H)}ACQO?=KVs2@c~L?WqNdE56+UUkyjPRvPhZ6-sL$c&d+xlqX4zR! z9SuL6{%+e~*)b-LidFH&c@VB#PxV_J4`nrnytzqEK)(ZJtR9GaoblMcL zr;072TSQDQtO>rb-8EtnXGnt{|CL3FE7J24GO{KvTd+2v!?$-GlTWK!0Oy^;YkOiC JM1#Xl005HyUr+!5 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_back_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_back_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ff0f9be63f4b936104d72a74bd95a2bbea80ef61 GIT binary patch literal 930 zcmZQzWME_f1I9ND3~c|Q?0Ns8U`2j&&X-M{ahsRv%vLVmxsW%oJq)4-LRQQ<8+tqI zwu3VMl*rEh9x5MWRW*jlp`TzeV^O~NrdBJ}K zAN8`l3|yq;b|^Ty@`+qy(U*`%pC3J&{dW8Bv#$~jrM|42wN3Eejfuh*&T_uH|M_R^ z`4(o|{BPD%x!QYQBOaXepLS8RoQY#sVAchnd-s};$=A#6&d80seR5I$n!5NyjHe`0 zV-|nUcqp8+`|RdQ!j82=}_eqQSmcLQ+d_Mp5QHQP*&U;##_C;~do*w*z z>1C(5^Zug?7Pt1KU+B~5k~uR?U}?_0iMK`cqV|VXvaS;@SAVo;abJVPrgL-OOq<~Q zU-n(op^H=g@>$9~Z97*dv+8NoWzhxlLU*zk$7@}-c+p|TwSPsyeugN912;i24oW3J zzz0k#f59vU#_b>)lw4{%_3U>nv=vRXV2toDRN%yj-R{E0dtyb}%? zcyZsAS8$b*I?5HbjZ3PnYMGnEVpGvAj%mqSS3@<}ybtY7e{7HV<*k#}aG(9(QepJ&?)yda zZNDad|C8Jqy=2k%@JAb`ubTAu&`jAGVXqa9ejPga;P=ldpYHp8bUCfpn@-)7x|Z9VcTx7n8UvrLLPE^4i`uu_S}phb^J&|q zFaeK+sYNR;iH4lwuyrwe?pt|JhrONswMx8~r&ErxBb#cx$IlsxuO8a$o&C(*UTcTV zq8P~y9~t+w_(oi3FWldMyVYFx9>DplY>Z``ij=3^#bWDZ=Q7xaj}kObG%S@Wiby=dRrk|)4iqXXM+UVw#nbG zPt5t1mQ$9JW5mBjdx^%vX(*n336>+@0 zBbnE##2?RUyQAbq^1nY1S>ggESlHGYn*p`}z^twucK`s%WoNtq literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4f7b336be8dbb74a49dcfb3cfbb20863765b7ba1 GIT binary patch literal 817 zcmZQzWME_f1ICRE3~ZH9_Pqa45PZkw^5kz)CG~Hw2mCbLQkwms_&h`ngshlzHqRH zL6a)~zXY8%OQjCGaV_4_y!GkSNskIX6$Ej&ynOrTd5+!OL%e75Za(Qdt9IG*@r0$G zvSm;Bnyy(@ED_;XyD%%Jc}-TUXky_6b76mzcS|pRF!yDPWZS>5ZZ6ZBp0atte>grW zIaW+jCE5N(z#aPNjk%e;^EEOvh`p1MEf zdtH&$*YoM7?=C)Hdx+`$=@d(waK8@@>`QmeJeVqDvhUyYl8Za`nDckr-H@x7ogg8z z?qcLGG=It5I17#5vtHR+H`=7$uDZD;avf*ZNmjQ>wLfcIvQrzyOTANf zupgW%F)gV0D(?@&8k6$c;4fzv3GWgPxR6+K@rPx_wQTWgYT73{C;1%nHQ*}X-Myo! zd{3SH!s4|n8DEAoe82T#`zaRowPymas6P6~_*8riFDTkTQ4It#zz8n`vltk+gJ@8k zOQ)ZF%l5|qw1sgKdx^ibDDU&k4G=XjlJNo1gvUT06E7E#*ayUiU_7AAS+Ke#K(pU~ zSqzMOfixq?Y?BELnd&AcD(Yifq%zO?~bE>9XE}#4&TjC%}#Di zZLV=#K0!iCM<+2Vo9T1zZEY>@srtNI+=J%&%N=Ox3D{N+svwe?{+^uQv6`s+4lRZ@8!=wl7He({7wMV Cnpy<_ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ade5bcd8b0bed8dfccff7f93d89febff239e4d32 GIT binary patch literal 898 zcmZQzWME_f1IEh?4D1|G_Pqa4@O$ekHy6tbCtVbNw`N>jQ_GW?0aS+o6?4vp`sUv@ z;ITd4@SoY=c~2jw*q|uj&3nhNt_pWF0y!ABbN5J6? zx}7yOD)XOob=%i;C%lB&^Zi$+iQ(hEi0PiBa? z8#GnR{W%vA;bGdgRK%^2o%^)6>d|#u3xc>?PM*E{^-G>nW4^)O#Fx6WmrdSc=J99+ zm$VVP<32t)%_IK8C)6*me&9H5>Y+(5EKa=Isvh;}QpOK)_hywwdHMZO4LdKMD?ap| zalN{izfkBs_W6u=r%tVYC#d1+A6gfEKWFE^zZ>S*pQ}o~FLH(LVei|O%i2Zm70Ab# zDy^7YlleAEG4@1Bw_SFW?uQ4O-47M(l{l?5uCC?j`@G=e``;Hf-+HyQF5=6iw7c@I_xN^VCWIvDo?X-1IQtY=r8Y5f!T zuf!xW`Lj$sSR3{>NRvk7YqE^NTl(QH|4gHivO8yEWmc@NM4boZU-> z&-ZSauca94yIEJ=t?#H)aM%aKBikR|d73hHqT8OJP0DX~NM8Oa`TgUi*H!bp{<>NF z#ZQ$;km+5$IPToFr%l{i6=`!+_DosPqQ7)Q$h$vvUw-zaRW>Z%;MaH9>SbkYSM&6` kORuNdFFRez-tgM|=&hUe5*BN$>l8z8mOo{7>zK6|0Mp-&z5oCK literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_bounce_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..00311a49b781d9f933bcb8163b091f9f86f16e92 GIT binary patch literal 978 zcmZQzWME_f1I8~54D7R@?0Ns8fXVme>gJ!n!S*<9m{Jl6VcT45@?^qT-%sx+ZK9#_q8ft(a_58=cJUqT$U{Pq&Tg< z%+~mR&F6ISm_LuCS(43rUYi`9Tfg9*M=#IT$?rO+M#m|f_SG`(oTjK>C{)s%cjY~M z?2E&?>+f8PnBiT@>8;uGNcD{F`Kcne_qu6rb?9(6Km0_k?;+PDLFt}IqYm~sMXp`0 zTh&ShQlbyp?);IbwW)HA%!xe#GlXXfiN$?#U{ddGvv=Gs>}v4$e=@&;@vf3NAEFOr zcV23CnY!)Za_98Kr+wBeT$cj-{5S88SXXyXH~stMYdfyL+%mP`*f!aNoL@JDmp4qe zzy4&loR#!5w!4egZ933A_sk*Z4@U$_mWC+5l)2x0?7se8zdh$R?~g2*diDRa4GS;1 z$vuA|6ZL~-b=AkhS)bW2?OCpxa?EX}spXngOmENh=WV&*V)~dVT58$t>?mu9wM_9X(of4lPqjtMv(I(GQpLe^QAxPH~NCY#Bq z9`2cTF5Y%W!`FSB456J45$Bp!@|hK%uGZX{vgNjPO3K57`UwH=<4O;-y)T-$;mMl* z_4ChHRti6OA$mmry1qg5+}34J?auM&Y*}`5NxkZw%*FGIf~N-fJ81X%cmC#nknm(W zDCR+_1qif&X=WOj#lW~7M1zveQYS;6lF0DNuM!3RMGbNKtIVIJLe#)W#)m)?o&b4F zyj(zHF%U0<^9})d$6!1lTMn!XXdlOFFpGh4FOX&g+0;2ncWsgMHO2Xoq945TI-V$) zwyuJxfshq*)=oN`#bhYr=B(K&Slhn)%oVBJTNk}vJ6%Y147juWaW9Kg+KiJ83bpg? z($?D>OekEqwAZh&`%nJgT2m4F`}XUl|Ker0 HTwDVH%-yGT literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_circular_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_circular_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..8efde4becb3821c2a9f775e56f95f053bd556ead GIT binary patch literal 916 zcmZQzWME_f1ICLC3~ckE?0Ns8;N_ez7ni7LyZj1#Y_l-ws>YwQ&mTk7K*)+YXG1UM z%{CCJ!2v5Cx`G~V1 zQ**!m^LfR!nLB@+>*r|e>v_HEQ1PCHc3!KMqanP7-9SoVDejzypOtQQZBFN1`Tu=n7t`7!Y`aWuMq7i>)7{ zEHX|0cun@4clhpq`Pzo97q5L3sBfuI4!q?Na#f;6?O~4Ryq(S*p1Tx2#ebT%`|tMl zyT1xerGEPPe>x;7<$38kkKW4k%j;O;syyNy|DXHVvF?qHn1#-)6IRt{Z7wjsohp^4 zmjB-I@%eK3Sl0{Qdjzcf#ku%Wjs+BUpHn=jextm(KX|sk#JB3yg=SN(r%2uSEtV;} zJumK+!`5d^?neLqy_W1uY0c-mzLC4}fmh1k3$c#6rs0RrJp2?GV;9zZvbnUjLo=mV zP%8A>^23I|n`6YHL!T+^?>?O-P*ALKW6``r=@vf6w^j#yeS9M(OZJrhABG2x(tqzr z-qVj7smz_=YmgVMyxrS`%T^>jU#M+bCC$BKt- zDgIIiQ3E5HSQr?X*nvDIUM>a(Rw*D(0`eRPd=pDD z^ok3MN;C`=bQLs86!dKsQZ#|mC7M9Kp`JmSrh>LYlBPAtETECvAd+Dv&}DzYEC$BC zK$;QcGG)u4Ys(morSB&fjs*|~S97m8SZ zI+*$3rG10shr7F@7wu2Ed$n?&GgnOs)3n)%QC}`;i0_@8zS`|T%@3t(o`0A`FNQ1y E0DDe*uru!;CE$Vv;cHP@! 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_cubic_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_cubic_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c5840278b354805d4ec20585685c1d1956152d2f GIT binary patch literal 789 zcmZQzWME_f1IG0X3~Vt__Pqa4ur=kRJb!?4rq*Md=}#(CAN099Jcg)&kQH;zhWKVb zHW08q{@}mC@}s`H%VcionTSL=N!Q%?GT|?CmyMrG>Pe5qI;k(~?|*d9-25i<;=*Io zRL^F7`EoDAN^$;C#)G?@^?YI>uWZr){B}}B?_y6+}3Aw%M2R|ww z>1KHuxNu$agP9+1Tb2s79B5Zr_M_)c*6!bx`(y3bEOL~;QQ|nMbRtLX;s1gaWripI zTUqt&{Jj3N?1WX0v7MJE&CJ@gJ=oa9!147-qw4wW&HMk|D!96P&$nJ@u5&d{@|c90 z_wx!ZY}Vf(Z8cwAySeLhW zt-=JS(>ZT0iJF|^u#Noo+_}h93QOm{ z_-#`acC27t;nw!*lu`K7PNsP4HVHpzz2-(XfTU`aXW|x#rUOL zZ3}BW?ifU;^em3K{i3kLj#&hv21YVI0Ga?w0!+MIATh?hAd+DQ(6oDC7DR**WZJBb zmlfMK^eo(^vr5M?`{Kv6@~7`1Y9M6AoYZq?xegf!usjg`a=|Iy@!O23r4?fNUo|+I zzHhxd&EZCi3FE=#AASF}I_;@DW58@s&!97n!T3bX9;v%Y`8upJ7ISWF*J)(STeIQU zF6-j#rPBOucTU`us@6@ZQ@!ru?-=d*W5rV^wW3oczY99QE1fqwuUIuxB78;2ruN@o f7_VK{$t#H7mzDV>epUH~S@Yg@{o(9Zj(7|J`BPYk literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a7a3dec32336a5bcd57b9e3f0b63c1dbe16f1b50 GIT binary patch literal 1161 zcmZQzWME_f1EypK1`az2n{nQMC|JF6UcgTl_sruHu5Rx1k`O4H3{>OGUY)x?A<{Y~A@BMN=r_5b;zLgm* zhi-nq`*U}^-@&8#`&=)io!;RUZ1clDBzon9g+-Tajdnj~-L%&)Rqdj|6S4H>e+%@# zx0=1Hy?p899L}|C9-oRVJAOB>E@rQp8u#MVsK?WHK0D{E?P4Lt`^%t7I&RlovkjAe zN?Z$iF(*1ga^Lx-H?DGMPj%?f*W2%-|5!rJU~j_3aI@Y=Czua8?$E&9nOYFE+Hgz6;rWjH#oG%0{`Y_T;Ak@YKdVJsrp#C#`{Cuq z^#-2~$TG2da@I|LlT!QtbD3@Y8LP)}OD|73lzBPOt)Fqr4F2X-jPtTx?)tuW+u=Gr zgjMXujV~!?HphIQI83d)mr=F6HsHsHZzpCRxA{HYF??3oFDb3qB?YbL7B(91Sl`lr zd3w3WU@Ylekxv9a;3|s#yJA*T0Wy7P}nR%UreJ@+-3=hj85QU=GRs zu7@l;#CBy^e&Gq)WvTp4Gy7l#Yx8n-39cV*mu^ZH?q(7+sSaPhx09pqpUvN2d*-Qb zY!I-!UdLG6&3kI~D<3w4FEipV%X4o0@LlI|N$2GM0u>+f@9&TB?MO@xc+vi_gs0F& zdP;Zac_)WYr^8z+`-zpF9)r=pPeDjr2=ULIWjEAm9TgQCl#JfpI&C2BlIJHkSJ92c{H#JFsrcb)L#1 zVa3B{5H&E8$scG!5Rk{j%LNi+Dg=>?5ey8R0w5NUy%$7)Ok0;E6KUkI&=wtl(o_T({WcFL*YrB$r_C{#!?>{1QNaGmK zG@IEUQ_iKfdE0fWZtvc=>)GcBy-S-pLQjd;a}Fna^z)+{lMP7FmP*W>?AEC#tSZOSGnFyVq1RYWeG!KO#T05 zX)&31yuOHwef`y2lI!@@uev{T&ZQkcwA*JqIQTZB%u#ds3|k%p(M{V`grgL zpWuz`%3h&Im%OjliQ3;D6v!(sOc0K94oGynhq literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9dc361ee4a290b95a14d4cce6b5410e1c4aa4d9d GIT binary patch literal 1240 zcmZQzWME_f1Ewwp29AdiHsieiP>?SC?DtK((7)TZnEjUgmvwMvlw=%44TP+ib2iM| z|FMC9-S(jWhvx(YMXA5kTjP?*>eNuh5SH{_`})i+*Orx~SSxJ#a9>jWrE=@u1u`pE zrRCHce?EIU^Wf3=eGV7W4({*@uKB_r!o70B!lFyI#=D=eZkp)fiP-Yye+%@( zTg~1jU%hm44(Hl6k55IGoxc02Xz#61HQvRkQIFRbpPkzt){$W$^Cgkv`JNK*+y`#Y zly^*adVc3n@59wGU8%hrf;d~A{CJX4G)cvv?WAFM{RYoDN8|)}f4N$!TX0<3THq=e zGx5oi87qHZVw`xg(Dh-|jGu>J2XU%zm2&L1_#^$LI*=uO{{Jg%W@6SGt_v>B?yS7U zI$y4qTUmam^8y9U$Vgc< zw0r%qvaRYa5nLi>l)LE63sIXXth2oBFJJT#yxPP4X2qZ9-}^IqdU^ZrgCdloOzU!-u*r=@U+E!?T@*bHUiFP~RBAc4XeO}vU&mISb2kM^e>@HtLTyDIX zoA>>gQjGMsi&y%pryXHZ`Vn`V^^C5WMtz97S<8Xse?E0*JKFX)NiNr(_s0FeVKY_t zb(8iwn1>yk!X+;dKU?!luz{qb(C=9G$HtdureS~ zF=y+fvtEZCL|W5>vsvyxbXusA`}y)MrKHEJxb(PKFRtx*yM(RH^8`PaSj;c6rXL(l z(&BkF%JB!RCvWpyzN@6rb4T&Ho$>ElCPXz)h;remGec@H+@yQkXVOQamDdBc#lZ{~NhmD`=6Kfa$5Bj;CDP})Qi&(|E1Cti+-S4z8 zR%sQZ_3nrr`j;F^d1e z?HA17A9qw>*R4y}lyhQM-(ibA+p*Ys^YzAc>bt8ZyiK0es-Avn-4~%u@9V49+-eK4 sx>CMFVDaAAdy$Rt_J^um|2)rikUjIy-l*nyYREsOxnJ0W41Q_=09KeWbN~PV literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_elastic_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..38f9a3b3cd53f369bdd14648b6c1e031417feb2b GIT binary patch literal 1156 zcmZQzWME_f1EwSf1`az2n{nQMC`kDG?f&Tl=hJU3y2gKeo@eNu^=G9ZY9M6AoU@_# z^KTgl)UkE`e>hJd@d3-W(xA-cVI4|xUg{gapR^F)Aok`&*@{(L|5u;){4sHxf3RGa z!kqW}tn1776&vaO`^4L1CVeba=JCD%3vYR}@=TrluJfku`3Y}Jbc8$G6t`Qv++v-( z^YoTN`Q6X_mic6)%7&lYRQ+z-<-@P;%(Us5R@k}U+q7IRO5sr5{>yE4cRt+7-P*X* zhke5or{#AJ-T4r!b#$9c#7dS!FCKmR{iDdFNwG&i;!AVy;=m`2iOc6c&2DN|i03vw zmEbmM@*~A^hmfE8tN=KP@rK?5PR#pUl17*ICszC1CkI?k=$kO~q8_+BuKe z?k=)OZk!tIt+v;LMt z$n14JBrafD62|>P@<>Uo+nem5=8sHl=g(gd{xEq--t--@jT~BcuX>t`98{dQJpSGF zO)6;uhqfE(C1h=Mstk@i$xtQtIsH$zqt2h$(-wE1h}g5p?Ro!uvAF#KV&m=#IFbKzY@j>oPB| zC2>I1z(}S5pb5c19uqGYNQ|ifL^6gjFmOtMSU~n(5CJmn@4FMH4t_Q7sXzH<*$Umh zHgB2mLa-7jQ8A}9@T}Ki2Z4Fs+JZ+m&wCcKX>0B!t%?m_LsB-hgOeTZ2F^HX<#V1*>_^dt z^QQMI_w6_}GnI8;toNad9I=PD=x9&N6kC1i$DtSdE9)Zav%grgom-)!QMCJCeOX1& zH0?F@jI;ihJfT@p$`f zS6O>HNN)etbt^0EEWXd_7q-*8=e0rIs=|K8y@J!6OZ#oTm_j*=CbVei*fD;)!FbQ? z_Kg`AqSh`}ufA|F?|$l%ZLtS0lxQ01|BoYXATM literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_exponential_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_exponential_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..64d87f7d12114da3997f3f2d68fb6f3b28b88ca3 GIT binary patch literal 850 zcmZQzWME_f1IDuq3~Y;`?0Ns8VDanO{eN~X;kvlwU~R#l&i`Ast-1$M10gHsoDDsg zciVu+R^8!WLzb?aqROO~w2 zJ)!nh#nvvU==4$jItPPq2X?H}vS}56)qLedK=n)cnbx1gB9pZuy|?h}Jp438=3S1} z+@3@(^F5#4lM|J%@@xx|I4YZ?lRrh|xbY!RU4gFGN2mW>r1603*>#=&r=C?#WOp!= z+k@kOf$^f{TR$DKWnz8l`TRQ9^xJpO-+r65x98aY=~v1QNlSZPeXbC< z(f`sufqCav6l?C4e#uySQ$6~DL7vL%Czf?eoV$XvUP$i!;rRG)w6{L6s4eK00ex%#IOj=Vqn}3qCx3Fw7te;pXrVlUH2`FTt2`4Wp(O* z7eoz=WPA=Z;T4d_#LEQ|W4sNP0h+)r4rVbh?ga^hOsjXA*f`;S+_s(-MxF=G{{G@q z?IjCQ10gHsr1qWWI%FW=>VCnM_5VXX;rT1Qx9(c$?I>{Pc-gAf2~%b*da(Xyp_kyQ z(rM2R>~wa~R*DL)y{jJB-)Y6s^(y5P%gn-CkI&SdPd#+)wej(Dn@$w1K6_k@-EWTX z`sl^o+RKywoY+r-nq&T*?a7jsD1jq3}nHV8F4r7MYNFr|p*f-&A<2XAd~;;PFKoEjjbxNqlPzr4p1H6D3QFR~}N6h2{im=bf% zx`|o+Hdok}iC51DX+LM4ys~PQZpWf25f^+|S2EjN>55(``e#;;dm_jE|NpZ%r$vQM z6a3Fm!@Tp0LO`1H593A4O&*=lVPehHyed90Q*hdyFsGb=|X`#|}X|s;w3o zDjnW;Yv+|SOzD%VbFZIM6z@8jms)Q3;*F(O`~8-_&)WHVb#+sUykY_CA0D?I z6ADTM+zyu7wdM=dZ^(?D+jQJoz_kC2TvO2gijy*rI@CIjsh`&T`2JtWO;xV*_5P2{ zb@t`UI$yfXv;5?`FZ12IR|aiye=(o!yVvULPS-_EykuM&rtG-S$aeb`D9%CY1PJ(m zsl^e@Vqn}3qCpA9AZEGM;lsbDEWQ6*cy_bep0@{AheOoBNJgL;jBkNFCSER(7~>x> z$;80G0b&3F<6aN}GVQ_HxiYE&-$eR33RD40B_ zn3LfQ;{&!wFa9#jIh*l$=FeY8Uod$;PC3xa^?jAr6yBo6)6QvKd-Bgw^xV4g?QXy3 zM)hyF5;p7G#Q1Add2ZcQiOc-0;k))y#J;059{(M()Yr(OJ_FNf9>*K9?nOI^b@T+W` zEZP6o{Jrm_wvW}@+ykoS8)jLqyz6Lp_Rm^EpiK9Om2cS+UEbIX33u%tBC zJub78*)cym;i-9~tyvcno7($1tbyi2+4<5Mhd%Tw=d~*RFn{rV6Hi_Je+%6WAt^ea zU%N->3oVgu+|<*!{P}vfZspA!cAl?0|Ft|y+WfbAZ{#|$i$WQeSNo!uDqs9H>8SgU zlN)qfp9kMqIcwj!(*A83U!UFZebcE`nRwtZOHojn^4@TJ0lS)AKb2VQ+Wi)n&bqhh zW@FdE7gB3odDA!K%Gdd=y|?H;+Y~mfrJKE0OKn@{xR+;raoB|RD8s&qT@PNp>xk+W zil4e}Ns^ewWSf;NhBqzWNZgyX`@33w{HK)tA6(76>kz>rIM*#)YYptO*Cr7xoP2(+?Ich?A)}> zUxhc2dbiwE3$M33Ud^LQMyFUB#-sg3U^Is)>0|5RDZXf^v literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_linear.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_linear.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a7d7be65b0808cbad3bbc9a33887b193fdfbc637 GIT binary patch literal 749 zcmZQzWME_f1IF153~UZi_Pqa4aKi9~>)ERxRD)x>7Pp-E@b21i>Gcpb5VB&<*^t2O zLk0qM+b;Ys@IP#My=;?Z02|-Tpc{9Ze={5I&5Eef^n5j8ueP6V* z=6mh*DLwU@Oq(vf?g*UraGTtOYfT1Dn-0BG+MKBB)_TfCFTni-Pv2n$o=0)|JPX)` z!*2FoG7#Uy&wX%e3fr?;qCp?d+8yF}#8H0uqO;L1{|91hhczmD*iOaPo6)!X6jDS3A?#ZI`K%}IdE!ymu}?r#c^IwcAdKW;)73DS?eku zlUtP&&j^0!=ASz&0u(`@NCg5uVAR@!SqzNZK{P0KcYCJhUXII2*8Dan#dzb-*KOX% zPe9bbNXC0W6CMJ2OuSqmF~*f(nHHdFGr%kc#=Rh6kZHf0^X%qE`z?C6Fr?ATyY>{r zbMb!=H4w65PI5xR%yS10oH}ygKtapq1tyy6#*vD;>h>F56m7SvC~VcRG+nP^XnR%F zUO!Y>*I3_>T`O8(&a64}rw6^6H8~<+&a6d?8|@yow4xtvIYGcoE)VS*O}^zGbH?TYXbl+@b zY$#Cs?$E!(HlAyD-4=# za%QpGN{RaPXqKhhITza;ul?(Mi|Y`}Nv_{BXUMKL&Yk*qdis2sLT!TYj*?JSOY-+DnZuY!=ubdKYhYseb#jZCU@G zZF8M%x~u4o*%z0K_9<@?87(!fz2EQPYmrxP_swp9zw2_wT)V`z%z{ljRinD4^b+p! zoLeq7|Kk0(cN`X$L}i2?x)r)Y{Hv+2@uvXpV}=uMe4cKbrCVg97430Ur$DW8zwE7S z4Hm#WXNH(I~kQQ!4T>{4W|L_@3gjh3k!lV8_7Io(kc`BPn1&f{YG$~ld0 zdlY6>KB{Ag+cHxY6iJ|n1p+=`^g4i942;`BG$@7_-V%S~cm3iz#YyuY$~Wm~Pk0*8 z4^aan8Sep2cnIV%@p6I07}tVjdVr=a2eTL$_kx5$rWKjz%5=|ol(Hcq<(f%mbyL;f zGq)jXAY{dy_f7A>AIZRYeD%vVDm1Vv4Wm^5>KyV{%CGsUOP2%goY zHz$Ho>{`f*XHOqJ(ecvN)IH_Qp`D?bu^@8!g8c3cF2XAqV&kL}XPWAZGc4uzP6Pmx Cursj$ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quad_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quad_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d53cd1d1dbada489942315a48978582489a0d16f GIT binary patch literal 854 zcmZQzWME_f1ICjK3~WoF?0Ns8fIm!1>9?}ti}H#+H=i)hpFT@qZxKWdgshlzHqB9>*PO1S1I*Hn^KkpPTTZl|N1|Im)^Wv`6D3N zdsDhe)#qoP>m=(_tyz-GH7`3oSokvF{gPuMrk+*acjsN55$1LxXp!$k%a|j9GO3e2 zWe&2uo4I`N#toBR30<2ceN<+R&gv;oexEz+c~)We;=FU4T^6dJ{H)?awe~NrO z;b`F7?FVHmX1so2sPpmBOpPy_)hC3m-N2O~BhvfyWVYX>j32V@i*=fJpO24iSbDK9 zqQl-{PosjZXGju<&EkUVVR90REh?G?HRtj+-uqJ%p)W7qoS6S|%e=`OnGLIa9`IBe z<*|OaS6TAuXMUUYl0~`($Lr2{Ogm}#o`G*m_^Rzae)k<8uirmC#>DQuZ}P-FSLI*6 zUdZG4kgM~;A=aE*2d`gz%Fh!WYoXD5)+<}<#t*5tn{IB6T*!Q7QlZR>SKrUGZwceF zxw<{1O|W2D#Uj!o7A4|8TM4Sy=J&$&*-AwJ^XZ727) zpLw_a52^okP}_4^u#`D-7T=D-45u@7*9tDZ(Ed=W5||;oMCzZ^hXuWLt9!~Xa3u-I zvON07AT?$EO;B`#k^m6!0TaSvFpGh4JBS9Qg{aqLZKJJeUVIB0k6MPrB> z7|Hk$Xu=a9kBOHHB*u6hEVG}1f!zhnVqn}05(b&J#DCh`cCNx@vlCCRu;|p@Q>ne$ z5TXV`R?NwraFFYe0gprVg~M$Bocq>V%{}DzDp!ux@x!x)c`r4ll;!Ah{OjMpGPM2h zD@9J5Nz(u7U46GEh0#eeZ=uuf zOP;NgUR8X(K)aXkgWoIVa6acV`ub-cSamJ-;PPU&J!8ICjdh{U~7mfk{7~`2UUj!qCK5d>8|GQsy?`WK_BCoS_?-RZ0 z&*wd#)b%lZn|naje1lWPHrMQz>{alYux7*iPRk8klY^cv5?CRe!nV9n#QkN0fV)A1 zW%0KKCTm*uv~7LhWyGv~)=Trp!d`VwFAxfAKlzo^H`^2)1-(h4Yo~H|1Jt{cM_~Q5~%N+`0e|0-wh!tI-h?sKjCJ1 z8Mxq#^MjW^w_kd6LZ?apQdOJ(&a>BUPd{4q(}1^ak7BTO-c-IL&&~e`-}!sm?a%pZ z_s!1fUwwNqt#^yeZc*F7FZ;8<9cY*{W$yCt#{4b$&u{y_?l}Kz@kJ}&E(7$o*&*5ykm0SiNCE^wof>h<)8fP^$VeO3F2XA`?maFoaFXo z_v!fe8x&mMFD+t|;%)YL-uatJLVwPFP*j1U7YO)(k?aFzF)(fi(cpNto}0a)gL`Ik zLdpZrP0mFUOBTO^sDY7;_kkun0`i!6xje8DN!61yhp3ck?Vt(~EnvEb(N1^L|@T!m*d#j+~< RvgWqTy|yQYVN;9GGyomJQx^aL literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quart_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quart_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..fde9e178d23d0bfbd1736b69df573a2329f9313f GIT binary patch literal 780 zcmZQzWME_f1I9%R3~WJA_Pqa4(7!GC$^k#UY0Wc!{Eg5!w%GGQ|96NQ2w5@bY{-4@ z!v+F%aSQ(+wmms#^IbNr9F9{LF0!i|{cqISn|JU_(5GajNB{FSmAyKkezJL~@8mmA zKi&Nvd&%J6Au|rId?UBi&fOoJZ*d&rImz{V+DzSSgVmv$T8&oDX$8~NGAHq~Wim1E zNIaJ}wXJo6a|G8q72^#T)=X>4kLFkIQ0~!REE^Yv9{azN^Sr4 z?!ezD=JL93_2XM~Ib7~~tg#hgcAc@m{K(n>miL*LP8aX^_xm#23~i%nKYs{5a&0Qn z513~7;me=f85@(u4ytF`9=6}9J8kvz+fV=GiShoN=ks<)sFl!s_8;~I-~GQoYJXxE zHGf-0-N}OHeY~HFY}N>c{-3a&o&Cv@H#&RYS1Q!l-YXKbv2$8{(W=%Zj$N6pk$a1n z>6`;u_kY@({%rU+VLF@E($8M2rNY)Z+VVd))j#39R^qtFtot_a0S>Gq(p6PoTI30vTWo`-52wjN3spD3YC|WN$n;;iaq3BJwak zz-Jeq+1@J7m(Nu#QR}9pv*q7x;~)UmmoSA_X24~kl81u_U?bl zGRa&;M~Nf%Q~SsA14r8-Y9M6AoaBUrna2+t&^mJ9z=ye;7no?O8%HYYs@rdLQMBEv zqOeuN(saFwq3u;wd;L&mr8t2(v*yg79`t6`p`GWlJ4KBhf7-Hv1 R2*$UFy)?VPZtya*@i8`Eu51?znL0Vhb0HCbeh6c+H~fDP2VF8+5X2I z#|n_`;X=y-*Wcl$w+}v-Ho3zc%JmWx+u8aNpR26iweGpAHS~V-4K$Z^Z6t5 z5pI^3feUn;9!UP!eeKZ!ohJWFzm)z5->cdCvv_};-I?Y_`)k40c~kj9E(NpIzBqhw zBGdb|o~IZ5f4;+6-^BLW4NG1ZOPkbp4;d{rt7IK zUeu+%Ma(qjz%z{+`MiHl_4l}$mtM+T8OkahzBtaz-TdrHXI;tT4!!%UtrlEcbfCE1 zd*uw)b1L%N7VT{b5|}(U?e_dn|F&3cug_47b$DnWaQVq9nS=f({CHkSowlAUpY#4F z<86PP88sX7lKjOCq`&S_JL~jZs!u)EdLO@ik<$6-|MHF1L0_UY(;uAZQ&{q$^*49f zo~?PHxCF&N5byz0!B#MffpI&C1|@`P6-Sp&xjXImOVxsff!8-n&CNYs2vGwg86N>n zcnah(@p6I07_We3_A)TA_kmdqj6gO6BgnM*+;jhb`w=0zLRs#Rz+-WH2blvR5H%38 zVoq{GLgd*42eM8dII!YOWWcN`lV`4(Fm3Yuh(#0TMF~xanlfir_@o*0UQL=meHEji zK8K(0x%1wdWoJEgH2i!o26~)6<9((vORGRr*GuQ*ne)!V-_D-l_CBNO>niTIhJia< zE97%gVNu$$%!~z+>lfsA8-zG|A9Ofx;v0O>?V!M_*3BAQmu%7CPZSB^o#15NX(O21 u@_23K&IZS)EJs9ncz8++c9(99=zA#`8_lZhYb3jn`%>2{A%_0Yo=gC5DrcSm literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quart_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quart_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..dcb7bdd3bcf50fc5e8a15e76d4cc7f8d2565fc4c GIT binary patch literal 792 zcmZQzWME_f1IG0X3~Y%|_Pqa4aQj09|5=NvTf(FtJundbk8Yo+q8-6~9wHQ|YJlKzvZsr;L{tH$q0%1MvqJx0Iom)E_#)l)0=D`M>sO3wWMocw7vA*T3lSo~>K6M0Uxv9uJ+h#M5y8 za?Udk!&t1M*rk{1C$3&{_0ZvConhLQGP-+=gck1E_jAi0P468|PfPdxn4>TLbdkBn zr6t_eX6z@cZSQ;*yx&ytMS>&bc4m%bcl)aN3J$kPo7n1>o?N5x;Pij{#m!qy=dt|m zf1oe4guQiFUt{{Q{O4CZ1(?`9eLhO=yju4CZ{F^G@vhBw8(uc4yjBwY)%0KY!<(cD z|0_)-il4`Sl%253F}Cyaw3%6(rmv8cnz7*P7NhF9?9KN7tqQKrw)x)c%yn+h(>x}j z=KZ`v3!C{jNL#&ESKqI6|I;n!!&=6w67nh1X(|4Xr+>%1b}bW9u>O~aRbYFhr{ytz+JOKnV{ zI^X^N6;lo8crN1em0J%ICzy0i^0|}mk+3KX6ltJ{1_C}{bSHpW42;`BG$_We zioY|eu+XYGGrT@M)0*I_4p9Rm86N;mcnst*@p6I0825rmhS@;VK7v^g5k`<{ zYmOAy@@C9b+O3^iJ9R;w`jkcCsSq^~vSLnhLPF$;0|!=}IdDMZOk}{UDU)ZenJ{hg z{D?&p=0yojh?+8IR`{eD^IlDwKYbOWpgxD6@455dnq_A_bu|2ZF9v#?KI46+F-xmJ zQ`bx9FX-)w}yc`TPx&qQDKqT(rHt~o@%~0bX0VUh>6JsosbQ# k1f!Rr7V+u_B1O)*Mazn02!lHVy9Lg}-E9>vByrc1>isU`j#}6|itd|sq?A%+< z{_eU|#82IMa};I^c5IpyQKiAQsjBX6NAyCDdyiL4Usmw{`*O|=At^eaKQbTTX35kI zc&7N_%b)1X!X&YS>Y28O?RTEtw)^?fvYoS7o$J(st@Ebx9eFPPM}Eie>FFQsrK*E1 z_NSCP+`o3IC@1`j%f^OOC(|f+k@)_H?wqGi&m;b7}s|6CMG1OuSqmF~;>^nLeOtAW{nos(zII}3k1dxqQl zjHa)vxZfHE?rg1)&qakrVoRq@5qqlGBDzJy=6h?30|Zt;@ji)2aPxdFoj{TEQ!V7WxKQ%sCn;v-EMH z%t48Ft{<$E6IXr_T{Fcb$|52vFjKXBZELWK;HKNVXTOY{cF@!(fAY!gDOM-ddL57^F&@P;-piVj~1_a|16wm=8>P{uWFlCz*lQw z74TrKX{O|t!oKK~g)cWAIhVQM)I-DKHg=IM?@XF6TM7KzccbK*#9mYVZo7!8_=9{t z@}V({zGpn-Uc-Or`NL=YPd>+4X!QDeXKO{YOTArWxhvC;XRC-%b=IH1pXJtuvd*)L z$x^oQSom~<=wHz(T`liSW`AC3Ghb}^H-6hC#Tq}DO+E8Y3D&f~Inl6gA?tRvKVM~*E#{Z0-1zxjzg}#(9lvjp(lY)3eh(UX_J*lhSWH+Vo>%bjAJcZl z?fjsq1Vuj(@BtIS9x#i6aXW|xrGtyK2$=~K*)+Y z$q5OOXAc~Bb>hH*j8l;Tv!+a*xn{z&$@3!?O_&!YG$CrroLS+MX3TpvY5w$8jDq?c ze!l0{nos(zII}3k1dxqQljHa)vxZfHE?rg1) z&qakrY0EM*7D%pNkl$?(;^=+Q;k=1&@IkkO0;^g#YiwPzMT0+4B!qW@lX+*9(k+hn q5ub|~na}ffyq1)Z`1Nro+vW6K+qm3jg_MY1FbG-B$gphQOe+9wFKHqG literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quint_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_quint_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..37a9b2262232b764da1c232fb93bd3c389da88df GIT binary patch literal 791 zcmZQzWME_f1IG0X3~VV-_Pqa4aJZm9P4;^4j%2m-pEE+89BaQmSA?j6kQH;zhU8}7 zHW2tH)BOK%tyJEvn}rFoCOlD2(ti>)Rev*g)%YDrIq9*y$LQDn@;c4jV|Ki?D>kO? zo#S`j_WVmL#riJhrqcG98M}@J|9379U@JCR^1|}F`^Ch2x1vnBV*3s~*7CiyWXAc+ zEYAwGnPk^C_g)I$5PB)=Vd7(#)l+Ty#Ns471LE%2MBbaCTGRHlbl;Cz`r=O)nQL5H z!d-2~ezMy3&Syb?N69K4mQ`;}w)Gr!zN&A-qU;&Ty#I1an8=5>|L0#kcuUH^>96|- zan4K4PO--i7(d=#{7QwRu~}u=kDfbOyMGsMkG;Qsk)!;L630oU6FF*+{+FvLGd%I% zNUCS&=k-7MJgzQScO>()kLk_qD?GeD7pkIW?mgRlFuq=P$1C5sU&j<#)9)3VGj<-l z&(?Y2p!yBox&4zT-=COY`F7#Pbs2MV6UD7cUjI8JHZ^fY?*s|YPq&W?TP@G33EqA& zOu%Dds#)1fE~(U(d12q4J6GDRQSVfLsUp5qNBP>!1r4*fgDMXOmwb!;HhKDn{?+eY z9v{EB)u`=r?`pd{lG*d3rEPdtxd~40{LS2OVzDGB(m)Xn1bo2gP6o3W7`KCHP>lbK zI-4X2P_| z^CK2bm=`59A!^E;S>cmr%zHIy{`6Ihg8CeOzUR(+YnGk$)Y0(sy%^|m`i%FP#w@J@ zOz)Y^{*bMTJFTOQ%f{d#czXx<$mqw&UKc>D&w%iK%x1tCd!A literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ba3e375236e13a64f9ecdca78307efb07796db7a GIT binary patch literal 916 zcmZQzWME_f1I9ZH3~bk-?0Ns8fMuHKyhEKbIUd!nwdc2I_qu-(&&=q;+}u+t^a!nZ?@&Nzj9;K z`x5o~@3ogio&Jfiv%Kb;Xpq^p{8j6-1w3vU9v8iz^e;M~v3=z!kzE|E$B!CFuxaV9 zSzNz-+L98LwI5Y@e!d92P*}Qc-DJzdkyFh+X6LeoE-ZDik>h8UIJ{TmWrl3dlz9ij zJXg22_X_U}`*g#lB30$kn{V$f|H(6JmY#9n?eh7HHCD637(W_loU(0ieiFmaA9JuT zP>oHZ?bsaduMHqO(new&2ZHV)qaE+_<7W+KL`>nz1 zjvO&6hWEpL)NkMIe_Hl+!wcSuvrDyABd-h3P5&Z(F|F+J|GrM?ytL%hHQQ@7r zha6HL?o4W9U3O*HT*;U}2_M3rr*~^T*eWFx^wMh0R)t>)dCe{_9x%Uo)&G67xctQa zs#l7e_0G*Xn;0(kBJAqQUg5(5#)=!&H@=_m_hOFM$3;0|rV10BP8$Tfy}0Hmyu<8! zY;f7xEmL=j8m!r?%#p8BzG^$)@x2$@SqzuFsr|R>&$haM^LidAd(?efT=z6Dvew>6 z{n&?ZkMHq&C!h7s^XA`rVsFOjBYzq9E1yjU#V{yU06_>aZJYzM7#O#MXi)MnHn)tv zH0@;4?4u={eVI9;&3;rrg{Xm%Og;<@O#VO~6E7D718W2j&jRwSI5~?_OG=CK6f|^` z6|@xGa`F>Pd=pDD^pf+7HA)op6;gnr@g9yoZt(%0nhM$q$v~W>X$>+3XqW+rWLUz$ zz^)HwF);20(u^QC*){nee#LJ4<;-bC-wH>oZ%hyG9fhcYkQH;16B1HW6B6d0IB?*@ zw9N}lG}VnG6?N6^H@Ya=ZdFm(s$prmUd7P%s;a$ysIsoHz9G9-w7{HMbLLMEdNXTs zM8KR`ixxL1y$p()5;1A!{C2fBvuBD=n-M&#OK(mDqu8~O70;eNdZOc{tEqb`_`-!& zZ;cGi9gS0dsZC3Hq551rd%?|h3;H(*tuVWH_~LP0y92?&j?#%1GkCYgU!FCco8i*Y GU{3%--Fxx? literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6ad3ed87418a40f9a5ce73492648e3818c8b6157 GIT binary patch literal 944 zcmZQzWME_f1IGId3~Vo;?0Ns8V7Wq@UmHW~(eFkPt3+mNo@^_UeF9MfAuHyb4fV}_ zY#?BJe8PW&Xz#>0OFXexOQor!VO({zPr)~POfBm0{W^q+fH7g9K zxmPLgpJ^@?9`olBJ4-Tu&ug3G!L|$RJbHOdJ*!gRozPBMdNNh5nsHPHr-q zW>@}IMO4_$`q3SrY}bJu!5e~{RFCi+j5q@U>)N0rMjEt)iK3jE!Z6P2%;<}5Yn zvc3@!r={7ad&pB);L`2ivyax!I>aNkJ*V!t*yoZs=1GMiKWiJBIrj0*b7I+j!0596 zJOzWmh_(pXl&`05WjkKV_+i}V=E-#b|NkuW3jUggzif-POk43u@kh_0*vQI9EdotT zCOoby+x+(3^T%ahx5)HVPxgDwDrp_ycAoLejN_A+G2DxCiME^XR^f0;s*$zKPC4?( z^Bv5V7vfgtrG7Ewm#Y8&`($cw+pRQBSyY#!q2h=Y^He-YnyA{&Vl8Q-4X}dh1Q{kq!bXU;T_d)C*XDpWN`PJoBH` zuJow(Djs|0iYspWryaA-2$6SrGhxU6fVj&XphyNK3?N7WCJzXUfpI%X0F*-do=6lm z9_qUpvC$`L*9V4}6>-k`AUPPQn3J54P?P|~X$(SpVt9Dg2s-SMI`R406CE#IP2E$$ z7cTgQT?jI`VC>5rB$a3Rvr~0nr>bPt$)8816xxdG;tD;J;ygFTHK+%;b~f#E>RQ&c zu4&=2rfp7>mYM2{Gd%bz)&;VQ$r)_pS_TGo3y9r}dx10~$c>Wh_Y+?lh+X^6db?eC zjdIhYd5iu))Ii9JIk9~QxtbgV9KJttJXk+tadc+siz|lQRvb%_TCmr2Vd@6B#hcM;$av}qMszu~L+U5yo69NA5GPO@@+vtijC1J%&OEB0@*ooH0E zwYqoh($`G?Qr=mY^giU&ld@a<&E#ms{{+r{3$DX`bKXl#`l6n|wmK*HtFk4JKI^XN oWj(%asp&VYQqnhnx)JYlD8cfYhex7rqFvjGT$#O$GgL!^0WNHp5C8xG literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_sine_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6e1a92f711f34be79504931bf856fe94c8b8527a GIT binary patch literal 903 zcmZQzWME_f1IAkn3~bk-?0Ns8pzN%=gJHS0f@#I{SB-LKuBKJ#`ask`$ci~>_*anHZ^lk1n1F7Q9hZ+h(8 z+;>mj?|WaOD!%_G1!b*r4?CTH$dNUnbLnP-2qwcOQ5`^{ea%GU!nY^b}rXKBN%;zrw-wZ99TvQyjM-+Fdcgz4baj^dR&vt&&g*X`VI za&+m;tybHaj%_Vx*~oGERqm;c2HTRFST;SV1=_Z?uFl8(gXp)#byM>=|JraZk7_^1 zy;*+Rtryb|Rj_Z}xA%lp$8UD~Z|6RN;un-AfWRM^GR}cn42;`BG$?WWF_DqBsnb4p zM<##m?*$)U=&WEo1W^McnS2=-m;!)2CSEQE2G&?0o(1HYa&i`>mXsFdDQF}sXeqem zdI~OSDgNF1cVf2k*$r2(@ZZt-;GcGHQm~uaj({Six0PKle;w4k_eg_B*E*kd svixz$XYV&Dlt=P;O*$zP{`lk7u-#`B*Pp8G`dm13-QyRWn*{x(0sHrP$^ZZW literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_strong_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_strong_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..40bdab030e519d7839c073a37622a9161813928c GIT binary patch literal 767 zcmZQzWME_f1IEP+3~b?0_Pqa4aLul7_VIP6l%*%D8OQJo{(f5jN*SUCLRQQ<8*1uNa?MSV+`K=l2gqJX?-Fy*mHt)g(so4SRf^)lYs}W0)^{$zs*) zz2)pLuUqZ-9R22ol$J45=v680{-ci9q~1wSTEla2zs0O2nlbtyIK-o`h0JDn3)MIeE-9qdH%ezPy4^} z)xNEn9^W~q^p%&)G@lT|+Vi)ZnX|UY=}hkb@9^VO>fzAWpRU#E6eYXg;dOBOu-!3j zO99jFybsk`pBVpYo|hFlwyf1u^vx`(x4UdNWV*>^DXOqd`t$5#$F)^5_E&Vb2=WAF zSiWtq;cHb|$bP!cX6oZiI}aNV^}kC^Qa#p3ALgm}GVh?>nkCG|``u6VoR~gi|BHvy zc=m=ZE4;ud>0#69~ zo{;!k+l(PtFw`SQ{PaO?E-;04Br_XqwY0T0p(A4$PIeF&1v+%dG zXSlu3X!^Q}`>kQ%&ejU~TvS*jwshJQv8ReHqFY2vF02W@u-!Fc5obt)p8vcKvqPQN M_QWse8}Ih#^|Ex;naH&H4w65&e>4! z?As0kcF_y|8!S)S-I*de$tlLU$+L&Al<%B;#Co?+m#(h4(eADB^L^||={ZNpi@;$a<)rSlG9=!@@Cal?Te&)^1e4E2U7m2MfPGJ+zoTT=% zWR{viYxJ`>ahVa^m5kB{r>3x7o3%CQ!{5Ne9FI7Tem#5j&oYe%LeH+>d=qUpUvzVv zqW|P`Z}(Ug#hVpw`6a!6D4|h(vspQ>Rq4lEwZ%5=PyffevunE^ zGkR~|wBKWb9Lp&!ws{lxTkGHdzkI*%1)ceG@!+xQ^|{HO1yUxobN*jmFm^}o;AO{=Sz?k}uZ>Y$;+Z)AUC z^KI5p{M7Qm#^!!3f#NqML*@?QRzIyJAa2g zH}6gpaD+o5UIv&14niW9aXW|xrGl3RGJ4m8mc4$sSej2)XWE*bC!hI4)WAr_$G{}> z49H{RX2P_|^CK2bm=`59A!^E;S>cmr%zHIy z{`6Ihg8CeOzUR(+YnGk$)Y0(sy%^|m`i%FP#w@J@Oz)Y^{*bMTJFa%Q7<-NUmRy-)#`$=zY-Pyoqn{LAQeft6Dc}Y+bTNgFjIugm;3I xd1sW;EspmQpNklo&r5eiOGrrk`nZ$ra{8`qTyC>MN<=Rhge+%d*!N(j9{?~pdXNAB literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_strong_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_ease_strong_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0b68c7055fbf88ed3e1b181940b00c4965138d1a GIT binary patch literal 791 zcmZQzWME_f1IG0X3~ZTD_Pqa4z|qo^IK$(Tv}^AH6^(4I)Hs97k`OfzvSQBJ5Z~-O z1_HM05B^W|J9=};x2lDjDV!=gCm%VRx4)IYa4LCyhmFyt3U7^{@2A>3J-QTpQSsQc zuZB{4EAvg(PB_2F&0w1!>r~ZwzvYA0as;b{{h73Da)x29&q}RUGuMX&!tRArbf*`x zc<&IFo!`?s_fq(V@JksF6VhE5Pqpb4^PA{$VtxL;wfUc9_8t0V66F4N zW$yWWm)@6tc+hXL!8F9alxJ0@shM0)^P>35Hy)deSoS~8n3!7d`~UeD3E3w$e)z}y zgPY}L;6gp;2a!LvZ+)dBaghDwyvLTikN*4cxo&^$4VJ@p7c#9+9%D=TqT3+(=}D4D z!}W_vKJ)9{B9z6O4+t%{gO{yEfN^=6;CF*4PcxqY4M?zj25VH4V;I6E6d_E%di-n!~Yd98LX zOS4FnTJrSu3xZU>Y$=+<|FkB;Ps;z2XZ*}bEqgEUNKVf~a%mFDN~`*PS;vMST(c|w3`$BcP9?49o{H3dZ)D58OY4;bAUU={=8b`TAU@qG7B zLd%}~6OK4xxO?BbH|wS_eK-kG10xw90!?@VV;pclX(Bt$O?=y{AS_PWA zUOFewoOc%fcJ>Un_ZdxJS8=~J4BXjTA)kv1i^P^rn6LCH^CcR%Nv{Q i4n?uXvO4=NFe_1g(wWiBbJ=ajy;;+_8A|w5p926yFHbZ8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_i_ease_function.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/ease/_i_ease_function.java.i new file mode 100644 index 0000000000000000000000000000000000000000..613f2ec8e094806dd110ee1adcd508d4cc217ecc GIT binary patch literal 659 zcmZQzWME_f14efS2Bu3;_Pqa4U{a+tCxN&8c>APz@}(DEPg&SI=@vu{gshmeHZU;z zkbyv2Klc~=JBx*C8_2AoJ;jlym3mV^iP$}#dn^&^4JCc=k7YL{!h!m=SwntYhB++e>!?91QeK{2mk^pU^FCxSqzNZK{O~P<~KE;-n0e2YUqIBLkOdGP<9eWJn}BR4UM`RbBgDKSpuifaioGCVkjW)4t?va! z)s#kTNl9~SO_?g>v1t-S4TP+ilbnz+DKR0T3rN3ss-xk1>ZDJYhmV$?rk9UipvUQx z{yKpk{<@qVx?X-~wLN|OOHZEnzUp!MjQ5$wQ(`R3)t*0JDzf{TikQgqWiK=qc^tY!SD5SVODn+RB{_oRTIC0B@lO%m4rY literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/util/_shape_modifier_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/modifier/util/_shape_modifier_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e2cda47193484250ba14a046df0bf1d0209874b6 GIT binary patch literal 809 zcmZQzWME_f1IAYj4D6pEY=*7>q2QR)Pmh=%X~BO?p6}SklRxim!Yg^G8ZcEc=WOWx z?Arzcb=wa9KWy8pqP%T$8BbJD*siTCv%V>oRBNPWe7h;OS=Ha3E%izL{gZx|ZoYK3 zw&@U@Hu2rQ_q(lM#%zAVep+zJDQC4yBK12tUC*($Y4Di$FVu_ZO;in@R~WL;bdL@1 zp99ZBb*EM~zD|0&>?zxVkG*P>543aEq+AmTI>_sva?&J5Gi<7j<}Kf|u1yBkR-OI+ zY4QnNAAe6cw!1>ix>@5x_V2l86cyunWoKDWTKTa2L3JR@=lc4n25!wQiHBY=eqfta za&n^&zlZ;1rBq?%tBfmmIVA@il#Vc!Z&%LgEcp=3J2ND3SqiIm^x|Cw?3Pg+lV)vX z;n$cbz1Mlc#T$2`cLldC%WH0s@lAiIZGLpCh-KF2lUko9Buyzicxv9`zsy(Wvf7q? zzyJE6cXk5bp=s-SE91hv(iXgVH2L7tX#VNlv-9K6t$%N4zO8p}h_W6}!KRlNTUEE( z2L~*kHTTlLn=(nWmR~Ns+SS2XFT$ zzrM1lBKOPhDQ~~s+I#(WfT+~!7VjCiW9`FtnMs5j{>hwp>+7_iX0HSGtV*bs{KdcZ z#=`xziHyG@e_F49eQ@1PCl0GcUzA&m6^|yXu5DYU$#aR@wif;02#<+3O3dR=#-CO76apUAk7GJ%7qC9Yxi*#d{$47XzIGty5!dU zJST`62nlw|%G88}%mg5K^fW0U!IU{kTcY1rup{)L4Y$I!w$FTw9}Ok?@5*#6EMmCu HhUGT^9sp-0 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/util/_shape_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/shape/util/_shape_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..97fa16e47f89b6d1d57d5dad576d375afba0afd0 GIT binary patch literal 614 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_animated_sprite_renderer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_animated_sprite_renderer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..92996abe93c6ffe11a59b650a9d9f7048e594d52 GIT binary patch literal 1610 zcmV-Q2DSMB0RRC20000000s&G03d1r0000000OT6|NsC0|NsAU+15s93ULY1`Pz6i zSljM)l~XwY00000000000001ZoXuHVZ`(E$es+NThtmQpoF7Y4@2c9@qRBj#*b-3bO)jGu(e%&s z=jiUSBEpxz)AXB;CG{j-Fu}dgETFT`Y1@TqTA{|cdqVW`5?|Ch!oJ{26Rs5+3+X}r z%LF@k`EqjuUcv_w>!pxz%6t(J1)n4d1LiN&PQ|!SVfg0l@b%l@U&AiEdgBd;-mAUg zULr8q+=$|@C=Nc3Rj|)lh-sNkO~NlIx+AFs3=&@zn2?=53?iT*7D|Dg)E%&#hJQCV zdV>LsAO0^@P-yHxAF9A;uF+{gof`8nXPgAUxQ64iv-7_W&Q3p1PA|_cr!a=yp~-wF zQ5-QE%sLL?s}KPt9Ky7Wh{%hWbH*1VODqt4QIR>9Vj-zYP}L^#F_z}(ihQ|(@Cfln z4-p*`eoDAd6hS*vw#6i!;SrNcCkUD#a=wk+?g?j_k>FT}=s?6=*901SCWVj3Od&`S zkYTN<$(h9KTw9mGl(Dac?5eQo+-#ne{S>No8iJ_awq>SYPsI@qZ0b*vdfQnlK2fc) z6fa^66ON(J ziBCI1!-unLDkYoIG8fl^%|P&!cQZiD13@%I({v&p1|(8+mSu*``^{O&`g^GgGyOTv zW?KnTU_a^F>O0zTrLnl)JKaA$n;s&0ew>~kUZigZV!fVYKW87<9yeG_Cufu2#kluw zopZ9vLu$47+qi9L>S<}!`+f46r|K134LDe*i7v2@Cu z#$lyJRD_;0=IXTHu258hDk`eJw(@o`Rg_h{sI267AvHB$p)^wCfEooE z8=YcM>(-|_$L7UO!yZ>`WqP=F^b<*j0(&ETysHet-`m?coDuki7hl*Fa$hZ?0{Ph@ z$VL{LE6ZcWv0WI}YTR-ZNDby|jmc_c;>o%5koe1nbvPea7v2HfG|{b29oWhC@%dgM zN~rLjUiGs%!%)8@}wQ_&~tw|)wM&YMU zcqL0d+gpOufQu~yE4X-?Yi zKE@3NwuaR2lq$F>&*9-p0Vkxf8>F#n-8VKLm6J=YgdoZ*t4ieW?>uE^MJ&s9mlb!% zTw1xRgUvneySi4M{fke09!a*`(-;%4MV&{REjXXeoU7E6$?@@|yiaxRHv+^}?pThT znt@sll2!d`)PStqS5#Hi+zi9YmC9a|vhvy|*_n^5tB6Fj+k5#5=Z1P`$jX9$4@IoN z+{$-#8J}@}_SKN(SN%=2YY_VApxjTNT?EmMSH-8yPF%9TY*?4HDbib(*{Hca-+SQS If0gTZDZ)b_WdHyG literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_base_sprite.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_base_sprite.java.i new file mode 100644 index 0000000000000000000000000000000000000000..3cf3785bad8c3f2bc8a43d3608f4a4dbaa84caab GIT binary patch literal 10321 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_modification_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_modification_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9b0be042e5cf35615effa7bf65e261a3b076718c GIT binary patch literal 292 zcmZQzWME`~fF}$LOxjSk_J1hgeWW(=Tl9`N2&{@`AA^3A&orktKp0w4F!HfySwD%S}K4yxiVpSFp%hbIFR;UR*04F!E=XFvdmh=2W&}ubCgwpDJ-P ztLaJy!-nQd{}sr!xnBsp2>0<-utg(}4t=lkE^Gq*m%<=mlP c`~QlH+)#GY68^CNYiix!=_2<9ZDz;;05tr4?EnA( literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_modifier_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_modifier_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..dab29c7f80e30608ce7e6e0d99c97e4131752fcb GIT binary patch literal 454 zcmZQzWME_f14bPN2Bx(THiOQ8D9}GXM~25|*XCSvk11|jc6Dy+$c=`o0aF!o)=s?d zb=W}U*v+R*we7_#oo8<=J{u)?ggf=Yo{yZHo}_eNTcQ$~*zrDZTTa*ZO#+|VKR-P_ z{e4fzhQH??UT{*}xa!rikgqwdpJy2^+pscQF<;75yyvXfvb2~reELxz`~qHInggi%Po$UqI-Uk(V+#rsguPo@6kGy zq`yG&<@VJY?72)P>;jEvx}LfG;*J@E{utXszIjeARHzKpc&3U IHWM!w0LoOmE&u=k literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_sprite_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_i_sprite_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b3cce9730c4b8c861122606a4b46b00cc00d92f3 GIT binary patch literal 769 zcmZQzWME`~fX56BOo~vp)_*A2X5w%wO5^^?H`X!17d4prop>*cL)Cz(iaBco&w8;K z^4R4sd_Q5abw>KCjvY!J3pTZX-SmTD6l!sye5DCee40ILT|N-+4E(N z`FxXE_DK1eu+*dYeQWstPkbbPr($v`*q^|_0Rlc?5GjCJ3=G;J8Wc*E8^5}pI~%5c zn62oMZByBrd5430E$_D3Z# z3m&J||2leA&-Wy|t^`yKn5vkQoRBanl_9x}%`Z;xT+^i`bIzo&`rrRE<;<2dSCrq3cO->9^>BtEgnTo*)|&M+~o*3|O_8Odl5 zHW=i$`Ct|ULl}@|0=eeiCNXK<7sU}(XU?3z#i!Ei8k)ojRRg7%WPwT*KHTudUpfzKivG4ni3p11soP(-?Qs9sRh8BYqCodOgL1|J> zX0k$AerAe7QEG8&iH4>%)Rtnf29TR~K((d;X%>(zj)(4R2LJne=ejEEp?Djy1q%gE M=t9*%DdhM709+0M=Kufz literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_sprite.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_sprite.java.i new file mode 100644 index 0000000000000000000000000000000000000000..79d14c20cc277814b1dce2860472e23d6aae1ad4 GIT binary patch literal 3894 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 K3ilfm)dDNIKT$CN literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_tiled_sprite.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_tiled_sprite.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7ed6eb6aacbaddfd215756f7e2df99ec0a22cc05 GIT binary patch literal 2489 zcmYLK3pA8l8~(-^<9>@y?w81j5r!iCZn+G(Q<+Lk4mBznWTIq-Q7FHd5+=qpVO-)w z^$Rt^3Myb^cwpZ3v9sG#kEMEy20>jy(rf)H8#sfvTFR=U$fcQhDQjR>`Lu8 zpYiZ}?uQtiPRq+miB-dGyW`X?!ps*EL-Fs#td|@$zkd~2PEUS1<#ztYkZzkqbyL^U zsb$372|8wP;egDX>d-H%+oO)Nna9{_1rzR-$CHP3>US?<9cz6v)~@cJ-zz~e-4E-G zMxt}si&6#`IEb^m`iRM{LFX2v+~qhk!9VhcQX)7dD`5i<9v#pc=}{mh;FLr8CPyO@ zlz)6p-t%L%`#9^1PTv?jJxs%R)}`6-t^eV(UU1~M1+||)f|S)yX{Nqh4LCJCvDBa0 z`EB^;=dqoq6D#7Q7_t4R=@{e}xq#;=CorX89SFxY01%gkEC7%I5iE$sh(79tJ4vLA zuIj}@Nkv1bmDvwl90*AClcAw^UvM~yxny!{W|dJdE8VJyBF3PE@Ji*&PR;B3x_)G&fvlL1#n`fh){N zs3R1#ghNU=VW5s`zvU)pxADN>mV{Z@gM8z|t9lUO--SfKb<@rpZYEFdt(|mlOm&&M z#i1E8bY&V~qK0srGp@ulJxfl$uN+ztRxph(fS#=A#CyHWdPDc6@V>t8p-MPE?S)VoBGLcSK}Rb03*ODOi+UMb-CtNAeK8;b;+~Lg&Pk%J8pLRvcm4(u#I1oT3!;cIN?ZgA{G8<`WUa12&=oLl4qVvM3IXwCxZH&U?2xCTNgS?{{skU}ob&mTuqr4<$zl$86X7?weG)D?UTmxE)$%%#JD?eU4T zY<=ziMIJ3zTE?rHVC#<=z<8WT2^yxS@S&l>?HrD(?2_@^@8S`6#N#raJ)@w%0r-?? z0@gLz!%X?0u&9w-@gLDS7+4D-&H?mW)B^H8M=1Fkw1~X^oB%!gXpaPFlpS?X*}fVgOrj`opi`ooo!?ui zXLQTgG;kZ#-$){;gr-jQpUl{%6 zRoo>>%UD~>QrYBeu26FS(+zN?6Re~>@`&bn%1-97{s9!JOmk0vOM&^aVyu#Y_<5VB zlB8~&lJD1>r!M7ip{Hg%uE{Q#Rna$8PVLP&C3%*^H530ZyO8(h=j85;k zk6^o~Y7aZ^)g7kb&G*8q$={^L&&V0w?sST;Bq?@J(J@ga%cgd+q$EP)zu z8iym?bb=iU%WQK+=C>}I!U1pfr)bb)u^W)zAwsQnn+jlm3sD@59D;PCp1(r%Y3Y3% zxb2ft;!F9!^-a#^3ThpTivUih2YQE?{M&&!8^p}pqqqw wm8#vmQv@t{3D7$=k(vdyIfak!+LN+d74r10@boPOn@l0iSvXyVU&6fp16#ZJ3;+NC literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_tiled_sprite_renderer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/_tiled_sprite_renderer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4162beb7349bbef1f520df301c2171b47528ed70 GIT binary patch literal 811 zcmV+`1JwKg0RRC20000000Qd(01M;*0000000OT6|NsC0|NsBF{>gP2YW32NDRxaH zJSk#T-soZg00000000000001ZoUK;hZ`v>rel8OK!#z#3>I`(6G_|VKGzA)o0s=Z| zPnDY-;5D%=+hIjh|Mxi#P}+vVP?#)e1|bPzHX}IejJx3zfi#874S+nkm7BCPG?pjGA=1&Bi8XiwC!aG(km) z@0N>QkUXdvl}N6s#v$5o3f2GMf z#g@ohjHL^;TB)C$R4Z@-S2Q&u&cf@?#$(Iwa` zDWo>TI4UU~sf5AMU<4D!X$&8?ACkh7D3e~5hDNB;Gb*T++SV-PN7=C}q9Ze7niP-# zmqnn9HH2|yu4C)Co$@eiJhkKO<4bAWb0e;v9!jDwKWzo+PSJdn)|MnGv@#Cc zxLPKD^y+|dlUejrrEKTQ5P{vI=RNI_Lg*{KODA)|BG3h@c^PCe$hC0Cc9SAI8|Z_b z`yx&gehTlzL-FU}h*l=ohKhsZ)>@`f+vVt0vD^y2LpvF4=bi{vpD2;QD7DkW&pLfQ z;I^hGG{lnn!c~8cO0fvv^a#g;;DJ4>d5>7`jvJsL-Ll%6?3w_w(_ONqvslR+>`FgV za*bd$5bboPk1;M;)wNF)d?8fiDMc4+t(RR1DChnsD#I*ad!(>>&#y5c^L1Al2<}N4 zzmKcLLMUqjusJoDQ&Z4|^DNn<_E~pX3Tnq2FMXLA&{mcV6yBw=VRGTca<*bFr_LVB zw;tD5IC9->^={htJ%1eZdk>@j{m^ec42G?{`|daxbboo>!L9dj(`tKGa0=UiH?7e) p=y~pW8#=GAmr}PW;M@)zd-ns63%*E1s==MsQVyw&^B>1HnY2@qer^B& literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_alpha_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_alpha_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1ad03e3fc33f19456774952a922e2e10fa2b028c GIT binary patch literal 696 zcmZQzWME_f1IAqp4D44SYzBk>P@rs;{wMBw&c#&e^nWjoaholDz;z9(2254VIU9N~ z@3sMt?eT{Hjms5zqpUOiaswB{wu>=d`#ND!`PpT{Nt-l0N;V|j*zX@UM>Uc^mp#8j zUu>SsrseJ8WuzKf`t_!hCJZA;u-aHw7 z$WE*O^Nu|g{x{z2)BZkl&w`hyo-GcXb%0}Ch_ZLthgPm@rw-2z-nuMl=e;i}TrHPh z{!FQ|n|FZI=iH``Cf2h4$KE#D_~v{zm1$QxQnlk+*-Epg4Ex)QmbOp(zV`92iS_w^ zJtjNOJN)#%{c9HUoIM)K``T-419z!jdCK^)Q@6-h@l93IRnL9u-!>>MHVK(Ewc+m- z3)LgfB)&bk#$x!2|Ib9_Dv?~n393II`gPsiaQ0%dLGLy9gD0Ek|DST1t+uf9fLjW8 z$(!0_=cnN>_jlZ@^O9e5f1$^NAB@im3oY{Y95={4yRZn>;Hf2PCM zAl7eBF0XDEwQ^V8_OC!Ef@9i-B&|l@j5B8@Ot|FlWxnJ6RF2#w_xoZu+%8rB&Nr!Y z%8GXdvip@^X8ZhOZk0P~En|Mxr&{=MKmR)3+0SQ5^I!Dd8=+zHPMp)i{2M6xKyeNP zbx1KE0TKX3{)6SO8Ee(KZ|QzrB`C(YY`aCy(R!y8XbNYHWy$?v4D*Q5CTe-90+iK>IJPV|` QHtuSiHjSBK>fzu`07d3QCIA2c literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_from_to_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_from_to_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..16e0aa28e7db73b8e9db96ffebf49b282536aec0 GIT binary patch literal 883 zcmZQzWME_f112*D2F^(kHiN-`C}=Q!A(rxAk#kdv-tFd9hlT#AH}*r-fT@Z(XT$F2 zUp5e^%Uk-7|9i`=ph@ehZ!Pj{KDf+FWWueF?~Y!-c4(vS?;yhq|H|jYdtb`SacBv1 zT~%s%zxMvm-NiiJ`#177ZJXVod9HB!--Wk0S{b#3N~A54SraE@=v`yVHF?4ROUdxo zrQ&USlli9qH2O6;_p|HFcZ&;JR{2Qx9dEYlc{pe3maAfRoe|#89-P|b(p3??r^M+f z$L7bEZ=QUa!$cW)&J`i20>jSk{@<`>liU{d8FzxDz4-J@?TRNK*%u!Y$opz> z`)0ODZO+k7_p&1xKgY(smvD>_*73ePamu<0CpOozp04>=WL4f+r}WEn>ov2O-%baN zR{wD|yK!jer-17^$KF{*3m>gIx33=Cl)8kF!}dlu(TP?;24>ZHH& z{_V;m39KoyP&HtxVoq{GLRU&c!m8ASgbPoeKGM-RrQ@yR8R~KRjQ5#9kJBgpbplWD zdY{qs<@M0z^7B1+-h1P-r%4G3W~@ov3)IvM-rESoH+{U((|CjDTs8L*`2?G?a)otl zpL8rOy^V~zzkd4M6zpyD*~r^SxcI=gjE2_YyIr3YzrE5Bu}~FT&c+-YHfa^-wmE;5 znVH=+E==%Aao+GM>_Qkr_mbt)TAoZ-dFHSu;LWVb5dm{%En2v80qaEf&&q8}8F&x* GCjtQcXqCzU literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..cefcc02a8325f77fe2632dc5aac0f90565f74ac4 GIT binary patch literal 2249 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 BzWD$E literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_pair_from_to_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_base_pair_from_to_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7d2f09f12fa85f4912433103d4557ab9caf75171 GIT binary patch literal 869 zcmZQzWME_f113WT2CgOun<3&q6inUTU|yX0X}PEJCguXxsc|eRElN-|V5(xy*|39o zw+(n~)gAsdE?4w4wl4Kw8<^m`U5xSCB8R5Cp|ky3PEJz1c(5z+zuis0B!r56MhNZ*~Fh3{W-Dm=V7zE<#`-W&DPq>@&7Vt)7M$P_0oqE%BnLOtIq}~6z``>x*4}bk{AKDPD%4_I(%+bbu!aIwu8-jAxOQqd7IH&tKD2XV0)Ei8E zEc}Yq&Fk3a4>RH&D_>f3&lL^-wDxnyl(NvItATfQO>)Gh)Sfj}UiV~4X!^GGpPwZp zue3UAs(<(2=D?ftY@>>eb5wFwvsm(3@37BoIMXU2y8ZL>5bnD(<1^V(mM%5R(KM_~ z+bH*RiR+QXmV)CeufOowkvA`Ehm6V2uhQ=lqZ6}aq#EOm!!EyFbo>3p6O%r2iamW) zV)Be}ZC7-v@04%Cr&)Bmx_9axxiR0H+cZ(o>av2Xgy6BQukuCu9X(HJGsQgd zmhYXLliu!IZC^Oy>g&KCabeG2MsaFCe>Tikm$%d7#oo`>?o9z&* zSi>(hCv=(Ur657!t39*wn^M^xKRofztAwvG-7`=9QHfiL9=Gh)`pg35sWqOVc?)C$ z)QdAae{)9`YnFjh4JfGrffq2rHGo+R46z^@l;)}eZakU(#qxOLwGE63XYc$A@aT?$ zssU3KbCMGhejYk-AnVkD0}1C(M#e-#S>gVi=UO#pOZ9F;#;N)dIR?I+(@4kOrg~K`v=t z`R+}hzrp!UtTpRz+}^iy_L_-8P&Hr*>=OIq499qE=J5SXUFqsNQ*-5>7#`(}I!$9__*BXz4ggdwbqoLi literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_delay_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_delay_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f1ae140984acf866fbeb5d45c7e3ed962e1f88e5 GIT binary patch literal 486 zcmVctOsXwt|NBnTKtXUQD2L{fkz+qQe$O6@>JKgnj9X?XTGOg|kt|s#BMBVV znYWGuWtGufFuAidNfWNDabcIR3-q*Tk7pkVo6Wm)x9kH+mo^^`(*%Zaj&-;<4t}yS zC3?7VSe2~qHy=HVBA850kB?8sQ}_zwlWa82CZqAFamdre*1w}Ws2J6n^DbY5=$*mQBTr1|Ft6LSX0A~Gl5hf4J*SMjLcEu zYSc5~z*zD_x5hfowtEfi_S{nU%+oILcUEI~4c*CMLCVBUbX}tLq@T38OWq!7*dJZY cq#49`U%+=UvaU?+p;bjMVu+3V5A!MVwM6;kHchJ*FLuV%$8?t2=(!{vAiXG==y7|EvRCv38=gxDMiVB_dw*U|_QrDX9fD~rTSI$6R~xVEi8nlmvAt~<=-i-)SNaNO&Ej~No}wRH ze!3KF)4~@7W}#|VVGN}c?WGnf!;Wab{JKJGDaU}2Wx-4^hZR!}tbJi7nuJvOO_epe z$3X2f@<79On1k7_TLN}0i9@+%M}dTX2xsOyE&i9X7m(CpbB~9%i4NbZ|HHxu&HBFL R+CjrwCy4pN{RIHyS@cO)`u+d_ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_rotate_by_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_rotate_by_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..402f353c084396809c892a56b732a7bbd582b6aa GIT binary patch literal 879 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 QHtuSiHjSBKR(0?`0122qPXGV_ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_sequence_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/sprite/modifier/_sequence_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e65189dbb3344825d43aa6e1f9e75e8bdb050b74 GIT binary patch literal 1652 zcmYLK3pCSh82|GpbK5HSeYuR)sM++5=!8NNpImZ{l_3iY%jFB@i`CreqO^UflCD2;w{W{oiyPJu zGHK-;Q^$#d$1U&mHl*)apOZ>ed0jd@op7KC!U!sur*6g*yLo{FQ#rzVrfbCHv)Y(W zzB}FI{TcLr&uZIr7DmxpGq8~iBe-W1(2OIY~U(#Ulsmoc{Ar6!x& zJqXj5H+{L)I-0QuqEq1s<{hhxE7m}DRIywGUpSl;zd~BLd~J>IBDSAy6`v2^D`yWuLi0|$_UVSITzv4UdE@yn zRbyO~HVl19ckzv?SNpWSD@l9PBB7#MwdUTF^oHlRzSwwHUhPT=v;e=32EaafkmB-= zr^hvfbMne&Xq!uivEi31y?6*z1h!ik;5hHg0#p>kqQ{=yA?`n_r2%s}aE;{i+<=ru z)KgHhM>Kh4YZpdPVu_+#mZJ3La|?nC8Z|93o-UfjZJ85gF3~ziBH5vjbc8j7RYRTQ zyY2+(_X(`_ySd|n*{oAYh^>9ejIx79g?U40Lg~k2mhsnQjHpkA8ZT&y)Fgpk<9lI& z$!GKIH3z)ePn^Lo+sN^|LZL@c4=!K%Zlu^l=CiZcq@OPyxvQGe3MQ!a?+*T4RYyN@ z^>FbPw?%~--FS=LPMFb~-9N9x&TPL2-x@^zOjrJ?o#SmsT<~p-&Rhh0qaC+NW>GT0 z;>ZL5Wu`O(0IUQhlN|T1gQYY$0Xz0RM4E|rZeIz~i0zLZmNxZ&Pj>yj2&Os8$?FEZ zx?&AQN06EvnRFkBx(!>BYzhWRw>}5}Du&Vw0PtdzmFNl5&Gr!SlFstyhkgX|1o@$0 z@8eaD6r_5Z+ki(Z_lp|wt7a*+GN@&YBp##rhY3A`&TxcB(37&ZE4gJoBqQW)Y;35M z3Chi$_4WR><@OeRYxx&)dqVOW2Z}c6x@rvVlIJwyfzh>_3?wIjjgqen6aZ9rNHTF8 z5-(69Zr0HKqddMOs8le)D(SkUkGVHwAR+vY#3JhXUYE9AYdidU!$5icV5puU&9ODm zLvEeA2F#{VF9cT$zTL!+rWiESm@mP^dDEiO{sI3vvu=LJiY2bWC91`Qqh?%|pYU+7 zR1bl=qDi*U9Dfx>_jKzlFhLI)VRWcBQ~Wjy)RxO?-YrsyW{*1H(;pfzBb{KViZ>{< zwZ7Lg5%9r>wxmDX-GUJHD{fJ7 z;-(YC(*MmiJ7-*?lhw{UspIJB(BIc=l?slFjTedwSyd(RTQVbFbH6KPKk+yR{;K{1 D!H=p~ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_changeable_text.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_changeable_text.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c52a97c6d4b52da57e1b070f77e6170d0c4dd4bc GIT binary patch literal 1972 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_text_renderer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_text_renderer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2e6aef1de7a2f5acf68ade71ac9c9e140ba5b4ea GIT binary patch literal 1658 zcmV-=28HFr=O}I(C62n9A z))Tj-CZb9J00000000000001ZoXuBTZ`(E$eolb=2kxbnGgpa&6)0+CsN=|q2geR< zr)}011|!inTbUFnDwhrY?>nSKiIU|c?Ob4fuq5i-FW)(eu>Tb=2;ySlVipACR$T~N zP)1zBB$W@YB=@qtx4XAXR}mKyeZjZ*-d#~&a1u~SIdi`*1!p{Vc?7H>iQTh7>#+U3 z94%YR28;B?$15VR+tru$Q!Ltvc!?w8p5T~_3A__Td=Fp$N0=t+{|ScFefK7r&xvqP z^ksDOh4}IUGf2!+3N!vWXVUG#-}A^-MiW7d+9^Cv)1%aa=SfK<4IypkB#fTRa!Um0 z)(YS2+h^(1iq5&9e}jiO?1Xf|p2IScg0jUG+{U`H4)*u=cF{h1hZDKv0u8CpLmZi?%&#mlks@yBZrG7a z8ao-0K5wE*f4c*(H*Kgeefv)e%~?e}iYf=24XaXSFWeBIMlPKOAcO@puCG!z^8G{z z0zd-NQZX<8VlNxELwWXpnomuuu%fjR%sh@0KyQbUJ5)twXPu`m8ftLE7?@3_ooT;2 zI~{jEXg^Ij-Sz56$2In}3kItRfV66t``#OaCT}vk^v1L9d1u_|PQ5W;_Xc$(W7dJ? z7#Z(N=gv_s(XyxBUu}EM^mZ3Sc6>>1Nnc~PPn?Duava#S&IZF8Rz!3`9H%8=yOTr# z;E`fW>#P)b%BVbnG7WkO^VQbnSoOCJTsb2W!i-*^iN5*&%%uwg10Lq^oQs3G;43sy zRo+zt`=HOj)H#OM+$t2RCWCC}#iy&q$(l?MNGp4!KC`5}8^MMoXh6z{XIH;cQtHyO z3a3in&<*acacxkVqtY#>0phF=HI#x=22FaaMUlQ3fKl5%ip~Z$q_`zsL$8Q*S)08P zR%Uz?lC1CnEjJT%ITt}k2>g&!J?VhZ>XqkIVe!*0nCJA{0$@sCt?A(6C<-4kdkb^n z#$AM`0^ey1V@C;8FfkqXJHxYqH)*27<~p7{HxF03(d!a#O^kVp5(Q*v)9BpMFMa`_ zOTsW?OPyIOiwsdThcUOh=$P|#Z!%AMyGn!cZL27gHS@N%%u--2{Csp-N#R)`uvssk zihIGS0|T$^Eg_CVY6E||AJl}>whDIDFq37`Wx9${uV~Ed)b!b^V#&MVJS3Q*JDtHX zNn+Jwx!g3dreM&E7p3z|9HgR9WeTk-@EFZ;7?V=X8S&}dRXcbt=5t;?g+Ji+onf%~ zGr#rLTq#hXJTzf}?>tA*P-K}4J6o#_N53mVL|?r!2Bw-m(a%7wKdPZY(%@^sj*ch1 zPLs1!qxb^Lr3>dy^<5L?!iz51sqZk5Q)SQmNwIZhsOs6ROwVE4kf~-Mx4GMvIQ6}1 zMBc4yJ12Cpl%)Xf=iyOWQvyJwUy)M^a-%|ch9jr3X5P}sFX^iqm|L+luZsYVxx{M2 z=@K>FKN>ec`=R@K-rhubol7ey3)+c~LsCer)zq#fzurK8{rD9v;MpxsmH@h5r7gvL6|8j8M8C;%sW~W}S0|!l1CO`Ei)Bdod?>F&Or%TD_(p;|H zOThVjtMEQfz2O9uO=jwI!uxn~)$4iV(a9fPcRDeC=3-iC5yIawQggl40GU}PH>NTs zAF+vCjChSzvNWaT&@@* zhX{ai=G)IU!Kk-Hu15((_7nt|dj1*vL!U8Nn=uPehjI3>;z^A3r@&Ue0Km?F0h2mX EOp-4iTL1t6 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_ticker_text.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/text/_ticker_text.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e7fa1cdb4fbcaf3e061895ea9df4d94c3d7a45e0 GIT binary patch literal 1881 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_frame_count_crasher.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_frame_count_crasher.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c4f4ab508878c28190c6949456d7dfb033d2b0f4 GIT binary patch literal 821 zcmZQzWME_f1Ev-R29Bi=He=#{C^*9q@5zO;E^M#t^oj%R1ZjB4U!zc^`-M=Z+M08vXIScI5si zZKwK)s!fR;vd$I91+3aOB+lUd(|G=rm&ad`YkJzB{S#mK*M~@6{BhFu+`Rj@Wd!Pu zoUZz*@1V8gQcJdIUApSI{P{U;7vH@*&>maipS4#=XrF-=*P;hUuEZPcDsnt(;p)M+ z>}7_PUjoNRM~VK!fpd=VDoFhZt<8Mka5j!LY|qXWJLh>X3e!0FBqAa6N#F(DFT5p1 zP4>+9yOk{d{O?!Zk^H7{{qiY&l46nmKSL(1?d>?QqwUhEwdV}3Z}u}tpCd9syy-=^ zD|hjeqiNQx)xRI~eeGEu?$atAbl{;{#y5sbrxF}w z)<<=kJ?LhuzdYMbeZ^MErtpHi`aLqb%9>f9@e&BZ%S3zv0I>tcehh%-?M9{t^_)2wcZrAmE+5epPhgGb>;Ts{nGj0 zH`-J@nN{8{uzh*uY#nj_iQUH%?&|2iOl5M`0tAG68@;S3Nn&>P2IKaAJ&vosAS^LG$OF#U_RArc{3rdNg z)C&ZLz%;A^W-%~s2hpHp+|D#@3%kgLN}hFQlQ;axn7;dP6;K@lRLn_EU})yzI9emy rkT1IsYt9ADVXI?%9QJ6~8cwWX@SJRn>SB@4_#4wQn!I>2%w< zFtK){-T2~kf~ai8kFRw4n>K z(Ko;QCtC0+-%7Mel5p^g{~m0i$io}Sq5gI=_v4e>FKSiw7w(VJi_0&}9yVCf(Usouzb^4;{<)RkWZ|-lo5+E#eY(rrz`qYZ${hLn zmG$WSAmJ*W%lA7T^8Kh+{8`jinw~r7>JR_s?bmJ=Kb7LIO?H2o&hlNh;_9YMPz-{i z9S9tNk@#>lI3^Xz@iWSu6#oES1dyH`zD=g<(Y0S6+F44X6R`bV(xZXFpOJg_gE|T*4R~@cxxiv}3 z>!Kpt#%a&bzBx17{IT-%u0L^)%D5h1eOVyH_xPfQpWp95mt%nzQL4>X4OD8S`q&;H zd{W}#{MwLJHB;epjU0F~+s>F0td_zdV zQqJqA{+}|kxxe@3nWnt$kDbKNc`P({I;8IA>Ln60b62pN`P4u|Kfy&OORmi4Q+nZO z@$qoueg4H8SXgAu^~2csuKdulP~i3H(@a|y!g|)}zJs#*kE?}q6&im2uV2N`FBsi% zJ;-Z1&*dFUYl=>8Yja76aZY;~WrC(N>n zPyNx>m0fXSHJ4WQxwRi-L}KPgoVBPrJY~N->zVJ4o7E@GVq<<(5gxpSJ$~Ac_G=cq zoYtNd*wfVd_fwI|Pr>iu{!1}%;kQ>l zQL@cZx%%$^uFsjh(WKtxLmzkD{7$Dv(R%G!=12ar?H5Zv3rc;UBnt!%z=W#`W-%}t zgJ@9NeNwQ5RrA{!&9996c|A>XHi_J0xdc%IAuHx2ConW8aU9*i(6OFjqi0&4V_jgU zQ(fS$xTH8QuPn(9ue09g&v;*L4w|=+RkKrdrJO_OoGVJ%ae55B{Guu#Q9KvPp~PQ_)Z24PE^M3!RRg9f=BS=I$kl8h zz;a>t1N%3TFQj;vCg{g``MPm4p|;_&FYmLXo*A@Pp2>Q1+JdQ*&v%B}sihhg zd@UkE%lY4R{@uFHt0GcW&B8-uo`Lb+kBXhDcRnqwUzIy+R}-7t=H-z}HaEM>rSB|` lw7LD$K2Ju+v0Spsc8=&Ahw>FB-&O^)Zh88Wo2yAr0|3`pQo{fM literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_i_on_scene_touch_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_i_on_scene_touch_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..261157645b4f33ac9c02887272e32103ac292d4e GIT binary patch literal 309 zcmZQzWME`~fUgV;Or=ovzyDBBnY87_smy%Wt8+h`cqKgH+Iz{PHBdERs$$OCi3h!o z7znhTXZyuhd}UGQ>qiGg4|aDwc;y(cF#FuL=9@DoEfW>Ie>Z1W`#c+u;uAdoYk2Jc zmmI5`!RA=AnD@GAUwhLXfyHioBKy7woVc5!6};vBk#_r==G{HT7D90=t|>oUe$PYU z;cvr3otmF)f+rlFE9s;y7k8q|*w&_Mb9u_`%p1bdEvsVUW7n@1(n|<^S+rFD^eP($ z*JZmBr3)4KUX-gH@?Sq^&Ysf=x6@xazp<@Jf3-y8!MFeUQ6C&~V*Xsb`j<&tylCse v84rWn`a1JmWu(|<9-Vove3!SRis-J8bBUMI-0l3*PDSqdeO|wB&Zag1)wq$r literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_i_touch_area.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_i_touch_area.java.i new file mode 100644 index 0000000000000000000000000000000000000000..bc59002c43ea94f2319951988209a1d239d73a8b GIT binary patch literal 178 zcmZQzWME`~fFdAO3T6NM4+RBVPo1ph4!>bMm-ER9d(q;$Gm6zvHDIb@j_N5xzC#8) z4i{~M-aW7s%Db~EK+MeSUBc3^EJ2wm%RKJLh5FQ2{6G8hWaNTvJvpb9<|`*f`Ub4Y z{{QIS)|kDY^EeJ#a}+$@yMF6I=V0AE2lswloe}ka$4XVkMKjNRu4okYX(>Ep7-Z9S LaJT$HCB-xVU(!qB literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_screen_capture.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_screen_capture.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9dddddd6de5696ad3fea18b34b093cd8751ed540 GIT binary patch literal 7407 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_screen_grabber.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/entity/util/_screen_grabber.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9f5feaa88d0be540caa33f9d6bc4d5d7877a930e GIT binary patch literal 2105 zcmYjSdpr|*8{a1T*r<#`$R%mxjN{(wyr)FD<~~E2CK__@7#m8G32&-3MB8GGnQNoD zhq+7+qaz`A35Qftq1=w;^nTvoAK&NsJfH9H_dLJvAKwQ61ONd)j<_-aAOqgXLDgIT z9ze9;{9LJl`K(TElYMg^45feEZ-=vkM4Heo*kRa8dQ(bf%lm`vJJT>_Rtzk@&{RFC z&rBSxQ|QR!!asS@vEv^UWq2#&p^*cTw7W0nb<;1$n~c%vD#2NP*X=+4N{%nuE-$<~>S_2gJ;_89F}JoSJ9aLQw3%(=B% zfv+y*k~Z`^S0O>#DxKEgk%8Iu*VDW-224$ZT)hwIN&J_ca= zud04F6d1m_vwzsRVm~7=qdZS%t`Q#lap@+s5gqlw8n4zUaF;1~ghviMpr%AsPMT3- zDfpOX16YF{Y7=UlJ<(AVh$I{5UNMi$bR5%?^ZIP@0l9#IysdHr_-~>{@)pHvl0rL9kkmXcDiMTQ4W!4dgt{UqvIhz24 z8$%b_2CJPoF~YLy^EA&nkRE?ePp$8g9>QX=sYCVg0@PzE!$I%m;$7zTS(nvmY36Kj zxrz#cW#sASLg|uG^12kXj?L8k)7*CMv@@dlNJUP{ayiIr@mfsx!t3F>)OVjZ+vbWK z+N+MT-`Dt~(}D%RuV9LA#h8zcBDLY&NdhI`ytwZPDiUKaSIjRTY`^H@Xm@t<@9H@5 zE&;H^$>5uH*0Snyyta`B1os5JU#l*R8`&ZI| zL&D=aqG{qHzUmaALkAvz2pq;&xMKBhlrHEVez)j!Xzs((yaEvF0gZ zqn#>lX_hkQE~hwxs4In3E~ILrKVLrK^{Tyrn!dCpb$6UzbgOEjh!U>Eogl zdv1TIxo~yOolrz0$-`&sH$5~}H#Q_6IaybV98%<}002;C+gl?=82|tp`suB@<&wuk z=|f}sJ?AU<=Wd=@Sgvu~;p`xh=9=bYo2aKi{^~s0cVYFAgidb>o$#l<EQ@%?ieGwhmc9h98|n7kdbWXbcL@lEmfv4)pkyg5q?Fe72qS0$N?B!iF>{ubhh_pfQvS#Zxf__Y zK>!VKpu-?Qu{l!m%MyNiORUgivmqeRyGAuAzc&Ie!Tlue?p0d_>sFH(veYSuQ(c3L z2aM_xF{GMn>4}_{sPoHgQX}!bdSLX^+v8LeZbPICSoeoICfkaFc60&_Z%3d=)ecYU zUWP&59kD0y`=BjLXnQ(dWrwqaM4Ar{kRT(`MwGs#3OtYkJqO*>mPP8|K*{+Siy4fC z1+*4Q21kR*(H3Abx!w~nu?{&bx(oLG@k09l?Z}bs3P{uywg#~8;IE4LjQnAxw!|rX zQROQ4gZ(dvx=wUn!cAoQ;c$Zj$gY4aQt~lq7D*F&hNA_oger<>?dKeWLN7zX`@y)0 znS2h;=P}M7FYHV#)Odz4Htx}9t7*UrV9dQNp>Q{=qY1!LVTvQ&l(D%vB{{iH6JFE@ zZ|`MiF`Sq=MUIeGa`yJmaFdH&REm_)Jty1>KX9Fnd3=}Zk_|PI1?YV>3=+)-{`Pas l|1JK7?TVPFYSSt+XJc9VF?r5c9C*(0z*_~q{GV)5{0A=g!Eyiq literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/game/_base_game_activity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/game/_base_game_activity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e95b2bda52fe0cb999600bd118db2f3e57504af4 GIT binary patch literal 1326 zcmXw%eLT|%9LImCorl!cWwEpeOHpE!6_ThN%19nwvyNuO*p-Hvht5Ou*vxq-i$xvk zoToESyOh=nDaq4o^DrY4Q=-|Gqqb{Zeg61W zT!ww9ds=j?=NdDb=GUoM>*W?0yCX63zb27ua%p1hMC`2Fp9pHs*>QiDg4y9Fo#JM! ziIDp^dcUD=3?Bc}9mmfyQ!}ZJ895$uUC`)Bc<+va<-C}JjJ)NJ)>a4>DI=S*a}QQW zp{m`)rUSYUQ1+wE0be0Sm8szS_;bEjAN!#iygl$az^!>6BQxq z?)WWjyp8CP-{*09Z|_AK=vJ?0y+oEBvZ>PCV)s7M!rq)0Jr)KeZ4R9zhOSt{Hs-H8 zulOvoVH2iZVKT_4HHAIfskYNsvD{=F%QJ-gFwubS&4y^0ryd5i*Y#zMSDofJbu=f9hFPqx@^u+q z3*Ei8@A$+n^u_ra*YFZDWyyf$PZ1kU2->Hw*l!gkHdrMcyAW}wZ!ux9e}Ujsp1bLH z>B+9T*DW>L6^DB#`VR&mA+~f4JTGfUPu=2Le0^Sv^*eTyOY^=Tny-`$X~>4BQn*}m zybZxg7#rLF(O6{FK&O4ykjVl^H9OsWaIGzdOAf*GE zM&7We_yHv{v?k8pz2& zMNEzBPMGwj!IP0OakTI-hh6j^$0IAw>Y1(=@vWu)Q$@x9oLn?&hhCE>q$(Lh`-by9 zn0`SK=7*D3@~Hlo4LbrJgQ_5Q28{^N$F;XbX;CTQg}dhtBqUc~U>nue=E3BjhL)L% zn=+YL5Z)e7TB4PW!^HN%^=Td5u|uxH)4IF^<g zQeTp?E(u8^+tZ!rXlz4NbI9F$HeUD~zti14sdJvoHNLKTlfxd8dZ@yRryt>x(mVME zRG2=WJOw|0wFZg@?>Jt3+%bPGu5f2ZKo^eD7pf(HHbW{8DW18Gm{E?*I=<%RSQ4$K z=mr@q{4No55HzMtYsH=+F7Kg`t%Pu}zYp0pse~^-Ck^*=9VLDhh%iaBd1p7%QJ zAaLxw-W%&Pfz5f7#00gPl$2Okv)4AhO`FBD%=mPgF#n_7yE9#?r=3at_gBJh-^Xiv zZ%a8k%1uN+isS|-t2W-FLiy3b82B>S$K-4MLtb=Vv9W6lZu2-I+wYO zc5JQ9Q8{32nVHMpfAC#&(b+9;I%J(Hw?^rNPiKueu*u};C7rHK5{)t1_w$AMjtCw; zr&jUzP&wn<+bf=R?&|1awA*TRvUtbOdLQ<8t-CWU%Z%^L_PoS4x&Eq8Q{A0AU0X6F upPctv<5zxUTkF?_vd?a#u}6G#wW@-%e_xHMDbnUY^5u#+9CQmr~f^x z{By5G^Y%L#UR8l*M{R<&T&H?_w$6EOc&clY#rpLr^UiHLx@N}pqY;5l&!=q2)4dQP z%KN+ZOq8@x%ARl5AAjV;iAYv$-FwUC<+=8~kMk`QW^WL?YQ2uLiNT)ZLpIlCDRRg9f<|HRDG#7Ck z-N4dSYFy0ysoP8BQ}?B>LZ5?zf=)YxWW`mb#jT3Vit|kKTpCwUlohwiR9{?QoS8XT zNnkxwR?kx%4c}8IeZo9Woj>pCdnWkAdFIvJC-r^L73eZ&UG+G9#`{blL${VlgQhHN a$Bg_s&$K$Z2+lN|uBCFIHg literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/_i_touch_area.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/_i_touch_area.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ba5b7cfde906e0fdc4976bb3ac79ca2fd8f2680c GIT binary patch literal 352 zcmZQzWME`~fJ+PvjK84l(Em_yN#xsW<_{-kuew+2eY{0qw}1T)bEq0HRWWC6pkdx& z1D-j`4)qUiNc85Y#=cT=*uCY&1Ru#+6Q^ZHcQ{FIy0i4feQou~U2JL`LM;5pm2WP# zO!R)>yn4dxS^Ji|+=)_4-6_AgtIp(Zw@A>FNHx}!4_(P`Y8v*M-h0R(&v^datarC$ zbflTqdjAbsH$Rb8dTm#4l=!Y03_C^sMyOgu^odCMJUD;Y6p?;BWoA$SV%Tz12 z_vpD6eKlZy>a(hB3ZHrR0@qKsWwqbSDmH(Vx%lbBg_yGZImbEvURVCJy8rZ-)A5@B z82EW1N{e~b4F!6E$0BIMDz5oCK literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/_touch_event.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/_touch_event.java.i new file mode 100644 index 0000000000000000000000000000000000000000..06f48299a88addbbca0e5ade2e0b15e3008d6bcd GIT binary patch literal 2770 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 acqqf#SsnrbxgPPD|A@*0fU2=0$o~UB?H9lR literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_i_touch_controller.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_i_touch_controller.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b9a666e8e8b2fc7833accd1c99af3981acf5eb83 GIT binary patch literal 1249 zcmZQzWME_f14a`D2Ifsrw$FbkNVJ)e+Vx;%mY>(rnS2L>wBMa;DTJtjkQH;*PRjQ_ zY#?wfe*J{^1^QbvZk2XzP}DeVUuziumV3$DwcKgts=n$){!Z*?^(@G3T*E7hy+beAq#bfC6caq6sqtW{F#vgSX-p81^HWSAkYB+z&-H0SR9%-7%c+*aP1 zIO}@Uwbnb?H50YVX05#LlBmJN@zBjQ@3h#wl5=iXKO|f|_oC*u?X_7&Eh_WWH~&1U zI_GeS+GFjRM=tLWbx~R|>&$7#$_yMKI=neJSfZQ_aWzCa$(l zCnv_Nz3^E2=!GNimCyFvT%eRt^~Kl3BIDl4XAOx0jjQtiOO~9^l#kL%HnOjGzM1}} z#89ez%8Bo{cDF_+RoyKNK75Hkq&Iov%DF}ReQtgC-*))hVTnE!m@jOmjmznUFCY3BUrQPXCH zFPb=Q=JXkh8&nnrG#t4Y*l?n{?a6et^oG_s!o@|CgeGqm%r<414XYwbTDawWI<*JZ<9~>U6lM)JXq}PH3MY z*C7W1S9fdH_XcxsEfL!yd{m^Ys=>ExlFl0A(^i~K;UClDj`4a5cAtM<|Idbvq0HdL z13AYoMray~>TK_C6*?VNqlqpw?1g6fKK5ypqRqRVYaeEnk{@nG|>67QSoY|FSf(h43wdHP64!}rulpD>Nn=Y0Y_bTm$^bO~DzO#(Vg0vgU-W|_so z@Kw-|4`eUXKCtb;XlGdiaR-wnkY)k7bz;o_IUcVUd~^#*+@QlDK=o`-W-mwH;xJjs>%bEYQO(Uq!-KbM}AT$j4CQuSP?rKM-*$(vG{Gb=kSx#rC< z;$oeVH0#=)m^pi57z}qPbbt(FW(6AwOmQr$AcixY2GXn`XZY`%!G3>om%**>DOb7O g70Qmi)COl3h&m9-1T46iwt^Vo6vqiPj|aj70I+%GfB*mh literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_multi_touch_controler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_multi_touch_controler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f2687a4a25d3fbcc73ae20b89773764907cf8976 GIT binary patch literal 919 zcmV;I18DpJ0RRC20000000UP501os30000000B<_|NsC0|NsAD*lr`vuoF48w9Q-$ zM<_{9Uan*S00000000000001ZoXuBRZ`wc*ehw1g+3QH!g;ZLUMiPLa0+K7qxi)*FP;@cg+e;z1rMYSHm&uc8MvDF zLYL~XN2mZFH44Xvugu4!D3tw4r;Z8*sJ{Le0}!OInb7_L@DAkC6-U?kK>kE2Qh}|d z`aoV?qt?_1pP(Dvd>qG`NUWf)?MqeYD>;I0;GwFAU0$#Rx!Pwo9w?EQ?J+9F9i;my zogO4{hY674hFI)kg1y;37tDpk8}Jejd5Gm!#I@*Eow@D9>r@oVKF;| zg6a~eF+g351lb%FD=Defdse&kt6A%QtAt4Ygll`4jbWzfM>cVP(<-z5qgCFi(P>+) zUgI{Qd8CKjH)e^6A~NMfWS5h$Dbz~5UZD<@03riccG|w{?C0A|Z-Zxd-aGi!Y=3W* zm)EQrZptz4ZQ8*;qscvwLdgjToPb3`dcfS88U!O+)p)egi<;or5@Y6a2jZpx2Q}In zoiZH5=V=SY*e~?=a%ff_hIXFfW2SM9Ym5B72h(QOhLJ6Yh}LJWA6J})O*Z5p-$1{P z*6Zu6B3JwGo6HE-h?*`~tEyt8*U zQZ$?1cVtha4lT{99Swv;A;Z^8iI1b-jImco%&o;p)7-qJ{0qb#Es#{&vZ3UcgW0zg z_NXOI^Z!!GJMXP^B!s=HIJI=J8qV-`RB)lPam&poLwH^7!aS_zY8$wojEquv%v09)#5KlbMOWnC6LIOXKb% t)`|x?xVZR-TKC4f>QxT91IKfoC;>Gg#nVUzK18SDgB*s*&%Xdppw1$Ny?X!v literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_single_touch_controler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/controller/_single_touch_controler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..99531718613e0eee2ec28f3e38c187495141b1c2 GIT binary patch literal 1476 zcmZQzWME_f1IFD93~XPaY@h#7p!#3(?x)>}+fQ1`rDj&0`n&8Ldn!Z?gshlzHpDmk zwu6AJ`-1-l%N1s)EWOe0i|)2Wl#xLny^ zZ-}~Avsdz2?$Wc9^#pE+dj-#XyzsB0=(K>yRkIc_nWwGi3I6a#=GSVAF6HR3H;4Bh z-nZ@fT}I8G!$+=fK6~}xqw=o@4jS>=y{wUQH)xl>+hSY&BZt>I_VC{8OE;(8m(KQP zOPm<1H*NZ9)j5Zc2BpehQQCbXs@I2#{T=@1O7~|R_}39}H<@D-`|=Gh^^QBg zVRRL%}5{-v##63P7b)6*(}Wa>Dg(Ia57j`?x?7rd;uPZiI2^R4Nu73aJ!hRu?P3iir9?Aq=a?Ufdud*#8B zES{4Zd$kN|ywlP@uvOQv?>5ai)+=B)=oS4m+3~=o6DdG1VuU! z90x|d7MR7r=m(-fu`fO+W3CuS?~Qw3t7q<8zG%9c(Wi+JH4w65PHx|Ru0swy$CO`O zXv%*uVdGS#zNTQ^CO$u_7ZrPtMcEWRtr9&b{yDZrSpBwE#Qzk|pS35a^E0S1EO;1c z-f(WgtHiitT9Y-VYH-D*&(XT|B1lf@?6nM6wwF1blbO;N{g{yT_EI_HF6V}OTa9*G z>u-+;pWYPs*{NVr#?stnm32zn?%5?T+~8`E&&z1{HTCmK$B6-2VxKyG>VJOC(wBT< zTHESi=l8Pf-&%W}%(JyWkiX+MyK`j!RwKTBkN$ESzTM5=vA^^c$TLh$U@w7kKs>~A zOrYRk1O-FM>(Dvw$AUjH`~Me>I_7Y)_W6k|5H%38Voq{G!mQ&A$9PodurBqqoOzP# z;LOUGmMay1Ercy-u2PvZD?2T@<|PDP-*jb<(DNg6<}5k#B&U_h$I!Pm zD^Abv+@niO3;c3EU2}LD6{i=c$Hw;TJP(gfe&e_IZ8zsn;oo9t=&xvhUfEDzRsE{@ zeidVT{v3uYk{(K2tR6Be_PVZAUFurNr7Ah|XjSG+*OeUX849bfdHd^jUbt{2&_TTC zh}w%8Jdc`Ecmh-%=P@$;+?%%o2hJQma9~5r<^?92>c)|Z7RLIv>ZU6DO)L*v+OJ=tVXwZ` zLs{2Y-_TuAQ~reKnP3eLt+SucbL)C|>Ui>=)bR54xfs~6;seX;VqNdE+J$~+PI`Lz zoD0)9AaXfm#j~f6p6KZ5GR*2dYm!s7rgA4k=3JYlAO|q-06QZFDb@@?!XT$VTG(TG z>&`1Mqtj&>GLK_O^Tm2=i!|B z;Xza8PmWqLaoWu3GZsJK6f4E!x>rZk^3R@TWk`?FSP8O%MFeaS&^>IT5G$E1LBb%n zxryxgTjccl)oYH3$tw@d?5NQ;`2$e{Bbnv_y}<+Isc;sQCgo%%D+FierRSuEvY^RLl=I= z>QKO=@U7_~3#JJ>;fz(3pJ?k9*<%0-UN!6AJ7L ASpWb4 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_click_detector.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_click_detector.java.i new file mode 100644 index 0000000000000000000000000000000000000000..fc0ff085cd6d70e09ae98c1ec0a1bcfc9c4585f6 GIT binary patch literal 2558 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_hold_detector.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_hold_detector.java.i new file mode 100644 index 0000000000000000000000000000000000000000..980636818bfb7c6df313f6d037f23596cbd34356 GIT binary patch literal 3657 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_scroll_detector.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_scroll_detector.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ca329274a54d4d659e1ea7ee3244170912b0fa92 GIT binary patch literal 2139 zcmY*ac{CK<8=kR5W1X>162=lTb~3bCK1+7S8e_{aGGww$nLZ2^QIW|WgCSeWnnICv z?E6HvBH5-%t1UiL{r>p9e?0fO=RD`$_dM@?&IJGgK)~-}y#oO7xBcNj`u^X-8|p?L z16y2E6Me(3C+O(LXlKm*(fmPtPMs4rcuJLjj~lYznkQG{9F56#gcVDXZ!htZPim9HmB8xP*LLKMrStW3{ntiE6v56dBH+1OBQ<%;z-x&rRhw&h<9wLW&!x<*Je8g(+>Pj>T|YW3sW ztyqORuuMxPe?wi0tlLtbNr16D8@)nwmI3CfdE`SBpM&~9ajnGG$NC5jaU+Lbb#J*O z7*X`{7uq<1GbO6K=lj2hPQP^gO1raqUobg&YhoO!rs)z%9Yi_I`9f+a!K-nRAP7U z3IfDAtEHiqkah{<%9h&e8ZND%;NKWj%u~7rGCtp`KqJFmAzYQL*(f4>6qz)H-w{H)Tdo>qOP7*!o-V=^4>pBFZ>p zkKK%KiT~ujOy^9x_&Bd4c?4KjP?#Dmz={IZxRO(&2bM)cga_=L2v38{4Zd7~IYOq> zMaYK#+O)GxostTOdD5ZMKdRnSYqh8lBnOgxXFPvN@A{c3v!PUz!XkA4l161R4v}NN zVeXiJVytF}cUzm`$8Ja9L3#ioT;N@G;bURHC4T{*^T4Lrs!f&O>ZIFPM1z`;gK=6J#8ee& zuxfMD$UEfWB_C>?^v;oU6{k1{UtjnvQ<0NO7Odk+QI0@FogGM*p@xl&C(hCa1aw~Y zQsCx+-iD2%!Wy-d6)i5%mXG+{SL$X|T;TI+`sZcdvTH*z_#aAbvmR#ZM?yR%ZrvFM zEy^XQ-#!P0vQ#{X=$w|yhkcB>&hu$fs>Q_;pI9KmaLZG2O~`hLon3<*_Zij;%+ZjC zH%RYYZ_8S7ynrFk7|hf|LmPo(65NRx2K6j#X&n>CFOIpCBSVhw^8zAQlIh7`z8Mh< zb-EPqI(N7TM=Cc6?x3m+@Dr3Wfs2cCiX#KXqkAvXCEVsLA|dqAsrCKhUt$5mskb>W zM*UWh41KC8Mrf(cxqa;y;B$OuGSfM>o!|bsA6UNp$4M6EL|K@Y8>);;Hn{KVOKaL0 z@%2$k+7Ms^?5h%HYM+lEOOJT$C@B_i1UkM zO~|TU%7;2qU`$SX>U+;FDQ6iV*&z3&E&N&Ad-M-0|2~1g3rdJ5ZmT0G*ax9;&`K z{aSHzAuKkzaBOxdqM0DKh|k=qU0EMS@YOcp(Mc?onZsvj1m1V;GTv&NhmJIx22?r= zdD28!G?6jr?IT53Q50^In+iI<45%^%+Yfv+%Uf=54w^94hf~M*j7%4vW%sL`r$;1s zSEXi*G_n*8qiRa-flf*;Wou@942?{+UKpnBZ3c`DsQdr;g6oE(JN(>3>+{KRL>_-g z@77UoPVu85zWL{TT4W};7bx-TLaY7S4QR(rU)R5l!S!P?p0PimrX%+9LkEfjS4 zO-|2A!vYG=KJAaisizIu_F= literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_surface_gesture_detector.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_surface_gesture_detector.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0fe84e34895b76c9cb4b863522d43ef5d196d669 GIT binary patch literal 1878 zcmYjRc{Cf?7fxbrX`_}}M%ua(W;iA z_SDkaX@rQSYTuWtC4?GEjWFkTe%~M8z308}ymRmO-n#%G00=k+8w~&uDLu(SK8OFI zrrBc=9Xs-2%m1r>dr5KIi+8DOCz=xuBd$7(TZ}66#rXX^t&8UP%~b0?7azAF-j1aF z_dB}GErQt{g(}Go-;Q5@?qGHd4QDvafnEEKGe+zo=-ZJ(QZ@J2=}1aK&76a$`=^#}Wrqsb{NE@hU} z6=TJ(xNR?Lx#rG@%bA)sIY%~OZ@cOjF7WSV8QAF?PK3lW-HS~R2$by>Z+a3LO$ffbMrp1H!37z3Kle#+3o$s}g zlS#q!o$!+z!6Zcw~9Co+1+!@>ZI0QL*32a>RddPDTe85cZuPbs2GOTUTt`8QN za8_nuo|d%gq`9j(b(sX0r81HE=Pu5K6!nyTw@=ekfd7vBF+b%4ar}GnhMf=_+_YQ5YY>DULJ7t32J6sPze8>TJsh!qhz%(c9MF`pG?v0=# zj1|*-=6C{8$i{(%m*uKHO+3bw#nn@Vpy4X?uQ3GAb;+-x!bu1sF{tTEV2_^G_&mv@7XQf0=CN7S*qDK2lJ#{sz%$*>y*V@8X*cikR8fdGD0=LS z%XER5Pi8MJTwpg~6<}Yj=qssF-tMz5)wWE?0g@9JTwi`v+PlU zYR*cr%amSisAjf=$FwkX*uP0=8-Dki_DgSX$+ntcgwq_^ExcZ+=$1<)+5)6L67Sbq zwS$1IlRCaKH^dlQ$nKX8S!f2+yb+8y@YYUN{ILWmKLwtXJ%KV9Mz22Y)tm8>vke9UguQ-=U>(dZ!D65Y03h1N$^Zb6{}BOMC0Tz@b<9=Z z^iF75CI^nWR0}vfhaF4)qcCC$!NMD)BG_IbFIos;fc!P}w?T<_^VeDvC3;B7B9mU1 z>Uq_&o>|u$e`TPT~_@pRs5*%gR$y1$|Tx@1TDX ziWrX6+qAmcha|%tHSo?Hc=O~exR^)JOSO;>X*;*hN9PmZo}xV`Uz-bi)gyMUXG-= z)CzWF@WzmI!cK8U?dHat%?(ZU!w-xfuJc9v4NJ49bdBBC`&ssITs=1F(a}{moY)0Q zIf@{bubb}}T&QcSB&f3N+XH=kH&~2q_(XHUVMHUU%GqXR-b7prXkPFF&J$;3l!Sld z+!%D#hX%BZdqK$Wz6cq zOi<7AE8UvUOHld^eIxZq(Z_xiH)=NR_3mw30qo{e{tKsP{LV?WP0U zbx5-5nVh(2;Gf+Zajcp+I*%*6{(s$c9j&mjx@qkRO5N`0e1Isi#^m-pVwl|xtiAt% z^>DFE?y=ZW>R8-9i9fNmK8>_b6>KP{4g_iM49pPvNVXXRgn>E2zC;5ymqfHZyjDoI b@CZbCyLdl=3-`uu>+N$Ui2{Q5#A5#ix_x0~ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_surface_scroll_detector.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/input/touch/detector/_surface_scroll_detector.java.i new file mode 100644 index 0000000000000000000000000000000000000000..30ff1f5f97ea60ef5e9c418d29426b275fa9c478 GIT binary patch literal 481 zcmZQzWME_f1IC364D9Jp_S^qZ5GVa6Yn{fc>1u0QDh_L|eZcyrZVyBagshlzHuSvr zVFMAn^%wp>oSVXzyIs~ry=l`*o;h;cn&pyz-D15x{nIQS*FX1tcP-+Z()n$J+%1#$ z?)&QQPv0W)$uosx)@F}@Ne@ohPcU+o(9~Mn*|V)kQZ*w$>g@7F0k%~drnBF=a@X&V zQJlF;=iS#s3{?esYa+ASqE$=vw05KgKJn7Ke$Z>8i-b%s+u@5JSorQ5ypnf6{BOZ~ z;YS7a zysk(3qC{`%FR6~0mp;-*=1PXK$dSzPAjjC`%2jg3#N-IY zTyy4*=J?8)u#h9-OTO>@*8w&sk1t093guVZOw(VbYOr*(9 z<*fABe&VgMU4JxipgCaQ^eziy{HF_oLB!yl2pvhV#=U%B2=J8=DObN=Os__!p_KEQ z6lBYdkf`_g#Yz8rd)u)u91NqLL5hH#XQU%*5kWh?8{|&E6=6DKruZ< z&Q)*qu6kGb4qAqF0X<@CI9+)?-0Tn{)+(DKy58+NHNqzM&JC+Ya}!QeSRbkf%S&Z& z%T+03>{{e{h*BA48Y?~!9?0$i$wBX8oR@&3@VouXOFQ-+W6ZfIsQEljqMcaA`SYs2 zeKkGY>TOH(SHh+@_p*QFMzgml^inA!AhcV0e4-=TA081J!0($tqcS)`Pc=UYS4y*BF($VC z>(s+7_I5=%U&#;!X|j42oc*4b%Ow_JDfi;GF~gJ41JTt z072@=<{xpl<5b(eW&*7rH$^xFv_b*Z=vnK{2$hf$oD~vpKcxKb=4Xwe#Y$J06uyrO) zJ~uFzil(-L+d7^`<%Y*|3w@V!%OXw|7dzVrdpJiICc9yxsF6QW)AG-6h^+($mMYyF zhfITGE)F48MRWs$I;0d=d#BZma(U5RFTn^`etO5bcA@qutPMn(7O2HxsiIRuSs2p% zKw?5E4;CG-8)&USwKye&^CW_`m}J(o#li~B3iM1-`B@lU?Ezo0SX%ZkO2?$jA~HS6 zwXQe(uA;0G9dQmDss zal+Ote;3X;lamC1Ylj$yU6;g+ju8xmz!%uW+Po5C{KcruWxf|9WOy zXh=zjWxSs$f4lqhsF7IxLt0bZ?jFET*|>kdVfI_;H=F?gVaY!mfOB|%?$=X8$q%<2 zfPm7_EF#7Hm|V;3IuLfCIbh#(d)vw67C;N%>-0m{w&V(!as>*!xUCcg-Yvga7rBCK z+FOwd+6A}*4Y5?-!CGuBHod}DSf|3&6%%BvcyyYNueL(4GmHD!mnj&t4K~EcVT$FX z_V9(Am?E1!M;ytA06HSzNA}&goBnv7{hbqX;LbVndvfgO9C=hS(tS&8qO8XI1AI-shJ27rXOY}A7>}W@E)d9GM$j)$#hZ%1iqKs8y60t z+pD2s^_?n>3UFsoL>ju^2A3tr3>|6c)&Tza-XI8I@&8v1@POC@UQa1~WyqtR^2rq| zs6mLCpd1eQyOhM`N72-@>+9ydLRYq8o2FhOtyZtYijT>yCu8a$JM8aH+;L#GZP1 z`mI2vScLn27LrBa#!;D7J@!pk>uy4Rt=JKCUu|Sa`4!FZvEzrOoW%^IwsU_-LcU)g zf=QLU)zCg8Yi-oqIw}He8w+?sJ|sai+NX9{s%OCBQD^6y1qjP|Bf>%3N2DkhHRhZdvzZzHyDef|9HB?&fMdGe-e*u;cY+2jfEQA06 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/level/util/constants/_level_constants.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/level/util/constants/_level_constants.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e0ad51b05647e98dd42cf9baf49579f286a5d50c GIT binary patch literal 338 zcmZQzWME_f14bbR24-dmo2mFe6llM_x&Dqy-(ubStNu%z$~-}AU%)AX}nH$UIx!tqZ0;a#PghG-5Zp&u$=nD2Ag+_vI>AH^4=^`_6KyLj^F zm-^B*H?Q?RKbZAvC)2#0DNg$}R@JdBar+at?sbTjjQhXUuXe0ybn~2eJim}nyWp6b z)#-Yxu8vF7-xT^kP7=>eW}fh-CHT+poa8sm>zD1|zuC6z*#DE-SA7(h6i!=mMM3IG b>EbzsrD-#tiG96v*62k3?O%*}M%Oz5b)TG~ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_base_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_base_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ed54867b1c7f522f6d6dcfd4605aff4e3519d92e GIT binary patch literal 1349 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_i_render_handler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/_i_render_handler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..12d947e9274a13bed2e5592ae891d42722ccca5d GIT binary patch literal 338 zcmZQzWME_f14bbR2BuXIHq)B_P*5kgVds}5Ba64kBX-YPsXc33AEyXJ4TP+ivo`3g z*AW8&yL^TB2JW#YxnZm~T?JTHZ>YMUE^+&&S>Egxm1vQVcYSAb$+0*}9jftsHhcb= zo})$mrj3PL9b!YT@H^}Zo7J-MQic(doQUr+Crt#}fW#G|u>Z zL4tjNO%l`ox`0a(A0KekZHanfY4gv19gF^(i%Wghy-Qy($MdSR>hmAJsuiJzkEz1`vN2RPOK_(_LY zSVGi5$cj0(z307-IPe^c&KI-!!S-?4qRT%26Sg;TaGgFh&!+mM&+^k5~k#o)K7`+w&3%)#>jlL#(- literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_base_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_base_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a6d80f2c4fe3b5d4a88f7047dca421bc62b8f6e8 GIT binary patch literal 968 zcmZQzWME_f1Ev@T298M(HbcvQC^&X%jdM?Wg5QSk4?hNK`@g@aw)X^74VbE!vo6^07vrzhJiC ztX4Idf)!hixG)=fiiFrUPG5GpAXei4|6sKl9P3P;Mcq7+e(&)?U%y;C!^akk$4pu5 z=Ph6Tb^FW9Ro_x8|MMij5ar$MlyodZ=w`wM;R!kYrnYi>m)X9#C;c!s$FF$0bf%Kg zy0;s(RVGPZbh`B@qATR)%1}cOf1Y*RlTE)&(+v4&bZTkoq+Ykqwa2&*Wm&c{^-XpW zxV%zpMd<3_l$8!1PnvI7^{PBN=KZ_q?k>H>r=71}mArmRX-!u2TBc7~zWwg2wrc)h z3_E&gl}f3b^s4(CG@ecfNuP8$l3A-ShADu%$tuY-`-Q$+PUMw|NTBP-O)$oS!?Ipt$lWyHOjUo?!5T3 zOES*iB|f_!TaflEdE(}aRjji#e)->Fo;>A6@s`l^GnVInA5`A)yh*-HDLCNAp)T1o zmi5f5zo({w5*R2|0)Z4TZK{G<3=AD08k9V*EvLFVHjrAe)Jo3nao+1{MdVc=qRD76YRqkY)s#Jkec6@ZkC2ZLiOS&OUoTvAN(^ z(PfAl2w5>FIU!-*sRIX+4j(u$;n>N@NfRU2On*IX^8AQLA+x4Ui&~Pfdcus!ljqNg znDi=y^GJeYFO$G+%l#(nU4r%ZYp`lC34LJS_~nz3x6x^Z9A01Fy+@K%E}NLFt=uUg zabupL!3O3`wo<=yXH0mPUpg~KWUs;X1quH3_Ine=^Y>mkbm_>PBwp2IRbSuMtT;V} ISRX@10A=N+XaE2J literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_buffer_object.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_buffer_object.java.i new file mode 100644 index 0000000000000000000000000000000000000000..da2e066e7cbb5c6013177599c010015f60d97af5 GIT binary patch literal 4180 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 F{|6_n*wX+2 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_buffer_object_manager.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/buffer/_buffer_object_manager.java.i new file mode 100644 index 0000000000000000000000000000000000000000..788fe16f469e32f5ce300691fbcf3e59b061a45f GIT binary patch literal 3936 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b06e4fb9c9b203daffff22fd472de36c4ae1b39f GIT binary patch literal 8491 zcmYjW1yCH@5?ve?2=4Cg5Fog_!(zeh;SeN9a0%|VxH|+7?u%=12<`-uKp<$~v*i6> zzpLhS&rHwM+&+D8cg+RB0AK(wf;bBRkRbfE0U=NSist3icM;2DeImIHU%gaY1r~j) zwtszIlvj2Qk-qcVYeK)Kpa-NvjF9Z|CQ^ReG}iU(ag;P%nNz39sKR`@)kS6vSQ&<^ z@W<=(6sB)3AOQ?4DgSGg1DQ3oFLaRjVN+ttr=OI_K3)8ev$$l+!t+v(iSHvYHuFVu zFYl6z{60Myn3IOY+^vUBwMW3i_~TM2TT}I|)9y!?kN@Of>{3Jy2`G}A_n%cwe8QXL z+>%$P>LW#ArWM%#$slx=<4IVCVkMs6kAOSIuA-z06RUY>kvDDX|b6 zs%S@uBH%DWxUd?9G7@{$<&iw>OSQ-0^|JFDat@t?2EFP|# zeZW@kWbt}?M~9GO9jd<+>T5MdFM>OTP;Sm*#yH7<+EileBu$8w@Cq3fNh5;WjXIbuwX2Fo z$u)X%0BxwMSXtLKn}T?;jOAdgoLJl{wW0kj%kWAW=fK2_Ym_C6SxH1(T2m4sftGBW zb|*Hi?uPzKffnY6npg9cb%>v_)gQxm@B2Dt@B9Ajcbp@#t^|?Yk{GXl-N1*`S4}b1 zHG|Ep$(UEVo!M$Xauf8anbH!hp`1A)4_)OjNFbJ?oT=Jkhs*}Yha8$`9&KQ=9)&I%PxniQLs3V{? z!2%2OieVXMip<>YXqWTdYqNk0(f8Hre87s@#xDwgjH)!N=qzW})jY{iXycK<8-fV- z?Ww@vme3Oc)yQB}VS>vTnanrEqxy7-AnQWWvODLaal{(FHDw%8lny~Ma^7CJo?vnT z|8QEtMRI|eB-Ek{p;^9HHg3iP6XK9hESAJmTU-8KzxN}a7>Akh=8ceUPKxaESKU$! zWOu)_w@R6CW$cBab4JOhQFC>O3!Z;Ah;46h-uz@Tf}BI>Yc6f}H}Map z_NklpEX9|WY1X-6X3kxR(n&h6To=GS%C2zcUoh2K!Af@@ikOaNx{3PeenKF;< z@n%kziEui1y7jTrSP=y{xf2Wb>h^G8JsGOW34v;mg^PEPfplW&8nfnQjju+ed{vNb zdmXslKt1ewojY=s<74{br{11X@`Xv7_gU)%OAC5%Ux+|@ zZTm0JY`3ijTZ=ODyU#%sVu4-ey_M$ex+H_Emo*Eqvfhxr_{unv>ijE#3hI=ySso@P zujrKar25pm1?yvcWxbD2>LE`*l^@LYSB{nsvDiSFlS38M9n@XMWP|X9$>oG+)(_3^ z`kT9c;0qreu#f0sIQ6kQX;9q%1}R1z8q~RztX-nfqpB5C^hC{pj362dy1yG`h+QIq;9qbma^pCDq(!kJ3Y`kktN5@HsQ#LtH9-} zO%Lqf?%6F-y#|dx&;V2=u``SzIv&w%iupz~#KPy^+Rp251#5Foy>U$ z?g`>JNk}*RxwhK^sMbC!`<;Qa`{e2jt9|%fFsxeNeiBn}>TOfstZ8VSjS$Tvtl%2^ z2h2q}0PbOqGW>wuN)_4xca9Puj@=NGEQ7e$<;$|<$bJ|=yj!6St!mIx_$(Cw0CCof z1pq`qHMAxYqpQX1?Ph^~iLkoaGQj=Fil;LB*XKofWm}j6LL87GzjA_tmIz1cc32t5 zSd~~6bX>+*M^#wW<<;2E71)>**n)rZec}Fv?S`AggB^_v%nq_N=T=wMD#%Qa4w5Lw zi*SZjiQL{(fye@h!W;LU)4%)^6Vx`aE^I?EFLJCZ%qZ8ZXz*S3Ux|BcgK`kM zi4{AFq2Qq4nqUjqH_~)WG8?oF~0iqtjh=B!r>-=2Hx1{~YI59a5iZ#<)_#g-VAere(hE^jo{*#&0O5 zz=;r%_>aEHdwsPt2C<;y*X#Kv)B8DjPf7m!xEXK2hwBm7AweB(Un@;SA$eGLltWh> zKr+3w;Tyi>T8?Fv;D2;IIz=ZcMiq0sIS{Ew!>8h1Z(Z^d_UYVj*E;tms|=DMqjz6C zwc47hTX8;M)WTbFv@oJ(rkWR--Qv}5Y7Bg1-Sky{g`xMLGBsB)G`?u0@t&s9BcG+e zZYAejbMCboFK_y)a!Tk|X(`MLaF{((o1;O-oIdEh{Ga_|(U_}4`&Q$^D++LfKOt9Y z?(D#JTnD>#NY+OUITG(2usps&A+okp(XD*gcg5adQ5BvxA#B*z+RVg2H)VsweNe1t z*5P{c?tzuflXs(Jz|7qvy`>E1AH&=D1Ua$oNe^%#cOZC~`p5^xP4TTAxQZn*r$OdN z4`zc;G}?x>K(g(jOY-*>Z^4scvZqW}jIkUu1|!gx;p(U_Ppq#0`|T83AuA#Xmk{2$ zrh8NI!gXl%ANdiv$joRD&^^EzuSq{z@r0IgB5&OdpKN&Jd9DzzuZ-FzwhZ zz%1WrkO!Y0WIImd(m5mW^3OwL@>pw&Is6hD z6!FMqGfOXtuUXQRKoa*+Se;6|^t?rvi}Elf*_)km7&l~n5r#!GT0E<-!$Ytpns~G1 z>M)~n@f`}S6i-p#)EpED*4ZcUxlJX9?*kg_simRQ6qOi?Fp%f@JqER&W#ajOh0gC^ zCHcLPZ6_t)r9Nf{D`q*?yXns%zqyx%jRwB|z<2xblx8Zw1};k{tV3w3FWH@slCxV8o(wKfZOb7(zWv6b>V#Wp`|o=yO& zA7J#(f}TKfG3SwIZs2f#N8*G)XAyBw^JGA zo+$ci6u5p(>svLZO@oh zfz(?Qp7c>iq}@EJta#;sF?-IU#$ZIk0bSye|^6>x32@Qp_~6eujBo z?8FKMe%{pkW}dl6IXPP~kMv>5FWto$RfgGKEvY`2hRgnsCc0Tz(%b>fZls%!{#gq< zQIFL%fncoGDU?gJ%@;GBQ>DSffe2?5D9V$$r@Y7?#Q%*xUQ-Uo&`{3u5Eo9*zY zr^gNphkCOR!r^vDR#)2;NA<|KI&9ko`7ydjO5OCFSO#=0@4xl<4||H%SgODE+#^w$jz+|zT`7)q9^x9E#?H^q+>oO z{#jSl_N+F>d+1>AJTcQ38b~iOoCcXwZva#w7C`gvY<5 zgW-AB@X#RaMXZ+H#Z2F>PT%{+%$2C1KT3Z8>+=_(CEYY*vbWbI2?q92qTbcoNy1+v zQqo_e-Pqh%QPGYlLUB@QdO~SooCCo9?ov^S+wJnJpRlGIP&2yPyA80SgHH*46*@HT z0GQ{ZOV$jvo^6q5K!ARP{@j=}Fm>8Z<|@QDYVV4EskUwp22Ugi_0AXk!FD|hS76lf(Ifj6KtLpgCaG^vR>14 zP?ECFn0_b1n#)YsTibR@zOh!+<{gx=;Y7X?Rc8%brx+9Ajjr=UiXlIr9X;!RGmQs|3m3!9#3|h*m23$R>F#BN zeVFn|^^&F^1rdtqf_Bu$(MyBQl=orTd8~2~sT@rmCMnCPZPA`q+Sz{z4@MPoKAu>k z&!VR030Coz&~Of{D&68yl8}6LF;BtRal=gk+j7X)bOGzTw@N^r>e|zZyi(emJE)o~ zje}4MFf5=5lLr7$FhQ+nTkaVUq0BXPgYVC3bB;!Z$S+RkdG_E4{t-d`2c#-^YLjVb!PDbg>j4fEy>Vjq_)J(5mr$2r&c=3^69hsbC zw7RGFr@c#{cgt7-UvG52>fNF1-9ZiA{8Eo5AmiVQ7^?O4L=-b_o!f8cPvAx!{g3SG z+6gbwvg-Bi9Wv8fImEA2gF@9d_Lu@8eyMAYV*{CHuY#_uQ3$`K$t;NO89b%ITq8GU z$h9ltFA&>W2(njB{GZl8jT5}7e_eA;#ln* zVjiQK{(>_#Q_-bipeawx7Jw9l3pOW*?@Wlh4l&}`PlXccziC?wu#`p|uT(6fLpBkG zX|e0yzs7pYM5>Vt+g}u4Ngoi@iV4o;LmISKADH%#7bh+>H&`|$=V!3A#~ZbW#KiB% zrEZ0#HsujH)%{_Cd&?_K$~zr9ZmW>*YhvKKRi;fO(Z1a>>Xuu6arqa#vb(hFo#vnErDeot z!bX6>5?=-07A9*^%LhvXjuTpuBXMZ=4?G1pZWb3eR*_(R6#c2$9^laF_{iAA#3#L$ zL{|>XwOqescM1L4$Re6%2gLNQIr6FDSlqHCMsqeYzmhY@5|QfYa6RW(vWS*l9!$X4 zdXNi5m6JY?Es@>trw*uSitv`;#6R8$ktgJ$8%Yq8P@4ArAc}7=p0&$~_EAdTnq#4{O#;^c2K;L{VjcD11Ic(!UniC#MC=!@#TJ! zx$i{Oo(Z%zxGD6fGUh5B$6{O_G7>_sK^O_4g85qi&der89JQ3p`g5Fsx~J;!)}YvL z!@2FQ5+4EQiAxIUoQHI1rr^*)5w-;Ypn5JsP=U#L24rZ8>3thUe-jAOg&(@u&W`Gv zxH`~+-us_C|76uxv&WIZrFiHG0~!F0nSW3_owPe5$W&{5$!IcRwr4HB1T#9)Ha6Zv1h*k#%i@B6t&AObN#T z(ri?3d_|jSM=qI;N-V*jq&;BGhHMwRXkA0z~D1pytQqzb&hs$X;Yuqr%$@ED+3%@ zKW15Rzgq~d%}evi6I9)YCD4>4Cp00}Fbs$*(y%)XCs9x()O=~OJ2$d4{^ zBe$fJwU?xPV3mB3y>Me7Z=spU;QC?U<4F&g*@D@f3pvh zM8wOt{SYv!Xi%CD1r=2-i0a_-6bUa|5--{JP9U|yF5cneH4VRMGp4NBz>oc--8kB0 zI0h@?ig=DE;wP(Ckxr*i7!0PdxPsaSkiUO`(0XPhI-u1LkFT()=_Z zSn=MN|MZ?WsEnQRr<}qoLR&Ku*I~r~05d6s2%5flYfywidd~WnUk%STbo&4Wn)Tk+ zO7vPcQo1p!q&l@dOI5+(=o6^-f5j`iIYCSbo(mI#)JGk>YI|(jYS75xpcUR&vF5Ck@ak?FVI?v#8= zriw$Nz!A2Z>wi1kmuH><&guCmc{cb_T;4gmTUoeUSyH;Wo4MOsP+HqMnK@8eJ2;!U zQ!2}7Ys+YwD9gxdo2bdkYRPC*icoS2p#z~WB6wN9pnFABFXzu|nfvnzD)bX>_s!9M z$fU9w#*$R`xq`ST(O^}KV7ZwgG z=1uHi+Z(eZA}%6QcB5+(PV1|u=%?u=RVJi?(=&MO4@Ph(hkG+J{E&gQt(TdmznoU(kxEqXW$JXzTrVZ(|~_;h#45zh29|>Y9uA< zSIf9bLOFDj$h8zUmzn+trc z3b>yfA7`6Nw+^A94G{bdwSl_noAo;w~|O%U;^10GsnQ*CXjB%c6p{`Zdpuy({; zL#1VD|5ye~A_7dEASTc_5Wd6@u>TxCj=yn%^?TN6(D;pIiq#(cE|Ijn^H?-%l;;{4 zI7RvE^B1A<+ln*;ScI=99OnCz<8ZqZEr-Ziy8Awpc_+it%!r5}d({eXO*l}P%#~?{_ z!;K5GtQcvlHq^c#RioiyYWeD%C_EPpN!2~(&|Nw#7e~;m3@2#(8UG*+YPA+)z*bvpU8w8~}Z9zGyuCcZ;`fOV*#nd$+|l#@;-BdJF0h#Adc zjRzbq^B=7q7&}ufYA8j-FBHSf{of22f4=-e?h&PP+aEeQIQ|vzvW{CEBCKqF-(On) zB9vSSXa_`&fI(A^5RI&PAD1QGa#l0*x~?VSBVr{=*O0(*^n?BSP%m{L#<@f+vjtiHRJDfwTfORV=9*m` z?Nx|#tf$DkwD-Srg&*HLY^o^jFj_xS4N76<$_efgaEOkLRieBJerwB0RgYgbTC)ropQg$yz+`>oPWJVCk<8u*UefXqV;J25t8JP2MqU6n<@w zuSXCT(QjPrdaiO~HLov!#sJ3O6~Lx(tHRo3r1XYO5Uv`E-j-q7f3g-y(0qLx#Wh}t zWyi`WL|O<*89<_MJvGBqt0UFgpsy!P*v9xv-)5W_WrB>ZUhZ?#!u5;KiUGSZMez-p_HFiL$?pWN(sDh6z46UJ~_yckiBJf>M~{iSKo*rg59|QP+NHngkG-^O$AnzO{357<`Y6 zi~31%At*;g^@zOpb&n9)G|PVB(bk8l7NDa<XQ5BQlaVO)wELgxOO;qe?O+QT~Ma}5{-(k7DyoBzuR1fYY%@>-hgxMLht4=jN uP+Q83a(W}Muto_gadSssebG|tEhVt+)v-4SDYg%S$NcpU2H-u<8T%jX<_k0c literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font_factory.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font_factory.java.i new file mode 100644 index 0000000000000000000000000000000000000000..57f1287b9eab76497bdfd02928b8d56254b359fc GIT binary patch literal 1900 zcmXw42{_bSAO4SZvXd>0vd2)CEM2>DC(}nlWEfGF%JPY18l+}Su4P=tkgH+Jl8**A z+r_95Ng+(uFe5uxj6F;9&5+;ooZoVu_iXQZpK|~Z00Q<6v;zQO{(~HtV*RpIn$bAF zJ}Y9v_57>l{$~ca<7|R|VfF)x)OiIN_*GXjrlyHC-W#9hn?qWA4uRtQ9uX~qgnBKX zeH=*1QaNJRm5txqM4k;>s49fK!|`EH)w{uF9w@YiGO=#pVb|oBd5ytW9j`bk(Ha&E8n{z8Cb2Ib;86YSEm^*pL(3fCG%;uWD0UgDAV)b z%PZ}w7k#+M_a_F1n~gQ^c0xQ6Z;A`AF6B6AJ<>JZIZtngZ2^_eM&^DRw4pORlkT^( zytB^&aquutY(YIDV@ z(Ek>eG0GOPpEe%55vI`rd+1N^Of$UE=;= z1PmPoLY(P+zsn`Vvt8#X*Nejycv`qF zl6)#=!(S5QpPQ%?wxh?B1)&XH0YJKKHq3?^3xi@!r}Zj+dTaOEg>7U0k==u12V?T) zVuS2NSyr(im|lbdXUkm0`y1C{pH_T713>?;vnwuP0RZ5Ivzx%|JeNGfrBKTU1!Z_X{MZuJgI%Sgugt?T-tXdMlky>^8B%9ggKC^VWd-w9vl)7A@XBP6365q6mOCsc&2 z`or3JMi>UcLKsB?7heNyu;RsOA$LlZjULzQ$2{0Z82`l>K0r%C0CS$uM2e^^W2r8zgZKhhHBPB z+z}oAB0tsJ^+fMnu-vFOntxRxJtt3-`JQ(U9b%DCyU;u}+_MzrS=m#yw;i8P_v^MO zNkM-!B*20)WxDBQ?&m(H&8^N*wFicHJ4q4pW z91mi@dZNFi$#sX*&7rvo7j5qV;gQM`(->L*-Y{vXpsmC~9~z1jlWGrdu@b|12*Y91 zBDPlQ?aGT|3IAg}q=IBHjJ!@_y7#5u3NB83M)Ccrgi`#IVNFprNa|>A&A)Fyu;W!N z7DdiWM-jDBU~l4NyR?uCYA!QfO30h>2KHyQ$qJy%@S6hnChYuYP$lXmrfuGVAJz?Q zV#%`FGQ@cC0!@YT<7&tTxgW{9;?1kFJ5WESn8@WL&LhIk%~rhP6jzTckH^Iu!pn%x z9=$FBz6%2_!Y_+FKpKmU{Lk*xD!yo_5he~cX6V&+PiLPQpSt*1N~%T(%d$Kdu|rp> z>I}meQ-USVn-`5nT6#m6Z>XiFwSJ?)q_^)@jJ_`?t&dVI>n?>Vz_vz?zmi^OqY4J zybD7ZB0MP2spzWg*D!Sn%b5j%b;Z%pc!!?|DQTZRUWys|v%#vx5b#dcdkqYbZ@8VR z{`mI^>*#{XMTC04n7@|*0k7McAue}qG82Bfr@GakX1lB1(>J5XH77j~3PzS}SoZcJ zba2)($DGn!^JW!VJ&-}w>obcHf8fyhePk-$E7EM-XQk0G>LC+~jTsdfY+ZZ*^w{gb zzqon8-2N8GHWG@OkZ9v18r^}XxU?_i(e5YeFD1KoW+l;QS$l)y{Ed@fUD;7V6g^;z JZ)`akXFN7MiS literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font_library.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_font_library.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c4900410253784f9a4656dd049d77c362da0222b GIT binary patch literal 845 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 I0J&l9;A%;@^8f$< literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_size.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_size.java.i new file mode 100644 index 0000000000000000000000000000000000000000..79dec06fc5028bea3b8a9ee4778f11d408d1640b GIT binary patch literal 896 zcmZQzWME_f1I7jh2G++AHbe7&DEKxx z`+GlY#0p~H^W>#ZP&)l+ijiTRtpBphPfQn9PV+04Nj#bFE% zR@xlTwO*jL#A(s%v>?HD`Mxzz)ZOxPPB(3C;9*N-V9u}>Vl#dGevLzhfl|MqEQsJ- zd&h?7Q1g4;+dG1!E2hPSpE=Z=_}c5!CF!*xGKntfg=XFE1-vCP7gf4mcD&Pn+B>;* znrKbyK}*Gg&;Oq>ibX{ppR(EZ!B>};aY<9ZA8`+vWf`&m#GR?1AO8|e4g7WI%ko7x z3zqx(AGxg(A6J@bSH5)1^b(FQt9T#&&JYjU$W`N0D*jmD-`7;IIdVG;s(4rX_NHA7lZsr`wkko!e}&bz z8vphSK`YfZo_)?~1{edpiVT6GB&380t*f>#U-Z2!P428NR$8We>w zci;YPJpa(sb@tim3ug1NZnAoD0;&c~Rm@o$u#vCHK)`jTLE=a5yp|&~EQHz3%h=tU zgWjrguyCnK*k8FjzrgTXT(&^Lrjtw0?yY_wJ3n>hCIY~&H7&&GN)v0jG1}n z!D@FluOo#l$BW{O7P8sS`rd5j^myLFl}F#GUtM8zt+dUsrsTxSHAkZCzNAM8eJb0z zYjQc$62~=*1uvdy>RjcqQ1ybcRPkP|mmlt#mu|Tew5*F0|OHVq?5i#aUU`Sl`fHQCHo5 uqsu}Wl|?H9&YnJc;J_k|Bl8?;t6u!F2{OKH>=j^=*3f#uiqUAEVk-dKi-orU literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_stroke_font.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/font/_stroke_font.java.i new file mode 100644 index 0000000000000000000000000000000000000000..767b63cd2f0e5ec56ccf8ae028d08dab7d61c655 GIT binary patch literal 1100 zcmZQzWME_f1Exs~3|vJJHsjp?P*Bq1Yvh?DDaChKUUSQaic7_^&#ED6AY{dyt6{PE zw+uvT^@RREwDV;QbUq$;jcX-`W9VAxVByUEsk84iTuq4HwlF#P|8E)V#(<0^zLhU3 z6#8o4wfCRj+qdMSaI6ByR)s0*oOz$vKe0acXxY--v!rSE>ax{$le9IbtUN09C-WMY z=ac!N#@(S!swoRs#B7R~{C%Tgr#d8krcLB8UBVC%ty(ZohFWi=$V_ z-(s^)!(Gu&F3r_H@8-?@`rF{w_xa@pf-%ykdh-s%J8PbmNb_|5>2cKTio%kf%RF~F z51uNH(t05JEU<$|Q$MhHUhaCS+q06R*Cs261WSKOx_MgV!)=W$h7`jWqPMk6bH%#? zcTP%clA56Sd+ThiofDGtZdfFTOxL#TFH$mE7&m*jOWlSeI{X{z?nRc&sW^XT(#wST zajNr`+Ow`0U0e8nRk(C-nw0g=&V7H@Uy-T2-@PHhcfIPW{Y%akKKh{+`t~q~h28H( z9QO_g^e*cWc$0LsA=aAbjy>n%-#@2k>Q)^02w1xO*pXZfiwVKL&!#P%Gvz>FF!P;2 zu{Sqg|JY=2aDxBPB{lvkXT|MmzYgY}UWYi(>Yxc*RO z|Ds>p?<|{jdeOpZWw!Sh1nD?lpWS-!Mgo&`^>?R5FFvPuif#=)CCBu*d(n!&-J&%+ zt*+IrS|L4+?Kr!oR#jX3k6TL1ljan>KJsOg_=%QJyjRazO~1=IS?-SS;*6^Q1?F>I z`9I&(nd4?_@%>q4{U(*we-1ajlGyq3;KUH?v#ZuxT=~9uQ}nsDzuvZs_3V6bdul{> zfmF6j)U+M;3_%M0pmYgJ%RrD0Ownav76a275DiMy6`I0|lPYxW;xrrrijyxEzT%6L zg{Xm$6?2jk9t0#MJUEe*knrJ=j>ai{PhUMx-$0Gi=Y0Y-yv}-i>K2{z(D7p75@Ve% zlKO0E_L9_Rs?RhWEVx(;B9A9^Ojzb*sxN-wNSuNlgUQt?lP7Q9u|;942mkKE2%inl zo-#4qI%-e~vW)2`*viR>jK_2uBm#1#!3*2di@&S?H2>(O{cZn;cc+fjWP(*g36L`r zG7=jSww}4u^kybTE7X3LRviHlPBTYSLo+RyUIC5r>(B21=PR$9)j?-Ik>ZwD` zG)5kaDGe6vCq6tt@)vVfxQC{fPC3L=qPRVEqNcA-!H&t~@(j42W+z5`VV=v*&?j&2 F3jnRg>sSB) literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_font.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_font.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6866f245c636dd732e31133f805096ebfd39e376 GIT binary patch literal 3190 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 H@Sh(5Ai~+c literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_letter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_letter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..17f7efbc353e162e2703484992284fba6cfe7939 GIT binary patch literal 700 zcmZQzWME_f1IAkn4D6dAY=*r5P~e^Z@$>v-lZT~D44lbalW4|ydKkcnCc8S+g1shJNZGr7OewMR)6+LRsyOeM_~et7hmyp4 z3%4e*MG2~07u`YxIvl z(T_9SpwuYLDK+sxC(F_kcfS8gds`keBSh=R;m$J~+FB32?wNeW@hoeiK5w0-e4qdS|HZnX{qKy=ynf@)Uvzf0@^-g7jQ-K>=gS$(`So|VN8ieQV)ip^uRHVP zBH1@u%$w>68z* zqF3s~y#L8me)aIjEj{weI1%6Ek;dN~`S>y_VI)X}w4+{I{)~^LD2j z-COHZ3v`#FlE?-Squ#MAR3f7w0DY_%5T^F znZ?M1EwnGoDH${ zKWrc{S6cJ`L$xbms(#$uYqc7+0<8`>u+O?^G5v_rM&;X%3RnL3eZCkJrS@cD;FKHZ z_m!8wf1`YO;roLEulPUiowUh(mXgO*wvZ!+`>xxIXo^dmxWxDAz=QUgKj*!lc<$S@ zFty2C^DHJ?UfmF~<%H$wTdrqWoh8~YpFCS))aK2xzUhP2jF!g*&$m=ws%v)MU8`Y`j*vu{AzwSQ%xm2>Mx@7)x>zx$3W>$D6WtsM=e#uoFXKXhzM zJt8Hv(qmByw~N>N@WfCMETA&Wde+ J*>Xa9Yybsw!8`x} literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_size.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/text/_size.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ede1c53bb25bcf91301d1190d9ffff5e0eb08a4f GIT binary patch literal 619 zcmZQzWME_f1I8W(1~wK5n<4K%6tEobUShBM=Jd;Z#hniq+HU^)?$Ac48ZcEc=WK|t z|6>CIQFo=M_GdC#MUVJ#ibN@Hbc&jG_+6viH=C`;dlk1T-(D#u@V|C0zo@|WP`6^JtbXXNYnW{LRkQ0s7r zbouY2Fa>$0s5eESY=ihgr``j75MJG}T$SuLA$_rRu= zC+}_xKJm_X$*O=0a=zydl-G0Il@^wkuJ8G9H{$c2jlJ#X_65dN|7M@4(*7S5A)r_U zf_Mf7)(S9-fgvA6gQBx(xd$9k~*F8D$=|>+f4Pvd)`l+HFI7dlL&)W4fB!z4P84en~hfonVN{May)eA mki#2h5wj+a<*Cn9pJ_O35pU?d9Oxj}EWvq=m*LiP#dZK&6$^F% literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_asset_texture.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_asset_texture.java.i new file mode 100644 index 0000000000000000000000000000000000000000..fc17212bfd9f956f81e461f73dbda5aeadd15bf7 GIT binary patch literal 982 zcmV;{11bCf0RRC20000000Q^`01S=*0000000061|NsC0|NsA?P|gwSwLh+70Z__Xker~1y52rq$bQHH^Jiw|-`vDt8f*}=& zXD_*?hQyAXOScK_f5$(PHrWD0BM+@w#p&IBK7ao1?2Ly$d5oZR%(#pq+}H=oSV&|l zGlPT?-cq4)Hs}xfBF&U0_`x@v3B?vyA8td;NGMr1x1tp!680Xii@5G;>{^M4g-Q}i zV(0dGOS4A~vF6!YggHACl=AFJhYKE((sypI$-%*(4+n6<3tB4;Uqq-9p2MZ)X(Gb4 zH|9cy2#0Tuj}DKI-oY!FzGc%R_Ii3awGNX(KP#?{JA@`ShtoVq`sTR-^FSHpP`&>e z^m~&D%%A`90EUj7xTL%TypB@35ST=Jl#ioG7k0Nh%BtMv`UVFpA$bC&Iw30uWAOhk zNedZ6=0d)5T92FpdU=td4kX?*z?Q1eAqG2;THMG8ws+qdIhRO;8eYKC4fbc(KBK8b zQ!p!~Co8Q|SX!#iZDmash8DfzA?}gN%6#`Hp@o!YV@>meQ>o-#s)`&OeVwq@vt^(a zVMrK(X+hN5_q>w9bm9b4)4p?9G%cf)7pb5|$QWdiB;#hnWlr}HathZF)b3V*hC}dkyBid{ z35L~G!9xV3S~A;OPdj0Oxcb EG1-#9(*OVf literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_buildable_texture.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_buildable_texture.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f468b00170dd7efa29fb908ea64d200d985d8c87 GIT binary patch literal 2701 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_packable_texture.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_packable_texture.java.i new file mode 100644 index 0000000000000000000000000000000000000000..83a03685fbed675fb9db269b8bc7b5acf6a1cc40 GIT binary patch literal 1409 zcmV-{1%CPf0RRC20000000e;m02T%S0000000GAeF_X1eO zCH;5RZ6baE00000000000001ZoZVP$Z`(Ey{_Ftx4+jib<-n0+w+(`3DH8NGK+_aU zf^Huf>1=bMNtLARdPV;Gj+E?LvZQ971}qDV=!MjC$Ghj@os_WXj*StN9*0cEG0xlp z<(NwhRYE5swD{Gg8jp8(c6azRQQE>EY{tUWauJ?s%@!ZHvFpPRKnsmZb%f#hb#{H_ zFORo@NN5dQj!RIVvb$$utTeZi>AwgaR*k;-8ew9&l0Go~y}jKX*n?A++KJNekw;1} z1Mf7O3LZ_eLBnN)FdV!X9=>>b1p6=;h6hLC@L+J@CiHiAlJu6QLqyLSaF*Duz}!60 z0cC7pdHrp7r_=Al$@YI4z$+zvEEW9mtLhNeEsI_+0BRR9>`P(m$lCQpjqrP%Or{2dT`?Xv-wm@&}3pzlRayf~Jri zH@S_pEpMGyE~s*u+hw{M>Jg_tUm+zJA^4Iq!R?|82Cb!vWE{2|$tSm&s*?SZKV34b z)!e|j5IAPyOpntkO1r9&joB-KJ$`|1k){8w#+!+=)lSeV*M7J~v{2XIQRZnmKf{$j z`R{aD7f8)2HI&4w{z$7ST)C*da?NM|T#~CJMvYL*t;mHUsR@3EVv&)Ueo|SliK%x8 z7Ak#0G^ds{r+!ME^SB4h)Dd{DoXs9hHeB>3HHTyoorCHen`2 z4I>ROdPAdppr)US21Y-9O*5yKD=Hv z6qvy2pS!7rNul9?B8hJw2FEn~@&pd(xWAt}(y8>h0I>;48)?8Zxpw#{D9t{pUNTXn zh>}Hc1(Y-BCW&d&yp->mj^`wjkBCkrWOm_LZmLcNX9 zv_CI$$<>H5=R^ZD%8c@5sS>R`^WKpvr5Z!2g8ai${nM_ZH1=>y`sUqE<0mNajcVQ& z))_Pq^Vn6%5x1_Cs0WxYYr;#giclM2YmVxwiECb#r&TkO|AZH~mGl}U^mi)HLuuMx zg*un6+hsC_GpXcas!{{K32UYIB0v8E(;e#9000001c3km0001h000&W000000005p z00000|NsC08`b-Hb5e)r{q7C}Rm?7?0U1W4000000000000000c$^)LK?=e!5JhLH zV(;*G1rg8S)`cs3f!GX5NX$qxp%&>Gyt1M27mvq-Pjvhdbvq(j_c-A$MUg_}v_O3* zXv?CF8822Z7K_y0Vm7&1!IM!-$nFeNw(5ILAxGQ>{%D=}A$1yg#Vom3I99yP7}>UV PlIr~Sa_J6#Hrp)D^~IX5 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_resource_texture.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_resource_texture.java.i new file mode 100644 index 0000000000000000000000000000000000000000..35fbe58959ce9cfc2a42a848a84eb94ca10e5771 GIT binary patch literal 413 zcmZQzWME_f1IAbe2G%zaHUrCl7;rxPC#si;P1sKS)oO>g>AYNzra{$!sfsygLwvmt zI|$gCPxx=3zS7ma^U=Ys1zRGjE;N7T&oQ4|W;l~~vvjoJ|J}3u7m4sIS*lE*IrofR z+`T=XnpaofQINRD;hEW$U+Qox!zs~g{*yxw?}hf5Ckn9b(%{{_e+zfER+z@TjlOZW zKCQC+bL104PKnkO#r7vh*7Q|h-{LaaQ{n*2yOgKf+8%mpPxj{Kp60sl>bBZUQ_Yqq zS+kB@wrDKwSnpb+srN`_o%A9Djn!N8*`L0TvPfdFQ&=j-_q^Xg!d39jzyFzxf7&C| zPu`UKP_^jG0z-fHBg-dtXg}roeq`0`FBf}`&s3Y~oUW^}`w7pjU25^OH{Ur~+Sk7N z^v}%X)`@Gqo)|uSC$aVGrytU9&3l6LpIl7O@6x?snPSlxI+-VZO8*P5A zY*>{#`>M3K?q0h&o~_KA;*OVFv`llU+wd=+<9o`By#`ZT-S)+WeCGSZ6x}fC2mk=! Bz9j$v literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture.java.i new file mode 100644 index 0000000000000000000000000000000000000000..19bb1c1cb6f5ea3698f2a70353c2f3546d20430e GIT binary patch literal 13609 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_atlas.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_atlas.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e27b5f6bfb1ee3f2c9ae00ec16b552cc36a515b4 GIT binary patch literal 2410 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 L2m@fcrWyYM7FKk$ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b6e3c44fb300205b356b095068c4945a32dedc0d GIT binary patch literal 1013 zcmVhJNKp?>OCdsS5ebE! zkh|;M7#!R3+EJpa{~hnz`;oAr4f26VQAQs7&CHuOqevY8!WjXfGK6`Okah7xct$xv zLRy0%O*YynGCAp=^yx|prQs)DW5lUI)2${`lcq#Xx}7&FDSfrq!Ye@&Byu!0lqIE4 zntMiLh#AgvSh#o&79LLez2Oi}|NY|t&IQjk<~k367bvAmN>~yoAF1dXYXVI}U{%__ zH}!>-a?C1@VYO&AHyqE(#9F9Or8#lz$RgS;LwaLS%B825G)Glwa9Xf!ZBC&2EI34sF9hGHN z&$N|}jc%#ohOvqrC*&&cCSJ+}*034bFi~j_T975yXOUA)1^;eAVF(8!7AN0mqL+Rh zweh#lz`wKjPr!d9G+XKp{LQ$*kN#G`t9AgN?UP{-R`r~ycl%MRB95!J_&Px#>5-$? z&Q%>7eOaUuZAOC$>>qAN2QH6~x!j37J_dR3@@^^Nw(5*?J398i8k}*#w<}?CD0ga* zRciD64ad(1hyVZp00L$J000014*&oPm;e9(000001poj50RR90|Idc{O)v?hc)G&{ z!=2D(@jQP#*#H0l00000000000C=2ZU|>7Rz`*vMfq}t+lQS(dFEK|UB(^Xn@(8NOpmZ2*@waEXmBzi_p+i&_{6?NJ)5RN=XLT z9jGQ&5@BK_Ruer^Gt)CluozikgfLPApDVSI!wc#_lH5*=MUm(h!Q4&2PrwLx4Z#e0 zFl(JEOH!Rm)6!Cl6p|nmFv>GBi}iBBG9VGKPEIBu-Uifpm6H?XXozCHg3=NW^caz04_prb*8TJ1V)VgC literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_factory.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_factory.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f465e31826a46b4f31d0471160597ee6021b7c39 GIT binary patch literal 1349 zcmZQzWME_f1ICFA3~ZAjY=#y8pG^5PC%tlf#&PVKQ_!qOk3Tt_GF@meRov^~k0V=;dP=l3&I>>GDgI8Y@zzj{H1oCd zOkO?tE@JvRD8@rCZ|{RyT^B24*bLf|Ba0JtVzN@bUOqT;s&ZxMMX9-Jtpf5g@7~G3 z%RMZ1WVg~iVe5}&drCSEEm-w_ueFB!>jj5Rrgrt#wp}-na1oUG`#)27j#QCOXDt8E zswR`G5zDe$mM=VU&HLVO2h$Jv*CWr{{9c@`tI<8FFzd~!KdQf2+h?jp9(tAFv~^M6 zteFy9=FO7uQV#a5d~{jq?#n6M7Qcj)i=G@alJTwMv~!;;{wKL4`_&=cDrLrpj~>r& zn{Vzs;eS!CSjPHIvs)$W+|6&b?62Hz>h61X`@LH=ZD%qPnJ2kL%>TLDVZUn-`^=4j zX=i07?Q*K#b%*O>kIfYyt(e8XFFlNvcQ97EAF+Sa!xkRf^S*BvEL<;s?GMX7W)Yq9 zlAu@tMI{iNVqjpe1hW_zR)T0yoJR9Av+!*AXS!=={;ip9wiYbDo7*Oi^BEAxK3Dy|fDXuR^^&!t6At~@xiDx{Z5L{XMi|&(n+yHhf^Ry}|W8Auh|(XMJ0KlBZjSXPV!}IJp27h5a^L zPuS}&v58k!w>MNZ*0+^-aplUM4`-%K;_;PbeH2o?ByCyx6o#pbcXLSSG3Xp^_zv<8 zQ#6QV6lP%H`~YGB!D=981ck&h7cCwC+k!=s!B-zNU(w}zaB~7LSOt`*nA010(CdhS z0PnqB8~#s7=2orvs3Ip4YonpPt^4_nbIX_wHD6xodUX9~@-em5w_}gC@|>K#r}DE} zVvp=*0r4MKqTKITsV-TWUGeYM0Syy{oY(wO0(%19J6Hr{^lC8gk-zw|=Gcvk?md&2 zyp=Z%+oSAR*BugPIe~@yb<&~@dsiGdtWx+OIL%+Hz-?t_ z=K!W>mOx1T)nXV>O-w*$G@8x+jIA; z=K<%RT!&8dY1corxe8GOA;F0&Eh!-(Ej1w_;n7p3O=b)q(0nJj>$tce+L=y+gh3YVuVE#y0yMe>JAe24!ZlPd%+{el`m)htUNd~ zbfpxlhLe@S+<&a94tX2rb+4YCyu!a@nW?@wGxKW~g?;{At_OcEbv?OKL(H+|LnI5s IX+QT~0G*;q#{d8T literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_manager.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_manager.java.i new file mode 100644 index 0000000000000000000000000000000000000000..cf0eca78f25945c9d9460abce506e938ad3e3ea0 GIT binary patch literal 6792 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 U+s8vK*7;RKYc1ghm|g1s0jZ9pj{pDw literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1bb1ad38a4c2ad27730a9cf8dc04034e5abc47b7 GIT binary patch literal 2568 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 bIm*Go;N)_&satC2VleyoHyQmm?1BFPC0Ty8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_region_factory.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_texture_region_factory.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b676bce2a7884be08818291f3511183736111fde GIT binary patch literal 1025 zcmZQzWME_f1EzKc2EJJkHiOuIC@}o8Pv%Ox(d4P(^Armdm~#_CPjo`nfT@Z(SHoiS zZyAV$%1d|tf8g$LMN#)@@Km#{uWq&biiW)UmNCcs16Ns!bcX5M{pX)B8+2+UWgZs@ z%DMl#xc~jm>nA&%U4LjL-gB*6?71iL_;)?GvwUlRZ+XZY{WefKYWi6=%jIvwmNN&~ z_m`DSoODIhsDSf(?F@bS1I)(`iY}D&iQ(0+QadOsxT>|LRQ_?LJd@gw+&vxjlPnAU z=1jPdF2rC|VR7uRwvEi=hb-&Ei@f+|w>iD4y|Yos*psn7jH|>cQ9$=AU*pdI)g5+6 znsb+kPGg+V^m7K+y2k99y*2w@oLKr~$JMNpj-g*V&wPpS_|h9_sK`}2F~useL`GWl zvB-q$@2aN9u5UaSu($cO_>VpBu1@F6JIR^u{J3w$&D8<(%wB|_v@DG+DgB|(X7FdK zTFh#u4_u2%w2z9oss{2bSDE>2#x0vQIZ9fM84+$hOw-(ZCVReWK9myR{IN>OjBB#v zF1rhpJ~Ffl9%H`v_{xDDag8<{N4IqTteyVRT{Y;N$+r#MQkmIhtrj`~+e%Mmmt{Lm zy(bjfRCwE_WLI*jpSFu`fAzGFLchx6mfd9ev!}$pP5IQ$T$3m3j;5GB)!KYdocn7b z)7ncREnZvKPF{O{^R)FFp84iqR5JLU_rT;u<5!W+8s(EsJibXnYktq}fBoc6`1!Q8 zDJNyq!{uiSyuWqt=!$Rg+kQ=+a9-j3zNVj7K6d}8>!^y|wA1rM^jW(b%MWdP!Y%(c zM(olJGsoPskGMA4ochhR!&8)f!TcHPk3aRA_mVHd;M!BKnDCXd#_JritalyFmp;A9 z`*iVRy&IFBpFRB`o~yLt@$)&}>C=U3joZG9RF)U-Us%`n@}1C$9qOeC|LPg?`F>e} z(jq7U1Hn9CG8O`}7#I{lG$gLL8HqKc29;yaRRm@3FU}!eu zIQq4-v9a20!p5e}3rsZCjUyNCP}#`h(YhpT$`rAsY)hA=KYOmJBED2@+LB$OPoJ|r zpDw1lJZnknGu3AYL^MSlB(1mv3jHnTnSn6 z>}gWMgPA7|9Ej#9`CMCKp8jmfvV>xbh@=Iv{aTzQ6N~HoGV|gL+bRO;Dh+R}W;k|X z+H{Z;nN`6Kl>z!r0L)@w&<4_sAm6ooDpNbEdv8v S1CYbS%f-OJl?lW-5FP+<2)r-= literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_tiled_texture.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/_tiled_texture.java.i new file mode 100644 index 0000000000000000000000000000000000000000..328b6a98b1169d34fd6486c3d9bb346a48a6e2f3 GIT binary patch literal 989 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 tcqH$5r2n1c#AC$J9ZV5$`Yq{T@A!`~Xx9H&D zOqk=+OJ zNNkF1Iy;_wp9o=1p&yJYcBHN+z_@!wF+vEZKXf9dy)~41t(w#soqt;FMCjo&xR~^} z?o{VUAL%jGur$tPwttOgx803MG{GgiPS$C0zD+HqN?N&({)ln6ymj zWt|seWEb8mek9Y2kdTaB4wVZ_RtxEZZjz|4ODz;b%oW)RZsiT>%SEyoJQY>#cg)+B zL?drHNu2eFVyrB-tVG*|h}T6txdUBuH^AnirNRraNl9B6Rzap2BgVcuVmlazOs*=g zzxr~ZP5M?^G_t*QqUnj-jMSP+1E1}KKKNm07XB2&2MM1tjf-!tF}o6HbIQvyJH2Yw z@Ol#^ojelgGUfe8kS*b%OKPD<2M>9`0=TuClf1g_HC??gRJFqXZF|W?Q$(O1DY#DF zF$MShKBgk|vX5-XN9K5Wn-;%`c#|);%VgQj)8Sp7_gFM9VihX)VRSCRM%zlvsZ89U zbhzVh!)j*=nSl*Qavsv`% zqd@ijy>_E=C`IX`#_?(Q^5K(V4H=^&(|%`z6oz}t9}eiGDf_(Y&NI$;zN#M&Qwz?0 zi6Q9(-RqT87<3C|kfdjVTHS|Aj-0)qM&6xN=;wAymRz2=5t$OLhn73gVq9$c1~nh8 zxtt@>HlC=F@S!&_=(NMNHVC2c({oU7phy7#Vh#Y(N}wk&Wv~O)I^EID(>iv0Kf>ft zK|^9j&zwumQSjOi3#T_^J+>c{3i%BZ_c<2cMncAGPT~{ zmT|bWfSJ;z6_;Cp*Cjq{vKS{qYM$psy03iUPjfIhs@L3A z+1P63TinQ0YdPg4#+DD8=c%d^n>|D3&Fdv?T~ZIH$XGM#FQrG^{iugVhh6+PZZz1n zG`HN4LR9XLvX&KJzghnb)$?NPNdHB5!o zi_NDU9Bz7GrT0OG8TV0eK9RK~b6(%FBG=AgB1$|j4WT0!cY`EuEeCsux`2F5&=VL|&>$fBmQyBV-s)Y<>N(e4KEcD2 zW=M+!VT7m)r(a8Nx9%`h;l$QhJr2`7y_`RVK%HohwKeFycg4KXql~IQ_;}Fa0I4M@ zfakI-7KO5GCoC_#se(JsA}lhizphV>%ivXeXsv%8unF!OI5bV>{qy;;t0(Gs(lj-m z*q^i8F~jD1+nMe#X|=W+0rnOI@mpDcTYvAk{kOF(XK0HZJz!9ktaH;lUtJ&>kUM0#c>%BHsK3 zxCJCQ6RW&1&`_y31mo(j;U~^W{`~q^QH%(n0t6eN28RcS26_eQnqu@Yco&Cbr_Yg& z*`GUZd(zTj*Fi}H7z5>lJun9VQe{F90ImseD_F|m#!BvyBI9Phx4%vVMAGbJgTbaK zMhM|_4+_Q5n?ezXTxjYarF~IvhW&m+k4feZGv9i?QZR!X7>?jFfs)5cxSs+ODfI{M`K;R6%(!wZ|{}3ZA!M+NLBcYdf5KZ(`|fX zwNu6M2a==(W1hJrz^of>0e34lCfxH*0Z}ZW2LLewgn~q!u)o2qP1E+rE!g*Zh@V7% zbNakb6e9w-Edap11OsJwVCaQQR1Zv80M!!{8t8dG#7lP%UYU5!?KaS~h+>bN%tyTT zuv!|ad{ACi+9qtDyQUwiZumaGvMp|pdNNAs#q`@dHK|f@CmswVTN6JRS}pCB=sq|y_|0-%>)2)tGzyVJnB4n@o7iZ@ z3UzvA63sE7yVKS~X50sLd9t_~U=M`HE zOzL8C5REzY(kX;rfyKeT?zQ2`jn6xt_4Ue5$w*GRb+Osr@J=q0 z!d8H`Bkk!pGrMQJ0otI3xt2M%#SQQqKrMl3w?zt*n+VjkAu5vyPJ_1tTgv`B^J;~( zf#anI5y?}dBY@#kQH%)Sf-S)-1Ot`-Q&+$*jzWETf&v5OC1oaPf^R0U<-6Fn)d~|3 z{-^3a!HhUqRsHDQG$(>7Vuki7@5x#9KC|O0KkiJpNJzpW1@M4{+F?%U5p8Vr2e7*O zFUt)F>YZ>rXSA>DO3{mW7a+$0}m~0bDp( AWB>pF literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_text_texture_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_text_texture_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..bce270469f9d5bff436d500343bcbcb206ac6996 GIT binary patch literal 1737 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_texture_region_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_texture_region_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..42def8dea49cebbd4286c77b3a612ca026ca8df7 GIT binary patch literal 840 zcmZQzWME_f1I7ys44h67HUsy6D7dvXa%PRilLb?Hj$b@u&}fqSJkk@Y2254VIU9CA z`?i6=vVOBC^*fe7G}tgp{_Lc_L)Q*%v+J2!w&7XeM!!BYccV*|Yo`2tKRLDhOf=ie zg3LcjcjvylT>EQ@vwLCMDeLar!3TbNd^(wP?q|ipaP`SMYf5$0lP%-VxLp?3J5pjY zJFWZighH-!X=iTCDb!`jdoBMeCNpK(m*ytHy5*;oqC%Z0fm%m)M?vRggQ96)fdlox1gOT=KdezLTk2wL;h;56*4&+p&^& z5BJuBf^)L(y6*Eo>M*qU{eL~<4ue~Q*Pm1!c)fB-ITv@K!`BwwO`&ebzJ-LY{>K+9 zywXH}m!O9AGlLBIovXfF{?GAqv*_O!y+5i|KDobTz0-2=p~fe{%-lauCmb`%Jj<5% z>gJ#4>L-#Fn-&m=4ciQgK>Vyv&>;8UgKb#pcJ?gjHtNZL9!lY}r z8%}M$u&(N5P~GD?CJBdK%AiOEr34^QV_@Jo2xc)bXoF}_lDK=prTT)~rCs_5?K1aS z%{gngWC1%=4VbE!lbpcNY{hYO7S|C;2R31Sac1V(_5$n&E8c8!Si|s;k-^uQX(mW1 z<2SH|NkCg(fLRO-Eg)f#EicaH><+!?7?Qm2ChJn?yJ2ek&euZKfGLnI2?ps22^vgE z%g@|t`m;!=_0OV`y+`&;nR3NQVCt;t^JY$8H9ejo<;jbwOTwm15nK97bm_A6XU|`@ zI_z*vm}d%dSFobMeCAnUry~PqO_@A%O~ayND@}BDw|Xe+8tWUfhq^6fXkERSA#n1{ p@I?U+f~G{s1w~F+wKCxB>7yqjW1<*Lm}707L@y{Z>|W(j3;=KJb*KOU literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_tiled_texture_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_tiled_texture_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..92ddaffad076dd91b645aba62ce181ceda62e178 GIT binary patch literal 529 zcmV+s0`C0)0RRC20000000Gee00}Sv00000000O7|NsC0|NsAGdxW!2J`TSep`%Ct zdy$ICN_Ce200000000000001ZoXu9RvWj+%Fc+HknMq048uII;ypSYnkgtShz4^-pIUO z99pSzgzV@z&5pAS_8~or)5G{6&C*^W34^wKWOc~d*24NNKV6)_3seOkZS1~;!6-@K z^z+Zc!Bi_tLXq|0&r?XhBsRr2ipNo8x}3D}5!Hx)L(bo4J1V6T&Bg(=gD`eUAK9*D zz11ey;^@^I)(a%!>iPk9PVfZx?B)rLkp*st4i(ZMMgvHLyiyRYtBoDW~W)hqN)zZFW zWW}EIHeOCJRy!vKbE~Z+sntz6?TkT1z3&IUE`c@G!K1T?#{JG8Sx~*=d>0G{-Y`Tv zgV@^u!J9+a{^8BOI7PGnr|1%8Rnvz+e07dy+j6vw`=bE;HvaedUewes77*?kee53)# literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_tiled_texture_region_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/buffer/_tiled_texture_region_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..18d9e84988a2332f8ef08506fa6de25b14c7bb66 GIT binary patch literal 1089 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 CXCegv literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e6b38fa1e57e0b9bd2c1c5573e4339fb49c7b345 GIT binary patch literal 2845 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region_factory.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region_factory.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f9577d76b378e9dc262aba9b16b8c632e99e66af GIT binary patch literal 3622 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

    `Dkjcc(j$bB z99veA~;xezRLQ+YQ%;mdp-PP=kUdD54q3e$&!5_MxjGRUbW8#Z%;B??ZJK*6bRi)+BdD0cwBO^NU*ZnEzDak zaFTihIA;`H90oMh8Jxb2653=_-mOT>XOk%>$q9*lY+R(V^9~-YHKuvPv=3*?gg3lyi=b|uzBx*j+xy12K znI%!rsr>D3Z*E2u*pV}DP4jvB9x~y9qwjA{SlBPCte!k@l@Yj?!m2X6bN)4QQCYF? zrDLE%tS2qg>$2z0BFwVUi>3$Cef0VV%Ae1^G~ah@6IX5qC#!hQo7taGCOUQGdyi8t zB*4#9#UA&=uKR!N8Y%Y`V?|dgZ9K_45w**Oov~RkZqD|m#C(f7<%0hADKef!E9PsZ zHV5_@Z$HNa7p3~U7@Np;>R>CE06_A<4fNf|(N|a)yYCQ|Rmkz1NgTPMU*juS1kE@( z6nwxwgz(&`)Mm?9>O9fS*RK`9#6M>gTR_QqP!ONFe}aStc`ZTu1fZD}R0Jex^~EcZt)<@v$^0^xQG$ zdvnPj)K=hXYa9LTEY)*jZV%90O>zDhQ~UO@&*_A;r$e#N-$vpcca=T2v#eZ`bXJHu zH%e;3bsryLO4h(FIm)yA0awJ9LFD&g^(Ar=#&)?}D6zEuu*^@ yPlF@eohra*T-4-s)S6|?%xv4=JG288=G-2c9l|gScdg@1ULG~#GBDRKW&J-7G&?W= literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region_library.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_texture_region_library.java.i new file mode 100644 index 0000000000000000000000000000000000000000..54fe4807b1b33303b7854b9aad7fa002fc471ec8 GIT binary patch literal 1270 zcmZQzWME_f1I8%~3~W20?C1ZXVBf!U$2}xOOCGb|{!vuq#PMWZ%|eJ82w5@bZ0JS5 zLk1$XX(#_Zw3Af0#cOh`L4woGX^~xreZaQU8Fy|y+veQ)@%~#gIT?YZGjb8r*4#a} z_xYQ7x5GZan5)jwC3GxR=JBqI1wJh<%eF`_IrC`wSx(7Br71GM=DqLq(cbi6!4j7< zMcP4T*XQu`b^cg(gyrtK_m1N4D)Yj-9=N(_J!M;VWOIni>Q{>ejhtS@@*OI;u)m4> zMeODeZC?+^MKCbkzx?yiLB*ntZ1=Qu*Dsx-zEQzX`p2ieVFCwU{12a+uxQD~n5fGR z``T1&xqKe0ec5tnt>>DZt`S@(gMU1|p1XEU`Gl*_*xVF8KK5|fZJhI_-&X$wuu zEOVL@y7s+P{anR^vWn3{PVAEkCamtzoWNexE%Mm5>C;=oY2WH%p6j3Cz4^B%?{pWh zjwq{lkmQ--UK7o23lh{~nRO~#)UV8o-n(2mLv3la-n*KHjUh#oSKe`m+~>CHSF zIU%9u@PPwQ&K@|Ba5yqxO60VNNvkGIn>l^PVu6?m5g~J4MTAU=$P}Iw6&MsXMQX~d zc{AsyFQ3qTNPpY2r%bax3N%UXEBI7YC^kjyX^NWmf)$@n`e=FSth#a`WCh!*2RbKD z=v;F)_BjWZfl1?*FvP1O*oc$PXXMeUh|x|oVu`m~Us6x+7M zfagG8Mdw}wxsk~T?9zY06srqyGvjw4%?R?{2Dj(a=E_HV=yCj#VO!YYFn!WrW{4UH zSurQH@4VMx2Z8qE*W{Fbu{Ax`UAsf&V10G(!M2dcJ43e5iOQWm zz1ljcUf8b1S?1x^b0UNJwERW{_eY_;Tsoy_nN+ge#^Trbqv4Qjoz>|W@l}BxZ(Et`CRdn-v598 z^~{F!SijP>#@|kd=KtnPFo@d8)_-U>kGf-mXPv3Uxt&XDlG_*7CoLB<_UB&C^+{=8 zW^BFct}t-uF<G;utXWW$Y`?Yq++4&Zc(QoZ7;9xpyr^<#-Bge7)|aH>edo%NLpE`d6X+) zUvF?yp;niZb!%3f9vj=TREIr68EV2a%B4HrAFMbtz43?Cgy~05AAR{Cep*z>l$n#b zQk>Vi8~Q8SZgo-CHP$zDS2SMlvhcuVSK$<9_4GikfWUc8Y+YHtt&c7>T~V@~pf({W wd%>xwIK2sLb!;5oFl@Oh;+dc3m&G-UQB`v0(W;&ER9EgidIIQY0h!QG09P3(;s5{u literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_tiled_texture_region.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/_tiled_texture_region.java.i new file mode 100644 index 0000000000000000000000000000000000000000..21a95545224a7628a045e4c4f6d2b874fd61bdef GIT binary patch literal 2438 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/buffer/_tiled_texture_region_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/region/buffer/_tiled_texture_region_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..38e996d8a20fb4ffc8b81cbf2d544ad8f8e69246 GIT binary patch literal 795 zcmZQzWME_f113!d2CjMto8iiTD3E?B@~*{iop}(?cX@%zk&J`mJhc$kNO5IbrQ(s4{%YwD6{=_Wc9(DTd%!#2>EzF@;2uc6}BKr z!T2|G`=3|lADb*=>9bV3_cW&g57WDi4^ny_CpIX4p5K0OMsXJJ;RiGAtkR(`D&5MMbv#vtpEYp0#xMO;b8p5O&ipL1ju!sMQ_+63@BH z>Pz1k_X_ANiFVv&uW*;^Qmpf?U1!R*pNPjUf8F7_YRgUa%H8vXI(XP(+1U!*iiNd# z-?IdBo_!E=*;Oeb#?n|(vdMm4#lIupA8J-4UzgtLeExeE!==(of3CGLZ{8_sQpld| zBzdbrcHi!Gmlaw3n*3m!6C|kiBw=In(414X-p+FIgIUZ4bG+>#uL``$EOc zO^10i-~M1(<)FyBWWDKMqv)kK^xYRve!7zNm+8OsDYDPcZNH{s<(~W|z^>`_r-iap z&#jxbVk^hT@-D}gWoa+gvR=r@6{@@(K3M-$L_DVWD&Wn%!*aGdyV6w-Yr|FRBwDAs@7u~ z`!RE!saNoxcgMmUq=KvdKKc;YqPFjToBc(pf80@f_g328J9v86wUS%UZU6s&JLkWv zwSIuh#+&We8NU?YyK|m*e!D?_;X;{n{EwGTDSLT)f6#{@t({RTY?_PqZ{2ilO~HM} zz$xk;pwt3NVn9&Dz`*$%%wk{yi-XeI*AkZ#CHC(pxLzvem;S#X{=-XNc8D4XSurO$ zfuY%tW<4^G%nQ%sG?N`ee?LM@g*{&dj+oWx|!NNtYH~S#agcnLjqmFKyX! zMTvDmKvtaB#-`w;LM^kOS#f%7Y}4jC{1MDpp{kx9s1@KluZeA0=Pa(HOIcUCR=r%Q Rs_{r_*0nt`4B>soi2#f3W%~dC literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_asset_texture_source.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_asset_texture_source.java.i new file mode 100644 index 0000000000000000000000000000000000000000..93732eb6827f300a8164009d1ab92fab2d243d57 GIT binary patch literal 2813 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 W78eMxw&A*XhV3F!) zo^&AKV5VUJ00000000000001ZoXu8IYuhjoer_QD;hu(5G9@XajFv#ttjo&Qt|T7Y zt16!zFC=5D=al`V34&A!p(2WKQ$A26Tp*FT zeMyPIU#3tDjvpyoK>88NVkdnhe^)o((p7@pH z{R1+osIhBUD~d?Np6TEH-qC0T(|`Z@0COp{p~C16;&qhLM~-RKQ9ili8)^_@E@%qw z_#yL;DF}Sd&%G;Jd?6k#!NBk6x-|=VYdCCd zJ9ps*t~8Hyk)sOQU`N-HS#wQ1MV8FG=Bl39CY)$AwIYL(`j$om?>~g`5K6g{aJF1r zg@eH}5uI1y{za+C4 zRsrt)V+u~Rq>cA&tnDC+vJd(JVG3>gtKdEqNzi=fky!_WAv~ErAy3w(ZL_^C=1EWq z*018Pd0OqV|iaxX!bow9HHRe>_#4eGUz#~{AH+w}-DodT3H|_2lH5HW( zY(9IWrKGV7VgzNUvh-KNs5xqFGWSn+ES-v?s=e1EhHD|LNbM&V%!Cw=nJnx#P$`8@ M6kv(_3-FXZp~e`3IsgCw literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_empty_bitmap_texture_source.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_empty_bitmap_texture_source.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6cb051a083ea624b473e62f0386dad80366bd074 GIT binary patch literal 665 zcmZQzWME_f114Su1`ZVnoAL60DEQ=|%Jy?r&$^LO_h#l`u&H91rEeypzj{vw!N zjw8I6mn%Er^ZKV{Qa+C){Qmv_#Mm)wV~?4H;ysTEc79cKaD6k(doqJ2qVS z^I+%NNq@JUKXLk$+Ty^%n^$wwmdbTcxPDgg=$Z1ADayNKE(FhudvU~gqp11B^K5gz z+&g*hL9O*^=ODFmzC$msifw&nX~*CGMVIy5Z&}kxt_=t5+duLL=q7fk++mbhY?Qr4 z%yduF72mkNU;CB5PQBxxSQ?XY)8UrZ74g{l9p+67#B>f%JhEl^q`7`xTkM|qbD8TL zpIr2!d56}!-j52~nicn$Idthydiw8a;F5jj=~6ERzRR&+-OO_T@Z!z+uRqT}UefBH zH$UpED`(iRlXgNb7eZ6z$}V5o`pWxSNmf1Y=AS+94lBE57x3=B`mg3d!7K*GDjs2A(evHsh85P;hhxn?_GWiB?tYeT74XOC$c)oA^T1K*)+YXTx&y zFB=H_o8$GDe|eq5%dk6n9vN$9Z4rN=(Zm}lAU|<>jIeW(dtb2G!oTHzCT;PYo}0mS zNz1hK&FQzgE-J0V~oCJ)NrnD=rJH!8}qfkZZa(9cyp0HMzN!?Ct7H_}*vYnRZ zr1irye2Rf%nvUUb-QC6WM6(vET>7%^;Ga)-OB-e;HEowMn-?R$ok>^3`$Y5}twk^G zC9Ia;|6;Vh`dV1fh6yf{(hRwaicW=iZGM@|W-O(lm@l_gIlW0gGR3*CyzH0l4aREA zWvyMUE!<)qEzb({GG}d2C~LQT%y{VD>%-yseBZx6RDI)n;z`3B|8Hu?67IZDJv!B_ z-NAl#v*xex>l<3%if4pyE;|v*_xah$`E}=|`yak|DgWF-eVXE6aIGSl?3^|_r7uDeuPvddXz|1_7h zb-!yM)iMf?|Uh#-SOT=AS#^d+jPWyLZ%FXN>!pH1Ic2;G7 z_j5hy{Mad+aqZfl*RD91A7#;)bYz}Z<>P|tym({iwOIp>i)*+UFvv1{EMLLHa1@XvuW9! z!|fT{dhK?L=WgqL_oJvaXp?~af<4zl4qnt3^ths4b9P2rmUM;kio{iUr$Wpg?w;|t zID|`ePeW_0jr`ZYEx-7E`JV=z_!!hBBIerm>C7L;-sdsSv6mREC#{}lC-uoC;#1-3 z>aS%s9&ML8-zKf@H@*6q<31a*Y<$*#`Rqj?s+rjWjJ!8;zUoy=sG_7|cCLRQR4PDltzWk_c0J#(k& z&my7LBYUPS`g2BP@0UeKntIMWNwQsjX40J_Ot#Pe?AdarBs)%TK~=nhUMd6gG;fC* z-V+H-CpY{{O-M*?`Djtk^f8`;pMl3(iaE1 am5u!`&zj!d*ci>#v6fSVnc>_$VPyc1|MbWJ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_i_texture_source.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_i_texture_source.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4d094ca858d1f7952110bba6ebf4549476ca1b15 GIT binary patch literal 666 zcmZQzWME`~fM*O0Otw%q^M5E<^1$QNlSP}_94x0#vhscKrXzl%GE@zis+hBOqObQ6 z1A(^lY@g(xtzf;J<9Z>M<>Q0nj{02lj;EN(Zu51T)ur&S{PH)2N4{3=XAXQe*yE!# zi`lAa!W^f3-M#+3dy@UNju@3_U3QlfUa8n~@`4|i=8k^FRE;dIoT=Ut(PquN9^Ofw zGj-RhB@JBb3eV(vd^n<3VsRk$(7xo$dIbsj9A;<3;&aYRTd>xy{4z7^i<`fbuB*)b zF1|O$OKrt|K1@CN+2(kozh>VnsdfM2Pd7z>yD@dTmGznpMN32aL;ALdEtntNwD`{{ zv+c*#ciTUhcVp{M@yLIrO{Yx`ug_ncID0qPtHAI90xe)D*@0OMjItma6i|N`rk1sI zXg@4oQT{Cb``6Gs(_hsPH87G%9;nX-$dltNC{4=AOjdBpEXhqQP{_$oOo1>pG_85L zK~ziREcSkuV1qiL(VHbf1KWC{Z+EdlZr(83`<&j&Rm0Idh|>Hq)$ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_outline_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/_outline_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..da77c5269afa3636acfed712c6a7983de0531f1a GIT binary patch literal 644 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 IWs%-K0DlpGfdBvi literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_base_shape_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_base_shape_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2da3282fc999530c89e560807cfd0dff2e2097b8 GIT binary patch literal 1878 zcmXw3cR1VYAN|IvQKOZJYX#RRDq@$`id}+GTXh&kZK^1>)m5ctlt`6?sw&rxJyNyO zYTXzWt{Ok1c5lqKuGIaVKhAre=RJR&^PCR=0zkkoF!BPxxlgB>A@le@=&!rwl@DG+4 zJ3kdH)Kak;Q_cIR$=bRx(#9&0_h=((k9x3ey7~hTinjv2pza0XIQtp5bXg=Eu>c1HPh!1S4Ut*_<*>FuQ-gw0J>RQb`c0Z3Hfr_JGxRI(wrjyISi~;)dc1 ztsmVqPG-`4(qayKa%tq9f!wP1R$3<0d$0J>r&p;d>qiVSh`Ro0xhDMuBD(sXCSw2S zxhmrPm5(`JNpV`n@FL~3DC3_dlJ%ythX^;U(Ux{W1Y8vExOVw5{EQ0$_vf0dk+T~N zY&*(O6M@zBk80f0HO;%&xKsODvciBu1^YTO-PLqwlhGGoAvp6ZH(*ke+DBr*;>bZg zE}~~|3c8nDk44;@{`%;342GEN=yaU-!7#u z!h0K)UuY^z-p=K7a}d;fR}M-Vg5!HTOUhcdZ${-;I59 zg&-T#AcuZ6EeEIxC)-qgp~~zDwxzP!VR>$S`2MB?o^8SVUM_jg{29l!LQsSNCfEem zYI!Elk>8lVw7vd12`z})Ft(rf?6wuOb#gW!#$>|x5eiCA8^_p3Ra;daGf}okQNpgD zyz&$aD3YL6*kpZB8KdzJKLU><&#GV5P}IZnf)Z`z16Y?TMeL8?0^s)pswaIRuQ+-; zN-TdbYh$(FaV#}XSN|)|CaiE*+~@AP9E*8VdTz7f3IVW$g1`m?W=rC_UHzw(gWivjG3t)qXhZ3(kjvehBnGye+!!1nBw{;yL@8t zoO1)5Vrm|-w{xI%7X54q5&~t3qYr~VCIA3A003_vT>${YD>~CxmDgh!fYWXs-1qXN zQJjH5%GK=-`rrQ%j(wX=zRIWwPO7fV`W&AT7$j!H@9Y9S=L2O&5~`Xl%Dtr#sGi{> zJDzDG7={X5VcZ9_<4l#gCdQuUUdNIbu?o^5%0TX!*g+29EPttkCwbC}YK2RUdp~Lt zYKXV7&=e+7Q_Ae#>V`^?o7skC>_c!#%XJtRS$6cI=_jx8N?=X6IP&&3M_>Mc@gHe{ zZx;E-O?WH9<3%1xj#*+HRG6nf40>wmTgw$X7O8BF*}m+E=yGOPzUcsR=A1bD5OA{*K4~iRmhtxM%{7E#Me3<(O=?A$=RWV|c>= z+#CRIIZEz`au9;@$!+O;aGhEm&`vxGu8Yb+5B`4G37L|Dfl8e|)AMDzOJ|VSNiVf@ zb<#`S34!RnWVx=GMFi;hj0=eFv(&!yXLzVx^vm)eot(O??vq}4l8x~ucH;^53L(^< zTJB=-pLTjYV5fG=aTCTV35iMZ@N1Scr1BlMwgUkXPI6;S!<+WWULmFIgM-fRpou6( zuX9~}@X^H@9*wYpou4Txu&oF70yFl6fryNy!KXG-MBXg+E7d6Uc)Coo*$|{`jzf@k z>)TI47}E5p5UJ`vuP>zNX+}oXdTnM-Q+MpL*5!^4{#no)QNfoJP+j~L3a?uoN%|^v zjysk|ueeJCwQS*SWp5>y)Sv>3UAK%aDx_`mZXQKmhv__!zmYNXVTj7bS*4uQ8nd(5 z`B7bZ>LE8hC+4(YX$=AZ>(*&*3==0W13lm%oX-7RKt17A;@A7ssOrivQQ7yWo>LCT zy4}3#bt`t3G)#^EUUEL^dr4?JsVyhxFD0Jb0u1gM<`w1!;J&b&i?_?k;UlaEXe2Q09fR1D>>VC(9&gQED+c42yOkMGX zP6<__gsP#Kyt0C#G3dDlJ2CO%EnH7mR~ATRU-pikx3z_5ZM@CxAXx{IRy$7LMpC$ADZL-za_}L5=geH!isZ8^qmX~%NJTPf(eMT#Mb@`jniX$ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_base_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_base_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..dbfab08ec68e48a5361c2c3337dc279b0bbd684a GIT binary patch literal 2220 zcmXw2X*|>m8~xjo>|<C0{tNXu)6%wsmFhS*-4DuLo4u&FEopo zI*F+&8L+{Adwz3pP7l(_m#hRH6cs8to`e_NhnRhMwfr6pqH-027>dN#m$WoX#49AI zve!_@BAP)1#fx%?hxv+@%ZmY*d)I4H^yDxm38k$0n{E(JX{{DAO$mPf*(6G(n2gdR zR*j(a^18dAS4|z4Yk`Ys88-+>w6oTMv&*(a8630MWsrP1P*&NFfCsktiR?1ag^)t^Iy?xwab!NlDsRQ?%KOGoA?WC|AsZJiAmiTfmHi zzHZ>|;7-Wxvp0^9s(^Qq@)k)^9BVq~Xdv$#`w}4y_y2#c^Xu(BIv${9Qh^+G^*yly&S; zBkJ4QtDpv?Q;CSTZcRXApw4hkjR&PKHmMk59ZvdCq>FdI@!nM)r|&dkSmSMNHQZm( z3L3XyEUP$Q+y0)cfMLdL{4sFr4Uw;p*SoAoF&(MEqzK?eK$+BMcq7Yz-em$fbJy# z@UWk%lg)_+fYbUcc^Ra5!jEgO#4&zIs@3k;t6UU3z5O32-T9~gYO4}BmNjyK^zWo2 zDX3}%*#WyxV8bVDI=ejeiO^sn(XP1pP9*Qj!Sm6TgFQohMf~zb3g2^%_PR)UA-N6k z(dl_IyYHO&MQp68M7*Fhi(|i)Or$}Nq)Ll=(eo|=t#Dc1?fpWZ&dn#|V{5(PS(l`t z(V-u;K1LG4X+I{*sq5iJ%C^FOq%E-;!Ogm+l_39Avb3gU<27%I!qohS(JcM%uc6hW zfR5uPjdMH_anXf7h85~By^L`$)Fn%XF=8=V+>GMS{4LhgJ5Ua~!fez1f2nhNS9n81 zz?CI4He#49;>)qQ5~!N)^qc($hTJ8Qs+rV`AqcI0a%kvg+5F7VoddZ1z+2VD!?%T% zASiu<{L~XhA}nzYxt~#tCYI&hI#2c~hFCuJJrk(nZX@&>F}8AhM2Q418= zo8y%&s_6$Fnhs%B8Fb7CmEK3*=}xxFqFj`_#j5!kli(20C(`~rUaif5sX}G5N7Zal z@>qn?)<=&QhZRkyX?8KUtIdw)7)G1;wJ<%lFe+|=x#)UjygL-?cS6ukKgL*m%Jet@ zfT*0R6J2#ebf=$g>O6p;__V8_pS{x^zY+J5Pjz~JS^iLPPC2s2hm7F*7oYbj#tMVQ zYAr`ZNnF?V&-WC+uKzOLj!}P#K5fxE?H}RSvtx{m3v@r4x$n)2*RHeG10YViDM5kN zV5j5Tt1WQ}s#S|wzIPf0v#`l|(T*YiIh*iIh7Yrcv7kja*p_BCaFq^wm~``35U+%R zWMKwo8OfcYKg)B79-^GQPE)RVu}ccsqjaMZGaFu5)%ZsfTAnS>g?PhO7x*Eqbx{x{?&WTJovQ*2z)1L#D6{WPjVPbgF z-EH%og0xaGfxb8mCIY8}pOk`mDs7JKqHUqox^?p9uyTf3zB+2Ayvm~`i5@wp?q zb9Kzzu8rH^LZSgt4j!tOATHF5Q!s;#A31 z)^Dvs=oCN9+@pNT?4iJV1f?#>&41Yov#!4&$O9(~5_Wq}>i+yJM!+%bH@BlY#NaGkV8OkNP^tIbD8kfZb%^DElvZ#Ydesg9pqN+k27CG3u z4cWnOh5$ORGYm%$nCVSkoiWi#taW_gQ?QjA1V$dkam<+$?NW6D-oqiO|K%<%@74%= z0j*d9y$obOU~aW7{d$^AX6;}33^<8&%kQMp51&l>(?}2MTDrzRRc>Bee?1`Zx@gu8 zW?ui>^P7WnTyJrC+y-1@A6fQB4ix2dyTxEBn6v=`W#VvvFk_cNnK>l1r5#>4j!f%5 ztapi-qJX~WiCLGWre|ej7Gl$Jc{d4G05{q0#oX-F%nbA@Q#O`pm6mE>7S{({FDm>S USAb?8aQ^(c{WBB5oua()Kcp)VH2?qr literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_circle_fill_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_circle_fill_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d289dff48ecd35ed38290560587afd65f1d3483d GIT binary patch literal 694 zcmV;n0!jS<0RRC20000000MRZ013bV0000000IgB|NsC0|NsB-cS#e13pD3nQFkIe zV<~3Up~BMu00000000000001ZoXu9>Z__XkeqN>i5BG$!X*gYB5?VEBv}mQ$2521u z9*uKtEF3#JJKZM4|Bhp4TiP)SC`ijg;vZkmci(+?Ny)`GzCuiukJX~_M}`?Je9pNHw__a-VQ6`L4k=%XLm_K_Y$ zMrLeDyv(JrY{K=5+tK5I4_s=uZJ*8EjlytHy0_Qw!5*CO%H@XOofJlK3sd5Sk|K|r zR%(H8aCr1$aP)Er&tZ7T2Cvv~a4@I=X}?!iUp*Xzf7il9l2CXmm0IKB%`L0oS5apc z9@+lh@9m^19RK?j4NQ!-j%#N-u-B1GrxI1xkv}EL6?X^=skwrXStx4O%hYr#kbrxYDohsoI*;SlTTiaBX#JJXL56ZRaek=Gg1il;8wqvUjDOm>x(so=f zExRYm(^|F|Yi-BUvgkr}CE?CaXJ==dcJ6?|PSW^MgMR$4co)iWAMpid8!J;n)EjGK zRbfL*?R2tf^1fHGi|P2%G+_kew+5q;R!}GJS4bo?{PO^PH!&KM#uY*j(LvK&nTcF) zxV@3cmTz6ieu~Z^!84eL!PDtD=ja=|@3jj<>4HoF^IGbYx>2Vy?Ok1PfgM%qT9U~) z6b>_3`7aO{-J}P{(iOaH)Ehr&zNEslNp)L|0&5>X`?3r9TcZ0UGnac+q%a))8vUh( zev5LMyGP)}Gg(=WKIblHh15xN-2SblSi6mTEF*pu#rFWX-xzD_EEIajI&0GTbo4dT c+Uwr`XuxZ2^i5$rp+Q}ph{_Z96HP7Q8s?l!#Q*>R literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_circle_outline_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_circle_outline_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..707273ebd86963e97c4e3b58b7e3199da48b96a4 GIT binary patch literal 699 zcmV;s0z~})0RRC20000000Mge014&*0000000IgB|NsC0|NsA%gE_GxSS?E`x?D-= zPLm!Uwf~<000000000000001ZoXu9>Z__XkeqN>i5BG$!sW@AwNodui(E?>cqo^GM z9*uKtED}39JKZM4|Bhp)kaR0-C`ju=;~$^Tci(+?Nx{W8zCzHnVq7H&uB!*Cl~l-d z;RYGAcwvLX&;W`HQPCU-;?h&n8MMGd9tgrjKr9npZjy zX_>GU@gkMNunAXdZbrKSAGlQZZ~JUvZ!`24#Rmud9vr|qFKwy`-bz|;iCNN-KLyD(w+KtAcm_VXkk`bA*%>Ij z4m;8Q=+2Sm0k6SPXK{M!sT3}qT}2y2_5gWBA-Z-QLeZKI8Wa>h_I)qAJyRA)Q5)>3 z+q0=OtVNgOw`lOzMucKBXnnm!{+}(b=CgON@3Hp_?d?UiOBL?Ne~f;aY3|~mW3sg} zB}BEgHqJ_{Nvd3rwoU%-Vr)JgU+Fp$Z+v4g7-__HK3gM^Oz=@Lx>lnVMzuGD4x+r& zAHq-Iearc~$!$2GR$Iq@5eF|4-KgqqJ+MxS!vD@%vovMFao< literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_color_key_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_color_key_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2c5a2156276254a4af11ef1e848758d6702d3f36 GIT binary patch literal 2140 zcmYk5c{J308^(WQP(v8QkUW;elwG!Z!`qN`WZ$R3SVltDvL!WH8lHrV5e>qiEQQcB z_RJIsWh-mR(hNgL#YlM?de3?9KR)04obP?^bD!%v7XSi4z;1yd0B}HMuLt$-{3(M@ zyD_DF^*KlTrr27HZR~qnWdm%Cesu|B0-FjhC{B*0Z2HEEbKrLB=rB;H#S+NL^%s$anF6eR8wm zNzbqDufLJo`008~+OzoApsol4gBsffD9F`NUB?rX4*Rl&Y7}tTbys)e#>5a!IQFPM z95i}FI&2N}`Kn040#lJ21AWQ!%Sh9^wbmOJr(lWXJ1B|W=Kl>0-~+xzgU#098dREY zQ!~`Zu6cM}auv!%9rAMTscu5)?$|3ptk1NF%6kmRKBJwTibr2}T@M9s*u5vz+>*Zx zVegDoeSr4(_QfXcZ_^G!lUkc6>fWfGLOjHT;UD>T9JzBpMV3Y2Reo~URt#AD#{1~R zXw-moxc*WL&7kY@7w%@<^94+433A!Wwzb#X1fK-i>ie=mYVet0GFMLXV(D&jkSq&u zG@qQ9_7PY{C$VCX2Pbb-!RT&pJ7{y$rDTmUv^KW-z0=IBd!X+k<(3wo-Ds#la!ca@ zw2fDvR<}+TB0TZnWbQ~LV|75c^6chfPMlcO@$M}69dVtCOZA*_(4N<@Ef^3d8yWn`#uSn(;{q)=r| zVIW935>{%<0tq+-k1XtrLeKZL6YUCl6maq)qBsFymoXNlW? z!KQ4*i-lSymkqi6{b!u%aEy`cVPm#0k_;d0fMf^4#65J?4FcXXKN!u;2;RIgX$3c( zSdc3}hxn+_ovuw(o=-8DbDmkjtGU!+qGQ{%RpJId?3k@aydVmXOvoJ4?Em~u-|4Xr zbu#Ti)u9a$@vWyVoH%eI1OT8a0N^*|bO6AW$ss38))xZoSxauotoG{DgOT&e@D;rJQ3##%xHNxN9jVn|V-%p%&NqLg1>a&&`+{H|y?eVkmE_!?BW@P>QJFYmloY9&?x(^O4;BY8nkg>bLh z1)|sjv#&ZrM=&&eier#BlS^}lYxGb3GUhA%Cfl}o*8D=^S~>>f5U&$Qym+G4GM`?l zv2Q_MHqbEhFGkvd9Gk+IFZdRPksZ$@!ILCI4k_hjRw1t;`F2x2Je@w z4%Y6-A8@=LK+!Zr(@v5VzmC1zd}}x+M3^2`BG5XW3rk7L0(5!GLu1eyIXkNdopE)1eBlZ!4{3L`9@$V()twbmX$`HVGxhDjMyR zCb11lAQJqDVVxG^nm5!N)NUs(5%a{<23rsOC8t*~w{u&#=Dz*w+N3^_ZxqiW<(x}P zSCAg=`+V{Tdjr1*nN`hhN;wFYgdXZOJuy2S48z$iQ6AAUHTi{q4yr1t$PxfF%KK| zRCxd5xrs2dJ~Zr~UoM&JJ;xe1H#_N16@SrP@%T@Pw1}MJ3PJhotPAN`n=GKK{GYe-KUf!D3yz zfM-p)R35g80$)muq6s@!F?PWug-0Uy<@4CvIApLfI>0VC9#v7Go>B8@o-5$wK6*R; zE(oBT-65ppfUC1X)$b*SNizJ?>uM z?{$5e-aC0?yBLNwM7fUG! zhPVQ0PJ97=US5o{7?X^gOL#V@rZI-ipy;TJgTd=Dyu2j7`?$)J{HUyO%`7;1J>tvX zEe^`HtYPz4y_UUpNFA3VAgQwCx|MLnyg%Aj!Hd`TQ}!{@j!AHt4!pwfkste2N5>W) zb1~{n=ZJ>HQr=H~l;-++YFMs7cJdavIt!1V0yEdaXL=ae+>CAVa524Q&hdfgXpWXf WXq7h>>nqV2Uxc3I0(x{VWB&z@l+s!N literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_fill_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_fill_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ee88a509d41fbea639da7b457e683cdde4009260 GIT binary patch literal 1655 zcmYjRdpOg39R3;8OeD9-aqZA1xs>Y|wit5U3Kgx4=GI8ZS+R~T?ur<>w!t}Ln*h-it3Ws*%wz1W>gO65DWn}=JUbrgW|y-wH7kpqc;xsJy#QS2{)LyY zDhC9?Dq5PoZ~YNi+oZV!;+vke=d4+;W5+8`!jnBKM!ed{>b2p>kp8EL2bAzqTDj5L zpu$#?BNfY$e@ouGyF(c_|D-_O;tMCK{>mV|rX~N~6~&CMd)n!L7Q)PjBs8&9U5iJ% z?;P4m%N>L$X}ebB*BTkZy(|-!rOnA5eelQOYU9>6e2~XOgZ3R8{xnrvLCFIJO?aV@*KC>~)}@an{JpwexYYtB1hbme z&YrVaaUyy&`$q1%I8d32(_ZPJ2M+ye3-)oGzns8qw27eJUdi!5^-Gp_XT>w>Qiyo3 zfDr`;*#TypkNwHUo0wVay^9_U9B+cOhEly~hf#M5`$XSxjXv^Q{;cG51_7H|^>fin z5E0#TF5%(J3O38U`fJTYg~h%dvik5Fq=$C%SQAm9(+M;>VbutVZO*I+GW1Y&mXNl8?&15)@csVhkzl;SE z_9wSkpGH?VqbyEo2t;@j}7g2_ph#q$d^rtD+?vALQJQKUpM1OTx@0Dy*y zy3Ly`5sUJO?o>9W6kM#(Xq!Jq-|c3rcX;`<=W5Gx_O>)+S(Sc(@RYC;3mH91}1R0PGcFh0byp@+JHa~ z>6#&15p_DP&OaNN80~jzSHK=E1(K@o0f!SO6Q|NyAd>q1Y~!^8vMv;?RbeR<@?l|n zy_chYjmjesl!+zdDLm7}T~<&s4T&rqX5!GAJOUnnqN}Yf)cV$?8$9og_-xK9GZ6RJ zL0YNyF`OU8&*99#pB5@=l(|>vRmiQ_;B!&RG?0%_k59{+mUi=0n-P>DCDOE-iCQj{ z=aP3dbSywXELnC`w3tNm_w`yfC5hWw6g09~K_W@|Mw>7ve7QF<$1uW{Wb^4)HeBbe znJxYZfvV?e7=FFSt a4t2y&MhG^iU;jmrp||SXX<%DstJc4)N#dyh literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_linear_gradient_fill_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_linear_gradient_fill_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..364000cf60115232097184629a90c226cb74f806 GIT binary patch literal 2661 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_radial_gradient_fill_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_radial_gradient_fill_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a56ddd7b0250dffa838fcb7656511ec815d027f3 GIT binary patch literal 1661 zcmX|Adof0Y7_EgC#k}e*4WhB8w%tGO=bq2!b3Wg5?)O|k4v+&r0qh3=8Vh?G zl(+jYj9cp|&yltG4Q?VcKYuPZ*y*D2-p(G!l}zJbUlp3clI3shc42YZtdxlFye_j( zp=}JyJpzR9En9jW>WnB;teau;yX|~v8pM%bM9Is5b+y=xEh87#S@Hb8?W>A#Mkkb( zXwWQcO?!4`vUbgc!$}P{Khu20K@bj6&7L2uX+*@@-rqp3rG`H!OXG_$Ztl+H{+7V9 zXP6&}7Pl>C94EkOOH&p^b5qOG*^5w0G$!gwN+oWo)5#}q{tAy+%Q#~lqC~oM;n8Tm z%DN&VMu#j^?Vss}3`mobhLOmf^GL=^RZ`PjK<(>&hl(0&nwlLbft7XGf#w%2lT}ej z--O(8Usxfw-Aor&3bjt^h#W#UIJ-)v>ZCqq_bZpM4(f+}v>VU6IQzOM;rF`+{qwXm z1-(5JIbRrFhi4U^n~nMltbV(B2Hk2qmuB5j8ie>^L;oE6pixH0@#XXI?SUyv{e^*P zblV`8^Ec?~bk*RDKGP zUS0fEr_Vwy{B1|fCOKHLrL}7QI8%I0Jkk;gk2PR}mA6_Q*MIq4>!{XxEcOiwwVPbV zKdE@9W5s^4cKMo>Osx|i)F)CowLoi{3DJYg`I6<*x>t}DyKvat9>z^0f`{M)Jvvz8UNte?6X9Q|@P zW{Z@d-98!}8b`8(jE1U3pG!1AvGBj~i;WleKfG6)`h;Kbln$bdI0MHRuzr7nUU^k) zokQZmzCUYHN{DY#+(&62iWT2vvjGE2D=1hsSpCBtvW6zM71h)xI2cilz@IwRC|EqI zYW>r_gV%Z=0`vfV-6w`SxH8`@h3LcGUBN~k-)1ZsFv~ITX>--q3ht4QT#ol^s7{(3 zC{KYM^3ry2#yhRfqTl&eNV3;_2&rE^4^N_cHMcwt@}ksRA%-iKsY?BuUTOOaszg?_ zkb%v&Rz!taQAHDMFumO88E-lzU(1>gj%vUZLPu(FOY;nNsxQLjVdC^c%y>L~%&sm0 zc~KTJSulZ5DOF?36aau4WGqYQ&qhp$=?e1*DwLZG(MEy1>7rKI>_2>rCxhb(HdoG| z!_FbdA%QEyXb)p6RE?*L6Uk4HcletsOO^KXdaHVEUSqT$#?c2v*XK)xcj4S*8|j)2 z@M;V=9Sh*o*RGK;ca(VM!sqNWPtxylC>L~(?K81PyW*aD-|*LJKm3yk(ipLAs6AOR zyRo0|D4|?LNJU39`(C6qVWYem@3NT$wB47E@n-M(VigQ_1oG(g?)=}a679U1Gfw?q zhUS?1*dz$#3&zAi1TkJJva?+_PFj@|ac^@97kCBzOhRk3^ma1-hD1Ks7U*<^SJVhA z?upmM4|cIklG4I??la2q@MfYoT8*+TJYBKcuKRst%x5wmAfNmLYyseZ|M(x{n>5&mvFwG=pWSZ~6T3J5^G;UdN`n0T!-A;(je=3yPNiCUPg{QFjzELAQQ1Sw z5ljX0s6B!l!hv1ht$&fr$+H|uM4#! z-cLWCr)Ih-%$F!RUk+t)S)G;Zev_A9Ff-~S&XVS8Xp`d8)ET8te#=>k&UPRP?s18k z#~E{%zY&0XNmGAg4<1_Hc22~%|rc81ZM}XSe-Hq o9|NQ2y|z}i!De5{oyAD+A6O(bWu@0AtRd;Kgv5C8BMg}M4;+vKcmMzZ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_rectangle_fill_texture_source_decorator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/_rectangle_fill_texture_source_decorator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b07b394c94951e19791cc0c0926e709e17ae0434 GIT binary patch literal 564 zcmV-40?YjX0RRC20000000Hy>00>q90000000NQ!|NsC0|NsBul3^J#YQtj;g!$zb z0tZ@c2M9d?00000000000001ZoXu5DkJB&^J-1T+!<ByY6HNmhkXLCmGw$k4i^ z(`hn>DO}4s7M|dpQQpb`3zDTZs^}JjaS9>JuAW_9%`!NLi%T(kE-q%-tZ_(_aaDh2 zcTgM~;0{%k3=waQwR^B$Z#M}%i%tjli_7<9JW5k|`R`AcVD4RDJTVNAZy-pw2CY6J zJZ*`nR$TUhQ1ya1LJE_$ani!Rexcek&!BTME<)9$ntSW%X)BRYs4Jw&VZe?XD}D6i zKcZS&FL!a>p?+v-L5S|5#T#4Wk$Y-?@mt!1RKNCp{eFW)M&qMu!0qfEPI^d$?Bc-T z{ZaLcg$bfO*g!Y=CuW9F@d9H+f+w(Q2dC3sZ;=mIKJ3<>(lz-KRt>%L=CDkcj-jrl z!hsrZk81LfsX`4Kz5u|xo*uk0v6NM>@$Nc+s{8hA_m z$8kAVr@yTL00000000000001ZoXu8IZ__Xk7LSS4|8P&Joxn-UHr7s+#)cS`7(5J# zXUDmuhQy9+CorM?cih;?$kt7O@<3i3$9Lb|efQ;(XCaf-jlyOH$JsJo%rT2&Tr3$) zj~JyxIzwzG; zGWs3FdMe3Nk}FzmIn(5vo03+ij~iT2(NNuDLc>Y@ft+CEA)lNSgY3 zJ-RE~8zgR7yI?4^4YhMY@3hfZwV_FY(|y?t;XQZ3fLG?0H3c7T8a0^&y^ydTM z(s`eEE$(o4|1NzHD=0gGGoDXpFTl=WbfgE}xk7fs3OA+h5*R?cG)8UAMhH8{>^}y) W5mMZgvewW}i&2Jz&GQ$)J?TM8d|C1U literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_arc_texture_source_decorator_shape.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_arc_texture_source_decorator_shape.java.i new file mode 100644 index 0000000000000000000000000000000000000000..5955c19bbb2300715b074079f6855b4ab008eaed GIT binary patch literal 839 zcmV-N1GxME0RRC20000000RdA01NN{0000000P+m|NsC0|Ns95-8s?40{=EZ$@sp( z%wVYbW}8v~00000000000001ZoXu9>Z`v>reg=vE;hrX1r2)Ei534Gb0_~8xwgRd? zPHu7mYl&?+4(&Acf8WJPXh`|7RhcvdIP!gW_I>xA9mTvKY>puH+-1V|ahVP%=3JmF z6+MKm!Do|bbYq!l4_zNUshN@5jTcPeX{*_4@<>T--WTP9#W>51Q)?TpOq-`~mElsv z<%MZAExGT`HB$@j#qNNKB}*aO0C$WFv%@|?&s^FiI){g?CLF>!OUy!QxZ$1*SqxX2 zMIrYVnK9-Ci#RbXrZ7JQ5r{@{OUdz0Ju@Q%-?)6=H{q+papnJN<>0vawt2%xByxr|l$`F}=`{`&fx|xk8B|oE+OtiHycgZpI{|#+> zG!hRnU`c4kwsc;eQxPNM!KxUdY&ZjfPuW!aU=uncJDM7%O`m!ePq#vz5Y-k)!F_Ze z(iZ+XuGO8fL-c_FDxz8wBdS)n3YZlKyEVl-Sf>d1iG8`3g-+-3OT3hkCSJ$Hu-P zU2=X5fz+Kq%Lt~4LOn1*~xeb+AelUwBsTFsP>vC0YK7reg=vEa8FapXaaP5X*H>XY8}$LPNUMc zN6)z=))L!t9OyLlzwZ(!9Samtm4_mPBj5Qx-*;a=p&9?hVgzMkpUE)9Rk@&yg+yOz zdPseX_qH(T=c+Iq{Sdh_%qrvO3DbBn=nwiL)5_TARhh9I?_6+M#jYMhySHz(6-wrt zz=UR$2>sYFod}-$b0$};OnEBd3lq{-C4%8_(1#&hvce|Hz-Pf#%5u0iEK3DXTrd}s zBTS~}Z_myrXK)JRH~x6yPsfueEcWI7 z8T5NW0PmjvaRuf?nPmjmLA{Qy^g&=6c61+Y#EMx2>e12^4)dR1VZ@5mE-G5M({Xo9 zn}QQmSIs$T9c;=wDdj>39yX61O-YQlMT#rf>xsx~^F>X8EYh^j=xxVA;`*37UzFz` z${&N2C3lUc?x>6LT%)yU;1w*ZhnMp@+#vZ+m_wvY5E+%hve0PerJn=~Nmq>+$1W7r zqwnSI3XKsV{?o~d3=)*A$AdFrGp4;rNS1>0Q_yZ5f!nQ26m+#TdwV?_bbF_kk2@Qs zidk5T&?Y3G8q6nIek->~jHlZL$}kB9?I(=vft0TzPHZi>O~eGt!2ggR(IxLKc&GG% zjG3}lWff){m18;7?*!}ZX!Ug`t)4&t)2)6T@{bnsW5@fTkMFpFZi5>ZiXtcM8)g$f z6Vh`7r|eNP33_fAYc3cXwsvOX)x?dOK1OxTQ7y%jZVjV;FJF#PETkj@qrWupUMl%J SQ$%NF6P>t2MciL{GXk?`tU&Al literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_ellipse_texture_source_decorator_shape.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_ellipse_texture_source_decorator_shape.java.i new file mode 100644 index 0000000000000000000000000000000000000000..60fafbabf06c5a136347f9f642a22771bea2b0c6 GIT binary patch literal 675 zcmV;U0$lw70RRC20000000LtG011o$0000000P+m|NsC0|NsBKegVep#6;QxfX&Sq zUn@L;0FA!@00000000000001ZoXu8EZyGTWJ%hx5m{SE2F%UJEqDX0yCPivX6(aTQ z?9Q@Qy|!h0NvkUVy<>Zm(gX;K_7DVk<@tW|X29_5Cto6HyJTGDIj+KiYAF;lZRkNV zkH36vkvU!43|Wquw%lvWT*(bid);1FR7P9>IxlD3;Y|`QqU_>PwE22&ywJ+62c~FN zi<~VjH>JoNJLhV}gUU9A?_4OqLw=2!zl*nPOg*P?E%<9GrAvV_Zz&&R#fp0bs?k#$_Go~+z=GG(&mt~aV)~<> zLMSdF(gdn>oPff+bk!eBTSFl>#?~1n))p3tiZ5f(9|U@l#r?Y7{tzzFKLIg$>~uuY ze~K@a1*(>^(dayvM|}6mdKw(uhcAnyr8f1lsi}<)U7`1A;Ti3n?_LS-11r>@>U4W`mU#%QA*b zr3LLDBKIXx{}3kh+3xTl%ffzzX|YBY4y9(wSzcEt&C3u J?k@#X(LasOKIi}d literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_i_texture_source_decorator_shape.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/_i_texture_source_decorator_shape.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4d39c4cf77af98a11b59d731ffe80b61a2582951 GIT binary patch literal 349 zcmZQzWME_f14dZ}24*D)o9V`XD2Oz9wN~$eq)N5cp2A1jJ~FrcGnbLTC8sYIPoT-MV%bH2N4rZrs^^HtuNoE^g4H)%i1d5x*_bw25M3!iwv zR((H%yMNMaG1)tjZ=z1l_OM!M;kYv*Z2IX{4cr=9VN-Gfr##g-arwxX^^SZ8r@awt z{_*d_kJ*N%KRhN+wrPL;INl_pUByQ0ecFfFnM>HYEW2j1-CAnZ^0YB*w?L+9ZTqtl mZP9H4<-BUwiaTCxNiYchdFCO-sqh0 zCp8}PU>h$nFHl-9$of2Ngv0q{JQ=InSx+xRS%`qQ>2lrOT|HhMKE8IOtO>h@*_yYi z$SW`0M#+#bg=s|;IVSK;C_^2DYwom?AhieqZcvh7caM0qju8W6YOK*vfYm9v-;?oZ zHiLIBe-glwqh+rs41hO~OCJ^LVjzE< zq2fyfJ14H`MI;UDY}n|_4n(c@*DZRl z3j9l!md6}e(^m%cdBN?U^aM(}rM7}VV@b@P zC!#qslo^5ag#~)n?COzqC)IAPJD}xNwdu^I(4zErRnUgXe+h5-Jq~yiRS!VkSt739 zKbW5}3I7*#(JA++4*-Q1_pz6zF*jL^G)sNx&|4fFSheP_6478qIVBQ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/packing/_black_pawn_texture_source_packing_algorithm.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/texture/source/packing/_black_pawn_texture_source_packing_algorithm.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b84a47fce1fdf7c63284f8154abedc0664a79f58 GIT binary patch literal 2288 zcmVD2W!FMk^d(fuReJ&f$0NBoo8nZ@5H&vZV*fe2(tq z4Ur`#$fL1%2tAJOdCHKN(3Azpiv;HJxKLxMA>1(h5v-i4x+BY8{1Xi5KXTHB)uf5NqFiQ;A#0zNTOB9J8;^m4* zFi!kATEH~qo_GxSO7t2t3_Ie72fS`2)XYWv%pmTA3hZw_iBwvilG2tLkoT#S}l$k+XdL5mB zExsC?2|M~*ImaA@9R7~yd?nykWO_@)6-fYnRTX6s2TCSh^ekaN3_(Aet;3LDB-UJ- z;}M`RL6wgj7=A@EMmK@Ts79u|%FCn5qgLYU7mUJrOTpDzyt6bAA+)GI|O}h=S?V!p_ zeJhZ%l|+#m(QjzM2ODTpnNgdFMc;G~butdxc2Ch`+A)VNh^opI;A3f$6HA-;md2%b zrFv;Z>zmaAzQT#8EGz3wZecU7tf~qSjqUM#(POPhG(}67q};9@Q%Kq|ZoO5uXq6b1N9zcKu=~GgDV=JiBGP%hCJpcQWBl z^^@iv{rou|>y28i?jHW{(@%hubyQ`#XtKiLd^FfV7(05f>}aBWi))Ek*^5W@W1ih_ z)@pCicC#)v8%Ca%lJRC7hmLw};ZatP<+Z#JP~$^Qd10+vL6==k+Q!|CDoR;qk&HTa z-K-g}!vI5};`mPs~(v#2s;^L_aw&=q;j z^Qlw6ij-XSvK_0M=77XtAuShCp3goJJ-0H_9{>6k)S2=nb(JeWMtL@#;cx>W;p+xK zHMTk;ml>-EI)l3FZ1i?i)sCIru&al?wFBp>xP05@*2gK(Iy}xzY+*Ye+M)}K_(xzC zhnRyjk!xlM#By4!zyun2FXmSNJF!e>lFvGAGi1AEdHL??WCK<0kqY8Q^K9bJlr`i+ z=}xH@YztGY=bsFrqQa9s{{+<>b*1LE6=nDzO8ED6oKx#2zqahSMwm{oW&pO<;Tux0 z>bguv#~P-w8D#$fdP#dY@%tBUEP-GE00005OaK4?00Kq;03dS!0000000G+o00030 z|NsC0)P!dyw-GT2&F-VeH!~x8>xX6l00000000000001ZoOMz`Z__XoHU}7~=nxk! zT&w_+1C`+dhq1w`s%VooI<=h!5)$$fH}y#E$acDpiGP4N@&gbj4jlOzTsU#zA0Y7) zcyY3}X-kx^wV%KDz4tx`A@mF(^a`*kMyb*kpRh5bnH33bYR%5}gt1TRwWY(BN)jGg zp`?Lh$Ug&o18kL4rDMuu6!CHX$7L)erz(X-LM@-zOmlj`!nf==;r(LogsyxofNp!+ zy(~>NH|B_GDP(MjA8`nTEU)Vaj{Y5?wdX+p;icJeB0@Y?BEl&slYx*d!3#xjx)5mK zf;Sy^bGJO{sZ59bDNZYU6JR^k>eS#}upnkhQ^(neOWU4=Jk2}9=k=QB%{fF3I6@X= z8o1wn*+1;Id!55>tNo_c**|D@oBd8Va7L`{06xQHC!SYy_(DY-Yo#pS!jhl5J;@hc zs6!q$FuaS?(U{vK5!oRLRv+$g5f3d1g0kutz;CF!aZy!Bi|u^pEtScYHC$+g&1^3L@wr4rWew1ZFvM4xe>J3lZslIB?e^12E(!>35uKX zJa>W4!~fkODOKLP-zDQ%6jd6ocF>siNk{qJ(9s?r*yU(nrG;PK2f#<}5x<#=`zd5%lD_6V>Kw3}`oVVs<4H41B*_ z7hi}=xPA`!1qrWb3I6s5_NU~0P}uknW}!mM$M@!F?vu=;6MwnRKPF~rApigX00)u) z00000o&W$Kv;Y7A00001+yDRo0ssI1|7}BHUIzs00000 z000000C=2r%`pnXKoAAcX;-n(3pk{Z1i=F+2qG3X7N)UXHbY!ocfw|t1iX`{@L-My z@WXFD4?cj|0~ikgH=~hz;sGNKcn*PD8xE<>Pl|FH9d+V4mc@~CXfU#1XWe6q1+GzO zl$@yMoE&Y0Ye_z~WmWBF6M*SlyV8%P=@JV$p$2=g;vKqR`yQ{ly?%7@)_#=YKYHPY KQ0*7Z?KbLdkYzHkeO+HesgEz1jWK zE%ff~blDJRlsAiwzu8fFs$*JgkxBOt!RmgU8~393 zS^4CzOPySQ^3zQk8jVcrD&?bJKMdqtUD;rL-g>ReZ2e{_&`LD(2CHgx~MmqG#bMLSI%lO2>!u$O{*OTVHUZ?ZG-Uo&m z0|R3X0|UnbFrR_(Hi!lV-b#+eAKWA|75($Wyz^!7hC7LIy+6O z&i6aFvr@oGk5lp5R&lf7py-OFl3#;P@3?+>mR{SL8=Kws2I}7p^0(1?B(Zsqvtc5W z?aDh1)nd=huD-Z?`9*J^rJYFe_Bj*wreEL3anpXq%91mYEHhIKHN>l?7&uz4S-3U{uGK&7O8&=lH8cvW zIGD;><)D zCiN{eIlbbjeC^S~VokM#0OM2h1Ekd-78bC^avVxCe#7Euow2>i?}i<3^x;Q3s{_jq zPdGl+bG6<>tKKzNcDue2TU#3bU%>73LBGP?&el`kv8n|9?wn>Uv6SoUr`TW24{xZM c9J=e3?pe9qBKO~&ZTBA=KmWyB%(Q7D0A038t^fc4 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/util/_fast_float_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/util/_fast_float_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d43555945182097303510dad410ce8b633c1bd02 GIT binary patch literal 3020 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 bD99x+6z1gz^YrrbbPse5ba%nXA7%d^)%kJ~ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/util/_g_l_helper.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/util/_g_l_helper.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d1f2a9fe4920f40d4a814df65ed453fe49d2f413 GIT binary patch literal 7651 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 P5K^S36Hmy4p5}i5rkXvg literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_rectangle_vertex_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_rectangle_vertex_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ac5b5dfe4334ff740e9a1a1aa0b167f5a4908d59 GIT binary patch literal 3776 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 CSx904 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_text_vertex_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_text_vertex_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0825d28198311ffc1e09025c6a656e2ab2d1161e GIT binary patch literal 3404 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 Vm=-BjSXEVK4qgsGd%o!Ge*i4PV{HHc literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_vertex_buffer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/vertex/_vertex_buffer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0ce50592448d58160de1994055ebb50b6f301ed8 GIT binary patch literal 1773 zcmYjRdsLEV82=C~Ls_KZmYRuk9q&^R;TfO(m8wn`90@3zvq2^&-*;@3m^al0Gojs z02rmO_yF>w-fZ`5nA?9jGF}-R1IXz_sgo@sf;Gj_gHYHB^KHF?9T^mb9 zM@KTq`y(3o2Fj4g`RJm+2^ZCuqarV}kI7UkiZ+qVO<{5-rWViLoNI4WR=!#*#~YQe z>nTQ^UCQ$0T8V1zSK44G`6t|-E)qjSN&J7PmXxo}4y9Z^&Z&0j8A+N4H*ahv?M-rE zk}_-;v60=CzWB%sGXZ2mMN?{Dxh*o;=gJL>x>i~IMHcr_ z$5rvk_|P=BL2b!0&bcjfz|my(9&K&nXfAoMX{w?2X}wzD{+q&{oM}RLpfHDVJ(Ed0 zZW($M(Jdx_boVEQwWJT0ZP|D<#w!LDnEtmV`O@y>gRZVy?k-G;cUmSbCB55tbGw5T zX7(#-ZF+ild+f|=HEBG|@MnTZWvyhs@qQX~F1MAUO$TrD5IlTM*33Ih9r5W=&mXy> zK948KezNDSrBQ{5j#2-LQMuqyFt|qJZswWeJdS7lIk2SorPcaDbNkJcuB$l9$}rRS z)nz+)m*0g+Qe1mad5>XUr3ogp-X6Z?@A^-&1K;p>qh0bb$;&MQAs7WM2DD5%Bj{Et z6ZQbW5JG6H+*|T|vk@1iErHMFl#FTQDT9%}^qf!B(>gk|XLf7W@Q&D%5_v}txrX|J z^nf6$E8QnBEP%?eArfue9BfWw&`^@WcW`Pu0IarwJ)NUN1XQo4Vtea}F5W8e7|o** z%`(>TMc?Z=FbEaC5+b_O3!9nkgDiZ^x+h~_MLBCWH`On_Ew^(zZkFU>x~}fJ#N!pV z`AKJhdAItGXW6nfQdhygqpw_Odj6_=)3&-$L+N4JcvG0YF~0B-MwIKXx?R&NV6?r> z+jeYXH0tb*TA!YN$6@(7+J@OWX+#w5h&(?yY3?_wSH_azH1b&-8P$Gybkz`___}TI zTNd-dYoli_^-I=W;;!Lk0e&*q*JJTm(5%*tj_x&fpNy^ffGBa>-3YaSTzSI#bhj3u z?+mX)1E~84F7{j+m2iph?-T%jGmCAUT5!>GU=S*};o%RX!o%mesi|DA_m~_PV@h$t zwql%Vac*F)X>s8CB7vz`jOzr&6wpaQ8R!Sa>p>?9xCrLr6sBVOdD77J112WU`!{^? zxW}ss0eCciA%@OIGT{ozI$0dp1Atg449UvRmr>_}vf{EE9KZ%f`O&|3iOq}x@qsaFJDy#72(c+eQa}Ifa2Q{QY{9seoN$EOL zT?W>_Pg{{}X{4nEKF{m8M|;8llh$03?I)|fNVq#eZ(GQaFN~Coub$R)Cp%jH>itt; zT0g2acxxvD8L_MZc9EiN^IYOB-HUfkcUu&H@Z`pGSk)E{67}cA@v6NN89^JD-um}x zso1;p@Ya)6w_83Mr~HfI3WMP<9hC)ZH_ut4A(HJpMsAJ=qam zMc$=J&O4^+V{C{wV&+6$?6FTfI}HOMNs aSWD}@r-7$Cn4w&MUM(**2AsWZZ~O<3iO4qq literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_base_config_chooser.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_base_config_chooser.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4bd59eac2cd230168a9a83829ab8fe171eb04cfd GIT binary patch literal 744 zcmZQzWME_f1Ev5522K+Qn~~=~6g)l98M(9YW>wWLQJdWhcb@l}{a`gj4TP+ib2jXJ z{w)I$yXGVRKU_J?qT$UnYuQ?!Oxf20m#%Ri=ki@wsS+n_y-7AB^yB{XWp`ATE?*=w z%Q@-y-(UBt=g$}FJ>G2Bb8z1x$NdUl=BaQvsVP3Zt^4jRd*vaEwnYZrI(Lk1&anM; zod2|Sg4Dl>wv`;kZc7j7UiSI$!ES03x9Fn4{c->19ocN2q0e%E;}cym`{4zaP zuw|_g{iDF8ozNY^(JI8Vi>LTWlq2u2$ZsYuzAxf<_S}9d^W)IWB&U)G>ykxOfC{|%^DckMPplKo8H${JZI``qFsbSmOm@c*H6O zm;1D?6-m4oX2kiuZ?5WIm$kgo_6Kh1-sA85w_xY&XjW^*#dAe0*PLd0dg$JkjHA3) zWEb8Dod2pj=6=wEb-`DUZ9na+sc}ZV;n$J#qUCR{>t?3r&yLBzl5y>so4TNF{;f5S zQvXd4>wA9S%qx1@v{X}*22r*1*SjZV8gI|Lo}X8M`<{yoREM`Guh zzFe2Lzb>;)0 zE}LN9`ueNNtDqwN_hn~(-2PK{>~vSL@wYSm+%bg*<%D~5Ol>NuJkAa#ql z+rx^Ypry0LRwf0Ka@!U8?;|COBID$tvmWLLOX7F>c*nc@NR=f0OtuJIY$L+54EN@O zY)ctNywo>Ew5RxGIvS3KbXRhr;1k)CuhEXCf@4M%ftKZjr7 z;@owTUDh-3#@vDiqwP`#gKiOnQMY`-sJCz@buSHM zRcdb-ez8^Z9cooEz5nqpx&FAi`8zrDeC*K0U6L$Y-1E1yxVrr_X$?BpJA8Kg_SLL4 z@WSXUu9LU#UbPlpNS(#%U9z0t+_pAefWFo8%`$=e6H`h9l~Wlt%>XZ;jr{zB2ij;g zTzWNcK^LllgTl84ZKwwKi{HX7P=f~@U=3WH#vo_|Yv2WGOu}v$-1pWI3sg#L?oY6) zZ~i}0`5N^Gr1ysn7n6`@4sVb{=ZCxx``=H|h+ zbX{~%>Py>s-8Nbe+j|df-q+1nx(8|7)0?W$Gf8Eibm3M-QP+fNYzt~?y{V<9D$e6L zu3^1K;|DWA+FULlnQ+jlh0rv0!Reu_v6?9*=z82l7X;H#o;|7_anpDn_4YVwUwRJ7 z*T<22s&&Xsj^p+f?~pt@j@%c^Lvnc>d8o6G_}-P?YohXqtmRnf(_bK{C-8HJZXN1G zG{DymZ$&hKiG!Vn26*OhC!ql@9qw<6O;~g@cJciFu({es85}lU`_eQpa4nm*$8U|@ zoB#SxpsEB5`@3Hqw{qF<(b6RSpp=f3Ku?dtBTmg;sfS0L4XFxM@8mWqI&p@=e7)$+ z>!8Zry#72syLUD?Y4dFJ<3aD^=CI(WFYu<{^xZI~cVYdp2s6gnw;iwaXH#={?_q}f Je*tzIQ$_4B=_vpJ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_e_g_l_config_chooser.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_e_g_l_config_chooser.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9dbfa0f7cfa50d6302a113a853b6ecae8544168b GIT binary patch literal 697 zcmZQzWME_f114<-2G(c@n~~=~6m0sQ*0pNw*PD|I^?zKt_V0kKRo8cj8VFf2XKhGq zzObP{jo*?#?NfhUa(fVSsC@yeNJvJD21jRC`SI=L>5n$+-kxr<>eKzm+nFBBPFkmI z=e&P&^XA8@Yty<}*9-Qnmb{+YdD>#Zx}|PuI<*?xrtH`y@rAwiX4GS*KTo{tPDg3Z zIT*y2X%cO6F5|JJ(4WU|s$ybnm})aiR9_!=shMz3YoFgDx5Ez?@HT)+J77b&;|4_A5@Q%N_Q6m3pQB z-Isz#Il_;Hk54IIxNvRV)I%EY5}#G9UXt-iDR%Q%=g-aG-?rSK@@UueoS>d= z4hi00+hz;b@v9M8U1}pob|$WCp16b z%suh(>9lsfX_MSv2eOxzPX1*5WiHpegXXPsS|**bn0T#2aF45^_9fxebfqlMl|Nz< z?;Yh;w0}NN!FJG8(HGlr`3(TcD=bwGQQnX3u#*EV0wJ}TH_0}&c*1NXg z%-eJSI&R)${?BC1BfHY8qs`?-d;6rsD_nbX_21kTsb1v2`pJDA{j@r!-7~8NtDDZf zNW1li>3qWSbWnl;B{Cr3117a7FpGh4JBS9Qwq2Kd{2v@xs`Fw;vyRgVrMuG^nK~hA RU?j5#0|T=+kjKQ!1ps#YKT7}r literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_g_l_surface_view.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_g_l_surface_view.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f690c76983ece09c12f299906aba97b55996d203 GIT binary patch literal 23249 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%0AB{UMd%e=WIk4(g1(%hr#kKsqU3S|vU-a**lE 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 PYtX&4eE`4+s_6d#gZHKo literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_g_l_wrapper.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_g_l_wrapper.java.i new file mode 100644 index 0000000000000000000000000000000000000000..3bb55f3aead6436b493b23ef58ae6170e29f900c GIT binary patch literal 770 zcmZQzWME_f1EvxN2G;iwHY3k}D3J1>sK;vS@l28XRlt$f>B4`WZo(Wu8>lG=@t>buc+Lr0NTADWP(mC8`+Pr;6``(K@agCA9_XUox*%)T`Xs*G* z{9xzgtfMn)<<3pw+hqG>n!%+vzPSfYq>5V4eJuAWm@9Ve*v*N3n%kb3FY6Fs)zlK^ zxZZuMpu^W_j=OBgo*WPMwvHL@mJuTE=X%U`Opd8^i>bHJIAD66!Lfj)&(%$?t=hxt zR#E-N!=lHR8F6oui9P*R^|+y9>#?bmJ(*8B4>a*SiniQQi(7JmJMsNVXcZ+7pPb2eQu!AdHu^w`6_oK_o)4dx!Y z``@1PLHm^z6{?{-{2TtLg!*Srv18UvXgQs6U>f^pnfo?NUsYZNzoPpEnI z3fsQ;`aHAl(L*=MEpv+`)|T3Y{yW-r_{g6B%tE^lC4*8PD769sA27|n1G5+yw}WU< qvYluB&R=fRlNV>Uypvk-Q8QRu#VPdEN literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_log_writer.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/opengl/view/_log_writer.java.i new file mode 100644 index 0000000000000000000000000000000000000000..50551bf31f3c2c06805d655446ac280a0e53d445 GIT binary patch literal 594 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_base_physics_body.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_base_physics_body.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a685eab04a6ba525c0cc1d88a6e61fee9534547d GIT binary patch literal 928 zcmZQzWME_f1ID`y4D6N=HiOB3DA<;D;dt1rOIeJM|ChV9_=H?|b@voh4VbE!b2jvL z-faUOSNZG%{|_u*$ZK`F?2?(EKtlF)vDy~~3h@U{l&m>BjmMKOf#>)4lj2VKz?YfFL$7As(pB&?`&d%8xpT3B*CNUJ$BKP~cb(0cb|>z>%9NCoHoYr9 zM>JfVqq#R#D~!* z6uiW)e|D8PnBH+%VGdiNM5}JY&$!Th8JU9QHEwy0yA{~pUAPc%ajuv2kGIv&dk((( zzu)e_-bu$6ZAojXP+s~)V}*zNsdNQnVIl4lT&-fK#E(D!Bzt?YSWLviC)Ew?%iD4d z&)Ro5&MWN`b*!w3>O1DEK7HNJ(5jfWxUbib7G4ZJed8)8|J8Xb!oRcEt-H5qsg+%9 zS!_*SablC7XvEiiUHQm)WHxo%hMB zFHF~rmESR+t!Ap1+0s?KC0}|E&C0&9f7717j-VI@B?};sVqjo{MSK`Y0F*xXUQLj= zD7B4^LpG=9fcL%S%Q8w=gXGXa9)!=T$iTp=0%SAsa)Cq`zk|hdfF>UUvlti(LBb%D z3wHRI&p34^PPTisgUlhx5Y2>JGoWg~RK=X+goFzz2?-r+Nt@5yY5KEBsP)gHlD$Xv zOqp`UNMP!$>GNhzUp0MJ_@v07mEi$XX3mbB6ge$wjrg325fie`o<4fuz$VcSc_!b0 zhdLU*r%w8WdH87QX?pqS1u|#{dHCxx8k?9jzGCc4R$2$LkSQ5#tu4^42f-``h8mDC z$gTVzml)S%&-p*e{-7uS32{e}7PTg*8W^PsWW)opVPoBgjr>IX-FVzo0m z6bn~09lVV@2(qSMUV3>R^&A#T-gu^Kz!)0QlP@Uuac(oZxm@a64`j;Tx6XFw`z50vp_YH+J*Z%8=^Vez^~GWuQ5ZEVhb*>7W=;CAz+ zjJd?7<1y&jxCc|#)8fvgidExtm9u?RwU(Vir6yNcX`u5DU7bx4!r%`CI0b`F~lI~^Z!qO#{)_F!t2n(OpPv53P!@Avqz)pYb@JUcMDUY&x$n`p1h+BPL*$_mwo=4=9ci9S-WTjr zezanFH&dtBvdnhq_k|qObkq4#8;n0EF<&UfZpu<>yl;ICOfm7pcKA(dLc}~GLjv#N zPD%D=3uUN$?i}~Au-eRHtJdK0^6ZuorkL!uqi>y|8j*FH79`Vj2J00Gcu0MfO)kaE zdg+ez>RMRH?pmzNHp0vX-;)b37PXRBF&b%s9t^@>NCp?R1n^L79+Vqpa^{p!*5cqB zT!s#>xPSxzv0*V11cE99iUkdTfc&h!wz6g7!}>W!v}!a>1iAf-FDd|Mf4~Y44tt>! z%_kam&TbVJyR%ssH_y?@>rTcB7&72RGm4^bWeU!BNz4~uas+Fpy@~KwQDWOF0lhZ^ zKCsVj!sDawWXF3n!W(6}q%&PC+K{B>@A8fo>y46Cs4@0gA27O!Q%mbgiITJfWm@ia z!Kc~{MTZ}z)y@81TQS+ei#qCtu9V{E@0bPQvkcSWmjy`;b+EH(%;xpggboG$app1g zU3b{JXEZf9!UEpyW~Grl6K=MPVp}qokwV!%$1NLsr0GU2JUhEk9hpBtx}iUgd$4|A zj$XGou9kxz<|DoN)#G$8)es+xhgM766@QjCR!eC61=*Rr{-~FeS2eQBw6OvEZ-S{! z--ofqlZ`I>a)3Dy{zHr8S*HFm%#pPN22AZ%;R?TFZ=L1Rz{Jfh88I?s>vs>kkBE}z zNg!nZ)7q+B%(OI+E{A+}7kw)Fgb+722tA3Ii&`aL|AY5DdUzL)PCP2NVlI zti=Yr6u4>M)sN#A2}!Q0MhPo4`5;=x4m*wr7+Xf9KLdAo3gkFcHeCGoExl1a)lezs5b7_ZjzUPTB4k86;fH{73ykoncj%A=+BV5A7y9(s59iZZoz&NZY#)= zcXUU;-)enTenw$}$1>Qc2MlpKhu43h}uVNJQBItjh!a58F4D{Qv*} literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_i_physics_space.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/physics/_i_physics_space.java.i new file mode 100644 index 0000000000000000000000000000000000000000..66fdf7bd0bead8ad3eac515155f713a1ad2dfb5e GIT binary patch literal 924 zcmZQzWME_f1IBU&29{O`o5A=$6l6_1zEoz__LRhkX{ME)4oo58O$ksnV5(xy+K^cP zLk1$XX(#_3t_@L=_L1i~a)c$M;)AlItK8|Tn^NAlx3qfn{J+cOy1kQAYFg@P%e~*{ z+}?d#bJD&^JdUq)l$wHK*2HNTsTlpGEt)4JZc}l?Bw!fDFLqf>nss^c%c}RmdY!Ca zi6iu>wut0CJdkxqw6t5a+{q%ppKC!(lw2j0IRz3Q+V6n8m;;O~u^rS5o=LFwB`)OFTwGOHVOo0RNRBA%Pt%C;+JUEFx%%;pogct`T z#MnBuMG`nNqdpfg^4>Xm;J_J1lPm0Z1E!zab0kJ2c%hQUv81lXGpr0#JuTh>010<= A8vp#{j ze{SbaribNQ)DJwhbI>_`qFt8bcCZ^$pp3{-t#7vXxt9muZ`QO~5G5XSi2LXs7cMiQ zP}QTZ(jik4nLhu1`u48Ttiz@{ixhToie0qX)NtXu%ipvI4QJz6*XK5=FA=Qybx(yy z@#p{RavL7`WFFa4R4`B3E8FYT8NvB}`{x*iIK>q$S$IoQ_p$KCtxINPow})cU~{2U z^qGg^i#Dt4PEZKoP2XsoE44eN*K~TGsMM8fPd^+ww8~UEQ=w1kZ^ZkpGyke~N}O9a zi)-GCrd10HStgl<-_e)1{vptgS`-YQ`z9`;X5@}_oGKcq{@)qVv?;qBlv)`KJ@Z;GVHO~h>|7Y`Q zSiPAzCss-C%^s^~zaR1Sxz^p2JymOXDuTu2ddl30wi3l9;jOWImF9U){CFvIv(hS| zxz5bn3ubkFZP=SAarV}sqc7zA>KrDw3vTsvW&Et9vd-g?{OhU)twkSJJp9}&o4M=T zt>_tFbd%n;Z;szS*Ea|hD4;+D0!3g@=73oY3??8N6q+4<(;{731Ng7mC${NHD0wgR z^a_Ehfl`bLKodafMLC^4gPeU_brgbJokJY`+L4JG()4r;3)Gdh-6N9=>Rc&(eYk^pxi~T0oB-A!iDXL$P=py|OXiuC k(wzoA@0`=mmni&Sk}16Uo-@>VC-GE6{xrW8m~zwAM~(B{YTl=Q9z7*x8=7usO0+a;Y%%(>UDiveq+{C=j}M``SL{9} z2(TG6SZZqqv&FH5TW;Q9xaI`w`B~oDD((_@ec!cDzQ}y%P=yTd`$ZoMOxEx`GPv+` zw=w&>8eNmfd$TTyX<0JV37tA}s44QztNn)-h#xoj{XdIIXX=(CDv|sjZKiG!o1s4M z)kU{Al8Q^5Hp%Q#a4KY5xxaDNq{&A6sxl;sj`jYN_kFppi_h*pJHzcl?8{xxlFm<)^4;%yiMK}N&5hzH%OJI!5*D^IeZN>$VJ&V=-&c=Vw=<)b4 zC0>`wddagZ`43G!mQF0-3*+`X|6V|keX6>qZ1kP~401~+wL47}%ktUd@KEhLbIQgG znV@I^#U&8%0b_J2n8m;l2BJZcdRwn=i%2ueFKu(Fdh2T(){lLEp zWG&tBsvvQS{2YOIH+S=Ov;1!T#GUYW*(rWu{`IoqJA~C^Y_}&r)4JbYbw?*WSu=d| z-F@7C26j8=^t<(UYWIr%x%g*caim(-ALVEB(|)IJKl)ws(XZf-YX#5uPMo&+Z*PBj z@rvxYvltj^ zK*FGqQuR-j6J`yp-Se8Mo8g3|OYJ>PIj9;Kr3qxj1F>OdZb5!gi9&u+x?W;lN=j-O fh)T^%&&*5JOU*0EEUDBh&PXgs)e8oZ*1TK*9O8|f literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/physics/collision/_collision_checker.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/physics/collision/_collision_checker.java.i new file mode 100644 index 0000000000000000000000000000000000000000..846d7eeb5c84cbd71fcf1008a0a53b28592bd95e GIT binary patch literal 1666 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/_base_sensor_data.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/_base_sensor_data.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b3f0bd30c305d516be20a4eecbcd37a860fd3b80 GIT binary patch literal 813 zcmZQzWME_f1IF(R4D5LjHp9{XP@v`LlAC{Ai`O%EhZL`@niE^ZgD9vPFjX<&G@UzMZEP zt|fk8UgeqUe48sR{}fo8Cb;@kOiRqpKf!&>Fzm$C39mJJoWia;W&QAr5;C7P^<$V< zQPABuqxtTNXCAhh{L)aVNer3da&WCm=*brsbG43X9{P0mRqn1```TD_E?eyFy1(S~ z6*iT?2=n_s76Fr2KVS~r@qXX`i5X1$7a4d6-T3qODMMM4w(pKGxeqo|zjP+ftX#Ex znv?R?8II>HG!^w(FY>dm*f(jDWA=58mO|dE(=NFQRYg@lzU-+Zy{h%gL9Gp@yU)$| zcH~Up7M)jp_xwy^;>*?wy-*G=JTGN-;A8swqZ(flo>qK0_FHVL8|V6j`?eKER}AHA zbONmXHqTq`a@T_|c~^Q^ZIN~a+bhlDTateKR}cGszvZ~^`3Fb6Cug|MpGoT%n4XsP zVzKRw?9Kn`m{;!97qcyTa6s(hPmmfxpPZS%9`JuB-}MG?ZDaE?x0OP=Z}1kGKy;u zd-qWCBlq)TTzU^ockGn2Z|z&V|Bw2jKlYP<^c5F3oc+(gE#^b8sub&7_qa8NhyJqZ zRs7!wihEFk0Rj_XvdICn7#O#MXi&;AYw?I(H^uXak#3-PgrwMKpQw)I5H%38Voq{G zLe!B12ewRM^!QL@Xs}@kFpW%5KYa3Jw?B8CcUsPEg)m3UZ}XWe11~|;KuEBi4-*p-GSd?h zHava8vrb3P^Xye`9WAdlKIimTT+!h0KBMWYdo9r5Lf{G4B1c80JGRz)c^nh literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/_sensor_delay.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/_sensor_delay.java.i new file mode 100644 index 0000000000000000000000000000000000000000..07c0b49663882b7706f7728bf802b79b99c5c3e6 GIT binary patch literal 466 zcmZQzWME_f1I9@V3~Xm0Y^L`AQ1JM3hsyIqKW>;k^fqV^>)KPdJ=FxF20~WMIXl(g z`>=z+(eu1dtj~DnTwJnIZi$kF$uy_`4vX3SQ+=1cO)`>BGZz)yzkBwQ1#wjqY-e~o zJv;tn@Alo3y;9aEbuXxp<~UV+$J~6$S`{9XNntf_tM{p&_S(o8ovivfLEWNWxX1C9 zQnBMUPxoJO77{|_&)S&_ff``dJBJ_vlV+JYge;gyshB#_tn`GL?Vk>6T zEBAt8jmYf1{^{S;GI)&UM3|m!R&KxRk?|(yVhJCApM>vO7WgcveJ}R_FP1WguD{s~_FtDJCy1#jL)Cz(iaBRPeY0;n z2-x0!@ZaD`fY9`HZ`9r%R1=tZVS@9eX6H^>pP63DmC>2uXV%I1ysSU}>hQWdBG#H( zE*x9V^vz4Vcia4w!H-76#%B==xSXTJ_=7fvsPJemj!X~;a9R_*>B!@_?boMfF1vZC zJZ8~}wLUH9d$cd#Db`q%sv&mbA+u4ZCudpjsoHf;AAkLg6aQ7vwlg-POE=JPz1t7$%|4JXR^2G}Fn#^) zk2V&6zprMpxPB@kp`CLRa6tDzn0vYyD?^wYR8g8EQ?$g@15`bi*@oGo;gj6 z+O4W=%{e?ADh4oU@}qyq%Y85lShgINp=svsJahPI1&zDUyDX~Wh0H*-dP)h=O~ zYerBtV5(wHaza90Dnl}x^|_`?OXi$OY27mC&yh(lB3i#(nY7`^oJ&`dczs*5;`IE^ zExI!4(juGINj+zh_QrHfF%8%w)={}rLL%a{!VJM9t&(BW=FeOdFegfA;lyb(r_W$E zj9I9_l%=vM^5Vgjl}CTN?(3}Ve7VxKO0Q3`@1x*Gu5AuiIkGRD?R7CVpX5=jeDImu zBQtZZt9LY%&h~bNGDym>nn`5nFjPCG_ki5Wv;yqnYM?i#f>{g<+CZ8S-eSWQ(|8px;4VVIZGbueG;ZYKU&>n|LJ2^X|AMRmxsF669Y{`8@Ji#VR zQ(;=`=Sz(i+~;mH9l4!oV_Ww zkW7?7h)qb<$1K-9eY+E7Z_JIHbTdfP_UqhVEVjR7i&5Eppx%!eTPjK^?{_;HF^H=i!&QF>9mrW_rEwr0|Ec}Yz-r{ZS z7XQ7Lbu%A$8hk1|@`-L6`_dUs$N4r3zn4v`=;coPtZDTlG~x9so0^D=XIHPZp7igG Jej0nQA^?F}D3bsH literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/accelerometer/_accelerometer_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/accelerometer/_accelerometer_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..02e85e9226cd55b7da9c66749ef52d5f7b40776a GIT binary patch literal 279 zcmZQzWME`~fa?qlOsY_}z<(%E;U6E+U#E4y|2#{Tn>RT(#OT{t+G9KZZ{rR(2L z(?d+UyXuM0oQ5K$&}uI^Kc$RmpVD4ljb@(bUboNWgz3!o%jk$lhP3o6SLm&rC9u5+BWE7s+8h+mh9;y>%m>&}Ty%%>7}s)Xe{ z-W*1#3B!Z!ak&M?pEkLZ3Z zFzHyKh!YS0qRs4QKP+0ZuCHxKwMQu;b&D9-0y!373jbayGC$s9` zgV0XRcCNQa=Jdu$<{oEBpYpe;#?AaeYhzGx)UHDZ)@4t;{`bJL=%O{=iXWSfWge-v gY}n?q&izh5m-eNSoRai}3Fo`B)?JAIzjNXW0Gv6p0ssI2 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/accelerometer/_i_accelerometer_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/accelerometer/_i_accelerometer_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..5a7ec828268daeece202c7b6e17c227bb8602282 GIT binary patch literal 437 zcmZQzWME_f14d~E2By^zHiPPaC}6%Vb$X|mqVcyP9?5KN!I`}xN`_E1V5(xy+KKnQ z4jYIZyZMx!L&N}8BrvBWu`DxI)Ng>acymEV*8hd5+js+?wKPjF5uCMjMkLz_*qnoBw zIs42oX`y*N+x-?yxiWFHwA6{t*Yoc#{>Cg>^oP|w#rWFdnxoSc9{gx|eBZ+E;Sa`l zN=bsk-L6Lx7{hnSUb}X1^R#Ww{NMS^=T3W_`C{ut7SBN4(^}dOc_z&`F6sYRCwZ|KwGtQ-`~u3IErrFEh3> zW%GU76S+9kbFRs62|l;&77AbXuk$-xUhncoxc>g(Kv4LA0u>0PfI+JYW-%~mgJ@9b qrhSvMZrLc@(qmibyesIc^}fle&!K9Nsa6PwDHv!*7?91x%LM?QVXKD# literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_i_location_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_i_location_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..41f4d3f0a1813a57ccb2a4093f42a09115332024 GIT binary patch literal 409 zcmZQzWME_f1I9=O29{+IHdFh5D0p8PR9@@)l4nC!@Mb|X%p9&`MjKBy)sjTEm0wSrx~Bki44uM^qfuXbDMmY zlzL?JExfg9c~i?FFRfQ!4>433JZp{4V2(Gs+7(@4Ub8f1*9!i%OGFeq+nd`T{$+TV zFkypA+V?`C=?xk@pOT(ER5-bCW-AR_AX}m*#-KS;zTa=l`ngD yr7-+P+MTE^@o|0sKAQg7KC|p{SzGQIyNhLe`At`gwbf)FIRDJ{50lgP>=yv@gv8MR literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_location_provider_status.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_location_provider_status.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7a1388d7447543b110bcf5459382bced5e24a0f4 GIT binary patch literal 450 zcmZQzWME_f14a`D2G+$8HdFh5C^*)0X~v2@*X7%lmcBJiZU1#yQo#?R20~WMIXmTS z)?ovln1N@v^ken4IMX$L`hUMSWvXZkK3I zjXq)jx3?ta&*V^!pisHRn~q$rbX>)vI|0Ndn`6-ISU)fGH@4L-;<8CY2VSXZ25zs6c&D{snm_Asw` zE}dHDXSPV~i+z6V`@^UI9}6k0+~{butG}SkZMVkRMcZ|DZl3+LELdl`>%2APnRn*q zO!}F%v+r8wx40bf`g3zD_AU|jzSQ=0vcJDaaAT>Z!aP5vt3}FJ8&;%c@M!I5-DBLw zY~~()YH8cvNxV5_uz6i`>U^)$=LBZZ1HY-uz-;iPP`3Zk?M7OD|U482_L=B8& O)CZbi1mrRCasdG9JG#XH literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_location_sensor_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/location/_location_sensor_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d2a420fa6a78d822612aacb661765b3c59a72e2b GIT binary patch literal 953 zcmZQzWME_f17>Xo2L3__o2mUj6e#@p^|Yh*^2g09vlC*!Ypr2s+vW#R10gHsoDIL9 zf6G9iPEY86^HNXYwYyk$ZC~V-dLTf>N!w|@y18Z0>dv{Ae%n_)s-OQ@AWMCrt_gp4 z3&)+i<@?^(-SFG+zr)#~r(JBBBZL1>@e30IHUurud>nS9Mu%hZ;k@Oy6$=mT$hdZ% zrBi4A#gGK8plsJ9iRt@Gk~0rVa+V#qHbalvh$toYI&w`;EOZMX2__N)i=-iUoraXEBSSgb*1*#yP4oJR$_BzPyj){*&s zE>?H$&755^mhZk?Px)0`VjjOx+hl@^r00g1bi49BFMp&Ne#~2b`cZC0Lwo1rwQk)T zA1+;g=^9tQJ*SJ~=_PlK#Tb`q%nPcKcPwyToW3*Xps|Ehm)4yds#A_c?s=rb)A;<0 z=hMF?{P!7WOqf%(pD!qNldVwbuF7ZJ$D$VnZGF<2WzF!VNLKLIjXOc{K?2J6&s%(( zU)|Dm`D|t4%6a9w%8o8#2ZZXHA@*0O1=f1&Ji!;Mv<1e+XD?ZNHbO~&oY~T;{39pNu1N9 znY~V}TKy+_rABbnN|E3dp$(cVf)c%Y4SXkt2`yVNZ{hYQshTxCJCdfH&eJ8hj)elz( zJx;supmu$y*}v~Pt7iOe-Dqc1e$z@;>eH)^HLB;YtmiwNrRAGj`|72q>DH{x3#O$9 z-+xnM{M@Vf@~wO3%!>X+FSI{h@%C2lT(p1QlbNESYQO(A*)F(Ywrjdj_mW-nb*0!R z7ItMVFcrDVmiYKhepA-E7rwz?csugTmpL9$XX&%+gNFWjVf?MC}HzSg&EzyFV%;Ji{s{!>$z+mwsX zXQX~An{oL%SGLi`{|x1A$H7?(l*xdA517^RAsLA2G>8V}wyRt8yL6{N>Q3X@p*^qe Zj?KU5-b9ER7|FJdfq`ukkjKQ!1px0~xOD&k literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_i_orientation_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_i_orientation_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7ad36f57f4d45adcf20f261b2cf4d159aeec7141 GIT binary patch literal 352 zcmZQzWME`~fGZ3POtMh+(f?3zvUgcgTHHC=s&LK?YHOT~)avg)g{lEl6?4`G`erjZ z^4OLq{B!OrJ9xAITKCd`6&g)z_ba|Ta`!@R+Dys4Q~s5wZ(Z<3W3~g+$;VGWUP}Jk z%G>z4*Ky;tK4<03h!ZT69_%Tc=c(jY_G!`836;|_Sta*8RNQv%u=@3NhZ(f{@5^3) zn<^QR)wF4jz3AuXT+0H^`WPCA28uB&Twi7XMo18GvQhpOtmTOSH|o;che#$U;| z{`>LPgp*CNtFGKMV0!AY%1$HFV%h?G=l(uji=Bp__qt}D@cWj|pC`uM!|`|j!Q@|` z*N3Us{+!$Z_82fUfPe=WCemOQ15-PQ1_jHSx literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_orientation_data.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_orientation_data.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0b97156ee7fa9931860c4fb3e88b7f2234fab576 GIT binary patch literal 1857 zcmXYv2{;pc9LG1jXs$UXl9emuNaV=ItK3I349$@%^&%_txPIXxsZ;-*Z$I zVJrn8>?=bpb4id(v~`&BTXWE`guttj|iMER1Q_X zWUb`jry8izn?p|}B6pVEEfF(#5evF;C_S1I-f%bQS`~GHN1O`*iXqQc-4vRpYD(HJ zP$U#HF58vQWYVr?jpAlareGC==loT)jOqR0ye6cR38*00%G4rXQV5!AfRl+ zMgH^1bagH1r29t_C&5x`lxEl5I*=cG6!AKip{58B|Kf3pJ;+kcD``Fx+%OOYlrhG?ebZX zZ2e%7V?!}X^PBm>S$St$-<9VrI&}fDeUT^-VM^S@qbw&SRqIctz0I}CAQ{L0v(fmh zY)l_tC49f)xI<)XnatkoxJ330D~>hNpP6g5$Ni(v-^mcNI(@d4uK{;@ytw=I6|&uB z39phA=eW8!Kt1%Cqzi;pwV-e#$|#g%)PWOa&R%HpRp_>dz!LLWxy{@s!b%^}P? zWh`Q4(PnM1>C#Y==3c*!zOSHz=r3-K>m9n)0dS0&>8c{{wp6a@gflxmcI5k|ydV79 z!2|%-vO7C_7cZHzWnKZ&kh3_d(7Ao}Xz$CmL(L(vWFJpYkmvrn1`ug*@io$9o zc2Id+Rc}F&5NioM55RYUQ;RJJP9Jaw01&u!c%74%y=Ff&uk1T)LKQL=PE3-TeCX>BgE zosh3Lx^8b4v2=f}_n|OWFl<)r&o_u20XIq5V^_JS`zF(a6oUPVD9g#u-C? zt`SoBTuV~mv!xtjtGYlsLk zaCG_Eh0QV(^s8aVG4DI^lxeTeOF(E6rsmF zK6Kb^3rCsRLH8vA%oMk*e~=@+hdgthsmBcZ(|FX4EGmEK3_n@$z>W>Pz5q;9JYiN3V$F9pXF9Jf{9!h1ZX6A7N93aw zzOG(;ui^p>Ny`FS^4-n1Nu9#|tLkE}87w{G^{?Y6*ST5dinn&RQtV|Sp}IIlypa~K za}UMaB+lm^7xG44^k*nF+`-W2x<@s_kVXhuH`8&)CE-s81WYR*1HQBBKMQHm%iA~= zgFV;S*f92a-Nd3`1FWEq7p&@hfkj&VN!oiZi{t| z`dE4q)>GA-$((3+)-`u#)rVk6k)SxkMASRtL-ikCqTa9E6M||?f#2Aca532gO743( z#h&)P1hc{R(pSZt%1|{6NG1M}oEIFa9xx1EK9KwdmK;iGLeMn8alLrAbZ4X53(q>e zxbz|Q7z3Na941 z249LSr|HNB^m14q<2GpjQPeNwb99?*F8t-2UTn5PNma0}po>S>gLI-o#bdMUUwF_2 z5dX(fctGIk(gC}g>g0KFSw^$pU!AH|rFNt*ut9%c(}5Yr%|aFD+M5dHB^^UL0SrX7 zv10W+ZO()5%wQxABliB>iCN+~W#|%gyB03zTb*Dxm6pi-ptoi_iLI2TvbqQFr9sY6 zidW^cecRx8bwng~1-lv2xOfMvy~WxZi`W_YC4WNTk literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_orientation_sensor_options.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/sensor/orientation/_orientation_sensor_options.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d3f048f947a5cad1e80d186b938e651b2beeacab GIT binary patch literal 393 zcmZQzWME_f14d5<2G;iwHdFh5DA+u&=TG_7gq5Ef70&A2TA*6)muboGqoWR?~yU7Aw4%cM)iX_nsQpGAe-<{La7mx!HDf4QdEr7*0oK$eU){^ z)xh3j*ktjWHyo%ho&>1!$8eWiLTaTg4DEA-hf fOgr(l$9ORm@pC>7dsU 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/ui/activity/_base_splash_activity.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/ui/activity/_base_splash_activity.java.i new file mode 100644 index 0000000000000000000000000000000000000000..8ade054aedc42b070f62af1789b3b02accacb86f GIT binary patch literal 5051 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 T?!L$+3|8CS!v`yL6H5O-8w^<2 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/ui/dialog/_string_input_dialog_builder.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/ui/dialog/_string_input_dialog_builder.java.i new file mode 100644 index 0000000000000000000000000000000000000000..928316615ad3f242b4f8bc212aff711805a962db GIT binary patch literal 717 zcmZQzWME_f114hz22NiHo8j1hD3~{+Z^EP1-&>Y42w$kWvDSTxs+AN}4VbE!b2jvL z-(>@Vt9E8V{}bn32y&dntGYDSfm?Tt*2Xn1-`QiTCz*ITi>C=`4$~#nM zEYUbwQBza&tfy8mAk-%F&bfxP#}!rwO;lf6IU0FtNUvZ1di6_{#C(rWT}ySmkG*`I zb&RKH*~CkgE-J}8bmcXQ^$d$_lICzsb=O|K^UU;31!aM*GU7a?Kj!9m76^*8{8O-O za_7vRQqV7CC3j8Z`r!nL555bx*iOvc$?@E!W9xD2Gv73$3dMp{b-kp|oqq0LU2C*Z zZRZzxD`kcl{?600nz0ml&aT=FR{FF0`r@t<~b+#hfzm|W0 z+d+k{2Y3I+n>K`>j8Izpl5xGd*L+K^GPfG7&Mk|>Ue1d!O|wXCKHcN3w7}3n1@-TezM(2t&Mk6$ z;`6DV?8ij^P5<}LrTdrQL$R~YMX_RcpVsW>tNZNh$BhSiEE47UuGxmajSl(0 zP{{V{ech=2u7`~yLiL|-HoUXYUg%HWTus^3sN96mQ?~lse`M6J`LZST&Yk?g>~kAR zwugzWblqkg9Jk6ZC(<*1`RQ#JwSJq|UC5X_&3DaxEz_hq{-x74z2T{UahQGOlgnZUEmSK}DzW?l z*O^T%ytXyAD-hzpcbsI)erPW!ht0*w%=7qp=FP-Q^;5P8j#?pY)8J!X(6-v5NLn;n z8rNQyMOo;TcN7mGqc&nDjk)J|n`nlR(~VHhMzm4P^7<=Y9t2!>2hRC}mQta(vomQG zny)&rAE^soO{Zl6Q@D~TJ~)DJS~(*F+>l%utsZ)3(7X}q^NX{$7j+G9;N(o4oQl)B zKF@%vEPT3WI4Is5U=c}MKG~<(lStY$NWgT_HXJ-3uhjK%ozGyVf5%K9#L`g+QBe5E^a6knwm)c4LgM7gcFR!7uYs&!2bQXF;dSOa%^1^lk%Rj1KONS?3s?-E}rLp&muj;bZO6)bXsXL+nt&!cQ4 zonGBNB9U$|YnEI@6|os)3vJH2jJbBn#6h%!&v&986hIgg*}*n$m4;*-Pj%)t_X7WD X;G=c+_sXRJU2R4w2`BCe&&CP(4#W0x literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_activity_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_activity_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c0e6f7eddc4f5a595f8f53d0e26ccf5faeb6f193 GIT binary patch literal 2956 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 OwwTXxgoM;9bo~!UH%){9 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_array_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_array_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..0da7fa8be4c897075f932b635a8c178a2fa2a77b GIT binary patch literal 502 zcmZQzWME_f14c^*23B(jo0;!F6m(jq=EwytdFf_1`?i0B!oi&h^_dVg5VB&<*%0sS z!v;Kd<`e!exEyhM+VyMR-xHQ@xa3?Ou{-$X!QwebbS5_E@SnO-KY!LU@gA8Z9;0io zoi8m9JE0$_Wf0=V^f{(>e(Ry2#a(+Ye|45}R?U;cky z^}wkGrA%{W74A7qh}*jAv*5#*UM_J~&dN?(!_H|oY2PUA|HyD#OYX-Vr$i0C6DAuz zuU&Mtvf(kW(G@2T(?w3-D%v}aZGWy^d}?FG9s9#_UQh2;y3TmE>w-qs4f(zcWij*0 zZ01cUnz!M=Z7L+FCWF{*Vmn4<|DVq>Gg%E|J#JrUJT#dBMyu=)Zkmy*20>`4F L#7a$tYF;h?Zmr1C literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_async_callable.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_async_callable.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a57521de3205bff5477e23b5821091f1d4563328 GIT binary patch literal 972 zcmZQzWME_f14cOp2Bz&0Hp9XHP!O^=WpQE9V)HLcUu=6aZ$gae#U~n2HDIb@&f1{U zeuoVNY|MlHCH4zAK4REArM*k*0gHOwfsN*!t=aB%A_9-@M^4_dx4`LU^V_fQdcv%Y z3qBsRW_i79lC);wbUl-~MiIvrd?}sxG%{4Al8tpuCC}c{4~tr^-Z?z^ar9ajd$GMn zObg@INkqpQS+xIJm2&!1)76|D35&0X&%TcJT5ThpDW_WhCSHxj4W zu9K3VELaxiDWLM-^Y`lTA}41yUq6X&Cp9fU{bpaxyz3e$h(O^A1cAWNeF|nVFsgxQ zPyjnu)(R}X=CrN-(mNYf|D~mS-iC!j)Ii9JImrnLSxE^Aw~ie+FkuM;3+qx(%b6#+ zQh(0WzqScP*Tx0-;TLXj6I7NH>kagnm8vaVA9O_>>(`ahf_?~ zR_0th#Cl4 zF(#-sh2kF-+RWZM-KqI^W`3n{ zPip=#G5KSgo?69+x(bT2X6?HDAeEm_{r7@e&Y} z+9ADdR@MfiIl}4-H$&7w$cj0peZF~4hCD6KX;(T_k@?@OkL>E7i^^adau5GP-ZWM5HlUl{`?X8Q~ z%KcqFAw;$2jXMc}rt$Uc7ho+Wl+$xhZl1;@-MWcMbI=_g8GkB literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_base64.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_base64.java.i new file mode 100644 index 0000000000000000000000000000000000000000..8df646c4961f7114f46366300e126ed9eefe7745 GIT binary patch literal 12376 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 L5}04BSBH2q(f^I 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_callable.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_callable.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4a27178c2c76ec68180f67f993d226fa74da2f2a GIT binary patch literal 694 zcmZQzWME_f14d2;2Bv8cHp9XHP~axr+rYEy<5qtG%Xflj*L>?Wn|}tX2254VSv%>x z*I@^NW9NCF$nIOrHham&xTvX4f&NvmxP8norxfm%{?^a+X!mZ#OxBMoGY`Mp^!aT6 z!`UxA_5>X^*mlzMy6OI};;-GZ&NWZZnyZ!>loB~h;c#11e(%w45x0qlCof$*X_4$C zzpR5RPF?lg8l`9GUO9Jq_Z}_rRDF$0OSpe)v|pL`wsBE~x7WqEk8j_}&CfK_=DPFO zp6$TmD@z`oTvaBlp#JLB%*Dl%O-#Dej!C3la&KE}S$1$U^TAErr{a$`9@>6w&vAR+ ze*$+ZGfkc_I)3jvEPaLT+!OUvGq-Jg(|lEcd8^z^`=5e;KA4y4Sbr~CrQLRX2eWmD z#qVzKKW#@_fB$0BIkjN}C^SGp2n3UW0oed%F)(fi(V(zAqMRDtm*=His57sQ+dM1k zNK4Ech#Cl4F(>z&BiA7V0oDr_=eFK^sBhX~+aT?@r%~MFa!2C~&66y9JJdf)$(_2u zCjRJ|{=X0M&RZ%3b?3W$$(tRzJj7E&=BHWOMoy`V%ig4N_f5!tQvH(Y&EXq?GVD9J zi!SWlE^zFC$DY|8H!WSXE!k$=lwK9qf7SZ$@mJ4&A2NC6)wlEexd%Lp_r~XcIQ{1K zGv>>YPI@4BG0q0NE*j{gHi$c!E`o$XK6=`FMb45{_2>KB6J84OJ?#+TJ+v9320~WM zNlr*eN=r!KN=-=Uco1?Ss6fL@S5x;?u*OM`P>*xxbv1N7eFK4FdS^8+K7PuyTH~a~ rDSiF0g0&ugx*8|XoDV+X6RdI8+vk*LsK&|m%peb!7fcL+p>j?DvMVak literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_callback.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_callback.java.i new file mode 100644 index 0000000000000000000000000000000000000000..187101f150ff4bc9e8fdeb197845d7d6e69545b1 GIT binary patch literal 338 zcmZQzWME`~fFleHjIW^V?f;=*VOaU8wN}gc+K*0r?>GON@XAY5*`aE{RK=XNfv33+ zIq=w&C;nG-*S#VBHKA64qv}%k(dwMbWrcTjYh#bpmuJ7__i*-5kZe1-A~7X7rLi; zM>NP=)jeRDw|&<)j_I2>?UlCSxEe5Zp`(1jsofVhbe4a3bfzfw#y@%HgMk`TmQC_` z&8eXtRH~MISEWg3vc0mkZqS9SlEP`V{{0JO)Xk^po;@pkU;evw-AAxTfW8L;K42KU v1hW_zw}WUWoqSB#kXh?m!+hHnr#D}^6a!HMAuHyb4UP4F z?I2K_r|>^<-Vw38D%Yw7yAxK*>t=8-({<8J^)-8&v`gAd+V#l)y7cW&%|!Q4urbl+ zoN1Y^HrX=WSjzU2CG*N>EnOCA{?CpbnZxbIb@uYK*E{&)(}FS&bWE~QD|X$?+Fx{O z;>r-S!`UV=>{11O+JK~LL3_1-oR*)M z@2ga-n=HydgHJH2c*7Uv9HsW~>nkhe=KTE^C0MfLgsG_2`UZYYqoeazq&3Wuy6v}P zfu_pJB~?bPc^30{**BkikXFE+u5jbC)s;Eh><$+#++MKx-HW1Yuj6CxDL4Nwj<_M$ z_wLr=dkg-{%l?tE&AUJ4l-y1Gn3F%&TX;Y2N{hc~wLpt1b68N2dZ?NvY zYa~)W$60CWbd8-Y8&1r4C9$!}wsEbRNm3~9B@3^!JKWqZx+uIB<59B{U^=_MuGU&C zC|2W6hNeNQfRNAj$H}vzzNkHsG+c8gZEfpTuC`0J&eeII-u8_#XYb9B8u1NFUtQaf zl^W=4H|?tkYubzG_~-ktZ*I-4`oR`^X*26BIbAoyB?8*ZRhO>UKm1zl^V(Ocx8|;W z$Jv;5_%QD+r>^Nsbw0c>w2nQg_4vU*#*V13Ye10-=(veAL zQd+m1*>gmu^~@e2*7SP${|hS27!hD6_lr6UvP1w*7a!1z+D_| zEf6&j66$$i0HiSp?TO*x$=T_!NAyJZBOMLjQzw1GH1s@m7=vb3s&YBL^HcnJ?x*EX xSEIlS87^uX(+vOUAeL{BgxNl>B?DLSNFs)q!ucC002^qk*WXy literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_data_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_data_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2076164924eff44ac7a60fa4604595b929db71f8 GIT binary patch literal 356 zcmZQzWME_f14b1F23AQ3o9XX=D0nox?NY;5QSPu9k(l&s%$ zzsXJ-dDkj8?%UVu9q}}>ZtB`kizJv`g!mUeDhT*?{P26^!Lj52e=F4+ z5=C*7%8j4Q<_uc7akY3$`l1tTPkUnpR_Rvti=9ib&z;8nhBfm2*5+do7b7kow&Te# zUtD*zPa;cM^qk9+`vn`CY^8nWm@MxKUGsPE&u@D@*L+qAyXgFdQhUWOzi|<(-B40w t*!?p+^3xqR`{K_V<{W#|5n=Er^q{h&)i*VZ8MlnQ&1dY0pCszk2mraxoIU^m literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_debug.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_debug.java.i new file mode 100644 index 0000000000000000000000000000000000000000..bb15f5635e245a127de54d0e165e3f8a7866fb42 GIT binary patch literal 2744 zcmYLKc|6ox8~@E>NcJr>SxPZQWh;p{=DNkm7^b1IjwQ0Mxwa-FyAWe1k+Ek_)@p1K z>e@+S?6i?`Wl8V+M(=yiAK&NsoX__>&-a|?Ip+Wn00OWE)vx^>a`e4q4W zw#=*#k?~zIIQ&bmgwyK}>cw*Z+DR%vavyXStm44urH4f;qi^6Q^XrCbW+`_yoh1j3 zBDpFhuMCwLEh%FRI?dgvSIJ3N$qJ3TRyDAVbzk@INv~zl)fuB*(JH$Zk9J@L3^8(4 zuGdX2=g>)uwzUkqnJ^QZGGSrghAcJbIs6}Y^sdWR;LIk=$G3V29uowGJ=3~z|GH_^ zm(r&P^zWrS8bz-nEl}lF-j;(yc(DflX@RA~-5Ip}zMCKRK50PLjKmk8V4I-EtdXy!=g{iuMN(ZjUXH<78=l~ zb`V4LR-y{W=nLqFTqBYlV$g+`%^a+3x+LXjc4$*M3S zwhUh!6qVo1gB}%^GwZ>Va7M(qv;~(3vEcS0;WwY#}(*qMJ6zyp0&~eog z70XJC_RbO1ux7`A<&``snS8ky8j2`c!cb;fEQRt}76xk;s`+p&yA(3>mk6tupnI%% z3jlE7#(rezVWx$H5^!y*Uv;{u&aIQJrh?`9!5g2pM1E&y8I}aFE^p~{I*CriWhPTI z9^)*Mu0v@(>&kec9+g3*Zvs9-q53gO-v)&_gYmJkfIT9IoFaxWm7!Ys!jo3hbtJZGcufaBYz_KrnPt_086*IVsNLhIS`@J z0Knr3dQ4xF32fjYi5YGEN5{dTi(px_#Zh)MwPYAzT~!v13I5s7QVe5g5Dt)L!$1|{oG>t4VNBE6JCD8M~UDSKb1JEk97v3Tp>k| zcT1xGM4qP130%IHw_0QKsR-h2Gu3xiKxKYg@4beuAVfomVe@5aOKQyUCru@Qe3X2H39(j9tm6YYJ&pIz6qJ z)9Faw!DWcN!xN5;*>Maw5QXb|iVdmJhjRtZ2gyyIjn9K#KC4+XDX!^@D{9xz7kMH= zlUI=L>N2*{?U+73+af%>%fshWhhVg@F&t6)2Y!^nY30Dm5g`84CiZT^RL<%Qw{$`d z=DDQXQL=da=R`|kf~rq=%}8$mruP}D1W~EpWIA6^4iH0sJ)J_FjFPxST{jT8?eT|w zeAk->Hr~BMf0IA{)W|gLPOSE6zh9(%8#^FnTU=-lU2T){wp;jktH9G_o^46n3A(#(+7A^bV=Ei$~}(Vn^Lg~ zLHnG21aBeZ{YyH1hxrh+hNi_*YjaglvdYA~2AOKOZX@`3@6b{U7Uk5of5?p=J+K_! zh`6xD-fZ^G8v?k>3aWr{5SLlebeIZ)_v1n%n3f$>@R|adXe%aPi~d=knoi_rv@3sS z+vn^fOM#o?z6w&;tCgkIrPB7^&Q~kqLi3VvhwzJtt$^*uyKi&I?t3Kg^_A0+>r?H1 zb!mJgGwmQS@HaR39{`9L5Fr%+z-teB%!_xB2^^q?!JEgbzeh(q3m@se)X>iBRUNF% z`de5uCirKk7{9=@Yl&VmD=EB#m}Y22!d(%vMi-x`q@vxV;$qY+-?;?xQSZ~rr8+zH z_`JONgAor~+1FGjA0Xi`3iVzQ+_Gla(BA47I)ymp?2pJ?bh-=$?r#Y&*ea- z8Do0$rXCU{*+p{Xew|Mx4qTkf{($i?$rzht0sfIm?wt6^(y|t&53H>kktKR0y$|i}gTY Y3(BBh#Sqy1TKKDKYxxp<;O5MK0V#i#00000 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_file_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_file_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b943dc56509f915f6860b55e64553ca954fadcd0 GIT binary patch literal 2843 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_horizontal_align.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_horizontal_align.java.i new file mode 100644 index 0000000000000000000000000000000000000000..c3a36d8310b108b12c69c0f88afe688eea64ccb7 GIT binary patch literal 516 zcmZQzWME_f1I9202G)BJHp9RFP!Jvz#be#Rqua~0D}md$+t9>It{tidOjXP|JH_Ao zuz|#}n-?ASAFlpnkal@X-qo%L5_jbT_;2rXn6)f+i?7!tzGXk|p0)b;Ah0S!uTt^- z=MSfa@AU`-pY{Bl%;YL?#!2k5hI08$lU@DBhm3?Kbvy}_VQXFObS$lMxyONwwyAoC zQ!CH)Kkq#q;=(%JGJ-UnCLIM~Fx>`D!L$r!kH$JUs`rf+s7StRJ+Ih&rh;KHi5*xLnr3yQNo zxLKWPGO}ABP#@9Gyk+7g+f~2+CFo7Hxw^{q!qMyAS@Cke*iK$6QUV1nC_aEd4;U+j zU={;Y8;Ax)OxwbTeQb=oesX%KE&C|evBtE8XB9*Zgshm8oWRiR#BtPuv12;3+%$>_QcFNx2{fcoufk7gyp;4J52S(8Mn>Wn%MN9sZ_w{O#}$>1Z*bV(8fFz#v@R}bVd$yd6V;#VC_0<}6u*{!IHTUTweDK` zmqYJA_Q~JhJE0ZqHDGuE0Ut0_q`)i&#_b>)6fj#acXM_tuQZ)2sl|BObZdd7>ET3( R8W_p=h=G9-6jDsQTmZV`lK=n! literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_i_matcher.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_i_matcher.java.i new file mode 100644 index 0000000000000000000000000000000000000000..58da8ef956d80cf988771fb489c237fe3e71e3a8 GIT binary patch literal 263 zcmZQzWME`~fa44djE^8prnCQ{Am?gO&~@*^up{nQo=#_5Ddn{6+dHUwFjX;U?L^zW z!v;KV&$%whTBxxl9oM>W@TX%VpCj9LZ#{?8Th@jx2W#?QH3G1p6Gixpf%eA& z6O$tp@)vrk_TGBc%4Mq>b}rJX?e+YF8?ty7w{m}pziR$+hn)QP89(BGMpd^00AK@o AasU7T literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_library.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_library.java.i new file mode 100644 index 0000000000000000000000000000000000000000..cd3d9f6168d162f2352944686eff4d5e318da580 GIT binary patch literal 943 zcmZQzWME_f1I7sq3~Yr^_V@o#5cip}HM*&~;B;q|tM{f2zrMb?I|-r&LRQQ<8{+GI z*g?S7e8PVN^^1!wh0U5L=gU!Mn=* zaqWn{7k=8LFK6eciwd?=o71-{Ia=@Mo?m#yGg#vP|16GWZq{P6Vj1>1OqwV1ERw@k zwm#aZXOdy_)=Nt5dpCuei4`9^)Z3J~{_T>WO$!qwO=K@z`}b#&UTypKQ>wjH63xf@ zo6nrnuL+vFK3-EweM;Jf;q54Q~5>EAwo7 zB5!6Bx9#u7FWmFLZxr+t4Pur)uyL>VjR%a`-p(gfGjF7?ULdNlrcnPyy8p9;T#eYt znhAkXOEOJuF75mlwyyPvu+^)z_bv;XT)$;LPyUO+MYs1{!B#8YazC1-|Hb@a)EZAv ztbk$?2=syRnFD4qFvWvtP?V}K(wuuRZ2lLf2h(DDyG}3~YF6)ssDY3bbCMGh_MAR& z;73DaV`JxZZjUqUk6a7xDJ#@*JvQ9W@aVdMT(`2oZifm6qigJ&L7Eu%gS9?lU|^pH zF@&iPBn+}nF!k*26~;dfnJDf%QxU!}_u2F5-VikqvSLnXfUoxv1A*QR(>eYzB4(a8#Y`_ZKtggoa+XJGiZ>J>}A}sN6=S4B-I&_yx%& zwwcEm#U3dK%nE+-T2;F2y^K)6*Q1M8o-$hb#OL92e`nh{GQ0u>Md~5f&rf)2v+K@w zyY&}NrPnd)=%s=~glQqzw|u}5nhNnZ(`g{h1PUQ*XQ36TYqR%vd@}XA6n1YT=j2nL SA!=YGs~iIZt0G7}FBbqavyb2a literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_list_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_list_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a2e683ecdd7e0240785945d5b198246f82379e97 GIT binary patch literal 546 zcmZQzWME_f1I7Rb2G(i_n?dA16g=%++GV#WTln7V8Hrm;&V()bc<(+`4VbE!b2h}= z|B!=#-Q^|!6aCmcax^O@wtIC534LYy*RXZ&p)Bj$Z_X_`^5gzp-If!I%(S6;W`wMQQYO0BzExL=;_ zLc4Wh<#H37(;=dV4g_^?n(*@73X@4eEh!fJqzx{CrZr3)}jhPB@&Qs)6#3H+YT+zH_mbx_hNLJ^W6%U!N zeO+pMWZs3Z)oBXhR_C^ACFW{h;l98BW0%a;m?bwBxy<`v=KR8BZQha_oiCrUor_Ma z;{I{cL(h~i?disMY^#1Vd8@p;s(kmPYUiWrlZ`{CC9<{1*FVV1fAn^)kx=9{+xC@# zy*Z|p{{R2v>4a-5T`$g)JTyl{)+?3w%GBH?3;Le(XC@|=f&vv36F?9IjE_bzi-AEK zM1!J4WRk?3d!|#YJdeF+_h7p)Cpi7|NvIkq#bU+4z)}U|xN#PgCgo%%D-@R`mH;W6 z5IY6OqN2n~pUmPC8+(P+ijvg4lwt*-a7jK$Od~BbFEK|UM4`YnCp9-UuS8R!nwJXz D2%+M0 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_math_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_math_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..412daee3263165eff087dc4251b325785499d890 GIT binary patch literal 7103 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_multi_key_hash_map.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_multi_key_hash_map.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ac727b875555f0f2daf8b5a36456282f5568f182 GIT binary patch literal 740 zcmV%M-biL&1j^Z))9P(3o=|C%O^HnJ zD5_I*#BkV#i*VRXV3FSwSfERC5{!W{1}kE)tp@Uza=B0rQsVef&yYA#(42W$lAGt0 zi1x)ic2ATu>*r%}48jqLONC|V4JfOm%0zTZJXWdnD-{wG;ru1%G-ydRh7|936&eB_ zfs>yKPMt?CkBoCeI+JZUGO7aoEF8oflEQ=)sV7w``a>bMxAPo?J^7h&>Amk=ax|M% z_hLDV;7bNwX4J!_6D~6>uD$cm@Q7wAlYSj~*@n1uhO`xFXU(;#&5d5dMYcjS^joer zQq+SvpW-{>evEfRoR6#TT5E}1!K2p23Ant<8`j^0XOcl|p{GV}!X&-4TnbygXb}ZP zuVWAATv`nMy#u6UL1TJ1C4RC5aj@Q@uP!{nCDHEgJ#UH$y}@-K;)VT7an*UD9u(@q zgIdg!+_4uZb&nbq1E0fF#mndmem=`1U~GAGhQ63K09OAI>2=!E3dYUSexwv_Q2L(% WeWlfUsWS_K^c&$i#rYS)^jBNcKW9Dw literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_parameter_callable.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_parameter_callable.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7842ded0942009025d8f373bbb7cd1cc113a1ffe GIT binary patch literal 259 zcmZQzWME`~fWr(7jL#uVrVIa};DD&{*GXw_rC0sG+Om`HEK?T4g$Fnnb^_Mo|b2i5x^2k^uTo+5_4OjK<<(-pVlcCyOctb;(^N1GL zUk#BBEE~(1A9C4$U~fDgc~v!x@6?u%^o*nCTli9TD`)j~F3a81uAXjuzWMHdL#a7a u9CM9dZkc(YXwh1|6hXhO7sNB-SBWffwK#8Qemvms3B5P$@%cUub!7lj>~6CF literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_path.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_path.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b6d8218cf15bcce4d655caff8a961b56a9d74c2e GIT binary patch literal 1364 zcmXX_Yd8}M0NoaH$*YFlU5^=k;d+IA-ez7AL*B1j!>CU+wQ;>lB=TIIBd`W=*Q4{}ob%)SIOoR!00BV20geO$0FvT|9xDKn_2 zTwf;1+;O-hduPqDrQDa^8nhl1J7Bjl98IJXXnC-uqvIINjcM5YX3S%x9!EN(+%xYI zdr1(l<^m~t__wht-7gvkPo1&It3>^XA7$5mN|p(%^i0j_k)NW8{?^V_C#K1VmELxf z>e;|bEnb3@OZ3fi zRb+_dI#d0=fAA`VVv*vVAylm`L->g1IaOq(aKqK%N{;U-KjqlEyU zK3{jabY{V(J#n;WW2S`AdP2I!+B)qS1e=C>2(d|xc4_$TUEoZ8Gp-fv-ZYkxfIbt0 za`$r3)ePskRed6mB?T%25%r4m=!?nRv)f9?N<-Q*?E;j%G=$x3e9Tm?e}!p3d6CC~ z5fmosD#}ru=YC^>evxPNo)0Z^8KXxQ&3@>rMPmv!fh{`lMW%-OisZh+K zDq!zV`BKWD2(&dqu*_ihsdx0b2TMj^Lg|r~*;Xz1i#EYV25Pv4$T)RwXhY$Z1uC?; zvZ;UiY)8O&ty*XQ8|Y&QiW)FT^Vau9GIMReUADz#I~eil(HGLI4AJx5mq^Zqx99U8W+)YBDADj$B!!WT%9IQ|^f1`f44N&uK#x?;a(XWy1fE2!EIeJ6u_ zbHuaH>^17%Q)R(bqrhUDC?otgS_gI$1nRE=UOZj@TIf5OZs@vH3$+IFmv2R~ho%=- zDV<)o>>0R&J%ZIPz(_?}6oilcrCjCVMNma5- zgLxD6M3uPklDgLjL?C~xQKP!Em<)2Jn>jwo_^yj?Qj6a|*#0Z`(75+auLB1F9^Kdd zd#2BmEk|UMa(*K3O+vu~L7s9*$-~Sc$CO14cZ=P&0t>T}#?{xQbbZ9QQnupha*O_Q z?BJFf1HIt^rbp)7>_+o|zNkEIiL0a&l7A{>H1+fQM=q|*;chvNqW{R*+o%Z~3#MQ>%z16Z)<0s=Qm@3eR>DGVcB)$)y+vc}F zh`pd-_^dhsyfd5mpML_uZH#EOEYe93B^HTVl-^n4Pg{a^C5l7*`TL!P#15Kg?5%Y@ z+yHFbQ{evEPF;I2G@={wvt}DkDYO%1$!H26W)3-~EChpD2*qGZ2N(=S@2frr;*jGt0h_Yy@H0AD?4~kY@iUXtE8LhM08rp*%*IvDJ)mlMoy=48Vqov7q zsB>ev1CEc2X%xb|$rOZxYJ{nDG!PMf4UgwN;*pE6>X#-o3$R$Z1#%5ZsD?62;T5hY Po;1`)#R068R7L&=NkDTu literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_probability_generator.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_probability_generator.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ca17ea40a1d4173836fbed258d9637d628bcbea3 GIT binary patch literal 735 zcmV<50wDbW0RRC20000000N%?01bBl0000000R&I|NsC0|Ns9MDdXW{L^{>SY>Mxe zXZ>i;gweDB00000000000001ZoXu8EkJ>O0JqKz3!}^#O!Ph{rQ;#`E4JqtSP|K@f67D34>@nG5m_<46j{ zlJQmVs>jkyNCn^Mj@pOhMoPN>#BybqvtpI72%?1MIeeC4MOQ3gYJZO$B~?OBmNWQ$ z)eDA0nEwB#bZ{$pt|(Wz2Y;R*-7!pJPk1uPc2ps(6G0WEt!gfcblf&zoF-5o#AMEu z-0MQmAT_rPbC?3hA6+J4f9x%Jdmgfg^f6!1k=&zFDB&F}?9Jr>dqlMraSm%ChifTP zSQHt`TSJ}U1J_X3G{Oriq{Hi}xl5tg2^Is5|4*$k$o6-iqa4A?q!>k}QpIS(YNLUL!XeSNY2ztW_@ z(0M(W-$Og?8jNmmHSYj)o>}S3MXR@UMm(H#Rg@r=)xmYPi>cXppSXREQy<)U;ClXn zt|Z)W!S|^sa)sl29fsN7g=*1}?COIBkS;apZ6n0C8RC=k|KfhR94uP9@i_5|E Rx@NyUhCXur{R7~0hp3%cXT$&i literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_progress_callable.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_progress_callable.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9c761a9eb142d8054c1bbeed772abf2132aada2e GIT binary patch literal 609 zcmZQzWME_f14eTO24)Eeo8jPpD9AZ|I7e*96wx#p?gu>QdD5!(>{EcM0aF!o)&`yS zJ8U3eV;=M`v0uP(Qd^NGf9NU(MaD-L`r{r?7ZFg^; zC42UV^lHHqS2TlDJKx`JT_wg9{Jv#R*J2BywQ7&+nzt;xwP35R=ED<9`qw)@@{DNb zI=f8Idy+*Hi`bdnZ9IE8{3b_%zujVFRFhtu}RCUI?Y>t z=WpM}M@MhuoQ&AG;#6hubGy!l&Q z6iQh9Zx<%z?|jVs=IBM;+#j1iIZC}OdX>^~&Y@?4UUJb4$K(H}-1%Aed&;aOX4|4T eV-$B>TOB94u5i|;dik}6Pv5Tk#H)NeniBvxDhrPQ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_s_a_x_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_s_a_x_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e22156370885fd8313d0aa89e72b73493f048204 GIT binary patch literal 3258 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_simple_preferences.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_simple_preferences.java.i new file mode 100644 index 0000000000000000000000000000000000000000..058bfd68ac9b8174e432bdbbbb8a46719b6b15b4 GIT binary patch literal 1759 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 leg2{Q!#>x0fqw%fqLy}VE{}0V2ntK2M literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_string_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_string_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..496576b01b426bd100aa1de847e6f06378a948c9 GIT binary patch literal 1893 zcmYLI3p~^78~<%Hmx;ONav~B!7$p{pkITUab6ak!ZG}TalN@t6rB%XlG|e%xBDadj zEw_@9Lt~umEXU|%$JvS8LjKta$A7=g`JCtTd7tNb-}iZ+>-Pm900fW_Bmn^66H*;W z*x98e!Z)X?ON&fK1KtRyS&wqH;02n;ALNkM2S* z{x(xj_M|~ooK}5uZ3ata@`|aSq8E-9fUFNPPFb8a-Qa6Rr$>-!wb^DdI#=rL^KZE5 zM;Z;KX?PNCbv+F81Vs@obc8;fZv3V(XgvVYMzVV9GGN$UQgF$$frt>=nuM;xy}g%c z?!;(3(-EarM`K2-9kbYv}LbGrr6<3=Z5xDVMHVQ+=i zci7;1(ec~&Pxk9~1ZUJ3GR)aOIkCo1;VemTQ_`i79vO*&J>MtCvfPI$&tI2E$Or{9=s|f*~As~sN^e0NJ1f=M}29sCqnqA=~@M z&CwN&<>Nsa=*?Z5T_N)o0LbWzH&7*nSZffk=6`o^EwNAWz4T5Ti2*)>ehmPMrl2N1 zaRwO}sW|7@cOF)%D9Gfdw@u{PhL6EC6^Y3%qcDFj>`t6QsSMg3gehr%PlbjebA(7f zKX=GqQD#oJ{6o=qmvP!T(ShfRIdA-s*~7_(!fHl}_wb09TU+bupJ zSKWw7flg<^qD~4v>HYmg!N$uKdrQ8~#k=!uqxEmmZ&hm=y=;d?SAW4o<;izWU+guw zd_CfpX52?|C2@}=GU>$cST_UQR7c<WO6_ueBc3KNu`Bv?Oj_J5mF?IKZ&>s#DSkA+Q;?T1VY1zhReWD0I41bv!#^eO ze*XP~MY1tr|8|nyRy8Ll&M-KNo3vJ|mgmDzzoR%sx57{KzYk;aOWLbWDAZwRk1qry zbYRaN$c>DGUVwd4idi{vDDu_umIwLd#hpZq#q$eqixku@Xe}&vHJ(ATWDeZz6IMR1 z(>uR6oHT}&Rrd37`nIVl$)fkSW(G^gL{=1~wolE;1cUb<2%mA{uTZR?huC#C9j`*XvnrCbkRwERO-vzKjr8ZJdVV)xh<_O|NBoGKQf1M==II=Sc zgIhQ0^dm=}xZgiGt$T3P7~a2z!s2vXn6N(}z#LYV2)>rtEAeqv9M@jz4T={_7#NrG z-j$Jlr+*>C3t1?9MYZAI-Kdt@NI4jnVDSxs5XoV&2)*p^!ib=V!Urn2pu!S{e#GsP z;K!jj8a=!s5K!d?9wLu=9rp3H^0wp#zOoo$kF~xBGbKZ2l*@G>OlDk3S`Hdfl4gv6 z=Xe;8{$1@-WSLvQHn7(yyrsR+4vfgd8~ytbVL@AX|Wju(~yz;UqIZxJsfFT z&@Av6EPyzV#vm_?EC&5^IVxMNkjTxJ0jZ6YQpO@wO(l+)QBHTu9t&j z^kwk0wkDAtA1JONi416y^LY77di17^{Hbab=LgE>}5qWpSi;=6ZgjDvDaeW zjI<7M83Ded4;RwOv3wNlOK+`(GDKsD`XU)SWs-%Qr^EAkZG(nL4KHe}xoPGAzr*Ov zC6ls?4ivMq9ZNqV9Mw|*E63#>Mv`?mP1F9h=G+6(=Kjx~{q;|?@*zJL9~POAIV$K% z=g$Wfbi6{Vd`S)Fy7?OsZm%Oz%nw}7bmqRPE__)uOKw4KEix4b)(B6LREiRJr%zfl zbQnAayHh3lxM7)%cZ$Oh;)2f?#SZlLiDB>`Nyb|cLm(80$1H&r0lpTdDR_R#zzSHK Wa6qF;y$AGM-YOQz0hkEb&Hn>uy&nAl literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_system_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_system_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a1f8212e50501c43d13408b46aac71bd03c9bde1 GIT binary patch literal 3112 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_transformation_pool.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_transformation_pool.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b737bcb8cf1e46fee72ed5d4624ec16f10a6e369 GIT binary patch literal 496 zcmV86%S@-f-&vSC6^bfT`Al_uk6$NhNfNoyXcM62($C6 z>E+eMIeZFcHl1a&>DgIy$kU{%pMyK-5bNQImGf)jQi&lKYr(HH8Ra=#|Nqq{xFhF9 zIq?JJ8wk?9L0b%gXB6&=%~lCQ_(%!+xi(H&_(0m{!@d0i53AKzxCVzm|K&D5Z5SBc zthUH(3XGGANl*(GJ;H$8t+k{Bj+kpHSiZ)O7^P;{lsgO>pU$JhK0NmG!S=SHn`Kt>Tuo_>%Gl9$`dWaQ7A@solF}fUG6t1 m{d66&VYxXTu`FFUE+G6Q;MS4bl~j9Zq%w#?_P+tWo6vRAh3m5b literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_user_task.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_user_task.java.i new file mode 100644 index 0000000000000000000000000000000000000000..23ff119bb85a905fb9ea2887e18728e9f7215e2f GIT binary patch literal 4725 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 DgdF?U literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_vertical_align.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/_vertical_align.java.i new file mode 100644 index 0000000000000000000000000000000000000000..656a0f58cef2c10d829d7f8de3668cf1d78e12b7 GIT binary patch literal 437 zcmZQzWME_f14cdu2G(pSd&Yk#s7~7Eb0hq7=9UYeX7<`{3V3DlcLPKXgshlzc8ag} z5d(p?^K75wpFLT)CU?75lhTf9yWS+)7j%E0ajvZS<&r1P0w4F!e*24iNqd_Eo6#N{ zo5V}pKNX``l5d9uTz>HUr9+lzqST&C{BsJYsdA=II53&xUxrT36q6{6h^UL1s{PNs zmwPCk$$$S?Z{0(#uGuF0y}N7X&6hGd_v?e)ZAQ(K4{g`9HNQBmp7vn&=5C$lyC-N%I$);IJdWm_N zQ;7E$Io+5;bsEcpl}2Nbzo@bgINqrZ6F#HpaKf2XJmi;a$xCL<|lOa v)oj5#=`|2FFp^OgXo3llC(Rk+AE3j_#p&$o7vdTOVmbMTg!ubf^KtN^XKy~-k+d*quQ?hroFx!LL5V~swSK&{+^)mwxl6S;KVy{8@Acl)RQ z0ml#KpB(y6-86kRDQew+2HW2&cPUBoJ?3aDaGrZto7cZd)020NiSCkw-?uVZjQAdx zn9V%1POX6RrK#uglsU^TGk82&QKB!$cV@n+z>V$y1ljB!t(dN|;m7|KoPQ?wF3s@e zuF>_}B_5L|dnvfp!#Zv1y9ujAx7%?)WHP(D$oi1n&hy{TIIJs~lpT8D*wh$(=YMM1 z@$pv6d&)H?^xi9DF}?cA`&5nt`!Ns zc?(ekAuHz0?epb6WWdu_eBm(LZ+^=>gDNo_t&Rsbt4n1?c5ORyh5yLr{b%J>Z(OXs zWBbIn!gJmph7WBaE3Dsl1m0?!lXoO^^=u2bn-jU~VxKT{^B*V@E#DvM*2NrYbE2Jl z&-S$w*LZAsvg=a*oYd0iUN4?ZuZy^SEu+~mbV=%ZrT$lkPrfjYizv$ZYc10smAmv{ oW2^F(V^6ZB_e#z_qp9~RbIrVuXYUuL`}O)be!W=lWS-s&0C7?&l>h($ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/cache/_rectangle_vertex_buffer_cache.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/cache/_rectangle_vertex_buffer_cache.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9731ba9dbe7e5b68d03376c00f270002d2e63db8 GIT binary patch literal 690 zcmV;j0!{q@0RRC20000000MFV019OQ0000000PY1fq4TN%N+qb ziZ@!>E8ctn00000000000001ZoXu8UZ`v>veFlmDaQ8CNiWyRA4=bY@Yc+~CHmRWX zv2vXo;x@4@$Du_N|9!RtYuW}zr%Wm@AZe+y%v)3naPW z31O7Q*l#skO`a;L4cyQLy(cMWT4KlzmxA2JS_+vFsjO#$85w;Gg0fE~d|^$l^C&`1 zKKsj$>lP#e4_7uJuu=s*2^0rwXKpWq}<4F8JDm)M@uES^y1Q|uld zwwiDVpJ;Akso^_kGNBoaG))uE;^JY(1w%Lrj)UHD?>)SO-UreP$Wbo{oI$tMRQa_v z2WEXUsLbZnwE}*%nvHH32LJvm08XXIYz&jtfL9ZxFC3GwCO%5@1vLl}7c>Db45Vk8 z-p!V(nC2%2PdfW?EDYKa>{NH+1kxQH8i2sNmm;3w^rxONL^Poi{ad!bo;;$ zX2ZlhYrFNg8gMn84QJ!itFw#YrOU3d+7s)cXKK^451^<*y$kw{)r~w!)&v_GO|Hc*G9GjV zm}L0a$5T}KGa4N)OqE#e$D4IfFkbDowBSPRQTol%7Ldy0bv3FVl3ayW!mF!Y@j>BQ zGh~J@aO~fG%*qx?Bn`{9?JY$55BjsC`K}aY_20<;$up9jZ5jJO>rPgi)T?!4A#C~W Ymktbt6w6fR8F)ddMMo^p-(~S1T$Ogerld4-tKdDp-0Nnsd-G3;l}*Su>*3$d zBVPF?_ShfspD&$G@=O137YBP07%o7-2MirnFpGh4JBS7a(8BaXt9P8_2%LOmp6vs7 Z#?x#+{~v^?fsu^*3=E7$Kpqn>7XV1(j=%r_ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_constants.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_constants.java.i new file mode 100644 index 0000000000000000000000000000000000000000..9d30773c3a6c36c2099214c7c8053d73f54a8ad1 GIT binary patch literal 481 zcmZQzWME`~fU^t?jNhPahW}8ovA()4_@};m(nMLUL`J?R(~n=sgsB116?4`GoaQ=Y zAYdbX!d^#?dl|o=i(t+7CE{P1ubEs+xZ^dcO7Q>Ph_CERPH(Edk(gGNr=cIAwIWAz zLYLFs``&>oJv(n@E2p@gQ?4|B*0b57%c7ZMS;X(+)Wp@PsTUmcK4xvPsqgcf95UgX zdvnf|r5Bo0G$!pkG0CKoIq6*9SHlC2lf%EYFz)$r@<8)uKbgZ%{{IqKW4e$tc;=z4 zj*`D#TS|Y z>@i?400AE`FusCW3=G;J8WbLT9;EL*{Fe3Z+M|})dCIAwoAw6mf~tX1j9Nf_xhMo%=wo$IKP>edR|(#;{4n>5H%38Voq{Gf=?Pl za+}4urb|oaoJnbYH0g+t!qjOqr_WeCVP^OufoD=8kE8_OzkJT5qAZdl%Cn|&XGgFs SXGktb$l24Z3@R&R9{>O)uC%ZK literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_m_i_m_e_types.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_m_i_m_e_types.java.i new file mode 100644 index 0000000000000000000000000000000000000000..53c9b2cf487e8e112d1d3bebbf2762e24c5b46e0 GIT binary patch literal 296 zcmZQzWME`~fENr5OhFJP)2;tdQ1RZw_KJv$-^ZnP-h;{~XCFjX;U?Zksw zhYfhz&Kv)bb?I+BT6i;Ii%40fGq+~zTUHzQ!mYddHqJdLQT=`A+XU;}fJMzE7uNef znjZdZ0gscs&&rtFk8ZDAVEkl*jL^-X?|N!agXR<;o2kKdZb5^)>5^Lc1n*tjwVY(H zT%2?-e%8b}ZWGEk|8Bpzr73zsXynPFD9=hEj&pxLOnT~|m-r$?%=~rQ&p+=B53#44 zI~{oRYX?KvlPPBr4Hu~q-|f5$S7=;W`1z(qxPt literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_math_constants.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/constants/_math_constants.java.i new file mode 100644 index 0000000000000000000000000000000000000000..2938bcb0599fcc403d648930557cdc66202cebac GIT binary patch literal 550 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 DM2db{ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_double_value_span_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_double_value_span_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d692fe1c12433a5f874aad01b91e8e99b9e2a080 GIT binary patch literal 1132 zcmZQzWME_f1Ez@#4197>w&H&%sNNYF_#&?A+vX+R_FW$Te71zw+<>TokQH<8hTqM< zWgt+mC-ncYt*>q}-y83!$mLF&qCvZTo8I2_)l1ObsC(OS?Xth`i|sf(f1Fxov*9Dd z5xe_;-<6l|>t6DXf0u(mmZQdZo0y~aC&YV{J9)T0G;E$3hcuV1zMHgAP@N2-mflL&MRya_@u<@tysx}S#D{XA~k92I99Y-yB==XdAcOn_?^<1 z>gn%)P0zo7So_6Z#l8GbO4r}_W>wkx=|kZ^&AO6Xx{|iHE<4C?4ZLFdAZo6Z+qGX2 zH+28_HFKm-`qa)d-%!hnYiTn%t)i!ID;sokbt(hr3!=FG^>fc(zo!drj>Y-EB(qj=FF*uX9}Q7SUG{ zU74`o=cMAnz31dCTn9giUl$L*%FDC2Y;?TQ1L(?X6iTbAJ;1 zW(yPZk0DQecDB9>7MGTmxn?=7KVSQxjli8vMo-TeNU1Phh+K5m(T}%nYSG=uJCT!R zWQ>EI|A&XHlP!IF!A4Bx|Ct@8^?y@ay$t!i1InzU4xc}y>sux;RrX9_sP?jgw{py7 zGJ(8l+a81!goVCg<Zs@wIp^@D27T8J7r zsSjk80kM5%Zb5!gi9&u+x?W;lN=j-Oh)T^%&&*5JD=o>)(aX(G$xO>kEz(O(EKb$) zbOn-brFqFEnfZCvyj&myneKo{h6_NaNP$@lObdWCBgiSSPv;$dWO{Jr^tg@35{`U( z`Z0_n4x$D^R?JCGNcftVkdO_;TOR3X_?|lH6IS4*<5zl;eN*sZp<=J#W^SR+HJ^ix zE*k}Rn_M#bEL1FVspyliw+L5^SGSP2(dW-4A^|OTyFL{kw35B3;`C`F*Ws(yiQ)X> z-&!mWt8d<+VyeIOgxV3mg$%I)!3$?i@1DF_MR{`s^T|$)b52EEU0*%Il4h)4{NN=Q zkL31Cdr~HJR_U$F>sx52IP2P;m;(ZDk`fZ^*?3%cCkk~HTs=`2rs43+k$KmSEetPI Ulbob3^M!nFP~>DVWP98I0Ouy<;Q#;t literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_duration_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_base_duration_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6fa6df1d75691f615be6e625971abc242a11437d GIT binary patch literal 1031 zcmZQzWME_f1ExI;4BYpjY{maju;|vwGUxf--9PHjwe7Gwd$0M0%wLEa2w5@bY*=*u zEd!A{w$A?rznZw31+LlVEDgE4YpYY#cJ>?m1(St0q`f&&c461b|FwQH?JB$_(|x2o zVru&O_rJFmS64e2zR69X=&hh!+Yayj6V_|G>tCEw87+9JW6_+iyIxis$$Z;o(4sx* zMel?Uoor2ltlKB$Nb;IpTcN=(uESuPVEiUf=#n)wO!ZZH=Jk7R4 zEGF~N)-1(1?+JMtn>MK0Y+Pc!NKi?wqwTF%#-V8v9Lg`*-I7`#>UOKgU8|g<`|f%Xk5;Ge4)tR*4?h<@+5Ge05}^}HkKGI8UY*==r$;pK zRGV#!;1!^Dpt0#BKoxHT&?d}ENbp8Xq z;{|6Y^t8-z3Cc;FIqi6j?M<6Zaa3)JEUKj z!4|ePc-5_)b&-yHF6@v!Q>Xi(DcF~D@%`8jul}t*Z#`vFTg0OoJD&#D$xpx9?6zDz ztVjCP%3BE*C$0q_KKRKXlF6Qbf_aH>KhyrgO`poFQX5XO#d1oQefzUh|J9NQi>94o z3e~N!N}qRa$3fN;JzpOzyR}71{{2kb^U5;M&K_B9^z7%F%04aAK%vzP6-MnJMSlG~ zZ1Hf@xmB}HK5H>A@!5DV)bEw*Z$qHE_Yli2KiQucP{x6j{_@6Mgzs?&L4W7qEU z$A9TgH*I%m-BoitOu)V6sieiRd;isiKmM;=5&gl$@L8kuy`qEi+mr$)@V*Fpwn^}v zdZ=|(11JT9Qauo)1JnLPFpGg{0f+`A|JR$RcMHg?%ygJNH*B>6_lYaI!O9Rd5VB%U zazcV%dO||oxdR6-9El8=HD&V5H4mml%y|_QH6>!w%=yn}&!04N+RUgW6Q|9bK4bBO zX_MziEDB(ld^NCvqx#U4pDAL~mpof4cC+P%rpN;BEUl2wMTJFT)5RFh9-gxG*;6J4 zHAjO8kY&sei&cQm{0Xs~=`@gL1UYlLjNVn*r4LVSSn;UM?HP~4vf6$15H%1I?99&z j49RSAe(e7@U0Jl~%#@HgJvKJIdJZ>Hc7~11IF82+pcSyWnhwl6*+X5y-ewmUybLX<$siaBS)?q}aN z5U9&j_=(t6ic|Ot0Cp6VG>*^!1;dG%@9{#NYesw@Z_bYb77%@0Ayt zfA0R@U;B!=j@56HZ8F>4p{clG)&79D9*H4VlLFVVE^SG(oqsiaPt@7;4Nci$yL_a7 zc*S_9Jv_G|M(F%4XYVfMIcn42>*<|8_fS{mdEh5ID{sHa*A^z+lee>}Ta*9z=NgUe z|1uMzU-LZX+i`r$hnbOk>igc;HhywS>N^#AI9Ci6A;%5DXk2PoOv=bsvwl6u6rg818Vd$BM4?kEx+jU4@a@9HBbq8h&U1#3# zS7YCV(iOKRJ~@8uYl?2>vJ|g(TV}2@)cyUdBw9y0Z0?SpH%Wq8g)6-@rxG2HDEpAW76`T9tlmEv(_^ZOSv0pXh3-4bkcJ{|SRjq!8hpkJ_P5;U!H%orK zd;a$q*Jo{*kR`m_?fHiQv5dS|r6T!L{7qA3)EC|Tx}B?6v61~-$t~sEp6iqsIfhHI z>e~O>R9nTlTJ->9q0V!KZ#Qy}d=%SxN#(#I?gxC%;>rDtx0|cgK3ve~U$CL(j zR?OU49rv!9JN;h0>ScVYtdFw6rN6%mKm2+eq#dKP{Pu?PN)@)N?yT4q{ck>JO;FU| zQ>B>;FFsKT`ttT4bD!sQe^62Yr5+#%2c{t|FpGg{0f+`ABeSwK`A1%4P1BZazI8YC z!G$IK3#=e&AY{dyQ)4(t}vWbQ(xAf}F*5_~*Gy@uL$W156nzQp@(84Ph{bsDY4RXBj6jB(ur+ ivH#z6WznKDQ$phO7Tn*~%_oQ&2w5@bY*=jm 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 IGab3D0Q^<{bpQYW literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_loop_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_loop_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..611f2e748bb4a9ee65fe92b3a18fec1978439e00 GIT binary patch literal 1242 zcmV<01SR_b0RRC20000000YVZ01)>80000000JTZ|NsC0|NsAGyleEI*YD8~N3PHn z`>J`}@Jyrt00000000000001ZoV{1yZ_`K+eom$S55vpJtx_jB9)Ol|K%ii$O%O?u z?g<%tlB{a)n%#AK2=#wwcWozYdz}L3yS7qN&+PpC=G$==MmOOaf$_B;(m2Lj{eg5% zDEhf1iJ!8VtO)Y6!vp<0IzB!;fMa+W=5oV0%t*wNP{2DLrU{8Qg-{S0AxtKxlc%ST zpTG%>AN%8H{-5K?xKPMKr4P@SFZ92o!-FjUqE17kObNJTEW0Y*Diy$gB+^*G>rkNm z{QKd-U^IgB-~TBLOc@n2q*C-?PnjrlQ6{DOSP>c~K&XVv`TWD@>3p^fX4muU1)Rgl z#8kDHBrXUhabFp5avMr4V_zjKl#ss3xk`x9GlxoGw{F&?-L$D}$X|fwEakkK!E!R3cYRYzdES%yA}_JB(ehYu<#lzSR(K3wHf$ z48TsI*};~=_FI%NinWMe&To-(5~F)!be!cO6CX#Ja|*g34K+`PZW-=_s^6hhMTb9B z)AW~K*}8Lr74BRjuk27+f$oWHG0-g|F^CSUze6V$R(_on`s>aWs-;nFax2D1E6!3_ zXa<|=t#4$eWfex)(-rH0X|c)FS)$z`YtiXOyy+05*IBF<56@ndvIRy=t*dX7FcTP8 zM81S9keHSZ$;x|Fc)K8!hz-W2ph3X?)^=UVuB4&%!Bpbkt851wOja(DEh5;cRg3RFF66v+Z~0qI6E z`?4`v3p{00002pa1{>0RR90|JqkONXtj}ra--!qyd*0tdDRj zsQ>@~00000000000C=2ZU|JUo1c=ImYG_lk(Qa4 zn4{ncL@@|XXceC6o5=|&M(a?fr-M+K+&tIP|eH5$yt(- zS*(G@KxAX`N^^2_kaSw}asi#r3&b~o&Ob|Q=OdeoVh%P5qC8z(S^#t+hF*}z0Jcku Exhud;5C8xG literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_modifier_list.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_modifier_list.java.i new file mode 100644 index 0000000000000000000000000000000000000000..32be5b28744bba0b9de518d521ae94956b2b7c4f GIT binary patch literal 1069 zcmZQzWME_f1EvB7299%3w&H&%sA=o+`D2mIIBz1~c9VC9(x3ZB=0May$ci~@Lw)ma zISANFcm6k6&Jkd!=5V=%MRk#H*OVb*HE6C-zjxy_7yB}AX{#~-<{`uJ_46WDQ^%4+O&0J!6{@Rnf3k|PqQQx3f z7ZJLHaZ&W7cVD}A7KqFW;mpw9y!tugOTPs>d6!DHdL7%~CmeFR=9s&-BbW2D#Y>&y z>dyvf$~}lHQmbSzaXs1_5Ng_^Vmx8Z#pxxBYq}y98Ls#gsMHs0^mXp4mA@)aJ*yVi z^GS|76*7bCQPw~4>c31U58qQvVT>zX=lt{KQ$vfNvQ2FU^DcjT#AOrJe)!g6s~u-I ze9U3Jm=~89XH+n!>UQp=PfCLC`DQIF%ML8xx$kMyYgx7{uIlO+jA{-?r2R;4PvXz~ zVO8z5>cHDbTXFA?b$PemM_7u!s%754G-3UcUF$Ai%-Qd=JbL2{`J!zWMrCP-*cMI| zxDxcmvQ=8~Xs}K&?@^X$$r!IY^^+!ND}z!UD5U~HF#`jq6PU%obP7a+lI#KT;|~4# z@tOCgOqyb;D(UX6=Y9gB20~WMNlr-kmX?s92gEZDM+VHAGI{2j2eao-nmKJ|)RW1P zF^eWnn>l^PVu3{g0+S-9%!^vIGT`j#qbDOLO^jSKom((yL#t;L^U|!!oee62YA-b$ zSd2b6bsnb?6WW_k>^z6|S-8xk0>U^V12zfj+5bW>)Usw`!b|IjM8%-kc`g zs)UQNw?iKAZZO=cU%9htUcsj@mj06;dsnX6pZ8{>oYzIpe-HD1#J;+dytRr;B(%UH UJ$>r8(AO&;Y|ga{TWov|0LP`+EC2ui literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_parallel_modifier.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/_parallel_modifier.java.i new file mode 100644 index 0000000000000000000000000000000000000000..67cf9acf449aa520eeee8dd13e8b0ae6b4c8e7f1 GIT binary patch literal 1298 zcmXX_Yd8}M0NuQoWLAwUyDWFt`0T+*%5$zf_Ib61E!ogRQUa$Ll>7oEX91Og*GY%s4?A8hD#DG{j)h3Y5}R zU)*r3&a~`&8de^b|7|=zz2Jx&k%r9IF*)#lrfDgDyhxhwJU+bFkxTA6t2b%0g}0uB zw7rVfDl?fTW}P>m)m*h1eA(dQy4F7&9P6fd8mSW=skvICk!pG+-CUO9;*M4CWbl(+ z(y8?UC)ApnB3EYXRF7j5VOirh6DCJ%wfk=UH8I-mXs4&KdaQ{*3TB(AkB9oG9pJ}7 z6xS!bJD_%0=HPegjl@Wc|_9VZv zV%>4l|HP1ykkbYmcYm60$c|&5<|~wKj@kRq$HcInJKkYMzXAIos4f zRYiHE@)BkCkOm_WAo5j`3J~k zi+-T=(m$sNdL`3UJr>-EIZX4y;>DWR+Is{LG<-S8W;r1tMVUnx^}E&xUjr_lhq+FD zgaU~RiO+_k;+NfxY@gH?2bnorxE2ny%QyeJ2J?C}bGQH%>3}uxx2J@Kef9t?t%7Nmmi_)cw zm|m9d(YcDW{`-|a#)UK7Yq{~X`wE-J%$obhMTnEn9##0L2;hQ&FJnCE!P|}!0*pw2 zkeZ;^ve>0h7jtMM!2x3h+B`44vbMn#*b!Zw(zRR=Q(75#v)iy5)~$bGA}ldlR8&c7 zc4&ygs0yQjkxHME0DT%a(V^|j zsrc`DvM(Z!_CvG(8e=2D;Rz-4A*T@jhV9)Rh}x0-Z|4->6)&_1PlRMXTpnwcgq-CV zKN)ds6a@|F>SDgZ|M=B(;46Dg4Ar5Cd|%=b{Y%uf+jRg1 z-j41ZT2oC>Nt8Wpu>k+9a{GoaX{sdNR-TbFy)cAE8|!Lqg-BXkYclG17RE+6GTfjR zX=Y?(*=c2uz@czLS3?vIW9IUFf5(c%6z$eSKs^D~5|IwtZ+skx8YlVX<*DA}s!H!{ zpImBS)kjc0!q%*_7TIE9W%>Ap@UXRz_Y2P6>s~&GnN!zL4+ynlDCfUz4gg5Nb}>6W zl)$@f@Y@SaNSw-vavz<(6!eN37ZX01Q75Hmc4bBksD$jFns3lg^5M~GWnX+08h zHk(|Tt0RRC20000000dP402KTH0000000JTZ|NsC0|Ns9&Ey~skr{={j`=Npd z3&VOOIl+bi00000000000001ZoXuEEZ`(K!KHGr*1Czr-P7~Q}(L?K|XgAw-4Q$&( zTI|8_L6Jr_QHkV|RGMPZ|Gpziv_(BPjj-4tfGv@n=QrOBErRfCumi&7&JS1=!EOEl zY)2XRnWl-K@`%P1b;f;C2$?Sw*hluMF^n zRrvDrD*|^KSft3WfpXseJ)2Gz3v&7Me}#Z6&Xf+ARwKw8$)tA_l4vA*grv8D2C}}+ zZtCIvgDQ+|5ze%}eq3HTf?~>ogsdy6*le4paV1B};S^<>q*s}gz;w&rHWhKg13dIw zCId}5Ta6Z8lX01an#-|*T!6UlmDh|F@qM3&Lx|=??+4Ji2}=DLNJiOCd8Zi*_Yi)C=yYxMNoHuKWviEmtfF9yzWW|Dx=bY17C|;S)G9*KF z*l1k0oJK_TYWT_SRH2AtbGaQE6mniD<*-QeGw6kpI&wRM2-tNUO(O@flv_H5#citYYl0skjCCg zq3s=IRP7-;w(>6G*%V9NBk|Th7}PMLP;U8Tz%Oifpgjja-C9Y`aL0|-AAB7LiGu$r z>-wdSwTO%e@^LR?CEk9=TX%AB#KzikMF;O=@;g>q=hwsV)DGPtJUn_-rW`Roh@F=` zDKB$sQ`llD!<&9PA|Fyk1`?AF*{w~tGro2nJ;tJkhfglejmP>sNZeTMmBj-VD(N$6 zJ10XP7e!#IVDf_i7OlfYm5RnYFf?3hz^&bp`ZhGbf#ZCq!&RkGqt@q|XU(eu09x@_*dB5z}c) z%UCjnc9Bi)$+_p8djpW!1IXL~z=bCy?bS4ruxjd6d@#rxcoj8ii=w=wN+U;ke0@T? zj`~p{2e9%BkbSe9AD%FEMjIpv_gj?L7zt<5i{xdAB+vs?5CjvXDiYn1QD2deF>Ke^ zscf4ra$R|BpwKkp{`N`c?lCW=YzOK?gt<*Y>TJyw9UDse0Q000000000000001ZoXu5DZ`&{oMUOF%|G?9bWUUp)%QphFYtz7oW&<+p zu1R#FO_mHv4B$|s@pdm;z zBuh7Zr0hqe{O@#6y(=$uGrC1^k^Cx>e~RSiR!ILC!7n1r+g{rvy4MFif2nn(+v4F z#6nS7JEae~p+&E_Fh2?PmC771&Gct!t~F6t`($=)taGs)ki~hEt^-`IJC{!2kNd%J z62p54{)M@LBckgdCvwfIt1jZ(QB|arQ@i`cz@5_Skmx*vQd5mc$tCVLHDL4@-5(_t literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_back_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_back_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e36a5d64061a236635e36fc4f2fa4527c7906232 GIT binary patch literal 674 zcmV;T0$u$80RRC20000000LqF00=bz0000000Nx<|NsC0|Ns9Gr(*rS8zZhNwcAHC zFKoW*=X;d^00000000000001ZoXu5DZ`&{oMUOF%|G?AWrmYpbv9l%%(5@dr4s8cy z*j<&WRGT9ilANv>`rjviBx#dgHuz87~9?3`fz+)tM84rhX|AC*Lg$Yj| zV#;X}BRd@=10D_78OL;x45Orq7=h7@D7_$5rYWw<7s`c@NKjf~pNV;-Ig+JH1sA9Z zQiJ5$Eng}7HIw&+4Sv!U^$xt;8R!DRfdw^KumKASE3#k>5|kk0uGjTQuh;dU2j{e~ zk4nQ-WXEtPn98Vusiw&v5B7GB7K5ZVJh)P!j%hy$&HT`TwT|xKz?u>hN2@Yl+g0z$|TvPp-v^S_GG) zbtQgV+}Yjy`^DYm^|&?aRW)_NtkNwf@P@g6SoYuTzSKUoe%{S-fp%7Pm|-2&=?Lzx zGk5er7FpKpbhdVo__TZIxb%4`7mc>i@^t|lDs2>Tiq@irPcW}OK8`SN(am~lfGbV7 zR!f){IqJ)DY{^VIs+=-xsqg3aE7V$~xa}{`6s;Qi4K;IDg1fV>ltjO_=W}FArsg`M zxxw@pxR5k!g7T|E)AHWfG2aULgJuQpn(6P#+{mJ~8YhY{81}>XGaolP@^?-JGTENx zF28;d^F#Oo;aXsga5g72KJK*#)!R*}bn<-zy$SeX5JwLB5ROXheb*B()#fI{wRT^r zcT0jmRDtiIOdxs>{U3-NIU;U}_QQFUd|s-;Ks6<;42LV+ IU&i+|Gd`+ABme*a literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_back_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_back_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6518fa4e3b45535536bfb393fb99d80ca06cc71a GIT binary patch literal 617 zcmV-v0+#&%0RRC20000000Joh00(ja0000000Nx<|NsC0|NsAhEF3qrIltoBlz|x1 z1{^2SGrpJr00000000000001ZoXu5DZ`wc*RgPHVKg_8Dl6q~v3#ycq5X2#*5>@Z( z^%%Cbcdh-PMOFTL*B=QKm=Iz^=+2P7#GCwLj%pjUh$Bf03Xqb!!Y#2~R zkp+`a{lU<^MdLvfjbaSqGGYc=F(TEDP!Y#?C>|(wTp&SVxH%HNr#X^L#ysJu2vUt? z>26;r`}t&z|AQW=cje{omF^InlwV2tuTs7>JoR5B{6b>h_Szol_1Yfv;FemmmkL%q zy@3s9GNl?;ie@Qi`--8tU<1ISAA~_cAZ;(Vk)s21u^P?{0?+ak zGq)QJ>jHnUf*CFa{AqhFLg4fNUzNZ@3T># zS`>$stcA0hP=*av{PyX9O7R#^wM|k<%W{52#oQ=xlj>dy>{NKZMJ7e8mnqFP#y5~~ zLDM=Yzqg7O^Wp-2Ehkd#}a$iJ6b;w?QDIz$IbnDx!f8-&Brbu*dALnFDja296N| z-{b-}t{wwPsd#X5%aw#bU9Uq3eE$EZ4lq&DSnA@p5U(Xj4;)3>5}sW1Ewu=)M(a9! z(%WRd_;xp+OvkMuubQa~W|eLk|1t31`*QkD`COaSHE3`>9UWT<(r^B<}OWh6} z$U=xl(>cgN;;*xmj-8D}QWJ;4vs|_rQ z9QCBUu_TcWYDO8hH1yl2Eo#kEJWMweirR9XUr{r+4&1uBR}y;}msB*`e1S~K)Jz4< z4Wz^>qe~ojW-g&;ld4w$( r9OwRUz}GI#nrXfrdL>di+Pl9F+({*O8&w#n$khs`T;u)%vsD4R1_B~Z literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_bounce_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_bounce_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..f4a4c98956cd28167a945e85b53afb001c0138a1 GIT binary patch literal 641 zcmV-{0)G7f0RRC20000000Kb(00=<<0000000Nx<|NsC0|NsA!mftM#5tBK{>%LOn zE{?MVeDuZu00000000000001ZoXu5HZ`v>rRv(GPf4HZKF&0B8l)@&pqZH+#bQ06v zjdKBSjvd(!8=Csx=Oi#_Dx|5(L-XK7cjwRFoxi(Wcub``joUGF2P~o^#zupf4KT*5 z%l_rydN^Xy3Zs4$(|&NhV!^Q3F$SXMY@1PAAraQ;6yKeJr;2N*wxnKZqoN80VC2W_~a zncXN2b1pit;7kc>V6JH*INOvFhPwlyHyjUwajyp-AsG7ID?jM=x_JO;dTF+D;lSKp z0~M0MlT={hvN90nzI*4gTuJ!T^csY~=hr_az*I?Nsl%@UuO>?O97R+UpH%ZLwFoXp z>xx`0Z@5@~yIo9YliJ7^_0$=&O4po1g?sCLt^wzNDx*pjoyl{JHZ1O$VY#o-;Bo7a zy`u;+6Jqaa9PJ?S*UN(^dDK(BXtbG@r)AvJsiTy0v=%kIgJtpYb_Du>uInQMvC<^g zDuHE|qMqgrOhW0X#*|@Aw}11vMXh;+$2*RNqQ#YdMa|r3aMSBfNo>VjQnB}@OJqt$ zW+rHAFzUcF=Ut|0K1C|#2QI%;kzv(Le;4MXa4P8V=?Lj&Ue_NSl(g5!se=4xTJ&G0 zQ3Y>9&^e{t?VM67j*H>Lk$tI7KwJ!$Ua$l~VP- z*yFJ6X4l$Xr$rV2y<&*oI?K z_*-M)LaJT3l8I5m!G#qIC6n9Q!bu7TQGXosaTLKG@P61EguEB^N(0so^5TZfAt7G} zPbh+1 zO8m6A)2rF1ldH+uVPn**YT6?4#x|V56Xu<6*?-dB*EaS1{5Hoq`f1hS1Z%HWOJ<#i z%!wZ8LaCLewU&d%Z<|36OPl-hWziQ_|60Hml_rXKf!?EqcQC6CZ)Y$sk?wlxATyR_ z)+}IF`E&E6TmGA-1+lt^Z)Y(~wWftdKMioAjlNr$!a=nb N8rcR^xSx*bdMT11MHT=6 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_circular_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_circular_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..39f02d0d3ae197ac17e085b0863de8ab74c62edf GIT binary patch literal 633 zcmV-<0*3tn0RRC20000000KDx00(&h0000000Nx<|NsC0|NsC0d(8yJzm9Bv0|3U7 zMHS5yzl#U}00000000000001ZoXu5DkJ>O0)gFn&f0$Dh=x$7cHswPr?TQ7&0a}Tw zcjHXJt+7+vVT-E$?{z*F1nsHHVRLYz@yzp^ndixk$5eLIco;#{?+@>zB&KmM?DxY> zlE(c(*pH)d6Ar>*JfMT&pqE5t#0ZRLMCmP|GD+}IyijhrM1sI6tj; zQhCjUqIOB`uJj0WTQt2_*s3?Yn1_t7W};SQoW z=zR*JUf3%fNZZTujdKU)Vhvno0gj5mz02CbqS%_{l3A`K{BCSBIkQSPoWUh^zf&sUwQ{Kh z^zR(EXcuLR8P-89p89W@J9;2u|M>ZUTJr?Y9ZriORCM$UYUYN5 z8*I-?qF>pwH8Ld=GZi#5nA}3jB^7m0_MB^4OpYt_lFM&Y?V#1)8cHrZgOQ%^i)lGXpDq2YC)a`yR@FbNy T?p1D})KDYRafSN>2g3#PSIjOY literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_circular_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_circular_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..323ef9f00b233db63b1e82d6d38848a604743eec GIT binary patch literal 670 zcmV;P0%83C0RRC20000000LeB00=h#0000000Nx<|NsC0|NsA(_t@6*_2?7w&i^-Y zd&YfKgEXK300000000000001ZoXu5DZ`wc*RgSU5f0$EcNaD2}K@!qPi3mg-l2oGV zeOZrT+hy0?4^mX+zjtjDh=58}PM*&mCO5?H*$+Xv_Im2%E9BD7P zO3#z{;yh+kyh>@D;N?ZyOQzGyYDXW8W<=>3p)$*GS-w!txI}`|a=RjCP75RpmGPXT zCP)pEp&3R(eQ6iQq0 zIIVbAqeene`$+A)LXb|U6+j1Wsk3vX;em@&c;ZY6YT!ZBh2U&nBMg@eA?fwIX+KHe z4ANc{Uqoq~#3g{Vg2GKb9GKs0V6PDHY6LEP?FPo>*O8OVawXw+D>xH zQMHr)TIme!xH@Zw>wU*O58vwdB0)MK)?bddagg|ODD`!Tdo34@)@k{^m1{{&wDSS2 zMGc=|QvLWiHhn~Y`!fT%(j?bv0TWlC9+VfEjHQ>FQ-%#W;P!cmTJsFI=bV=_sXWv# zsF@!Se$L%1iD4ZtCdib`%uvw6V0H>QmsG4b757fla*FJPAG!QSg~Q!2{Z)mxrU`fG zf!u6K{oISAZW}&B@@A&BL27Mn2+ua0HQ2A=X2wS5r?z1^EO)bXb|Y;M@<~p%(l@Sr z=gUpnf6Ka8+}RDJ?L)~=4kd5S`D=rH9LJBP^f%G}Gs2xza3R&?F1zl2kfJL8z3Y!a<*Jv;hk#_G@ten+nYZJMi0k}l=r93%KN=4c#1yj|9N>tu zQA!!{@Es2M&4+O^7~*I=E;A-z4QJYH8LBj;LvbUu6^a-sC)|=VWHZ@ntI&q-MyerP<#;9>^Gx(s{;Nv5AV2ej>xeVhG#q zUMuQW@q9yEtJKaV=9bcH$b>>!C*}9vV6iH@n;#XjZsg#dy0qkc3O+E z{b5|U*l*p2gkYm)gq@XygrpaU8jv2mJjv(WR>!^e7D_v{ M;-b*F-vNyfIuIBxIRF3v literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_cubic_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_cubic_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..d9fa12d74dd762a42b52164b198f90aff28412d0 GIT binary patch literal 596 zcmV-a0;~N10RRC20000000I;M00%b!0000000Nx<|NsC0|NsB>+MHg(996J@kZYRI zkEAip{qa`-00000000000001ZoXu5DZ`&{oMUOF%|G?9bW}OvhiStnuXpyFY56uQ- z*j<+CM4K!bvXm|u`rjviv`Mp_1|RB!Y&?;VPb5WOcueI7jr%#ol*M5>j)#-cXg0;xUM#O$6JF&~TV|AQS^kOc-epz$=X$^Hn}3{cizccn%dqk2@U-`GW+x1! z6{6Yc9C48N^fugeY4Kbx8jaO&64%IRBY7({1~q(uP4)49+VK(H{Z0xhCZ;&aO6iY$#0+TC9 zxul|T%I~eF<+M11AG!Qag~fB2{;J@nDVl1(!fulF&cXq?IR?3O2Iu>KBOj09+wGsG iOz)>}A}L)zyZ;E>NhJ@NvISIK(@L|r#Qgy!8u1kMJQs%m literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_cubic_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_cubic_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..8696f74415241eae316110a923c0df4a2a061e98 GIT binary patch literal 624 zcmV-$0+0Ow0RRC20000000J-o00-p&0000000Nx<|NsC0|NsB2<#@9epGg=5@btI2 zHq5+f-7m%f00000000000001ZoXu5DZ`&{oMUOF%|G?9bWUXcA8_5E+NYlWFrUNqU zuE=zv&5;aQ$`%a$?~^~$tWFQb;6r_o4T^kxq@L(2hsorq@Gt?tJ0ALMwCOYK^)@|* z7!K$VeH=yJARPB;KN`{T#>*onkSa!`+7c?l5D(c4#g+>sC^XkclJ01NWG_P=aa06p ziezDzx!G_Qh$o}nAM`+-D<`4sC*2}gG`B!=U(j5mdF-B0+ze&fbeaz7beaxy;FcP_ zlM0qRzJ?WNGNvgk72U_2?Fx^S3x?niCxh<9_u&S*L)RO*UC;M22hwyBv$5{LY-|dz zIRf7&G45?mDFoTpgAq(~Dd11jX%GUl|9=XAxfH3U7QY6(nkYSRjKiAvB#IxXMzA$% z+v7@igVp-m-D0-g((LO^fVxJ4c0N6fGcYVfFas@&28 zVdA*lX`JmK@YhAsY3B5tEef?!;@=LIWa{YR617GJpJ1JTd>m;$qP^~63XxPKQgRP# zlc1VsH3~Y{5YHzZ#ggVH`V|$kL&1)%dnvG0*poFfDZ+FS(^vD_v{qK_>Z8C4C!G{{~1D{ChBl(Fw3z#Yn8uv4}rqd~2Po_znjHZl6 z2^}-)?@v*jq)`^d@nnKmm{lG#Fq#piw}i?x#eMlgx#bcGO3Uqmm>n&U(wMewo0I#&1=D|D8N@HIwQ#+dhmen5u9egH$bq0a7< zh9wu5u;xq&YGA2pE;!rO7KTfP5XG~r@hpnqBaGv4GzrI}XjB@Ieo(l?n*;N{22L3Q z&kKRM&&R;3TzGJjS*|4f>IXeS;Pd}qb%2GE#!?@@gLoZLdf+J1j`$Rs@2N%bIa*)g zKWe*LZ@%8H7x(kdm{-Nrj#;HU=6_0ja9(x)r8cOg^RN82XjfHp88$9Go(*2J_S8T+ zA)1xm5eJDsTN}9N`kf#PRrAek$4jWgX zUXVRfe@4r;vEAX73m_ktD%(@V&> zq@r;u?wqFO#Av~fTz;d%VH>8;72K$z>Gm7!$Jt=e+RqE7jgaHEe%wXp-mPu&H*!%L oUL2WqE3Kx3??+NADZSMFe+F))l80P51C^jU(UC9QZ##+n?_m5QBLDyZ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_elastic_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_elastic_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..fb4fcd654734cf19624376b778976c550d3f50fe GIT binary patch literal 1041 zcmV+s1n&C)0RRC20000000P(m011l#0000000Nx<|NsC0|Ns9{eScydjMY4Z7@K}^ zXxg+$7JAnJ00000000000001ZoXu8CZ`&{oMvo1U|G-m`q>W{#ukqzgAdKYaj1_UKamubwT{r)i^16;aNHY3eD`2~9B+&9 zINIA058Glp3=hK5uGras7>}Yb8ApZ3Ay^}rHjj*}IL4X(LiH#WGE`2w7iOP$hHR>1 znMgDYxkYwKkIR%>C&fes-}#Jp);bv%Klmd8kp(4LupkR^C(~d~5_poMZl~Lk(@Y!p z4;P`8bzC_c+;I1FKL54sOddwdxWr$jnmZ3I5Nt5$c3=RfJaRprIOmbvx^f!O8!BN`eJr3w$j}x{{d2E$PXOoN$0z`Q=e- z(u-`GTsUo7-atcnuV2*vtwfZ~^v4}OqMH=;69%>8qr)k-}?q4h?L;eev>f+VTeJ;KvpcZCGOT6z=m3&AC6rY@$eN!UeWe z_0!KYG)Bf)*EjLw$QSeujiC8J^YKC}?3MQH9%;VCmg<#RjJF_>il>!Rc99!i4v~iW zMyjto&GEgN|18W^Ta;FNRKI7`AYl+DOD4W-q859n$9GydZ?md>7UAp0BF7a^c2eu_ zd!FcTJg`}7Z*XRf@Lv6bk>+(6Y$pvkFW~U{3cUp%d?L%n2JQ2BIYCX#ag7<)pm|)M zqNcue>rKF5r;HDnTCC81sjO|ELJ;QL=x#!4{Vfo1x?+~%GT{ByX-aaM4HrSuKKdXGXJgN)oa>w@&#oeb3h{5TU~q7+Rk`qKbs zN~@Qt&Mg%4pp`K|iTe#>0+)9H00002*Z=?k006lF00|HP0000000Q*@00030|Ns9J zH$Kt_jh#qkQVtFO1}lXwb?Ea!%9Y5$c4ptaee-rQ&PFRz*^9>M0StD-Xt;~}p9Z_5 zhlimb2k|gSA{+#xV6?ZtKiUfi;XV(Gi~}$_VoE8_Ml0jd5B`Wid|t`tE%?0LiqxC)c#h|=-DagBx9Ebm5>$58dv!jd9Tx{3;Vf-aB%OKnBoSnurn8mJDh?8# z|FH3)gT1+nMw@F{_i-ku2`{hETGX%w_r=4IS?C2lxB%m6S&Va)MxG|&Bl_X zCOpE1j{oF#idu^pt5Z(gbaH2UhdQEJLF4jVN$iyI>>g>{#fFY7GZ^ncA|y{|N!fX> zc{xy)!q-B6areA^P0-R&ZLN|>I0fXIgf56n>4DFW6qwdlcg!vZUjY+P1L3o^AK(&1t z@a}R6tDYV~uwvhWyH5r?JNTSDQ_r1n2Lj(kSBd(^#MGsg#k&T;b7LuK{?b1qIF(AiOjK^5m~xE_ zH!|)wpFi4<000000|5X40002m000U3000000008@00000|NsC08nSVKiE>1oW=@g5 zxV!02-Jbcx000000000000000c${Nk0E0FN#l8fHZvz?DoSdA+3bqOwX*v0cC7KEv z1q%8K0iN+8;hxT}3R()ji6t3&iN%?D8U?Y= z3usJHYDsBP9>OGD13goq2^xtoV+!)iHH>r=3=Ke{1;MGw`FSbDt~rSX#i=O@y0!|2 znwmfvH;{I)dXTLc>a-LJTuO@)OEUBG6m%7eK|0{h)mJD08lkOF;G3BTb}Gb`95Wag hIL&~rT!iUJbjRt^)^$KWFi=1)gasy=YXKBKb24Ip{to~E literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_elastic_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_elastic_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..5a70c691170a117548a1106d30a0fef50522913b GIT binary patch literal 1032 zcmV+j1o!&@0RRC20000000Pzk011=;0000000Nx<|NsC0|NsA*8F=e@`Le7%>v6bj zb9mKR+00000000000001ZoXu8CbJ{Qvo*wZG|6xxVpkUb~0SZYcnY@NW9y4@$ z?I`jZ)Edbn$)uSk|GkoJ9u92}9UsEMi1oMMe%f8F_~0>_J}X>}A&wB)h*1{C$A`la z8^-JtGCH86el)_-;OH@A$HQTmdyGLVMx>e(DxwHi?hD173nVBEH_t>bXo_ShBOY^9 z1gS=HWgk}w)rPbC%=q8wih3Wsl(HXmj$qmRg3aHs`I+H~zh?0r%cSWwJ-$q(GXHR4 zQfNbk(f%zpi;MNIU1#f|B##RGbt0*8&>TTJou&sJIHQ?aNCh`M>B1dn(u#*0MVAR@ zivpp!U@Pnb>55m9!NYhKRM+*mLeKk~509HzZOPewcQ}^mR6U=Za zx=@h~znWfy5IFt+PeHI@tbwm4N!J{cs3twB;wx$p>>h1`-zIx{H~VsacX2hTO?#eB zl`$h#%{!<{Z?*Fdcr74BKmB=+b2QVu#0*QP29I0oom+VzvLq?rG`4mS__P;v;y|zN zq0nSX>}IeOQ%4qW&=^#30JD7Yep>Su?dgv+#8Q!1$tBFP6xD@0$Yd(4)R;1?sqkm_ zD^!X{xUF#PW|FJu11e@`gdLKXQedmFr!%xeF4DGOsm7=aF&8u`ozlxp(PEHP%(q;8 zrAdZw&Gct(F8iXe>dAJU+71c)Al@<2U6bvxH+o#F1?xU5+h-Gg+gR3d&y$>P^|u{Q z_%|N-xYb_aOe^7?`VFHU+JS!UW_R z2G;T>&uwekTzkIb->XDtCv82@&LbB^AZ_pFK3|tLY1ca($}{+WhQd?`JFM)V2RIi} zJTGOYAs-2~Oahy@-&-%9%K!iX00Pzk00000vH$=H7ytkO00002^#A|>0RR90|8U*g z$X@s@mco2%B%P?_VDu+8wEzGB00000000000C=2ZU;u*_2*utB#0P*3YfetiVg*|T zjkKKn#1c&fjRFOIg#gd^kZ@0DR|PEv-^7v(y~N_oJdFb1#EP)QoYGXFf<#SCYhEs( z5l0yqIKqL(OylG%N-ZfZ%0n2G2-97VU#?-Kqo8YO02C<*PEF3wODT5ENh~N%P0<7j zxq&o*Rf4S1KvMzI<5F6bSdy8ar=Y7)4AKF2pT0tYrh>Kt!f7COW*(Rgav=bzRYEdB CxzbDk literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_exponential_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_exponential_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a48b2e180d0a3617243918b5cbfb85748bf1c426 GIT binary patch literal 632 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quad_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quad_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..1da336942a6e23e19ca19d23c931e9b839ef33fb GIT binary patch literal 630 zcmV-+0*U|gdh$ft*Ck* z)??V#>{{zxQdH%?cWq24PEM5%@nLPv&b)my^LBjZah2>eZAXBYm(j3C;h^8aet^B< zvKR0r4lV|RVRyOYeYfKBBFG~~kZR79UNMwmNZag1awQ}&l17*vOV^kX+o(`Pf;1yc ziA~({&0;u{PuBQ9af{xWmmvRzD*^}R@4@_6Fy9&x`v(v|0~y!7y2o0rx(6+|L2K4Z z!&JoQFc)0Kn8H-!CKi0X_eh201VL|f)g1)^w4vMcJAJ>~2|Aert9yxEI(OhMHiZ+4 zAT~)%8<$ZEvux+VN^XRb@Tcz87=!EofA#=(N~Q)Keg$|HQF;&*hZXTjwAi8{a5)-R z;?v^J=8NyQ^SjBoGU|CXwdF?XiW4|t-e~6if7yHN)$?wKD>AdZznqGgnur>Qyd61^ zHjay(+R+Y@p36s$GoP1i(PXTa|CXSkQWzlxgh1%iW;3WdBv6+Z4& zMtW=cd?fZpa_x5z8;y3mgwf2*Wn4FSn{II&OD9yP-9jQCN3%02-Cc5jGq{yX?l#J% QkSn$lp}NBT1#VmzHrA~wkpKVy literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quad_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quad_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e9d2b909998e400fd9f420c089f1a091cd7048f0 GIT binary patch literal 595 zcmV-Z0<8T20RRC20000000I*L00%4p0000000Nx<|NsC0|NsB>{A`asqTO+WKOA8# z8Ow5{l=`6n00000000000001ZoXu5DZ`wc*RgPHVKg_8Dns~vOBmzZBL=wayq!m@~ z>-8A6UGG}^L5r&V_pUz@D9WkwAwI0F*_k(QXWov_0;Y<+#@!SqNz9Tcp>Z~jCkdO- zaW)*s@pZ&Tcpb%2g2`2uj-x7K3Pv-c^oCHGrnoC#C^uXpL20?&6SJiSl3b-cx224pbk1~7nI>g-l& zSa5L;E6$Xl1{Rv;g0pSyVYp-nqs!?envO{D_;O76I8ep!ZvDD+YfY%bGM~)(GiBF;Vj#>nNM(YcF zT-xPo{q1fwf0(sKysD*k%qrb7{UhGJe%1SzdcW4qJEz;AT~?iC*hF-A)_Xm(CkE09 z(d={%c98h%-*mImgb+5IT%o#X>@bI8(v&%qD7K72mpY*#c* hZ$6G#mQs2V`=1BgNhSBWat11?w4xASxWD(2?Q)GPBBB5Q literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quart_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quart_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..44766ce1b233d8ccbf20abe4089b76a3533df1bf GIT binary patch literal 599 zcmV-d0;v4}0RRC20000000I{P00&C|0000000Nx<|NsC0|NsAulx0QN@vR*vK$fi{ zXgub627Dm^00000000000001ZoXu5DZ`&{oMUOF%|G?9bW}W4@O`H!DXpyEt4ox>? z*j<(BM4K!b`p6ax{qK`ww@HH?hQWvWAR83<^hiF@X8}{iPUChAY&hx<)29qa(bXuv zOyaAU#c?zoq***nvR;y~i1mlbK4J_;GotjGP?@HP|`QRQ6(pOv%*D1T74v z7m#sDMIBV!IZexXabkYp@*5QnPtEk#-du~K?)IzM&$7u~J!F zN?e^*2rRv(GP|8P$euo5SsP<{-lRZ9^MrJI=c z?mB1i7VOBe+0fMgeNG5vg+8G?G!M3QzWe;$`8(&rV=CQh+zesBgXclaIq&g)w;v8@ zKk9_YqAUpMVAN;&EKK33V7MM>;&|Fj!Sfl{E8WtK{de}`^+6Z zkTyxmo!Y?;5`Ui@I?A11@EkAi!)?v=#G&YmuiDH&&zgr*tB zm%xRjNg0&hTTSzqln7JoEH+9(qKfx&|n9_Hl$ilhQS$`!B++RC2pkHiJU; Nm8jhn?jPyAGzr@!D7ydv literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quart_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quart_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..94203dc1e13f00a58e7555b4da3f6f3e1117677b GIT binary patch literal 606 zcmV-k0-^l?0RRC20000000JHW00(OT0000000Nx<|NsC0|NsB{nZLaW{^Nh?*B;Q9 z8SeKOL;ipO00000000000001ZoXu5DZ`wc*RgPHVKg_8jH1UEPZ~;|Hln}%rq!m@~ z%kCJqwRf%kAVpRFd)FTc)as$Ce25QgYj)=Co0+%cvw*4mpm9G1%Ggyr_`nBz{Bbgg zqRl4SjCsr_BRYsNiYHez8pY#L88HQ;8BuymsN@{?#S7(DNF*q&um@sxG)IytE)s#7 zAT>zle);04wvWz+-|3zPXF*Qc54uJ0SYd?~zG8*WiZpz|2n&o^H|PeW-|q&{himHW zPH9+(^a56bsgxR6Xqu&h?J5r=BtsaEr=w^(9Kt0;<8Tm%(O@_z97s3F-Nw5E^RWg_ z8G^|26f>WXfn~9A?igTP2O99=`>=mMGl|OnFOuaxM1MBKRDw zukatWU9Q$&Z&tVSS!>M8Vrs{%(k=5pCEhzPyZ>A{RMPodep|H5vbhZFkd8=tFIjtP zAYGc)JDsB)BtA6`oE0w5#iG$VEl+D#6KSJ<3$zwByn}W5@pdHnfc}zm1Buck(JF(r z%TeDJ_mwQArqmMsiI{+Kci-T82DjzrzG|&d%i}dBscSv<_7r% zBtp`(4$AMGrp3f)m>-1vMpK7PGyPebYgN?UzI?U&dDiPS4)ls?TFCKSKktU;KCJ2T sFP1X&{gG_DYO9<2c2u^M(yQP9df-MXdB~JAP-?6dY5Bta2IV#bl3cPRUH||9 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..6c550bf77ef01ac7e1f4115e70936610d910434f GIT binary patch literal 594 zcmV-Y0P;R+Ig3@w(AZAB%B$-Nh%25-f z2Fctn-yN5BDZ^iMPlJmfr|dV~B6z5M!)b=ZsIsBj?dAa@(@4$Q|II3Wl; z%LQgW8w1P2{@^6DTuJ!b4qAl3&HJwkV5X$8)Z;gR*AS%#jv{G@Ppq%?EQ1KU+LyQ*=^CUMQ0h-5iOo}UUK%tKsq7n zoz~F~5})24H!VD#i$$Y#`c2_#8ch^$f!3miPp~c@K8_q8(SP5GfmCUdYL&s-<)~-H zr%IO6Q%xzuhWdT`b&p!}1dqKolD3#TSpnT!}0U~z)L&FXqG5`Po literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..834398c38c9bab387565a407ac8994fea1b829b4 GIT binary patch literal 624 zcmV-$0+0Ow0RRC20000000J-o00=Dr0000000Nx<|NsC0|NsB4j|Ub)?#{~T$@y2% zvb=8)SA9JI00000000000001ZoXu6=Z`v>rRv(GP|8P$eur^MhfC@uuMJeK;bQ9Cw zJ?9MG5<7BiHZ=8rpYwyVhCWSsXdWEveD~$M^LLjEkE!&aaX*1UK>IiSh+RixKIGSw z^I#MX2FNK3C}+cvW59#)O%XAHOf#bNmQWc*xX)iGw?ZO8X@ohDY)4ZhiHZals0q>x z$-*sPtdM3UpRDnJ&^`4oyp*z^bc^87{1VN7LG!HEYkSaxTWZZt zX;_N*64rvLm}aolG>HYhBJ6gz0)le@Lal-0(v{gExJv9#SE*Umf)RZ=8hgn z8^_g2>tqLszs^27&7Gd}MWeA={#(I{OcPaHqA{r918j=T`;q1&x^|B;;7Sv&RRSBE zqMqlSOIFfRb<+wPy7=3tJ!&l?Jl!yl6)kS`Giv6Bf*V`+N@Az9ryFESM%f~!X@=1y za3N`21*P{^(|mH&%#T8Tqp`)hnf@-!C&hGX@IYoKP&eoTf5^M=3Bse4Duuj2RX*-j zM{3IQ@s!S)P~V_&p3>C}`rQWUIItS0=6a-(;``~1m6Wb$-LDhwq>_h3*$j%#Xrv)r K;r;^E=1 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_quint_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..7e32da07e35537fc870db53d8210a9ecddefcbd4 GIT binary patch literal 604 zcmV-i0;Bx^0RRC20000000JBU00(>k0000000Nx<|NsC0|NsBvV~}YjA3e@4YmUz>yR_Lsd;R{AsV$AwMKOn1LOh<1l4%^nM@YtDGzpU^j!Fm84|2Eh?!bI(0p|=s z>~o2GpHBhHa^t}%W`$PpryukPfzNM$YJj;`g{2<91H6tXJqVP%BR;ti2Wk;~j@DQB zpV}^0>u#qmdaDjD8r6ge)DudV+6-jcQdJJ)z2?zm>&jySlwxbgW8_2k!i(?dr9*G`88xh zQP~9Lch1mqVzkVULVc&wVcSf9SLQ|)O}Agoew+;kt@FHK+7@y;){ndR(ucKO-e$Qf q!LCm1yOm$l<@Y1IrBePn_nF2nS{;s>cByaj+7l2p5VB&<*-+p7 zTMh!DeG!lB&#Ywf+H*so!(nO@M}T*$+oD&dx7Hlru=eKGvg=D$oT`8Si&-XUW&5f2 z9}oIxn&;m?ccyQ>jN0VIhYm~ps(8(>bj|&i^w+}~2PCRL?RB)+C0kJ|#anGxrMPLf zO%hL(q0-f90fKE6C*(A?#V9x??ywZvyO?v*UY^P$fr3k_j>TKr8Gfd_#JN&&fMxOm#%>9-s4;tL0gfV#VQ)z4qU1cCgjI z_~y3m{^u&m29voewVMhO%)*?v)^0FLx^p`ulf&q*l+&k}ee*X#RzwF~>}v)f-*na#hl%-Vmc*UX8l(!Nf86K1{s zkM~2psu%C~=3Zo}jFg%BS?uC<%uX`s-}GJRdDZormtbj1 zUgxm|P5c{9#^3YTUUy;MmjGuK(atG%4y*YFoZaN?&6K#*ZAzl=(S5(G9F|segr+Xe z`ImCF#^LB2pAF0(Dlyb?d#2l&u#ncv*mKg_IqpimPB1jlDGHYuOlblWLC50#OLotf6MmPhD>|? z_lv(m%iHYV{*5aqJlZjRW!s+WtW2rdJM6{OB>sbv5h&>aK^`yxs)1PyOkY7XC=EuO zTpSvGU2JMetjd`KyQF423aCwlsDY3bbCMGnn%Ovx9%DHY>ELFio*tOxnHe~*sV%QD zKgl&B$uDzN)3l~&zq+K({3Oq|xT3m^ZjJ?6MRjpr8?*hA91F9$n)W$0dS?bEd8XCL k1>`oQ?`dD$KYLlzHl{-y0@lX-XRd8|_LPZX(l4bu0BFT+$^ZZW literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_sine_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_sine_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..99dc35d5309e8f6a9fcba96b9580061472cc6c09 GIT binary patch literal 643 zcmV-}0(|`d0RRC20000000Kh*00*-G0000000Nx<|NsC0|NsBhXKlDQ6`CsMI(tdk za@T&II{r8S00000000000001ZoXu5DkJ>O0)gFn&f0$DRbT>|dfCW@(S1h0$U{|8* z-Rn%iZDL2ZLyM~Y?{z+a1ywy%IcyG2;(0T9^Wm2phso@qa6bWm?2V#$=;OHW`NL=! zkGw(jdOz~}lm-3!0E02oAZDe<1hisAsx6@+if~`tP;9wCg2HffAbLkLB&m#e%ux}f z8p+%)8;c3Wb8g)4bWfcdC!_2K-6GgvZWYWu1#@%56ZaUzErLwjPTS#WCYAYz3zI?{ zDvWkl)a+)*xA)H0LrET0_(dYADWD~S^m=UvdhkGVvy%#zJh_E6XELE0mWrkcXS)ia zxnKzXa54xcz7Ka03|(*J2A=N~0Md4{{MEvNSziqo6#&a5!PFK^Ls(cAxnPD%0l(W$ zixBwo|5p{@lz0R28ltq|m_!Zn$rRsHgJ5$sw#1jk4cD8mkL%fd+8Fh+nkr{Ts)iG| zVBYDL{eP@UOGr^VyWF>gx_M4lwIrFGs1fj_T5IV~`6#iG#UO1v*$ zO{IwvF3}iN@Ci2M!^auR721;?X^5pFv63ll@(k6iIJ6`bmTF8HHq`Zp=RGRLBRuyv zF7&5p=nE=l1;Gm9lN8vAxu8jH%{FLdEz7=@{-4?;Y(*)!(-vhkKa%c@&;BL5^~MLkj&;B6;?{g8 zRd>m>sr2czb$1qPn;Y8{^6TBXb9BW^6WM*fOO5^;BnD+Tw_bcVXV%##A4>Cbbf-KC z?3}MQX_icsg2(d9B@39#O^l^iCLEirr(-dh^Qu8`$?Sq{nu4>q+a9nw@3;SA^MmE@ zfw#PO>dwD@%5bUVQcmi_18df{ZT@rclSe^z_fo|(PcQoz9A5h35NrC6yCqUB2cG}m z@5S!kZ~9|(=cOshLRXKdht|0BHl4kAqiTM*RgBL5Uh&E8fw@PzqgM4uuFP6ie{AvoT! z^!EJ>iGYXK-mhYG`+aiPTZkG6SurO$fuY%r82oYMRy*?N^u7nV;m@7FU=y&&{zQtEeu{Yh$)wl4D_3SJOVHM(@nPB+s-uxq#e; e^gZp1`)4m}+UC@lpC)&M!#6ulkKvWH+)4nezi!X~ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_in.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_in.java.i new file mode 100644 index 0000000000000000000000000000000000000000..a72916e23b9b9b4cf80351449ca1a22607389349 GIT binary patch literal 595 zcmV-Z0<8T20RRC20000000I*L00&_J0000000Nx<|NsC0|NsAb(NWWBi%P3LeS5>j z#ooue*}G%_00000000000001ZoXu5DZ`wc*RgPHVKg_8jH1%Q{Ab=tzA_VymT8XOn z^?D53u6M2dAVpRFd)FTc3F;~GAwI0F*_pR*X5Nm^0;YE($C8&Xwrn%s3S9=&P8A3FkjfS%*f-f)}hl5Et97KcCfpmkyCEgvFk2Ua` zA@IBqnEQMT#O21llgx4@;cqwS5CYfle`GXK}ad*@a6pK6C%I{(XWi#D#B%diRQ@T~WowWkKs z3DN9yj&_jvcyi#pba^Tljn?TmwQGp9QNI;hiyA(`ruz6el6*ja$x{QF(j?O=hm9*x zFUtE$V(F=7lwnIPzxlRDt$B*a?q)(!TlVuiYUYQ5A69otVz0Ir8)QnRW+`Z4Fuj0` zODdY6;?8MWPK*=t1D8LkaCmB_e=2jMil*ByW39#Zr3B`yUS6N+l1uat118wIV2AxPSHJ0t4jn9lihn literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_in_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_in_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..5e795b9f182290bb29e1bf9a13010d33e704e06c GIT binary patch literal 625 zcmV-%0*?Iv0RRC20000000J=p00=Vx0000000Nx<|NsC0|NsBG>&hfn`Q{mB#k2se z6w2W{ud-DD00000000000001ZoXu5DZ`&{oMUOF%|G?9bWUXaqbv_rMMVbaaG#!v( zcTJ`fZMI}ca<*XTf1mu3W^lI4;6r_o42pbyq#o%jhso@y@GygT6a;ZJibuB?(Bash zdJ~MI2}L@cOmBm6@PYZvV^J9~1Faa5YDcJuB0LluiX9h7P#A8GMDJ;aB$W}5IVyrw zBU#yHYm^kbP(0_x{YDSexpFefzSA9og>x%7_Z7~~4Nu$?j9b9WyH3|3gF)AU0o>8t z?4^P=Pp)CZnM|mLwW4Xl*}n47TrdQGGz*3^--jC*j$Ci-4n5y197xy6@~_q%n2puY zAPGFp5=?DY8p7i2F&E5mDd1Pv=@0^o|9>igr4-swi{AoXOOzftCQ(a#GQ|(nAlMv@ zEpoHG;b!~!ezRQ7TO(iAQ{~J^)p80A?!A7gftSjs($GJ$+@T4}TV_~Cb$Hx674B#@Wu*|RM&DI&c}Xr?i` zhL{VQ)Ir%pu4pkm8s;Z1zR)DcrkVaM&1cE<8t_0CXHYxsJU58@@DcozmTHB(Le)NY zYa+E}d4EplLa2YCahcN10*3t-=~%D^r}lcJmg3v#jZg^Nv-bZ9_d<$eDsv5GXSC7~ Lws5}z8}LKIn0qMv literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_out.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_ease_strong_out.java.i new file mode 100644 index 0000000000000000000000000000000000000000..540663605208225e9ec8236b7a3c3ba5767eacf1 GIT binary patch literal 605 zcmV-j0;2r@0RRC20000000JEV00)8q0000000Nx<|NsC0|NsAjZ`oNZ=P?5Ad8~Ed zXS!x6xIO~_00000000000001ZoXu5TZ`v>vRUe7Of4EN*rCm(Yk+h&mttdr2lulyW zyRmP;TVh9!O^2rb_c2<9-6k)i}I~;v^n#Vjga; zSrD@?S1e)U=z2qgDB_%l7~fPL6DTwzN^c33oa4THq1+0I1f>z?K#CpBkz|UCM4%=} z3nX*5tc_N3`(%y(lkTZ^=H-!FJUE^N@)QLO|w+6U2Rba$q<5QG7cv}0G}a@{88+OqhM4TkiM7OjWY-4djsrMRJ~*%H|597j-SgiFw`i7CeHk`BJ&_Dv<96ae z+B9u;dPf{2KDUpYmNqZtqS06_|4m;brHd3U&=}P43D(ue$7#z)bT^$BkSI+Otuk2K z9QCZcv}7rr)PyqZsOq;*d(>KRJk~c!6|D;T4K;HE!A-1tC2>&W`5Kv$yqKpnFOXkC zA|y>4r~KY(T274?{3zrPnp$kb^mhd}ZP8Tw4R$kaFle3UI;M?~ms literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_i_ease_function.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/ease/_i_ease_function.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4dc6451bf3c6362a5a568da849f5664061e32f4a GIT binary patch literal 433 zcmZQzWME_f1I9uI24-~#n`zE}D3IU6aN=r4>0uX*iN+@q!b_)k2?;>dK*)+YYbV{$ zzHK0I{A4ogKlyitymLi%m(5us5_N)~>#f9^x4$FzsoV-V=~0v+@%z5|@z)BqGJ=oz z{L1Cu?c2pTd7Guht@8`dWR}HV4OzlEZIez{=2ZVro_j7QO*-FYa(a2F+37yf;tzgY zueUMz#$Mi6oU-lI1O?#`3y%GV+m6g$d(~~CaLc?ShmCH9W~T&P`yju=-7JCk)chT) z9R~Lf|FDR z3DZ7*shT(K1M4PE`RO*&%OC4Gs;tReJ%jHQOObTXN%h=A>sw+u7`OkguR7o*dFA4y zb$=x%2!7mNC~x4h-SU%vb-Ygacm4kJ1>CVe47IxY@-=N{M2M71#>qXkIbGu~vj5SU z#feXwoh1_%>#}vstyflm+;+4zGQ# literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/util/_modifier_utils.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/modifier/util/_modifier_utils.java.i new file mode 100644 index 0000000000000000000000000000000000000000..ab775761adffa35ef12bbcafd9109b378199cfbc GIT binary patch literal 551 zcmV+?0@(ck0RRC20000000HL!00*W30000000JTZ|NsC0|Ns9)4+FeAS3|OAn1N1W zuLSU(SwQjt00000000000001ZoXu6;Yuhjof40H@!##~8BmP*S(00jIy0rwF_95%` zP|DD3*%6Z^PalIZ^1tsS$H}}DHijSK2TSL>``zzOx^qMFucV?NRTUFa6!g1WsHm8r zu{DgxwJcc4sPfW96h!5{xGa|2o%c&7lPH7fohdJyfgA*!hI`I=T>su)*s?9sA&|Hd9$pqm&kH;ry zI#G{Z(+533X${OkSndW^5R_aJ1H2E52G{O;yjDo5O)#p%MSYBINm&W90!FMverA; pmwzvCKlR_Mwi&Ef7DC|6!Ji;p3Mqcn(rWOXJxD_%&tLcl5<*R(0$Tt8 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/_direction.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/_direction.java.i new file mode 100644 index 0000000000000000000000000000000000000000..effdbca4b5fa85d3ed3b22789e0e4c8b27e6e879 GIT binary patch literal 557 zcmV+|0@D2e0RRC20000000Hd)00(!gAjiqT@@lnvztLiXw`dwZ5;FoNuLoW6-) zrdetXl3rN1U$r?PZ!4HmiG`wq!_QtABneFZ|8pD67*@zt<6%3!#ocw34q=q_hcNy0 z<;pC~{KM?>HX3C^NcH0LV*dU%vI~oomohE{Zxr!XhmVvlDYBKPd}>MWi9%RYP8d+G zpqe66WI6teGWQIxYzrl%=ZbcWj`r!-uC^gO73F=)`#^1I6L$!}WNSZuqRMwFgGBJ? z;<|3qWKnw9_tRPm=k+gn&~;RAvzTZ;JLz7W8*#Q32NG2)x$O*_Yw!rj8ie2NM@J5K z*PXff?|k6U={WZCWNh1fr-Ls~2RFTY7~X*_#RG7BfCXb%5_T@j)?6dA?*-QOH2ZtV zeGqVtN}+@oaAPN)IOw=w&b374K#02fyXp^_c0{5>$NbNZxnC$gqJB)bo&}Ni{55lQ@4ff)$PrTmd*F{ z-!(Bn@P3)k*mmH%M!=4O-D z*Z+^(EHJsne&wLPLH@$YT9a1AzL+O3t^Phi{Os(m!x0Obq~6Ts6R`_3V7{2Wq5nsm sl>E01r)DlxQ}tea%<;dM?dpPESHoslfk)yTg;SqM%k{@;1d3QJJh|el9I`Temw`S?9nh8%;3-&*r zUaz-t##ux42}=DJG+a+tDNo+KaK)E3%H4I>_?rznZof5XFpEiinI3e&Hhs~>gT9U2 zXK&^(%g*jmuzjcMsc+k;{9>Nl$;c^ccbDXK96m5@@+#RI6Z*jCG&2fKxSFWbI%OvSimVf0eMJK;~at{JZb{ecJz42ev{?zF<(-O@! z4nDr~Z*EjKjj#<_Z~N#KyU1Ei=_}c-xqs#^3y|DiD=g@n(Gc6q9<|AGCI4B8H(Nix z375U`@Nd|^#Q9kVzvj-fxw+8d|MJR^6G`oVg+tYI=4IP0zvu!00000000000001ZoXuBJPunmMel8OK;r4=34O)2FO92fPF(I*m1`q7f zG}qQFwKK;lu&Mujw&NsD(zK-*i9Iwd_I-Ev`SRU4CZpeEg22V3M_3r*TtARaD8pVV zY1E5}oDOz(c6aD3=0d_FnUiegObGIFMH6Y3UU=ME1AD#%$DwQ$`6O>n~*yS|nnsV(3l&N4Kr!?th)b|ql7Y);$g=?-C zwY`1@+1Y8t_)>j7&+TZ+BCvZJkmpq3NK(!;ZtAE2tSZs+IYR{ z_?13Gh#<`kXE2>xV}* z>O*`jrzmo_s`F}O(?u%_Ej`rSi_AuCqAxvlgQBxK7I{N4EUT11<=&i^YjK=Gf@c9h zkWEY()}Z3e<{9 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_a_star_path_finder.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_a_star_path_finder.java.i new file mode 100644 index 0000000000000000000000000000000000000000..8b8ffc3a3652483bd560fa9061f00dd60589971e GIT binary patch literal 2041 zcmVs$xCEz3u&da>H;k#Bt~`~&=b zOJRpk*2cM}Ims??wKj%iqJ-Mt-rn3m+vo?}hy~;5Jxy7TYxIueBB$v>Z`QO-3Hs{m z?_RzB?$tMF550OlKKOS0)xoO+39!GpQ8hCFM=9Xe=;R74=JYtcK1Lu`P6|?r8l8tb ze{61y_V>}z-~XoxoPwPN1_lGr8%U(Ll;qh!@>HDOV?odzEpd*l;~lGd7jK=Mat)Bbf{SOlgC+jz8JyLQlR1jKVA{c)5RN786S+mB&XZy z?GzPCk}jPYV>!VkDo*m8J-nfK&S3e1-75#{l~8%)Po&|X3Qd)q;nHNVLsx#tn^Z79 z)Y0qMilQp%F@Dv4?0P1zLX+=CR;+rhxTWH9Bo?$zJgOa9{n)$8dCrQ`EQLG}$ ziZY%PA>Ti;hdSAsb~m7KHAN}+lqgYDmWHs$MuRb)$U}Mb)$Wj#wPOM>$4BS@o_l-7 z$QFIshpt7{xJ!e(bhslW)9rG4`#AMfP9AsBQhD1*`kVgqWw1bhM}#08y+l{)<^NN5 zE(nzJtVUqc{X5PIbk$UZpUTp_e_n#9cQ_>j<)$Al?+ND+rYgC<; zf{JAvzNf4f!P;98*m+Fv7I;Ije$7@O=nVijj?$A?gp1WMc$M4GyQBpe(^_u*n6vZ~ z$r7th#NFfBdM78M;Uy}YJf9dZl#l&w^oHX(s#zh+lOL_ndJm7KJ@> zW6W_Og9OQ>7cRFf^tv|QxcGp%7TP$R-1AR-oPw&n?c_$*g}ilt6=zw}vTSjrqG`h= zpHPN}1)Nb5Y#qiXdHE8(aO7!yR#ak{*k}QxTrXrmaL`$~11-UbMEN?(;p7ml^+HL| z0~kzwz{wEUO2JaC{d~_dB7vZeH75m}VRB$91jM?9Ix?#ZG&GV=sM7ot^}#%vJ^IXwy7&W zF1`MKO~G1<5J(@%9=XSPBS$(agNJY;^8iLO-G!-JjW&|>$p$7qv<$S3eHVo`==$=_ zB|5KlR1z7m6{~9s6I$2AeUHrqA4bAgS^)-j-W`=>jpA&R? zQ=^IEsHa3Vp=c#^16ow;b)RjkBN3qF*#^l-r#M%ffSoc46J~0=;QUE5RvTL1R;h^A zlLe`D7Gs-A-|-GO@tVPMs0&RdRIu9aJ1oLa4UYfjkSM#F02*os^f#YBqr|~>)(q%z zJVtgdKsuCGqUcMHc#IU>^ip3C$!l2+lh`X{tOR1|?#wrh2huaDIv#;TMPmNtfp}PF zJTFVxSC<(&DOtHJSW_c)$1&8^Mtg-^3oPtU8+syfKW3b=qQYE`>SnlBhWy9+#Xo2a zq0cZ<+21q<5lNZTPkCyF_J?F|w2oT;Xva17y2CDP&tbmf=3p|QRiaD(L2P5L)6`9- zpRZP=u^@?gH_>*Esv`S&FnU<3oEcp~9l|=@o6;c-B-MAll{d#!Y9+LYy>rKUSkm7+ zFg|-g_6ntH9W%&|j?mziTKnpD5Ci&`x4tz~mDI>J3#@r5r!IS4@6ED;37ngrTpOp; ztnZi&HwW|*P%Na~)k`m(cFT)kDA_1+LL5f)>_B18Z_k{yEucQ~@iWLFZn$?4{?stE XQ~a;Wz|+7OT<< z{co3*B4?ri00000000000001ZoXu3hZrd;nJ;#9mfv2I(HaiK>p=j5kMUZqkWCa!< z>Z2ypi7;8xB&t|Z?B7S*TiPK51`IyL7t`V+`9$;43HeoQ5v<>4!c-MLv@bMUWiX4R zbmj!@G7(7l%QQ(7)i~?vU-(s_G*)ZjUdAxcTUGV2rM80BjO`Hlc$_9MhHDXNXFYsU z(rOXl){90fx$B)l8Hq5PU7Vd?Os4P_rth-Jc{ZC&CoLdP6BoZQ93;mESVXB+g~EKq z=v5#k-xnW%$!KiQP=M9VhOhO9_bE+Ac@9_q|MUsw)^N+X$N>2UqO??~t0Usmwa7jcuVB*|$3tw5tc)r^ZGB#Q+rTC|^z(Mo^Oa$$wU9VaBd_ls(0kSn+rK1L zw|a#w(&D>ANmzZxKyw@Dq*g{~*ekwOk!wHLegnO;0Jkut=<)Y~GSq{Xe3SdXo|Xrv zg*`+Twmj`bJL(-h&FUVm_A$ICo=aUGK+9)n`4U=oi)l3SNYNYE@2f0)^K`-$#%-C` rZ34E+(>C*uq5t;rjNi%_mIbeHxG~l|HZ}(6hHsFW2B!58Hq*lYP|ziQPd!6<#;n+Yc2_q}xt;w#4?Tpafshq*)=s+Z zb=X0mZ9VT3*=IrBYMBlfs~j}fep?iGWzT^bK9>)keYeT_W5bVkc|D>mt`pvz-SoNM z_>b{svD55pID1wLUkP>Xzw5dy&DT?VjZpU{&kNkUE?aad=dCIHB)(rGB5tt&qw`X_{z4)Bt7V=L!F)b z&M-FCtVuUFFAZ7|HF5gNkDGR<^>Xd|cBA)Np8W3%t66W%6q`0ZS0RV(&7GOcl$X10 h?fn-RHFJ6X$3uT6UEpTC&n^E_x9=X~*~LfS0067)q&WZp literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_manhattan_heuristic.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_manhattan_heuristic.java.i new file mode 100644 index 0000000000000000000000000000000000000000..16a3eacc55d0b39f24fbfe3e11e2c97547b7d24c GIT binary patch literal 465 zcmV;?0WSUk0RRC20000000EHz00u7r0000000N=^|NsC0|NsBZoC;3h!ty&%UGELy z!hK9!Gte>s00000000000001ZoXu3hYTG~%JzJoEm{W7f{!rzlngJD@o+S30BIb#dM$9!QX62QXsehNeZ|_Fz(!wXUqI-USRrwM z`OQ*D|C9Y4N4+$K&+otX4W^c4Ao7w9`gKI<&S04z5ubKMzSeC05wV&fGkW*{%l2?Q z#1<&d$O9DCr-io_ENh2;+9*AplTa;`#*PMg{e6etn;hl**HT4k6~hMk_LoD=nE$}Q zQyciCFr-R&@^j-NcX&91eKrGkOKkYz5HQ4h)SZ0F{j1T{i)dzFA~U<{x32AZ0?P^<^FP9=rZ&$D^V-k*Hf1GTe}*hsxFgS`Bp~9U0so H*8QX6^hn|w literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_null_heuristic.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/path/astar/_null_heuristic.java.i new file mode 100644 index 0000000000000000000000000000000000000000..69cb8ead13b125b6541f48998c0e48cc45abdd77 GIT binary patch literal 435 zcmZQzWME_f1IA(o2G%zaHq*lYP;kX+<(ByB7onDG^i-BHERT;btb?k7sH~WCHYC>j zuz^Tz+`|74?K=5#cQ-24E$s3AZNPe+{kz2F+j=w96n6@`{&~M_uCR;a1Unsl&v&+- zetz#d6aREx<+yc?GdQ*Ld~W+HF)m?$C$+YVT8Vu#Y@v)%cpKD(B3ia%)zaxy&^SR{j3&R9IB`(s;HUN`+&jC-Lq^?&*s2uOqVQ- z{uv%0=HTFB%ZW9wY8d+;l6unfX|`nQ=`Rao=uUzc9ZE$ z$ixNLeH}ES7N-9#E=Wt-xJ>^1@*jyklI=xo{06w_K{r~^~ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_entity_detach_runnable_pool_item.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_entity_detach_runnable_pool_item.java.i new file mode 100644 index 0000000000000000000000000000000000000000..624ea56d3d9344376c1c43f383881d946a5968db GIT binary patch literal 919 zcmZQzWME_f1I8B&4D7`aHq*iXQ1EN*0S?2Q{jISJ_GO+f3|%n2Ja+*^4TP+ib2c%1Iq&?VFBdF7D?I5t*WAzgzj^Wwx%yij@66jOl5o+rm%TM) zjg3b9@d~lD?^kk{s#Y5(d^Em!v#6TKFk&-%Pu^9d-L)!20~WMNlsvBcH=l&FuAdDBKM(` zU93mq8+anmH7)ux>B^HyS43F-ukV?3W|CLyorWWeuIv%Yj$4p4tw`Y>cgTywkpZ)& zOrE(WVA}kdivs3EF$FG}IBn+i8O+zC7zD3|ta$eH(G#7MCv>hg&svtiJ-KB@^^C^G zshk<>gm>+Hq2`n!%X&wQ(RUJSlJSDfOBK4QkC~IW7Z~M+q*iIJRP8(|c}{YsrKXes zXNT!5hg^oLT@kB5j%Jz;cDe%t1M4*~i-DOPNHc=G8}A|JGRfluhr!MK*~Qu`^Tek# zB|+3cNRW3EE+r%+6s0mSKNIHR(J@xYxu&Bqk1ORwVbQdd6tUM&cRib$GA-oQ(k0VW W)Y4g&KUS%qS^@n00000000000001ZoXwO`Z`v>r$HgO&@*VD}0;I(RmV~i&YDGKBL%RvI z58&7rNavg*$4Q5(e)l>-+Z%hB@_=7#+2_B0zPrB%p3voS36&8{n?2(sB{uDZw9g4y zZF9v+trfc`o7>|S3*F$hCgQ2WAMW61DY?Z5cSWHIo_WJNO@qx6k|>#rC{4o%lW-BI zBAP|93>S;3$YlKKV}_VyaguohujJwv-y=AR;6xGpr3hMzpr!cid%nje6W@ag-0<2S zw1KBwXvHg78(yef98QN-P6A;zUxx8=7QqLYhrx6a%%YCSKk{l2G{>TP68`UmE~ls9`t%b`j(@T7sS)0$kf7W zb3s&VwAS^}73{jj<$yh+^OEcAOdFONUBIp`(X3i;unjrXj0@~3kvHEPG$xnm)}_%F zg++PRfvs~u)2&ikIHUd98jU+Q4Gr4b5D>onQ(-iAf5-5x?|fZO0XIahvD_~Nx1{M< S=(>Wge7#i7CGH(Y6{g7$Lg2;# literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_entity_remove_runnable_pool_item.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_entity_remove_runnable_pool_item.java.i new file mode 100644 index 0000000000000000000000000000000000000000..e579102e07b885066d407d52f526d006de510761 GIT binary patch literal 924 zcmZQzWME_f1IDQg3~b*aY$loiP*BmeQ05my<<8{}FKyRNRgjfvJJ=0T10gHsoSmBM z-Qpl{JYM~W?6c4-fvY7QMc7?KIBWywCtUuR=b4@=zeM@hyS1y!Z6#eLp3D|Z`}6+C z|K8-Yo7wH0CuAM7cxq{u>oAMcDXmu{Qa80yf-O;DRg{)-OlL|<Z`Eje`F_3M z1D8o=b9&?)^OsCJ$1?4w$KNYnQfGLcU6|aSWy+X8d7fd&`W45G!*8DP_}c%+);;;o z>2-(a?w36IB5#SbX3>QVtI6hEj(cJv@j+gZ6*E^<1_^)9FP)sk5GK(D^UgT^wM zhx*n@hj=~tanLk1^YP}ZK0o(feO#A)>Dl~<5B2*NO*!$g>_3l%nrF9H6z{wf8Vd8` z8N@6fp94h=C^~__3>c~3z$^x)?I0QyulI|pYfC1q&ox-)eOzSGhn-QKaS9MMFp_m5 z0|V&BSZ~^teBIWkkFBkknn;j>F}95 zO@9^%wf`YLA z!n}3>BnPE%=!?py33BmN%!f6c89+Vk988R-t3)Ys=Mmf`_iVWCGA@5H6KsK z^}BDjj@J0Q&Wz)YS?401!?9Zxb9oXU9lfz6VcYdW5% zIj7cMynQ$|(?gl3ZSlXS83l~b4c@5lU7d2__4idRCVgD{xn3?fd|T+9XU`k)8K3#Y z=XtEv+1Dn2zsrZyj!jQY_Q7(6R8^U?J1pCb#m~Hdpxqah$+i7|JbQy?ux8hi9ESCZ zUi@siWll9&opY`qde;(hHbCXeMM<644@x?06F&sKcw@S|fQvD0Q+WAY0xk9dc zB|AIy#h1O9bJE~QYqF#64B66zr!on%B2HULy#2o7?#jDYiZt#C3e^4Syzs8&=EYxm kQR^>jKA59n5;nuhKyg{^xqU6WYI;L-IlePXuc|l<0D5$|U;qFB literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_generic_pool.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_generic_pool.java.i new file mode 100644 index 0000000000000000000000000000000000000000..95967a18365ac43f4fba3abe6ff39df0e561b4f0 GIT binary patch literal 2498 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_multi_pool.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_multi_pool.java.i new file mode 100644 index 0000000000000000000000000000000000000000..742d9a9138703bac77d998103194196dfb6e05b1 GIT binary patch literal 519 zcmV+i0{Hy^0RRC20000000GAU00$}n0000000Qy<|NsC0|NsA%q03TiORZ)O$UufF z`h5+=TBy_j00000000000001ZoXu5Di`y^|J=@^_Fujy)*xE@J_OM@c+0u~1mO}Ce zwDQ;yl_fEfQbNgpuPk{X2}=*fhxlUI^EB_x_>F8B|HWDaO>N0kUE{95p=yP~(mNqb zqqV#*@*)?V(c~b6NsBrK*M^bBXCk(bm})vLa+tzb=G|5k{19AAW?@OJlY(zk&IVAWD>$tcaVXqj5skYE)sv6QAti3^c>4&3QsUWps951MmgWi#xoQ{HB zICFro6*kn{dvcPjEtCVZ`gT1y{nWHz`o&c|G%~jpwoGm>jdzo{D*=MDv%@jl2K1X_ zLiN#=!|s%9Ncb^hxQAgnCTlU0MV3r7lLQF^=jFS$jL>;f@l}K!0Hwv#V85?C)0L7Q z&h-!7;(IRf;~L%@wh0d*I7UgIPD_e%&ov~nGtpysZl!|e{^tbGN~?XRy@fa-qYOsS J`4@zR>JWZV`cwb_ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_pool.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_pool.java.i new file mode 100644 index 0000000000000000000000000000000000000000..4ad13b6f8c93a4871edf052a31bf62bd56a41106 GIT binary patch literal 2441 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 KWjeky$^ZaFy|{V+ literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_pool_update_handler.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_pool_update_handler.java.i new file mode 100644 index 0000000000000000000000000000000000000000..b96b0a4236b358ec68844783cb0b27071f5dd633 GIT binary patch literal 1865 zcmXYwcQ_kr1I3ddMznT~h=@|FwzSk|U5Qnr_PA(LGgi$uxTsi-RipN-OUv;2F)Mi_8V_1*6tWrgQS_5hmp)Y>aFcfV3;m4IYC)h!!gWsQsIE=$F~h zz^?=TEDPk*a9%adybmT^L*0j|@ZE)j&7%%AaqO{pzKDlXa!!J?!`e+ti)ZpfwW(&M z&4NK{3n@9`v$p$PS4LjW^L1wxqdY%lw}Pd7l@9eviE&HmId;eEcMBhGeXE~~()r6R zw-86Sl#6nWC4?c;kXag#ItSQUiMgJ{ESNzQA zxT(*l+SR)+75Oz-&0tR-@kssol)P`01%+Fva!ogZ*O}y=D7ELMlei;YLJ%919Olkr z=-ToXU*DxrcQxS@>l(7+Y)LF$ru@58Nz(5_;tKb)E4xq<*I@N1))Dwy%8e}PSE~6O z#n=Laq-9QS4WxB0JHp2q&F-s{Gf0ZzLvH z1iuuPA){?n|M*?=owV-8M^z-1c`V!^(yl~7ME6G)pHJHFpb%Cg!%^Ip`H5?bHfG#S zx7|oC;7#Xus7k9dwW#HVgyTC>Dn@ntZ9iwK#qZe#4}kWA5~_yb?_~Atna@7fy0k8C3m? z>L3WWq4(~-pOGXW^>8W0B^jGYS6a?YAqqxEG#OQn5*ual-l0NQ1oGR_(yjL^8c5h<}@FEI}b4wKb)rrTw{?mL9e7H0$6R3ac#zV_L2Glij z&xec;DQJb90PEB3;j|6Wc6X-6v-K^XI{-+KcGCvPcqlhq4v#(|aHeiX>|Fk%Jel>$ zMdpI|0%r_n?Ci+8U@(}Kzwco%Y4j`R!g5g=8I2_poubG#Q6w6HLTJ8M5Es`}eI<$% z*3|586h+$TSUk(ihEygsN;H=>NtgmfIqXwGmMdvF+36YfWj5()cD3=w703bEDTvlF z)FWFq-I!?5D~2WximBAbcpMLtNNx;dk0-{?b`fqYcjS65`4!@FLx`$cIuMKq`=8Tl zQFxwl3D;CTm1mcAC-a%DE(2y>)44itx;s>srnY`^8Zq(c9W7BM>nf<69KI({)f8=K>J1z+CYkDo=vJ9p zUU?6y9AbNdmI|BOGBbp$s{_A0jaiWio{Ih^JfqO)R@TfjZRXerG-K3w_*^(F%g`uf zB$-TEDRtrvcnK(q+ihA8SPkd@R5z&{S(WM0h%Vd)3vz7`G)Cvwv7EaY8wV0{cia~kEatEs`pT9Pg5g0bECcbR5>)1VSQcw^6rNstZ!>*9lc(fLF2XTv}zk2L^sflUDY#;hFA; z^-mcrK24B59V33-in$Y)ya=f_HzL9w$2tie8`>Cx1hD@@f%d{|Lfn|Ewe*aoYTdEbUcV2p(ysljXf$*|WHY zsVMRW-=d4l1P>4M&9w~*NatO7a9X?9W9Ln>Eq>(Owb7uG7r?bDn}?5|>Lj%ADr8g5 zAxy{24Qve9QGU!d)V zQj5h<3eIX=(!&g5I50jvaJhg0$QZcs{{fynQ5ygN literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_runnable_pool_item.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/pool/_runnable_pool_item.java.i new file mode 100644 index 0000000000000000000000000000000000000000..76364af38aaadb5d3a21ae4875bc8f8fbcfdbfb4 GIT binary patch literal 334 zcmZQzWME_f14cdu29}=?Hk0UoD0myq#mJQ$-B(f3$a8MmdMU;Kcak7#AY{dyvs2D` z9WfATy)O2Pul(tvgy7fu%1uTOF0?A06JGK%SAE8v=ugUBKi;KTEvkOG=%$KFd$GM= zo{`sAEq0bNXU&zbKjhjg^3K}O<2bu0#mu~NTKXc5Pdr>ZCL6xFad2{2&XV@t$=5Qr zTFX@VaxJuro*TbTPs^h5*Qzz^PVcf>`;BR0dUDQWnUvSfleHSW)a2rnCg$+kEidwQ z;Qk>u!HR#s^sPQN-Jl=BhtucDax!lJFVEg=I+@=n^85pH;Y-bKmvuYRyH2=@-q7vH zYF1p(oP5Kt`)Px1QkBZe+Ul}J?4be8W& Uz9d>!&3H6hb?f?kfi*VA0Cz-FOD`||a9Yrx1OMNtt)2RdbCUC6r%f}> zCr|&LX6E{}A(-j)GQpxr7Z&Xh^fwKj(rp%)wf1G3qr{P3Hwg!3KZEHrOAGqjB1{fD zNFVCGFg5I20-HGBbGOxzk}*m~XS)`ZUdWUy;k&(oeeK^BH~XT_{(UAiVUd5+;=uJc zjwMcbmK@JiFsIX5bwSNTp1k5T8R=ag-@LoT(yC{h@BA)<<%`CVlWNQKP2R6nzMt~- zfhtc{ANtNg$%cq=p>a}KdQ|Q_Cp|k(o5dV7j(gUVn zQU8w5=M+Ah;jr1^R=Tc~Z=>X^^r)$)K3zGyk7f63{}9Eiteq2@WhJKZ-+uhC;m?ZS zk+UMi{pZX*ykWxQH8albI6vu) zZvRy+Oe|&EeCb)~p-XQCm(2I?oq99=p1a=js-tP^P43D~{(WZO&pkl}r>4z+W_EtT zmK{RrdkgYE_3SDHMGq)SfuIH$v5jCB1CtDh2F2}Uk!+LYd9SD5TP(QsrT^rog)i>2 zL)1XXiaE&%309{L94KjG^!QN3*!kVzkL0oBn;b{V8*F0FH7)ux>B^HyS43KmEO|6( z(UB)YtpcroY>v;F^XJKtNmm;F{E<07=}HW*Z}x^`;XFKRUODuB^N>3I$vC(n%0}pO jP?3PtC8N(m#SLkqEK{F7RaH|=F%ex=xsxG?N9P*=$Hz2B literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/progress/_i_progress_listener.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/progress/_i_progress_listener.java.i new file mode 100644 index 0000000000000000000000000000000000000000..dfeb637b49e050ac7d2e5cf3d220b678cb0e2d27 GIT binary patch literal 323 zcmZQzWME`~fUOJ+j4vQersMyiKq%p(SIL4Hcf*8@r{BkVaQW|Y3WBN!Qx$X8PCUqU z$bhHqy!0E{qARkyD#aXccm{kB-DLW@%UCzpod418+b`S7BbiPaB~=QmvhyBz3UAm9Uf`Z<`zz;qf!gZzE}f{)z| hM}hN2k4>g4irhTY<&&`oq6S7XRs!|a0C`NjTmU|j3Qa1}dbE4?x>E7W+L270Pip@7 zo%{cVY1tQdwrd+aW@J>P1wpU!c^?|kUOtHIx}N3%%%TtKormNUo;I$kQn`PyS@g<_OW*g# zuh_ayHqzn4+cmA$A0IVEOMZQJU*&?e^4lGg4tTFfy_{9R#l;%dn%lM0ZN1tHc~7|= zr79;&!kpKc2}N*gS^1>DaWJnB-ZdjO_qKvP@83L`X$SWFaeo@N{&(%a_g#I7^PeC8 L@>)8q^m9D`kO#*U literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/progress/_progress_monitor.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/progress/_progress_monitor.java.i new file mode 100644 index 0000000000000000000000000000000000000000..eca811993f2f7c6a743f4517f4850472652ac0c8 GIT binary patch literal 945 zcmZQzWME_f1EzQe1}+%;_%%_=b|W9&U)LUH1S&JB|S+dhJBt z+%4{ZU+E{L^2=9Jj*a-c+wZu6kOVlP* zR?cGat%gfJOJ*ou=9;GWZL(G`kLsQt_c(zAZ}-=GHL#|8313cT*wd(SH_*r2`NPLE z;U2q`r4*O-ESW2q?(Z^-ar?h{<*#;qK7S|pVY{~mw#2UW813oIe88X^WJ)?Ernxug95!6`sWeg1xLdex_X~cRoLdKq za;Lq~$x8g|Z(taD`DEjvH3vnQv@2u$Udz6kBK^ItcGsKJ*Q!@vIemM{tHU3>zWole z{`{BwLOFjqD3O5@CJrf7FEpuuc+wgv7}9_!y#%Q zWW}81goHh(4jiaxZftDqoZj8oc$2l`?!!Hw9cnm_C08;Zd7o%=jX{C0?enjO3Zc{k@VxpN0q37GgS^12$ Q@rcRV%AE|ynJsSv01%n6iU0rr literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/src/org/anddev/andengine/util/sort/_insertion_sorter.java.i b/AndEngine/.hg/store/data/src/org/anddev/andengine/util/sort/_insertion_sorter.java.i new file mode 100644 index 0000000000000000000000000000000000000000..769e34acdecbc1ec81c0a77f6fa1b22efeb104ec GIT binary patch literal 1027 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 F2LRLS8U_FW literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/uml/andengine__classdiagram.png.i b/AndEngine/.hg/store/data/uml/andengine__classdiagram.png.i new file mode 100644 index 0000000000000000000000000000000000000000..567644b58cd22da6a3465fc21cc8fc72daab832c GIT binary patch literal 32951 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 literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/data/~2eclasspath.i b/AndEngine/.hg/store/data/~2eclasspath.i new file mode 100644 index 0000000000000000000000000000000000000000..07a7ab741d1b930547466c566f96dca6590aaaf4 GIT binary patch literal 946 zcmZQzWME`~fQ1YUj1o{b!+$8)y84jAhKRDWg8G|XXL|%*@Qu#722%r~E9Pw8xcOlX37Dqu`*g zL6eJ(xVwVC3I%(8k@*|b^v5>#(cLDQ+StQ?oA-R2IWs;gC?JZ-*i2LS5rcGXiaryA zxpee2uw#K<1A;uD2PcAA3=Fv-8sx|DmA*=s()>@R%jvq``Ip$gu`MYLss>C|%t=m2 zc#+bOkn1=5$($pP9yJ}A)Pw2x1#5#mvkE&W?UU6P5BM3Y@$K+JT}ylZWxD${V)ace z)i*D&2-VkK>Y~5eM1Ql(dF?CbjaBa5ysv-c;^p(E9`{*tj2Ql~YnOnmWaI~1%mZY> zT(S=&407$4-ixM%dCv^&zpN@VO_^n|^zPA@VATks6Uf{G<1$KvSzbWx%b{Wifix4y ztlfgDt*lH*?~grSX_InY(c|ZrH@Yx=AR6rRD`^bLZ0A=j;BO0R zV_t4O;mAptJ`fG|RYy7~P8pcpEIHCHJlX!-jMChsV!afgePH$WU=pO-1k7S!dIO{xK{n;? nWYkM7;I+!JVSW&oV+bu2u^8c0n)j z{(_AhP2zL-r@XE{aD&S(Z06cvC&rp4v*x#7CbLfsY+bD~bp?0u-b*IaG>XEES2s4k zTEl-}N#7g6CTWj@b6qkU)_vw!&>xW5regfWWMPt>DvSN6zk!q3o0fdo_WQF)-=#dH?^V9UY!lBXZJ$k7a8$|Gx7ZpTGA`?+X%{e>MJ|oLuHHtK0JP O-hHv&!+dE!UpWBveV7LT literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/dh/src/org/anddev/andengin/opengl/texture/source/decorato/rectanglelineargradi557b574af419ce9da084d7cb2edd96c8167e414d.i b/AndEngine/.hg/store/dh/src/org/anddev/andengin/opengl/texture/source/decorato/rectanglelineargradi557b574af419ce9da084d7cb2edd96c8167e414d.i new file mode 100644 index 0000000000000000000000000000000000000000..b1576e0930bef03d5064cf76b75fc30a56753137 GIT binary patch literal 623 zcmV-#0+9Ux0RRC20000000J)n014Ir0000000NQ!|NsC0|Ns9*@6`@MCXVXLcq#|4 zoSmM+olG+T00000000000001ZoXu9>Yui8!eoi3&gPukfT080bFggZZQ<4Stizcw= zn@_Qi*(akrryFDc`xM(*?JQ+&XGV;{mQK=rCw-QjtLUqW5s2eJS*>xieV~nv#ei~o zNdu4He8CtvDmcPGV??Yx@vA|9&^K95>>uO5SXJ_}6q`ZBlga2HW|b!eM2=Zt6%=&#aZ zKgf#y46&j^0any>?>^fljwbvDdAXush+peC0eH^^)>{zHAFC6dKqeGEo1v0(A` z36=JVaY441f=bz7U2R1z@$YBtqEpP#dt`V9%kt%TTG)G(;U?o{O&qQzRj}OBX}TR& z;lc{kwTiH#=GGz&lb1}RhK&qhAX^s`uZ+)BUVppQIEK7>)=a6TK(o5tQe`+k0l9bT z82x9XeImp@V? zmbOfchgf|800000000000001ZoXu9>Z`v>reg=vE;hrX1(E!u-u%b$Bq3w{mb_%UF zo+>xFfVIT7Y=>@|`oHh&gpERAE6T%=z>)8}-{0j>Ec(V~2vW}iCgK3mJD6E0;F5J&nv(fFs$^M_hz>tbdQCU-iJu;y*UoeY6HZA3!aKTbYQpqd~Z^N65 z@F6@KjqfK9ql?S4`|CS6fxa(%Ey-MROyim}DN^tZfvh-AK;Tnx)jk+hpo@gFq0|C( z$YP$GuY-R`FT+LeUr zRP)TWsqwt8*VTTh7hUbZR@rnV*5D-i7L{TS=K?^E3_6hyn%^-sE50C1ojDO$HWE_sk@1m z8BB78dgyjWcPuE>ghg1>texI2P-`CJAL=Y<2Z9u3ckrCsjH#0A#Y!de`E$u~zehp& zV|ll8ZG&3BDS5OyH7O?65q%vR5K)N{Xs-!SvSwA!O0`q%PO1tm&1ZA(u1L+Hzwp@3 zX$Fp9|xoMdY2*+Y-NY z8Ef|BhtR3ESFDio<_oCma@r|7dr{GMO9jLs!eJJ^uo| GEp}18QGT}o literal 0 HcmV?d00001 diff --git a/AndEngine/.hg/store/fncache b/AndEngine/.hg/store/fncache new file mode 100644 index 0000000..d6b232f --- /dev/null +++ b/AndEngine/.hg/store/fncache @@ -0,0 +1,698 @@ +data/src/org/anddev/andengine/ui/activity/BaseActivity.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BasePairFromToModifier.java.i +data/src/org/anddev/andengine/util/modifier/util/ModifierUtils.java.i +data/src/org/anddev/andengine/entity/particle/initializer/RotationInitializer.java.i +data/src/org/anddev/andengine/opengl/texture/builder/BlackPawnTextureBuilder.java.i +data/src/org/anddev/andengine/util/modifier/SequenceModifier.java.i +data/src/org/anddev/andengine/util/ListUtils.java.i +data/src/org/anddev/andengine/entity/scene/background/BaseBackground.java.i +data/src/org/anddev/andengine/entity/FrameLengthLogger.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseBackIn.java.i +data/src/org/anddev/andengine/entity/particle/emitter/RectangleOutlineParticleEmitter.java.i +data/src/org/anddev/andengine/util/Base64InputStream.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/SequenceModifier.java.i +data/src/org/anddev/andengine/entity/handler/collision/ICollisionCallback.java.i +data/src/org/anddev/andengine/sensor/BaseSensorData.java.i +data/src/org/anddev/andengine/entity/menu/animator/DirectMenuAnimator.java.i +data/src/org/anddev/andengine/entity/primitives/Shape.java.i +data/src/org/anddev/andengine/entity/particle/modifier/ExpireModifier.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroupProperty.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseSineOut.java.i +data/src/org/anddev/andengine/collision/BaseCollisionChecker.java.i +data/src/org/anddev/andengine/entity/scene/menu/animator/BaseMenuAnimator.java.i +data/src/org/anddev/andengine/util/Path.java.i +data/src/org/anddev/andengine/util/MathUtils.java.i +data/src/org/anddev/andengine/sensor/location/ILocationListener.java.i +data/src/org/anddev/andengine/entity/util/ScreenGrabber.java.i +data/src/org/anddev/andengine/engine/camera/hud/controls/BaseOnScreenControl.java.i +data/src/org/anddev/andengine/entity/text/Text.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/ColoredTextMenuItem.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/MoveModifier.java.i +data/src/org/anddev/andengine/entity/shape/modifier/RotationByModifier.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseBackOut.java.i +data/src/org/anddev/andengine/opengl/texture/region/BaseTextureRegion.java.i +data/src/org/anddev/andengine/engine/easying/Easing.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuintOut.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseSingleValueChangeModifier.java.i +data/src/org/anddev/andengine/util/TransformationPool.java.i +data/src/org/anddev/andengine/opengl/view/EGLConfigChooser.java.i +data/src/org/anddev/andengine/opengl/font/Font.java.i +data/src/org/anddev/andengine/entity/modifier/ColorModifier.java.i +data/src/org/anddev/andengine/util/modifier/BaseDoubleValueSpanModifier.java.i +data/src/org/anddev/andengine/opengl/view/BaseConfigChooser.java.i +data/src/org/anddev/andengine/entity/HorizontalAlign.java.i +data/src/org/anddev/andengine/opengl/texture/TextureRegion.java.i +data/src/org/anddev/andengine/opengl/texture/TiledTextureRegion.java.i +data/src/org/anddev/andengine/util/MultiKeyHashMap.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseStrongIn.java.i +data/src/org/anddev/andengine/entity/shape/modifier/FadeInModifier.java.i +data/src/org/anddev/andengine/input/touch/controller/ITouchController.java.i +data/ant/exportJarToVolcanoLiveWallpaper.xml.i +data/src/org/anddev/andengine/entity/util/FPSCounter.java.i +data/src/org/anddev/andengine/ui/dialog/StringInputDialoguilder.java.i +data/src/org/anddev/andengine/entity/menu/animator/AlphaMenuAnimator.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/IMenuItem.java.i +data/src/org/anddev/andengine/engine/handler/runnable/RunnableHandler.java.i +data/src/org/anddev/andengine/util/levelstats/LevelStatsDBConnector.java.i +data/src/org/anddev/andengine/util/ProgressCallable.java.i +data/src/org/anddev/andengine/sensor/accelerometer/AccelerometerSensorOptions.java.i +data/src/org/anddev/andengine/level/util/constants/LevelConstants.java.i +data/src/org/anddev/andengine/entity/sprite/AnimatedSpriteRenderer.java.i +data/src/org/anddev/andengine/util/VerticalAlign.java.i +data/src/org/anddev/andengine/util/HashtableUtils.java.i +data/ext/img/logo4.png.i +data/src/org/anddev/andengine/engine/camera/Camera.java.i +data/src/org/anddev/andengine/engine/handler/IUpdateHandler.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseExponentialOut.java.i +data/src/org/anddev/andengine/entity/layer/LayerSorter.java.i +data/src/org/anddev/andengine/entity/modifier/MoveModifier.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BasePairInitializer.java.i +data/src/org/anddev/andengine/util/progress/ProgressCallable.java.i +data/src/org/anddev/andengine/entity/scene/background/ParallaxBackground.java.i +data/src/org/anddev/andengine/entity/particle/modifier/RotationInitializer.java.i +data/ant/exportJarToAndEnginePlayground.xml.i +data/ant/exportJarToAndEnginePhysicsBox2D.xml.i +data/src/org/anddev/andengine/entity/util/AverageFPSCounter.java.i +data/src/org/anddev/andengine/entity/scene/background/AutoParallaxBackground.java.i +data/src/org/anddev/andengine/entity/shape/modifier/SingleValueSpanShapeModifier.java.i +data/src/org/anddev/andengine/util/pool/EntityRemoveRunnablePoolUpdateHandler.java.i +data/src/org/anddev/andengine/entity/particle/emitter/IParticleEmitter.java.i +data/ant/exportJarToHeliTaxi.xml.i +data/src/org/anddev/andengine/entity/particle/modifier/OffCameraExpireModifier.java.i +data/src/org/anddev/andengine/entity/scene/background/modifier/IBackgroundModifier.java.i +data/src/org/anddev/andengine/entity/layer/BaseLayer.java.i +data/src/org/anddev/andengine/util/modifier/LoopModifier.java.i +data/src/org/anddev/andengine/physics/PhysicsData.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseStrongInOut.java.i +data/src/org/anddev/andengine/opengl/text/Rectangle.java.i +data/src/org/anddev/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseStrongInOut.java.i +data/src/org/anddev/andengine/opengl/texture/region/buffer/TextureRegionBuffer.java.i +data/src/org/anddev/andengine/entity/modifier/SingleValueSpanShapeModifier.java.i +data/ext/img/splash.svg.i +data/src/org/anddev/andengine/opengl/view/LogWriter.java.i +data/src/org/anddev/andengine/opengl/view/camera/ChaseCamera.java.i +data/src/org/anddev/andengine/entity/IStaticEntity.java.i +data/src/org/anddev/andengine/collision/ShapeCollisionChecker.java.i +data/src/org/anddev/andengine/util/path/astar/EuclideanHeuristic.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuadOut.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroup.java.i +data/src/org/anddev/andengine/opengl/texture/PackableTexture.java.i +data/push_buxs.bat.i +data/src/org/anddev/andengine/entity/shape/modifier/MoveYModifier.java.i +data/src/org/anddev/andengine/engine/options/RenderOptions.java.i +data/ext/img/logo.png.i +data/src/org/anddev/andengine/entity/sprite/TiledSprite.java.i +data/src/org/anddev/andengine/opengl/font/FontFactory.java.i +data/src/org/anddev/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayer.java.i +data/src/org/anddev/andengine/opengl/text/Glyph.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMap.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseDoubleValueSpanModifier.java.i +data/src/org/anddev/andengine/engine/camera/ZoomCamera.java.i +data/src/org/anddev/andengine/entity/modifier/PathModifier.java.i +data/src/org/anddev/andengine/entity/IUpdateHandler.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectProperty.java.i +data/src/org/anddev/andengine/util/path/Path.java.i +data/src/org/anddev/andengine/engine/camera/ChaseCamera.java.i +data/src/org/anddev/andengine/opengl/texture/region/buffer/BaseTextureRegionBuffer.java.i +data/src/org/anddev/andengine/sensor/location/LocationProviderStatus.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseSineIn.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ArcTextureSourceDecoratorShape.java.i +data/src/org/anddev/andengine/entity/StaticEntity.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTile.java.i +data/src/org/anddev/andengine/entity/particle/modifier/AccelerationInitializer.java.i +data/src/org/anddev/andengine/opengl/view/camera/SmoothCamera.java.i +data/src/org/anddev/andengine/entity/primitive/BaseRectangle.java.i +data/src/org/anddev/andengine/entity/particle/initializer/BaseTripleValueInitializer.java.i +data/src/org/anddev/andengine/entity/scene/popup/TextPopupScene.java.i +data/src/org/anddev/andengine/entity/handler/runnable/RunnableHandler.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuartOut.java.i +data/src/org/anddev/andengine/collision/CollisionChecker.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileSet.java.i +data/src/org/anddev/andengine/ui/dialog/GenericInputDialogBuilder.java.i +data/src/org/anddev/andengine/util/StreamUtils.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseCubicOut.java.i +data/src/org/anddev/andengine/util/HorizontalAlign.java.i +data/src/org/anddev/andengine/entity/sprite/Sprite.java.i +data/src/org/anddev/andengine/entity/util/FrameLengthLogger.java.i +data/src/org/anddev/andengine/opengl/view/camera/Camera.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseBackInOut.java.i +data/src/org/anddev/andengine/entity/particle/ParticleEngine.java.i +data/src/org/anddev/andengine/util/progress/ProgressMonitor.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java.i +data/src/org/anddev/andengine/util/path/astar/IAStarHeuristic.java.i +data/src/org/anddev/andengine/opengl/texture/source/AssetTextureSource.java.i +data/src/org/anddev/andengine/entity/shape/modifier/LoopModifier.java.i +data/src/org/anddev/andengine/entity/primitives/BaseRectangle.java.i +data/src/org/anddev/andengine/entity/util/FrameCountCrasher.java.i +data/src/org/anddev/andengine/ui/activity/BaseGameActivity.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/BaseFromToModifier.java.i +data/src/org/anddev/andengine/entity/sprite/TiledSpriteRenderer.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/RectangleFillTextureSourceDecorator.java.i +data/.project.i +data/src/org/anddev/andengine/util/IMatcher.java.i +data/exportJarToAll.xml.i +data/src/org/anddev/andengine/opengl/font/Size.java.i +data/src/org/anddev/andengine/util/modifier/ease/IEaseFunction.java.i +data/src/org/anddev/andengine/entity/FPSCounter.java.i +data/src/org/anddev/andengine/entity/util/ITouchArea.java.i +data/ant/exportJarToCigaretteLiveWallpaper.xml.i +data/src/org/anddev/andengine/level/LevelParser.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseCircularInOut.java.i +data/src/org/anddev/andengine/opengl/vertex/LineVertexBuffer.java.i +data/src/org/anddev/andengine/entity/modifier/MoveYModifier.java.i +data/src/org/anddev/andengine/audio/BaseAudioManager.java.i +data/src/org/anddev/andengine/engine/FixedFPSEngine.java.i +data/src/org/anddev/andengine/entity/shape/IRenderer.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuadIn.java.i +data/src/org/anddev/andengine/engine/options/TouchOptions.java.i +data/src/org/anddev/andengine/util/SmartList.java.i +data/src/org/anddev/andengine/entity/particle/initializer/AlphaInitializer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/MoveXModifier.java.i +data/src/org/anddev/andengine/util/constants/ColorConstants.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ITextureSourceDecoratorShape.java.i +data/src/org/anddev/andengine/entity/particle/initializer/BaseSingleValueInitializer.java.i +data/src/org/anddev/andengine/entity/particle/modifier/VelocityModifier.java.i +data/ant/exportJarToBoxFaceStacker.xml.i +data/src/org/anddev/andengine/opengl/vertex/VertexBuffer.java.i +data/src/org/anddev/andengine/entity/particle/modifier/ScaleModifier.java.i +data/src/org/anddev/andengine/collision/RectangularShapeCollisionChecker.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseCubicInOut.java.i +data/src/org/anddev/andengine/opengl/texture/source/ResourceTextureSource.java.i +data/src/org/anddev/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java.i +data/test/org/anddev/andengine/util/StringUtilsTest.java.i +data/src/org/anddev/andengine/opengl/texture/ResourceTexture.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseTripleValueSpanModifier.java.i +data/exportJarToAndEngineLiveWallpaper.xml.i +data/src/org/anddev/andengine/util/modifier/BaseSingleValueChangeModifier.java.i +data/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolItem.java.i +data/ant/exportJarToSuperDroid.xml.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/constants/TMXConstants.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXException.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseBounceInOut.java.i +data/exportJarToHeliTaxi.xml.i +data/src/org/anddev/andengine/entity/particle/initializer/BaseDoubleValueInitializer.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuartIn.java.i +data/src/org/anddev/andengine/opengl/texture/buffer/TextureRegionBuffer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/DurationShapeModifier.java.i +data/src/org/anddev/andengine/entity/text/TextRenderer.java.i +data/src/org/anddev/andengine/entity/menu/IOnMenuItemClickerListener.java.i +data/src/org/anddev/andengine/sensor/orientation/OrientationSensorOptions.java.i +data/src/org/anddev/andengine/entity/particle/initializer/VelocityInitializer.java.i +data/src/org/anddev/andengine/entity/ScreenCapture.java.i +data/src/org/anddev/andengine/entity/scene/background/RepeatingSpriteBackground.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/ScaleTextMenuItem.java.i +data/src/org/anddev/andengine/entity/shape/modifier/RotateModifier.java.i +data/src/org/anddev/andengine/entity/layer/ILayer.java.i +data/src/org/anddev/andengine/entity/BaseEntity.java.i +data/src/org/anddev/andengine/entity/modifier/SequenceEntityModifier.java.i +data/src/org/anddev/andengine/entity/text/ChangeableText.java.i +data/src/org/anddev/andengine/engine/DoubleSceneSplitScreenEngine.java.i +data/src/org/anddev/andengine/engine/SingleSceneSplitScreenEngine.java.i +data/src/org/anddev/andengine/entity/particle/IParticleModifier.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseCircularInOut.java.i +data/src/org/anddev/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java.i +data/src/org/anddev/andengine/entity/modifier/RotationModifier.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseCubicInOut.java.i +data/src/org/anddev/andengine/engine/SplitScreenEngineOptions.java.i +data/src/org/anddev/andengine/util/modifier/BaseSingleValueSpanModifier.java.i +data/src/org/anddev/andengine/audio/IAudioManager.java.i +data/src/org/anddev/andengine/opengl/view/SimpleEGLConfigChooser.java.i +data/src/org/anddev/andengine/entity/particle/initializer/GravityInitializer.java.i +data/src/org/anddev/andengine/sensor/accelerometer/IAccelerometerListener.java.i +data/exportJarToSpaceTaxi.xml.i +data/ext/img/logo.svg.i +data/src/org/anddev/andengine/entity/particle/initializer/ColorInitializer.java.i +data/src/org/anddev/andengine/entity/particle/modifier/GravityInitializer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuartIn.java.i +data/src/org/anddev/andengine/opengl/texture/TextureRegionFactory.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseBounceIn.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLoader.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXLoadException.java.i +data/src/org/anddev/andengine/util/FileUtils.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/EllipseTextureSourceDecoratorShape.java.i +data/src/org/anddev/andengine/opengl/texture/source/ITextureSource.java.i +data/src/org/anddev/andengine/opengl/buffer/BufferObjectManager.java.i +data/src/org/anddev/andengine/entity/particle/modifier/VelocityInitializer.java.i +data/src/org/anddev/andengine/engine/handler/BaseEntityUpdateHandler.java.i +data/src/org/anddev/andengine/opengl/vertex/TextVertexBuffer.java.i +data/src/org/anddev/andengine/util/path/ITiledMap.java.i +data/src/org/anddev/andengine/engine/camera/BoundCamera.java.i +data/src/org/anddev/andengine/entity/particle/initializer/IParticleInitializer.java.i +data/src/org/anddev/andengine/entity/particle/ParticleSystem.java.i +data/src/org/anddev/andengine/entity/particle/modifier/AlphaModifier.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseCircularIn.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/AlphaModifier.java.i +data/src/org/anddev/andengine/entity/handler/timer/TimerHandler.java.i +data/src/org/anddev/andengine/audio/music/Music.java.i +data/ant/exportJarToAndEngineLiveWallpaper.xml.i +data/src/org/anddev/andengine/entity/FrameCounter.java.i +data/src/org/anddev/andengine/entity/shape/Shape.java.i +data/src/org/anddev/andengine/util/Transformation.java.i +data/src/org/anddev/andengine/input/touch/controller/MultiTouchControler.java.i +data/ext/img/badge.svg.i +data/src/org/anddev/andengine/entity/particle/modifier/AlphaInitializer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseShapeModifier.java.i +data/src/org/anddev/andengine/util/pool/Pool.java.i +data/src/org/anddev/andengine/entity/text/TickerText.java.i +data/src/org/anddev/andengine/entity/particle/emitter/CircleParticleEmitter.java.i +data/src/org/anddev/andengine/sensor/accelerometer/AccelerometerData.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/BaseModifier.java.i +data/src/org/anddev/andengine/entity/shape/IModifierListener.java.i +data/ext/img/icon.svg.i +data/src/org/anddev/andengine/entity/shape/modifier/MoveModifier.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseCubicOut.java.i +data/src/org/anddev/andengine/opengl/texture/buffer/TiledTextureBuffer.java.i +data/src/org/anddev/andengine/entity/BaseStaticEntity.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/ColorKeyTextureSourceDecorator.java.i +data/src/org/anddev/andengine/entity/sprite/ISpriteModifier.java.i +data/src/org/anddev/andengine/engine/camera/hud/HUD.java.i +data/src/org/anddev/andengine/util/constants/MathConstants.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/ITMXTilePropertiesListener.java.i +data/src/org/anddev/andengine/input/touch/ITouchArea.java.i +data/src/org/anddev/andengine/engine/options/WakeLockOptions.java.i +data/src/org/anddev/andengine/opengl/texture/source/OutlineTextureSourceDecorator.java.i +data/src/org/anddev/andengine/util/UserTask.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/RectangleLinearGradientFillTextureSourceDecorator.java.i +data/src/org/anddev/andengine/entity/scene/SplashScene.java.i +data/src/org/anddev/andengine/util/SystemUtils.java.i +data/src/org/anddev/andengine/opengl/texture/buffer/BaseTextureBuffer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseLinear.java.i +data/src/org/anddev/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java.i +data/src/org/anddev/andengine/entity/Layer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ScaleModifier.java.i +data/src/org/anddev/andengine/entity/handler/timer/ITimerCallback.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/FillTextureSourceDecorator.java.i +data/src/org/anddev/andengine/input/touch/IOnSceneTouchListener.java.i +data/exportJarToAndEngineExamples.xml.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseShapeDurationModifier.java.i +data/src/org/anddev/andengine/engine/handler/timer/TimerHandler.java.i +data/src/org/anddev/andengine/entity/modifier/EntityModifierList.java.i +data/src/org/anddev/andengine/util/Base64.java.i +data/src/org/anddev/andengine/util/SimplePreferences.java.i +data/src/org/anddev/andengine/util/sort/InsertionSorter.java.i +data/src/org/anddev/andengine/engine/options/SplitScreenEngineOptions.java.i +data/src/org/anddev/andengine/util/path/IPathFinder.java.i +data/src/org/anddev/andengine/audio/sound/SoundFactory.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseCubicIn.java.i +data/ext/img/index.html.i +data/src/org/anddev/andengine/opengl/texture/source/TextureSourceDecorator.java.i +data/src/org/anddev/andengine/opengl/texture/region/TextureRegion.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ShapeModifier.java.i +data/src/org/anddev/andengine/entity/primitive/RectangularShape.java.i +data/src/org/anddev/andengine/physics/DynamicPhysicsBody.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BaseDoubleValueSpanModifier.java.i +data/src/org/anddev/andengine/opengl/IRenderHandler.java.i +data/.classpath.i +data/src/org/anddev/andengine/sensor/accelerometer/AccelerometerListener.java.i +data/src/org/anddev/andengine/engine/FixedStepEngine.java.i +data/build_hudson.xml.i +data/src/org/anddev/andengine/entity/modifier/MoveXModifier.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseChangeModifier.java.i +data/src/org/anddev/andengine/entity/sprite/IModifierListener.java.i +data/src/org/anddev/andengine/engine/handler/timer/ITimerCallback.java.i +data/src/org/anddev/andengine/engine/EngineHook.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseExponentialInOut.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseExponentialOut.java.i +data/src/org/anddev/andengine/collision/LineCollisionChecker.java.i +data/src/org/anddev/andengine/opengl/texture/Texture.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/CircleFillTextureSourceDecorator.java.i +data/src/org/anddev/andengine/util/modifier/BaseDurationModifier.java.i +data/src/org/anddev/andengine/engine/options/FixedFPSEngineOptions.java.i +data/src/org/anddev/andengine/engine/LimitedFPSEngine.java.i +data/src/org/anddev/andengine/physics/IPhysicsSpace.java.i +data/src/org/anddev/andengine/engine/handler/collision/CollisionHandler.java.i +data/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolUpdateHandler.java.i +data/ant/exportJarToLavaLampLiveWallpaper.xml.i +data/src/org/anddev/andengine/entity/modifier/TripleValueSpanShapeModifier.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseBounceIn.java.i +data/src/org/anddev/andengine/input/touch/detector/SurfaceScrollDetector.java.i +data/ext/img/source.png.i +data/src/org/anddev/andengine/ui/activity/LayoutGameActivity.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseElasticOut.java.i +data/src/org/anddev/andengine/entity/shape/modifier/RotationAtModifier.java.i +data/src/org/anddev/andengine/input/touch/TouchEvent.java.i +data/src/org/anddev/andengine/entity/particle/modifier/RotateModifier.java.i +data/src/org/anddev/andengine/input/touch/controller/SingleTouchControler.java.i +data/src/org/anddev/andengine/audio/IAudioEntity.java.i +data/src/org/anddev/andengine/opengl/util/FastFloatBuffer.java.i +data/ant/exportJarToHeliTaxiShared.xml.i +data/src/org/anddev/andengine/engine/SmoothEngine.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuintOut.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseBounceOut.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileProperty.java.i +data/src/org/anddev/andengine/opengl/texture/region/TiledTextureRegion.java.i +data/src/org/anddev/andengine/entity/background/BaseBackground.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObject.java.i +data/src/org/anddev/andengine/sensor/SensorDelay.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/BaseShapeTextureSourceDecorator.java.i +data/src/org/anddev/andengine/entity/particle/modifier/RotateInitialize.java.i +data/src/org/anddev/andengine/entity/scene/menu/animator/SlideMenuAnimator.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseCircularOut.java.i +data/src/org/anddev/andengine/audio/sound/SoundManager.java.i +data/src/org/anddev/andengine/entity/particle/modifier/RotationModifier.java.i +data/src/org/anddev/andengine/input/touch/detector/ClickDetector.java.i +data/src/org/anddev/andengine/entity/particle/modifier/ColorModifier.java.i +data/src/org/anddev/andengine/audio/music/MusicManager.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseElasticIn.java.i +data/src/org/anddev/andengine/opengl/texture/buffer/TextureBuffer.java.i +data/src/org/anddev/andengine/opengl/texture/builder/ITextureBuilder.java.i +data/default.properties.i +data/src/org/anddev/andengine/audio/music/MusicFactory.java.i +data/src/org/anddev/andengine/physics/StaticPhysicsBody.java.i +data/src/org/anddev/andengine/opengl/text/Font.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuadInOut.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuadOut.java.i +data/src/org/anddev/andengine/entity/sprite/BaseSprite.java.i +data/src/org/anddev/andengine/opengl/texture/TextureFactory.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RoundedRectangleTextureSourceDecoratorShape.java.i +data/src/org/anddev/andengine/util/SocketUtils.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperties.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/OutlineTextureSourceDecorator.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXLoader.java.i +data/src/org/anddev/andengine/input/touch/IOnAreaTouchListener.java.i +data/src/org/anddev/andengine/util/ColorUtils.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java.i +data/src/org/anddev/andengine/entity/particle/modifier/GravityModifier.java.i +data/src/org/anddev/andengine/input/touch/detector/HoldDetector.java.i +data/src/org/anddev/andengine/opengl/IDrawable.java.i +data/src/org/anddev/andengine/entity/UpdateHandlerList.java.i +data/src/org/anddev/andengine/entity/shape/modifier/AlphaModifier.java.i +data/src/org/anddev/andengine/util/modifier/BaseTripleValueSpanModifier.java.i +data/src/org/anddev/andengine/util/modifier/ParallelModifier.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BaseDoubleValueInitializer.java.i +data/src/org/anddev/andengine/entity/scene/transition/FadeTransitionScene.java.i +data/src/org/anddev/andengine/util/modifier/IModifier.java.i +data/uml/andengine_classdiagram.ucls.i +data/src/org/anddev/andengine/util/pool/GenericPool.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/BasePairFromToModifier.java.i +data/src/org/anddev/andengine/opengl/texture/factory/TextureRegionFactory.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseElasticIn.java.i +data/src/org/anddev/andengine/entity/group/TransformationGroup.java.i +data/src/org/anddev/andengine/entity/util/FPSLogger.java.i +data/ant/exportJarToHighRise.xml.i +data/src/org/anddev/andengine/util/Library.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/BaseTextureSourceDecorator.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseBounceOut.java.i +data/src/org/anddev/andengine/util/path/astar/AStarPathFinder.java.i +data/src/org/anddev/andengine/util/pool/PoolUpdateHandler.java.i +data/src/org/anddev/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java.i +data/ext/img/badge.png.i +data/src/org/anddev/andengine/entity/particle/emitter/BaseRectangleParticleEmitter.java.i +data/src/org/anddev/andengine/entity/primitives/Rectangle.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayerProperty.java.i +data/src/org/anddev/andengine/entity/modifier/ScaleModifier.java.i +data/src/org/anddev/andengine/entity/scene/menu/animator/DirectMenuAnimator.java.i +data/src/org/anddev/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java.i +data/src/org/anddev/andengine/engine/handler/collision/ICollisionCallback.java.i +data/src/org/anddev/andengine/input/touch/detector/SurfaceGestureDetector.java.i +data/src/org/anddev/andengine/entity/particle/emitter/BaseParticleEmitter.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/IEaseFunction.java.i +data/ext/img/favicon.png.i +data/src/org/anddev/andengine/opengl/texture/TiledTexture.java.i +data/src/org/anddev/andengine/util/cache/RectangleVertexBufferCache.java.i +data/src/org/anddev/andengine/opengl/texture/region/TextureRegionLibrary.java.i +data/src/org/anddev/andengine/opengl/texture/factory/TextureFactory.java.i +data/ant/exportJarToHeliTaxiLiveWallpaper.xml.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/RadialGradientFillTextureSourceDecorator.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ParallelShapeModifier.java.i +data/src/org/anddev/andengine/util/path/astar/NullHeuristic.java.i +data/src/org/anddev/andengine/entity/particle/emitter/BaseCircleParticleEmitter.java.i +data/src/org/anddev/andengine/entity/scene/background/EntityBackground.java.i +data/src/org/anddev/andengine/entity/modifier/RotationAtModifier.java.i +data/src/org/anddev/andengine/util/MultiKey.java.i +data/src/org/anddev/andengine/util/DataUtils.java.i +data/src/org/anddev/andengine/util/path/Direction.java.i +data/src/org/anddev/andengine/entity/scene/transition/BaseTransitionScene.java.i +data/src/org/anddev/andengine/opengl/view/GLWrapper.java.i +data/src/org/anddev/andengine/entity/sprite/SpriteRenderer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuadInOut.java.i +data/src/org/anddev/andengine/entity/background/FixedColorBackground.java.i +data/src/org/anddev/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java.i +data/src/org/anddev/andengine/entity/IEntity.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseBounceInOut.java.i +data/AndroidManifest.xml.i +data/src/org/anddev/andengine/entity/modifier/FadeOutModifier.java.i +data/lib/libProgressMonitor.jar.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseBackIn.java.i +data/src/org/anddev/andengine/entity/scene/popup/PopupScene.java.i +data/src/org/anddev/andengine/entity/shape/GLShape.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseCircularIn.java.i +data/src/org/anddev/andengine/entity/modifier/ParallelEntityModifier.java.i +data/hudson_build.xml.i +data/src/org/anddev/andengine/entity/shape/modifier/ColorModifier.java.i +data/src/org/anddev/andengine/engine/UpdateHandlerList.java.i +data/src/org/anddev/andengine/entity/SplashScene.java.i +data/src/org/anddev/andengine/entity/ISceneTouchListener.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseModifier.java.i +data/src/org/anddev/andengine/entity/primitive/Line.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BaseTripleValueInitializer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/RotateByModifier.java.i +data/src/org/anddev/andengine/sensor/orientation/OrientationData.java.i +data/exportJarToHeliTaxiLiveWallpaper.xml.i +data/src/org/anddev/andengine/entity/scene/background/modifier/ColorModifier.java.i +data/src/org/anddev/andengine/entity/menu/MenuScene.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/ColorTextMenuItem.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuintIn.java.i +data/src/org/anddev/andengine/engine/camera/CameraFactory.java.i +data/src/org/anddev/andengine/util/Callback.java.i +data/src/org/anddev/andengine/entity/shape/modifier/PathModifier.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ScaleAtModifier.java.i +data/src/org/anddev/andengine/util/ActivityUtils.java.i +data/src/org/anddev/andengine/entity/shape/RectangleRenderer.java.i +data/src/org/anddev/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java.i +data/ext/img/splash.png.i +data/src/org/anddev/andengine/entity/layer/DynamicCapacityLayer.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/RotateModifier.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/TextMenuItem.java.i +data/src/org/anddev/andengine/entity/shape/modifier/IShapeModifier.java.i +data/src/org/anddev/andengine/entity/IDynamicEntity.java.i +data/src/org/anddev/andengine/entity/modifier/ScaleAtModifier.java.i +data/src/org/anddev/andengine/util/BetaUtils.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BaseTripleValueSpanModifier.java.i +data/src/org/anddev/andengine/engine/options/FixedStepEngineOptions.java.i +data/src/org/anddev/andengine/entity/particle/modifier/AccelerationModifier.java.i +data/src/org/anddev/andengine/util/progress/IProgressListener.java.i +data/src/org/anddev/andengine/engine/handler/physics/PhysicsHandler.java.i +data/src/org/anddev/andengine/entity/modifier/AlphaModifier.java.i +data/src/org/anddev/andengine/sensor/location/LocationSensorOptions.java.i +data/src/org/anddev/andengine/util/pool/RunnablePoolItem.java.i +data/src/org/anddev/andengine/opengl/texture/buffer/BaseTextureRegionBuffer.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXParseException.java.i +data/src/org/anddev/andengine/opengl/texture/region/TextureRegionFactory.java.i +data/src/org/anddev/andengine/entity/modifier/IEntityModifier.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseStrongIn.java.i +data/src/org/anddev/andengine/entity/shape/BaseRenderer.java.i +data/src/org/anddev/andengine/input/touch/controller/BaseTouchController.java.i +data/src/org/anddev/andengine/engine/handler/UpdateHandlerList.java.i +data/src/org/anddev/andengine/opengl/texture/source/FileTextureSource.java.i +data/src/org/anddev/andengine/entity/shape/RectangularShape.java.i +data/src/org/anddev/andengine/opengl/texture/FontManager.java.i +data/src/org/anddev/andengine/opengl/texture/TextureAtlas.java.i +data/src/org/anddev/andengine/opengl/texture/TextureManager.java.i +data/src/org/anddev/andengine/entity/util/ScreenCapture.java.i +data/src/org/anddev/andengine/opengl/GLHelper.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseSineIn.java.i +data/src/org/anddev/andengine/opengl/font/Letter.java.i +data/src/org/anddev/andengine/util/path/astar/ManhattanHeuristic.java.i +data/src/org/anddev/andengine/entity/shape/modifier/DoubleValueSpanShapeModifier.java.i +data/ant/exportJarToCampfireLiveWallpaper.xml.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseBackInOut.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/DelayModifier.java.i +data/src/org/anddev/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java.i +data/src/org/anddev/andengine/entity/particle/initializer/AccelerationInitializer.java.i +data/src/org/anddev/andengine/util/ProbabilityGenerator.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BasePairInitializeModifier.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuartInOut.java.i +data/src/org/anddev/andengine/engine/camera/SmoothCamera.java.i +data/src/org/anddev/andengine/entity/shape/modifier/util/ShapeModifierUtils.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseBackOut.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXParseException.java.i +data/src/org/anddev/andengine/entity/sprite/AnimatedSprite.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXParser.java.i +data/src/org/anddev/andengine/entity/particle/modifier/RotateInitializer.java.i +data/ext/img/clapboard.png.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseCircularOut.java.i +data/src/org/anddev/andengine/util/modifier/ModifierList.java.i +data/src/org/anddev/andengine/entity/shape/modifier/FadeOutModifier.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseSineInOut.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/CircleOutlineTextureSourceDecorator.java.i +data/exportJarToHeliTaxiShared.xml.i +data/src/org/anddev/andengine/entity/shape/modifier/TripleValueSpanShapeModifier.java.i +data/ext/img/logo2.png.i +data/src/org/anddev/andengine/entity/modifier/DoubleValueSpanShapeModifier.java.i +data/src/org/anddev/andengine/physics/PhysicsShape.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuadIn.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXLoadException.java.i +data/src/org/anddev/andengine/util/ViewUtils.java.i +data/src/org/anddev/andengine/opengl/texture/source/ColorKeyTextureSourceDecorator.java.i +data/src/org/anddev/andengine/entity/layer/FixedCapacityLayer.java.i +data/src/org/anddev/andengine/entity/scene/menu/item/SpriteMenuItem.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuintIn.java.i +data/src/org/anddev/andengine/opengl/texture/AssetTexture.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseSineOut.java.i +data/src/org/anddev/andengine/util/StringUtils.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/CircleTextureSourceDecoratorShape.java.i +data/src/org/anddev/andengine/entity/util/IOnAreaTouchListener.java.i +data/src/org/anddev/andengine/entity/scene/background/SpriteBackground.java.i +data/src/org/anddev/andengine/entity/shape/modifier/LoopShapeModifier.java.i +data/src/org/anddev/andengine/opengl/vertex/RectangleVertexBuffer.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseElasticInOut.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseLinear.java.i +data/src/org/anddev/andengine/opengl/text/Size.java.i +data/src/org/anddev/andengine/opengl/texture/source/packing/BlackPawnTextureSourcePackingAlgorithm.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseElasticInOut.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ParallelModifier.java.i +data/src/org/anddev/andengine/entity/modifier/RotationByModifier.java.i +data/src/org/anddev/andengine/level/LevelLoader.java.i +data/src/org/anddev/andengine/entity/Scene.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseStrongOut.java.i +data/src/org/anddev/andengine/util/TimeUtils.java.i +data/src/org/anddev/andengine/entity/scene/menu/MenuScene.java.i +data/src/org/anddev/andengine/util/ArrayUtils.java.i +data/src/org/anddev/andengine/opengl/texture/buffer/TiledTextureRegionBuffer.java.i +data/src/org/anddev/andengine/entity/menu/animator/BaseMenuAnimator.java.i +data/src/org/anddev/andengine/engine/camera/SmoothChaseCamera.java.i +data/src/org/anddev/andengine/entity/handler/collision/CollisionHandler.java.i +data/src/org/anddev/andengine/entity/particle/emitter/PointParticleEmitter.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuintInOut.java.i +data/src/org/anddev/andengine/ui/IGameInterface.java.i +data/src/org/anddev/andengine/util/AsyncCallable.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseStrongOut.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseExponentialIn.java.i +data/src/org/anddev/andengine/entity/shape/IShape.java.i +data/src/org/anddev/andengine/entity/scene/background/ColorBackground.java.i +data/src/org/anddev/andengine/input/touch/detector/BaseDetector.java.i +data/src/org/anddev/andengine/engine/IUpdateHandler.java.i +data/src/org/anddev/andengine/entity/menu/animator/SlideMenuAnimator.java.i +data/ext/img/source.svg.i +data/src/org/anddev/andengine/util/constants/MIMETypes.java.i +data/src/org/anddev/andengine/entity/modifier/LoopEntityModifier.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMapProperty.java.i +data/src/org/anddev/andengine/opengl/util/GLHelper.java.i +data/src/org/anddev/andengine/entity/layer/Layer.java.i +data/src/org/anddev/andengine/opengl/view/RenderSurfaceView.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseQuartInOut.java.i +data/src/org/anddev/andengine/opengl/texture/source/packing/ITextureSourcePackingAlgorithm.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseElasticOut.java.i +data/src/org/anddev/andengine/entity/scene/background/IBackground.java.i +data/src/org/anddev/andengine/entity/scene/menu/animator/IMenuAnimator.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/TextureSourceDecorator.java.i +data/src/org/anddev/andengine/entity/modifier/SingleValueChangeShapeModifier.java.i +data/src/org/anddev/andengine/entity/Entity.java.i +data/src/org/anddev/andengine/audio/BaseAudioEntity.java.i +data/ext/img/clapboard.svg.i +data/ant/exportJarToAndEngineExamples.xml.i +data/src/org/anddev/andengine/opengl/text/Letter.java.i +data/src/org/anddev/andengine/opengl/font/StrokeFont.java.i +data/src/org/anddev/andengine/entity/BaseDynamicEntity.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuartOut.java.i +data/src/org/anddev/andengine/opengl/texture/buffer/TextTextureBuffer.java.i +data/src/org/anddev/andengine/entity/DynamicEntity.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseExponentialIn.java.i +data/src/org/anddev/andengine/opengl/font/FontManager.java.i +data/src/org/anddev/andengine/opengl/IRenderable.java.i +data/src/org/anddev/andengine/entity/shape/modifier/SequenceShapeModifier.java.i +data/src/org/anddev/andengine/entity/shape/modifier/SingleValueChangeShapeModifier.java.i +data/src/org/anddev/andengine/entity/primitive/Rectangle.java.i +data/src/org/anddev/andengine/game/BaseGameActivity.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/LinearGradientFillTextureSourceDecorator.java.i +data/src/org/anddev/andengine/entity/shape/modifier/SequenceModifier.java.i +data/src/org/anddev/andengine/util/constants/TimeConstants.java.i +data/src/org/anddev/andengine/entity/menu/MenuItem.java.i +data/src/org/anddev/andengine/opengl/texture/TextureBuffer.java.i +data/src/org/anddev/andengine/sensor/orientation/IOrientationListener.java.i +data/src/org/anddev/andengine/entity/modifier/DelayModifier.java.i +data/src/org/anddev/andengine/entity/IBaseEntity.java.i +data/src/org/anddev/andengine/physics/BasePhysicsBody.java.i +data/src/org/anddev/andengine/entity/scene/CameraScene.java.i +data/src/org/anddev/andengine/entity/primitives/RectangularShape.java.i +data/src/org/anddev/andengine/entity/shape/modifier/DelayModifier.java.i +data/src/org/anddev/andengine/entity/IOnSceneTouchListener.java.i +data/src/org/anddev/andengine/ui/activity/BaseSplashActivity.java.i +data/src/org/anddev/andengine/entity/util/FrameCounter.java.i +data/src/org/anddev/andengine/engine/ISceneTouchListener.java.i +data/src/org/anddev/andengine/util/SAXUtils.java.i +data/src/org/anddev/andengine/util/ParameterCallable.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseSineInOut.java.i +data/src/org/anddev/andengine/opengl/buffer/BaseBuffer.java.i +data/src/org/anddev/andengine/entity/shape/util/ShapeUtils.java.i +data/src/org/anddev/andengine/entity/particle/modifier/IParticleModifier.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseCubicIn.java.i +data/src/org/anddev/andengine/engine/SplitScreenEngine.java.i +data/src/org/anddev/andengine/opengl/buffer/BufferObject.java.i +data/src/org/anddev/andengine/opengl/texture/BuildableTexture.java.i +data/src/org/anddev/andengine/opengl/BaseBuffer.java.i +data/src/org/anddev/andengine/entity/util/IOnSceneTouchListener.java.i +data/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RectangleTextureSourceDecoratorShape.java.i +data/src/org/anddev/andengine/entity/modifier/EntityModifier.java.i +data/src/org/anddev/andengine/entity/shape/IShapeModifier.java.i +data/src/org/anddev/andengine/engine/EngineOptions.java.i +data/src/org/anddev/andengine/util/modifier/BaseModifier.java.i +data/src/org/anddev/andengine/entity/menu/IOnMenuItemClickListener.java.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXParser.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BaseSingleValueInitializer.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BaseInitializer.java.i +data/ext/img/logo_icon.svg.i +data/src/org/anddev/andengine/engine/options/EngineOptions.java.i +data/ext/img/android.svg.i +data/src/org/anddev/andengine/entity/CameraScene.java.i +data/src/org/anddev/andengine/entity/SceneWithChild.java.i +data/src/org/anddev/andengine/physics/collision/Intersector.java.i +data/ext/img/favicon.svg.i +data/src/org/anddev/andengine/entity/modifier/FadeInModifier.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/ScaleModifier.java.i +data/src/org/anddev/andengine/engine/Engine.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BaseFromToModifier.java.i +data/src/org/anddev/andengine/entity/sprite/modifier/RotateByModifier.java.i +data/src/org/anddev/andengine/util/pool/RunnablePoolUpdateHandler.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseSingleValueSpanModifier.java.i +data/src/org/anddev/andengine/entity/scene/Scene.java.i +data/src/org/anddev/andengine/opengl/texture/ITextureStateListener.java.i +data/src/org/anddev/andengine/entity/primitives/Line.java.i +data/src/org/anddev/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java.i +data/src/org/anddev/andengine/entity/particle/modifier/BaseSingleValueSpanModifier.java.i +data/src/org/anddev/andengine/util/IEntityMatcher.java.i +data/src/org/anddev/andengine/entity/particle/emitter/RectangleParticleEmitter.java.i +data/src/org/anddev/andengine/physics/collision/CollisionChecker.java.i +data/src/org/anddev/andengine/opengl/view/GLSurfaceView.java.i +data/src/org/anddev/andengine/entity/modifier/DurationShapeModifier.java.i +data/src/org/anddev/andengine/entity/sprite/IModificationListener.java.i +data/src/org/anddev/andengine/util/modifier/ease/EaseQuintInOut.java.i +data/src/org/anddev/andengine/opengl/view/ComponentSizeChooser.java.i +data/src/org/anddev/andengine/util/pool/PoolItem.java.i +data/src/org/anddev/andengine/entity/shape/modifier/ease/EaseExponentialInOut.java.i +data/src/org/anddev/andengine/entity/particle/modifier/ColorInitializer.java.i +data/src/org/anddev/andengine/opengl/texture/region/buffer/TiledTextureRegionBuffer.java.i +data/src/org/anddev/andengine/util/pool/MultiPool.java.i +data/src/org/anddev/andengine/opengl/font/FontLibrary.java.i +data/src/org/anddev/andengine/audio/sound/Sound.java.i +data/src/org/anddev/andengine/util/Callable.java.i +data/src/org/anddev/andengine/opengl/texture/source/EmptyBitmapTextureSource.java.i +data/src/org/anddev/andengine/engine/options/RenderHints.java.i +data/src/org/anddev/andengine/util/constants/Constants.java.i +data/src/org/anddev/andengine/entity/shape/modifier/IShapeModifierListener.java.i +data/src/org/anddev/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java.i +data/src/org/anddev/andengine/input/touch/detector/ScrollDetector.java.i +data/src/org/anddev/andengine/util/pool/EntityRemoveRunnablePoolItem.java.i +data/src/org/anddev/andengine/util/sort/Sorter.java.i +data/uml/andengine_classdiagram.png.i +data/src/org/anddev/andengine/entity/particle/Particle.java.i +data/ext/img/logo3.png.i +data/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperty.java.i +data/src/org/anddev/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java.i +data/src/org/anddev/andengine/entity/shape/modifier/RotationModifier.java.i +data/src/org/anddev/andengine/ui/dialog/StringInputDialogBuilder.java.i +data/src/org/anddev/andengine/opengl/texture/TextureOptions.java.i +data/src/org/anddev/andengine/entity/layer/ZIndexSorter.java.i +data/src/org/anddev/andengine/entity/menu/IMenuAnimator.java.i +data/.hgignore.i +data/src/org/anddev/andengine/audio/sound/SoundLibrary.java.i +data/src/org/anddev/andengine/entity/particle/IParticleInitializer.java.i +data/src/org/anddev/andengine/util/Debug.java.i +data/push_google_code.bat.i +data/src/org/anddev/andengine/entity/particle/modifier/IParticleInitializer.java.i +data/src/org/anddev/andengine/entity/shape/modifier/BaseFromToModifier.java.i diff --git a/AndEngine/.hg/store/undo b/AndEngine/.hg/store/undo new file mode 100644 index 0000000000000000000000000000000000000000..ca8893930a621f401a3b0a92f5376ecc8f643f82 GIT binary patch literal 49553 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 + + AndEngine + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/AndEngine/AndroidManifest.xml b/AndEngine/AndroidManifest.xml new file mode 100644 index 0000000..cf91295 --- /dev/null +++ b/AndEngine/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/AndEngine/default.properties b/AndEngine/default.properties new file mode 100644 index 0000000..7334714 --- /dev/null +++ b/AndEngine/default.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Indicates whether an apk should be generated for each density. +split.density=false +# Project target. +target=android-4 +android.library=true diff --git a/AndEngine/exportJarToAll.xml b/AndEngine/exportJarToAll.xml new file mode 100644 index 0000000..c3e2cda --- /dev/null +++ b/AndEngine/exportJarToAll.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${targetfile} + + + + + + + + + + diff --git a/AndEngine/ext/img/android.svg b/AndEngine/ext/img/android.svg new file mode 100644 index 0000000..a4d446b --- /dev/null +++ b/AndEngine/ext/img/android.svg @@ -0,0 +1,32 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AndEngine/ext/img/badge.png b/AndEngine/ext/img/badge.png new file mode 100644 index 0000000000000000000000000000000000000000..70ce156d9b3c56ed1d07459b968e325eeb9071e8 GIT binary patch literal 13844 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + andengine + + + + + + + + + + + + + diff --git a/AndEngine/ext/img/clapboard.png b/AndEngine/ext/img/clapboard.png new file mode 100644 index 0000000000000000000000000000000000000000..3f55c7ed7407135be08d375f61b922d52ede022c GIT binary patch literal 23581 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 literal 0 HcmV?d00001 diff --git a/AndEngine/ext/img/clapboard.svg b/AndEngine/ext/img/clapboard.svg new file mode 100644 index 0000000..e5d0225 --- /dev/null +++ b/AndEngine/ext/img/clapboard.svg @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + clapper + 04-25-2007 + + + David Niezbitowski + + + + + David Niezabitowski + + + Inkscape .45.1 + + + clapper + movie + filmmaking + director + film + tv + movies + entertainment + slate + scene + marker + + + Scene Slate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SCENE + TAKE + ROLL + TITLE + PRODUCER + DIRECTOR + + diff --git a/AndEngine/ext/img/favicon.png b/AndEngine/ext/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..74fa83b6742f47fb104831a21d3c34f3ed6f70e9 GIT binary patch literal 548 zcmV+<0^9wGP)1fY{cRX{r(?-s9qbb;4V7r&KoqF*~C)Xs_w%P3}FG2S<-&d1?lK_{|(vG}}|9Y5e+X!I18(8-ea3af+kC?q`{0zQTex8vt~S&8#d z!IR+shM#GxdZ`Pzg)zLwBK|DLmx}o5;Cris_UbQ<3Pin@sgc(D5rt>o%qD(8+Ny3r mfABA6Nqea$;9qRR%k&!~*o%2U2ix2L0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/AndEngine/ext/img/icon.svg b/AndEngine/ext/img/icon.svg new file mode 100644 index 0000000..cf58fcd --- /dev/null +++ b/AndEngine/ext/img/icon.svg @@ -0,0 +1,404 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AndEngine/ext/img/logo.png b/AndEngine/ext/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..df06990a1576fe4a1d65fc88ea2365bf998bf078 GIT binary patch literal 36664 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + andengine + + + + + + + + + + andengine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FUN + + + + + + + FAST + + + + + + + FREE + + + + + diff --git a/AndEngine/ext/img/logo_icon.svg b/AndEngine/ext/img/logo_icon.svg new file mode 100644 index 0000000..9eba283 --- /dev/null +++ b/AndEngine/ext/img/logo_icon.svg @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + ... coming 2010 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AndEngine/ext/img/source.png b/AndEngine/ext/img/source.png new file mode 100644 index 0000000000000000000000000000000000000000..663ef733e0bedfd1a3fa1f78ddbf56e91d0cdffd GIT binary patch literal 23613 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 literal 0 HcmV?d00001 diff --git a/AndEngine/ext/img/source.svg b/AndEngine/ext/img/source.svg new file mode 100644 index 0000000..ab2d37c --- /dev/null +++ b/AndEngine/ext/img/source.svg @@ -0,0 +1,2730 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Jakub Steiner + + + http://jimmac.musichall.cz/ + + + package + archive + tarball + tar + bzip + gzip + zip + arj + tar + jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + andengine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AndEngine/ext/img/splash.png b/AndEngine/ext/img/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..2570a24ae94feb78dfac0c98da7e596929e102b2 GIT binary patch literal 26705 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

    sbY9Y^Yd)l}Ra3h~_5!G~RwQ1(1A)qUrl#J@~l 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 X0q6gQ!ft@q|KO=AX}y9fScU%&61prM literal 0 HcmV?d00001 diff --git a/AndEngine/ext/img/splash.svg b/AndEngine/ext/img/splash.svg new file mode 100644 index 0000000..19d37d5 --- /dev/null +++ b/AndEngine/ext/img/splash.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + andengine + + + + + + + + + + + + diff --git a/AndEngine/jni/Android.mk b/AndEngine/jni/Android.mk new file mode 100644 index 0000000..4a36649 --- /dev/null +++ b/AndEngine/jni/Android.mk @@ -0,0 +1,101 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := andenginephysicsbox2dextension +LOCAL_ARM_MODE := arm +LOCAL_SRC_FILES := \ +Box2D/Body.cpp \ +Box2D/CircleShape.cpp \ +Box2D/Contact.cpp \ +Box2D/Fixture.cpp \ +Box2D/Joint.cpp \ +Box2D/PolygonShape.cpp \ +Box2D/Shape.cpp \ +Box2D/World.cpp \ +Box2D/Box2D.h \ +Box2D/DistanceJoint.cpp \ +Box2D/FrictionJoint.cpp \ +Box2D/GearJoint.cpp \ +Box2D/LineJoint.cpp \ +Box2D/MouseJoint.cpp \ +Box2D/PrismaticJoint.cpp \ +Box2D/PulleyJoint.cpp \ +Box2D/RevoluteJoint.cpp \ +Box2D/Collision/b2BroadPhase.cpp \ +Box2D/Collision/b2BroadPhase.h \ +Box2D/Collision/b2CollideCircle.cpp \ +Box2D/Collision/b2CollidePolygon.cpp \ +Box2D/Collision/b2Collision.cpp \ +Box2D/Collision/b2Collision.h \ +Box2D/Collision/b2Distance.cpp \ +Box2D/Collision/b2Distance.h \ +Box2D/Collision/b2DynamicTree.cpp \ +Box2D/Collision/b2DynamicTree.h \ +Box2D/Collision/b2TimeOfImpact.cpp \ +Box2D/Collision/b2TimeOfImpact.h \ +Box2D/Collision/Shapes/b2CircleShape.cpp \ +Box2D/Collision/Shapes/b2CircleShape.h \ +Box2D/Collision/Shapes/b2PolygonShape.cpp \ +Box2D/Collision/Shapes/b2PolygonShape.h \ +Box2D/Collision/Shapes/b2Shape.h \ +Box2D/Common/b2BlockAllocator.cpp \ +Box2D/Common/b2BlockAllocator.h \ +Box2D/Common/b2Math.cpp \ +Box2D/Common/b2Math.h \ +Box2D/Common/b2Settings.cpp \ +Box2D/Common/b2Settings.h \ +Box2D/Common/b2StackAllocator.cpp \ +Box2D/Common/b2StackAllocator.h \ +Box2D/Dynamics/b2Body.cpp \ +Box2D/Dynamics/b2Body.h \ +Box2D/Dynamics/b2ContactManager.cpp \ +Box2D/Dynamics/b2ContactManager.h \ +Box2D/Dynamics/b2Fixture.cpp \ +Box2D/Dynamics/b2Fixture.h \ +Box2D/Dynamics/b2Island.cpp \ +Box2D/Dynamics/b2Island.h \ +Box2D/Dynamics/b2TimeStep.h \ +Box2D/Dynamics/b2World.cpp \ +Box2D/Dynamics/b2World.h \ +Box2D/Dynamics/b2WorldCallbacks.cpp \ +Box2D/Dynamics/b2WorldCallbacks.h \ \ +Box2D/Dynamics/Contacts/b2CircleContact.cpp \ +Box2D/Dynamics/Contacts/b2CircleContact.h \ +Box2D/Dynamics/Contacts/b2Contact.cpp \ +Box2D/Dynamics/Contacts/b2Contact.h \ +Box2D/Dynamics/Contacts/b2ContactSolver.cpp \ +Box2D/Dynamics/Contacts/b2ContactSolver.h \ +Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp \ +Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h \ +Box2D/Dynamics/Contacts/b2PolygonContact.cpp \ +Box2D/Dynamics/Contacts/b2PolygonContact.h \ +Box2D/Dynamics/Contacts/b2TOISolver.cpp \ +Box2D/Dynamics/Contacts/b2TOISolver.h \ +Box2D/Dynamics/Joints/b2DistanceJoint.cpp \ +Box2D/Dynamics/Joints/b2DistanceJoint.h \ +Box2D/Dynamics/Joints/b2FrictionJoint.cpp \ +Box2D/Dynamics/Joints/b2FrictionJoint.h \ +Box2D/Dynamics/Joints/b2GearJoint.cpp \ +Box2D/Dynamics/Joints/b2GearJoint.h \ +Box2D/Dynamics/Joints/b2Joint.cpp \ +Box2D/Dynamics/Joints/b2Joint.h \ +Box2D/Dynamics/Joints/b2LineJoint.cpp \ +Box2D/Dynamics/Joints/b2LineJoint.h \ +Box2D/Dynamics/Joints/b2MouseJoint.cpp \ +Box2D/Dynamics/Joints/b2MouseJoint.h \ +Box2D/Dynamics/Joints/b2PrismaticJoint.cpp \ +Box2D/Dynamics/Joints/b2PrismaticJoint.h \ +Box2D/Dynamics/Joints/b2PulleyJoint.cpp \ +Box2D/Dynamics/Joints/b2PulleyJoint.h \ +Box2D/Dynamics/Joints/b2RevoluteJoint.cpp \ +Box2D/Dynamics/Joints/b2RevoluteJoint.h \ +Box2D/Dynamics/Joints/b2WeldJoint.cpp \ +Box2D/Dynamics/Joints/b2WeldJoint.h + + +LOCAL_CFLAGS := -DFIXED_POINT -ffast-math -O3 -Wall -I$(LOCAL_PATH) -D_ARM_ASSEM_ -DANDROID +LOCAL_CPPFLAGS := -DFIXED_POINT -I$LOCAL_PATH/libvorbis/ -D_ARM_ASSEM_ +LOCAL_LDLIBS := -llog + +include $(BUILD_SHARED_LIBRARY) diff --git a/AndEngine/jni/Box2D/Android.mk b/AndEngine/jni/Box2D/Android.mk new file mode 100644 index 0000000..7f7452c --- /dev/null +++ b/AndEngine/jni/Box2D/Android.mk @@ -0,0 +1,53 @@ +GDX_SRC_FILES += Box2D/Body.cpp \ +Box2D/CircleShape.cpp \ +Box2D/Contact.cpp \ +Box2D/Fixture.cpp \ +Box2D/Joint.cpp \ +Box2D/PolygonShape.cpp \ +Box2D/Shape.cpp \ +Box2D/World.cpp \ +Box2D/DistanceJoint.cpp \ +Box2D/FrictionJoint.cpp \ +Box2D/GearJoint.cpp \ +Box2D/LineJoint.cpp \ +Box2D/MouseJoint.cpp \ +Box2D/PrismaticJoint.cpp \ +Box2D/PulleyJoint.cpp \ +Box2D/RevoluteJoint.cpp \ +Box2D/Collision/b2BroadPhase.cpp \ +Box2D/Collision/b2CollideCircle.cpp \ +Box2D/Collision/b2CollidePolygon.cpp \ +Box2D/Collision/b2Collision.cpp \ +Box2D/Collision/b2Distance.cpp \ +Box2D/Collision/b2DynamicTree.cpp \ +Box2D/Collision/b2TimeOfImpact.cpp \ +Box2D/Collision/Shapes/b2CircleShape.cpp \ +Box2D/Collision/Shapes/b2PolygonShape.cpp \ +Box2D/Common/b2BlockAllocator.cpp \ +Box2D/Common/b2Math.cpp \ +Box2D/Common/b2Settings.cpp \ +Box2D/Common/b2StackAllocator.cpp \ +Box2D/Dynamics/b2Body.cpp \ +Box2D/Dynamics/b2ContactManager.cpp \ +Box2D/Dynamics/b2Fixture.cpp \ +Box2D/Dynamics/b2Island.cpp \ +Box2D/Dynamics/b2World.cpp \ +Box2D/Dynamics/b2WorldCallbacks.cpp \ +Box2D/Dynamics/Contacts/b2CircleContact.cpp \ +Box2D/Dynamics/Contacts/b2Contact.cpp \ +Box2D/Dynamics/Contacts/b2ContactSolver.cpp \ +Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp \ +Box2D/Dynamics/Contacts/b2PolygonContact.cpp \ +Box2D/Dynamics/Contacts/b2TOISolver.cpp \ +Box2D/Dynamics/Joints/b2DistanceJoint.cpp \ +Box2D/Dynamics/Joints/b2FrictionJoint.cpp \ +Box2D/Dynamics/Joints/b2GearJoint.cpp \ +Box2D/Dynamics/Joints/b2Joint.cpp \ +Box2D/Dynamics/Joints/b2LineJoint.cpp \ +Box2D/Dynamics/Joints/b2MouseJoint.cpp \ +Box2D/Dynamics/Joints/b2PrismaticJoint.cpp \ +Box2D/Dynamics/Joints/b2PulleyJoint.cpp \ +Box2D/Dynamics/Joints/b2RevoluteJoint.cpp \ +Box2D/Dynamics/Joints/b2WeldJoint.cpp + +LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/.. diff --git a/AndEngine/jni/Box2D/Body.cpp b/AndEngine/jni/Box2D/Body.cpp new file mode 100644 index 0000000..59b11c8 --- /dev/null +++ b/AndEngine/jni/Box2D/Body.cpp @@ -0,0 +1,637 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "Body.h" +#include + +#ifdef ANDROID +#include +#endif + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniCreateFixture + * Signature: (JJFFFZSSS)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniCreateFixture__JJFFFZSSS +(JNIEnv *, jobject, jlong addr, jlong shapeAddr, jfloat friction, jfloat restitution, jfloat density, jboolean isSensor, jshort categoryBits, jshort maskBits, jshort groupIndex) +{ + b2Body* body = (b2Body*)addr; + b2Shape* shape = (b2Shape*)shapeAddr; + b2FixtureDef fixtureDef; + +#ifdef ANDROID + //__android_log_print( ANDROID_LOG_INFO, "Box2DTest", "body: %d, shape: %d", body, shape ); +#endif + + fixtureDef.shape = shape; + fixtureDef.friction = friction; + fixtureDef.restitution = restitution; + fixtureDef.density = density; + fixtureDef.isSensor = isSensor; + fixtureDef.filter.maskBits = maskBits; + fixtureDef.filter.categoryBits = categoryBits; + fixtureDef.filter.groupIndex = groupIndex; + + return (jlong)body->CreateFixture( &fixtureDef ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniCreateFixture + * Signature: (JJF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniCreateFixture__JJF +(JNIEnv *, jobject, jlong addr, jlong shapeAddr, jfloat density) +{ + b2Body* body = (b2Body*)addr; + b2Shape* shape = (b2Shape*)shapeAddr; + return (jlong)body->CreateFixture( shape, density ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniDestroyFixture + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniDestroyFixture + (JNIEnv *, jobject, jlong addr, jlong fixtureAddr) +{ + b2Body* body = (b2Body*)addr; + b2Fixture* fixture = (b2Fixture*)fixtureAddr; + body->DestroyFixture(fixture); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetTransform + * Signature: (FFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetTransform + (JNIEnv *, jobject, jlong addr, jfloat positionX, jfloat positionY, jfloat angle) +{ + b2Body* body = (b2Body*)addr; + body->SetTransform(b2Vec2(positionX, positionY), angle); +} + +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetTransform + (JNIEnv *env, jobject, jlong addr, jfloatArray vals) +{ + b2Body* body = (b2Body*)addr; + float* valOut = (float*)env->GetPrimitiveArrayCritical(vals, 0); + b2Transform t = body->GetTransform(); + + valOut[0] = t.position.x; + valOut[1] = t.position.y; + valOut[2] = t.R.col1.x; + valOut[3] = t.R.col1.y; + valOut[4] = t.R.col2.x; + valOut[5] = t.R.col2.y; + env->ReleasePrimitiveArrayCritical(vals, valOut, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetPosition + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetPosition + (JNIEnv *env, jobject, jlong addr, jfloatArray position) +{ + b2Body* body = (b2Body*)addr; + float* positionOut = (float*)env->GetPrimitiveArrayCritical(position, 0); + b2Vec2 p = body->GetPosition(); + positionOut[0] = p.x; + positionOut[1] = p.y; + env->ReleasePrimitiveArrayCritical(position, positionOut, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetAngle + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetAngle + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->GetAngle(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetWorldCenter + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetWorldCenter + (JNIEnv *env, jobject, jlong addr, jfloatArray worldCenter) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(worldCenter, 0); + b2Vec2 w = body->GetWorldCenter(); + out[0] = w.x; + out[1] = w.y; + env->ReleasePrimitiveArrayCritical(worldCenter, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLocalCenter + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLocalCenter + (JNIEnv *env, jobject, jlong addr, jfloatArray localCenter) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(localCenter, 0); + b2Vec2 w = body->GetLocalCenter(); + out[0] = w.x; + out[1] = w.y; + env->ReleasePrimitiveArrayCritical(localCenter, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetLinearVelocity + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetLinearVelocity + (JNIEnv *, jobject, jlong addr, jfloat linearVelocityX, jfloat linearVelocityY) +{ + b2Body* body = (b2Body*)addr; + body->SetLinearVelocity(b2Vec2(linearVelocityX, linearVelocityY) ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLinearVelocity + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLinearVelocity + (JNIEnv *env, jobject, jlong addr, jfloatArray linVel) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(linVel,0); + b2Vec2 l = body->GetLinearVelocity(); + out[0] = l.x; + out[1] = l.y; + env->ReleasePrimitiveArrayCritical(linVel, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetAngularVelocity + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetAngularVelocity + (JNIEnv *, jobject, jlong addr, jfloat angularVelocity) +{ + b2Body* body = (b2Body*)addr; + body->SetAngularVelocity(angularVelocity); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetAngularVelocity + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetAngularVelocity + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->GetAngularVelocity(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniApplyForce + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniApplyForce + (JNIEnv *, jobject, jlong addr, jfloat forceX, jfloat forceY, jfloat pointX, jfloat pointY ) +{ + b2Body* body = (b2Body*)addr; + body->ApplyForce( b2Vec2( forceX, forceY ), b2Vec2( pointX, pointY ) ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniApplyTorque + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniApplyTorque + (JNIEnv *, jobject, jlong addr, jfloat torque) +{ + b2Body* body = (b2Body*)addr; + body->ApplyTorque(torque); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniApplyLinearImpulse + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniApplyLinearImpulse + (JNIEnv *, jobject, jlong addr, jfloat impulseX, jfloat impulseY, jfloat pointX, jfloat pointY) +{ + b2Body* body = (b2Body*)addr; + body->ApplyLinearImpulse( b2Vec2( impulseX, impulseY ), b2Vec2( pointX, pointY ) ); + +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniApplyAngularImpulse + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniApplyAngularImpulse + (JNIEnv *, jobject, jlong addr, jfloat angularImpulse) +{ + b2Body* body = (b2Body*)addr; + body->ApplyAngularImpulse(angularImpulse); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetMass + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetMass + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->GetMass(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetInertia + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetInertia + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->GetInertia(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetMassData + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetMassData + (JNIEnv *env, jobject, jlong addr, jfloatArray massData) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(massData, 0); + b2MassData m; + body->GetMassData(&m); + out[0] = m.mass; + out[1] = m.center.x; + out[2] = m.center.y; + out[3] = m.I; + env->ReleasePrimitiveArrayCritical(massData, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetMassData + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetMassData + (JNIEnv *, jobject, jlong addr, jfloat mass, jfloat centerX, jfloat centerY, jfloat I) +{ + b2Body* body = (b2Body*)addr; + b2MassData m; + m.mass = mass; + m.center.x = centerX; + m.center.y = centerY; + m.I = I; + body->SetMassData(&m); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniResetMassData + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniResetMassData + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + body->ResetMassData(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetWorldPoint + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetWorldPoint + (JNIEnv *env, jobject, jlong addr, jfloat localPointX, jfloat localPointY, jfloatArray worldPoint) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(worldPoint, 0); + b2Vec2 w = body->GetWorldPoint( b2Vec2( localPointX, localPointY ) ); + out[0] = w.x; + out[1] = w.y; + env->ReleasePrimitiveArrayCritical(worldPoint, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetWorldVector + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetWorldVector +(JNIEnv *env, jobject, jlong addr, jfloat localVectorX, jfloat localVectorY, jfloatArray worldVector) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(worldVector, 0); + b2Vec2 w = body->GetWorldVector( b2Vec2( localVectorX, localVectorY ) ); + out[0] = w.x; + out[1] = w.y; + env->ReleasePrimitiveArrayCritical(worldVector, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLocalPoint + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLocalPoint + (JNIEnv *env, jobject, jlong addr, jfloat worldPointX, jfloat worldPointY, jfloatArray localPoint) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(localPoint, 0); + b2Vec2 w = body->GetLocalPoint( b2Vec2( worldPointX, worldPointY ) ); + out[0] = w.x; + out[1] = w.y; + env->ReleasePrimitiveArrayCritical(localPoint, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLocalVector + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLocalVector + (JNIEnv *env, jobject, jlong addr, jfloat worldVectorX, jfloat worldVectorY, jfloatArray localVector) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(localVector, 0); + b2Vec2 w = body->GetLocalVector( b2Vec2( worldVectorX, worldVectorY ) ); + out[0] = w.x; + out[1] = w.y; + env->ReleasePrimitiveArrayCritical(localVector, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLinearVelocityFromWorldPoint + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLinearVelocityFromWorldPoint + (JNIEnv *env, jobject, jlong addr, jfloat worldVectorX, jfloat worldVectorY, jfloatArray linVel) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(linVel, 0); + b2Vec2 w = body->GetLinearVelocityFromWorldPoint( b2Vec2( worldVectorX, worldVectorY ) ); + out[0] = w.x; + out[1] = w.y; + env->ReleasePrimitiveArrayCritical(linVel, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLinearVelocityFromLocalPoint + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLinearVelocityFromLocalPoint + (JNIEnv *env, jobject, jlong addr, jfloat localPointX, jfloat localPointY, jfloatArray linVel) +{ + b2Body* body = (b2Body*)addr; + float* out = (float*)env->GetPrimitiveArrayCritical(linVel, 0); + b2Vec2 w = body->GetLinearVelocityFromLocalPoint( b2Vec2( localPointX, localPointY ) ); + out[0] = w.x; + out[1] = w.y; + env->ReleasePrimitiveArrayCritical(linVel, out, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLinearDamping + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLinearDamping + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->GetLinearDamping(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetLinearDamping + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetLinearDamping + (JNIEnv *, jobject, jlong addr, jfloat linearDamping) +{ + b2Body* body = (b2Body*)addr; + body->SetLinearDamping(linearDamping); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetAngularDamping + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetAngularDamping + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->GetAngularDamping(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetAngularDamping + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetAngularDamping + (JNIEnv *, jobject, jlong addr, jfloat angularDamping) +{ + b2Body* body = (b2Body*)addr; + body->SetAngularDamping(angularDamping); +} + +inline b2BodyType getBodyType( int type ) +{ + switch( type ) + { + case 0: return b2_staticBody; + case 1: return b2_kinematicBody; + case 2: return b2_dynamicBody; + default: + return b2_staticBody; + } +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetType + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetType + (JNIEnv *, jobject, jlong addr, jint type) +{ + b2Body* body = (b2Body*)addr; + body->SetType(getBodyType(type)); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetType + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetType + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->GetType(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetBullet + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetBullet + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2Body* body = (b2Body*)addr; + body->SetBullet(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsBullet + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsBullet + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->IsBullet(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetSleepingAllowed + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetSleepingAllowed + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2Body* body = (b2Body*)addr; + body->SetSleepingAllowed(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsSleepingAllowed + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsSleepingAllowed + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->IsSleepingAllowed(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetAwake + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetAwake + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2Body* body = (b2Body*)addr; + body->SetAwake(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsAwake + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsAwake + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->IsAwake(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetActive + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetActive + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2Body* body = (b2Body*)addr; + body->SetActive(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsActive + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsActive + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->IsActive(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetFixedRotation + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetFixedRotation + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2Body* body = (b2Body*)addr; + body->SetFixedRotation(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsFixedRotation + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsFixedRotation + (JNIEnv *, jobject, jlong addr) +{ + b2Body* body = (b2Body*)addr; + return body->IsFixedRotation(); +} diff --git a/AndEngine/jni/Box2D/Body.h b/AndEngine/jni/Box2D/Body.h new file mode 100644 index 0000000..3222d61 --- /dev/null +++ b/AndEngine/jni/Box2D/Body.h @@ -0,0 +1,365 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_Body */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_Body +#define _Included_com_badlogic_gdx_physics_box2d_Body +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniCreateFixture + * Signature: (JJFFFZSSS)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniCreateFixture__JJFFFZSSS + (JNIEnv *, jobject, jlong, jlong, jfloat, jfloat, jfloat, jboolean, jshort, jshort, jshort); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniCreateFixture + * Signature: (JJF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniCreateFixture__JJF + (JNIEnv *, jobject, jlong, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniDestroyFixture + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniDestroyFixture + (JNIEnv *, jobject, jlong, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetTransform + * Signature: (JFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetTransform + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetTransform + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetTransform + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetPosition + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetPosition + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetAngle + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetAngle + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetWorldCenter + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetWorldCenter + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLocalCenter + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLocalCenter + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetLinearVelocity + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetLinearVelocity + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLinearVelocity + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLinearVelocity + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetAngularVelocity + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetAngularVelocity + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetAngularVelocity + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetAngularVelocity + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniApplyForce + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniApplyForce + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniApplyTorque + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniApplyTorque + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniApplyLinearImpulse + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniApplyLinearImpulse + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniApplyAngularImpulse + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniApplyAngularImpulse + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetMass + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetMass + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetInertia + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetInertia + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetMassData + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetMassData + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetMassData + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetMassData + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniResetMassData + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniResetMassData + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetWorldPoint + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetWorldPoint + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetWorldVector + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetWorldVector + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLocalPoint + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLocalPoint + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLocalVector + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLocalVector + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLinearVelocityFromWorldPoint + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLinearVelocityFromWorldPoint + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLinearVelocityFromLocalPoint + * Signature: (JFF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLinearVelocityFromLocalPoint + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetLinearDamping + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetLinearDamping + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetLinearDamping + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetLinearDamping + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetAngularDamping + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetAngularDamping + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetAngularDamping + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetAngularDamping + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetType + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetType + (JNIEnv *, jobject, jlong, jint); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniGetType + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetType + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetBullet + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetBullet + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsBullet + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsBullet + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetSleepingAllowed + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetSleepingAllowed + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsSleepingAllowed + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsSleepingAllowed + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetAwake + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetAwake + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsAwake + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsAwake + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetActive + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetActive + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsActive + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsActive + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniSetFixedRotation + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetFixedRotation + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_Body + * Method: jniIsFixedRotation + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniIsFixedRotation + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/Box2D.h b/AndEngine/jni/Box2D/Box2D.h new file mode 100644 index 0000000..0d4bed5 --- /dev/null +++ b/AndEngine/jni/Box2D/Box2D.h @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BOX2D_H +#define BOX2D_H + +/** +\mainpage Box2D API Documentation + +\section intro_sec Getting Started + +For documentation please see http://box2d.org/documentation.html + +For discussion please visit http://box2d.org/forum +*/ + +// These include files constitute the main Box2D API + +#include "Box2D/Common/b2Settings.h" + +#include "Box2D/Collision/Shapes/b2CircleShape.h" +#include "Box2D/Collision/Shapes/b2PolygonShape.h" + +#include "Box2D/Collision/b2BroadPhase.h" +#include "Box2D/Collision/b2Distance.h" +#include "Box2D/Collision/b2DynamicTree.h" +#include "Box2D/Collision/b2TimeOfImpact.h" + +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2WorldCallbacks.h" +#include "Box2D/Dynamics/b2TimeStep.h" +#include "Box2D/Dynamics/b2World.h" + +#include "Box2D/Dynamics/Contacts/b2Contact.h" + +#include "Box2D/Dynamics/Joints/b2DistanceJoint.h" +#include "Box2D/Dynamics/Joints/b2FrictionJoint.h" +#include "Box2D/Dynamics/Joints/b2GearJoint.h" +#include "Box2D/Dynamics/Joints/b2LineJoint.h" +#include "Box2D/Dynamics/Joints/b2MouseJoint.h" +#include "Box2D/Dynamics/Joints/b2PrismaticJoint.h" +#include "Box2D/Dynamics/Joints/b2PulleyJoint.h" +#include "Box2D/Dynamics/Joints/b2RevoluteJoint.h" +#include "Box2D/Dynamics/Joints/b2WeldJoint.h" + +#endif diff --git a/AndEngine/jni/Box2D/CircleShape.cpp b/AndEngine/jni/Box2D/CircleShape.cpp new file mode 100644 index 0000000..cb5fb99 --- /dev/null +++ b/AndEngine/jni/Box2D/CircleShape.cpp @@ -0,0 +1,56 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "CircleShape.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_CircleShape + * Method: newCircleShape + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_CircleShape_newCircleShape + (JNIEnv *, jobject) +{ + return (jlong)(new b2CircleShape( )); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_CircleShape + * Method: jniGetPosition + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_CircleShape_jniGetPosition + (JNIEnv *env, jobject, jlong addr, jfloatArray positionOut) +{ + b2CircleShape* circle = (b2CircleShape*)addr; + float* position = (float*)env->GetPrimitiveArrayCritical(positionOut, 0); + position[0] = circle->m_p.x; + position[1] = circle->m_p.y; + env->ReleasePrimitiveArrayCritical(positionOut, position, 0 ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_CircleShape + * Method: jniSetPosition + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_CircleShape_jniSetPosition + (JNIEnv *, jobject, jlong addr, jfloat positionX, jfloat positionY) +{ + b2CircleShape* circle = (b2CircleShape*)addr; + circle->m_p.x = positionX; + circle->m_p.y = positionY; +} diff --git a/AndEngine/jni/Box2D/CircleShape.h b/AndEngine/jni/Box2D/CircleShape.h new file mode 100644 index 0000000..a4b4fc6 --- /dev/null +++ b/AndEngine/jni/Box2D/CircleShape.h @@ -0,0 +1,52 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_CircleShape */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_CircleShape +#define _Included_com_badlogic_gdx_physics_box2d_CircleShape +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_CircleShape + * Method: newCircleShape + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_CircleShape_newCircleShape + (JNIEnv *, jobject); + +/* + * Class: com_badlogic_gdx_physics_box2d_CircleShape + * Method: jniGetPosition + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_CircleShape_jniGetPosition + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_CircleShape + * Method: jniSetPosition + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_CircleShape_jniSetPosition + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/Collision/Shapes/b2CircleShape.cpp b/AndEngine/jni/Box2D/Collision/Shapes/b2CircleShape.cpp new file mode 100644 index 0000000..018aa0d --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/Shapes/b2CircleShape.cpp @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/Shapes/b2CircleShape.h" +#include + +b2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const +{ + void* mem = allocator->Allocate(sizeof(b2CircleShape)); + b2CircleShape* clone = new (mem) b2CircleShape; + *clone = *this; + return clone; +} + +bool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const +{ + b2Vec2 center = transform.position + b2Mul(transform.R, m_p); + b2Vec2 d = p - center; + return b2Dot(d, d) <= m_radius * m_radius; +} + +// Collision Detection in Interactive 3D Environments by Gino van den Bergen +// From Section 3.1.2 +// x = s + a * r +// norm(x) = radius +bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const +{ + b2Vec2 position = transform.position + b2Mul(transform.R, m_p); + b2Vec2 s = input.p1 - position; + float32 b = b2Dot(s, s) - m_radius * m_radius; + + // Solve quadratic equation. + b2Vec2 r = input.p2 - input.p1; + float32 c = b2Dot(s, r); + float32 rr = b2Dot(r, r); + float32 sigma = c * c - rr * b; + + // Check for negative discriminant and short segment. + if (sigma < 0.0f || rr < b2_epsilon) + { + return false; + } + + // Find the point of intersection of the line with the circle. + float32 a = -(c + b2Sqrt(sigma)); + + // Is the intersection point on the segment? + if (0.0f <= a && a <= input.maxFraction * rr) + { + a /= rr; + output->fraction = a; + output->normal = s + a * r; + output->normal.Normalize(); + return true; + } + + return false; +} + +void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform) const +{ + b2Vec2 p = transform.position + b2Mul(transform.R, m_p); + aabb->lowerBound.Set(p.x - m_radius, p.y - m_radius); + aabb->upperBound.Set(p.x + m_radius, p.y + m_radius); +} + +void b2CircleShape::ComputeMass(b2MassData* massData, float32 density) const +{ + massData->mass = density * b2_pi * m_radius * m_radius; + massData->center = m_p; + + // inertia about the local origin + massData->I = massData->mass * (0.5f * m_radius * m_radius + b2Dot(m_p, m_p)); +} diff --git a/AndEngine/jni/Box2D/Collision/Shapes/b2CircleShape.h b/AndEngine/jni/Box2D/Collision/Shapes/b2CircleShape.h new file mode 100644 index 0000000..84d809e --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/Shapes/b2CircleShape.h @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_CIRCLE_SHAPE_H +#define B2_CIRCLE_SHAPE_H + +#include "Box2D/Collision/Shapes/b2Shape.h" + +/// A circle shape. +class b2CircleShape : public b2Shape +{ +public: + b2CircleShape(); + + /// Implement b2Shape. + b2Shape* Clone(b2BlockAllocator* allocator) const; + + /// Implement b2Shape. + bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; + + /// Implement b2Shape. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; + + /// @see b2Shape::ComputeAABB + void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; + + /// @see b2Shape::ComputeMass + void ComputeMass(b2MassData* massData, float32 density) const; + + /// Get the supporting vertex index in the given direction. + int32 GetSupport(const b2Vec2& d) const; + + /// Get the supporting vertex in the given direction. + const b2Vec2& GetSupportVertex(const b2Vec2& d) const; + + /// Get the vertex count. + int32 GetVertexCount() const { return 1; } + + /// Get a vertex by index. Used by b2Distance. + const b2Vec2& GetVertex(int32 index) const; + + /// Position + b2Vec2 m_p; +}; + +inline b2CircleShape::b2CircleShape() +{ + m_type = e_circle; + m_radius = 0.0f; + m_p.SetZero(); +} + +inline int32 b2CircleShape::GetSupport(const b2Vec2 &d) const +{ + B2_NOT_USED(d); + return 0; +} + +inline const b2Vec2& b2CircleShape::GetSupportVertex(const b2Vec2 &d) const +{ + B2_NOT_USED(d); + return m_p; +} + +inline const b2Vec2& b2CircleShape::GetVertex(int32 index) const +{ + B2_NOT_USED(index); + b2Assert(index == 0); + return m_p; +} + +#endif diff --git a/AndEngine/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp b/AndEngine/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp new file mode 100644 index 0000000..9db0fa8 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp @@ -0,0 +1,434 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/Shapes/b2PolygonShape.h" +#include + +b2Shape* b2PolygonShape::Clone(b2BlockAllocator* allocator) const +{ + void* mem = allocator->Allocate(sizeof(b2PolygonShape)); + b2PolygonShape* clone = new (mem) b2PolygonShape; + *clone = *this; + return clone; +} + +void b2PolygonShape::SetAsBox(float32 hx, float32 hy) +{ + m_vertexCount = 4; + m_vertices[0].Set(-hx, -hy); + m_vertices[1].Set( hx, -hy); + m_vertices[2].Set( hx, hy); + m_vertices[3].Set(-hx, hy); + m_normals[0].Set(0.0f, -1.0f); + m_normals[1].Set(1.0f, 0.0f); + m_normals[2].Set(0.0f, 1.0f); + m_normals[3].Set(-1.0f, 0.0f); + m_centroid.SetZero(); +} + +void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle) +{ + m_vertexCount = 4; + m_vertices[0].Set(-hx, -hy); + m_vertices[1].Set( hx, -hy); + m_vertices[2].Set( hx, hy); + m_vertices[3].Set(-hx, hy); + m_normals[0].Set(0.0f, -1.0f); + m_normals[1].Set(1.0f, 0.0f); + m_normals[2].Set(0.0f, 1.0f); + m_normals[3].Set(-1.0f, 0.0f); + m_centroid = center; + + b2Transform xf; + xf.position = center; + xf.R.Set(angle); + + // Transform vertices and normals. + for (int32 i = 0; i < m_vertexCount; ++i) + { + m_vertices[i] = b2Mul(xf, m_vertices[i]); + m_normals[i] = b2Mul(xf.R, m_normals[i]); + } +} + +void b2PolygonShape::SetAsEdge(const b2Vec2& v1, const b2Vec2& v2) +{ + m_vertexCount = 2; + m_vertices[0] = v1; + m_vertices[1] = v2; + m_centroid = 0.5f * (v1 + v2); + m_normals[0] = b2Cross(v2 - v1, 1.0f); + m_normals[0].Normalize(); + m_normals[1] = -m_normals[0]; +} + +static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) +{ + b2Assert(count >= 2); + + b2Vec2 c; c.Set(0.0f, 0.0f); + float32 area = 0.0f; + + if (count == 2) + { + c = 0.5f * (vs[0] + vs[1]); + return c; + } + + // pRef is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + b2Vec2 pRef(0.0f, 0.0f); +#if 0 + // This code would put the reference point inside the polygon. + for (int32 i = 0; i < count; ++i) + { + pRef += vs[i]; + } + pRef *= 1.0f / count; +#endif + + const float32 inv3 = 1.0f / 3.0f; + + for (int32 i = 0; i < count; ++i) + { + // Triangle vertices. + b2Vec2 p1 = pRef; + b2Vec2 p2 = vs[i]; + b2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0]; + + b2Vec2 e1 = p2 - p1; + b2Vec2 e2 = p3 - p1; + + float32 D = b2Cross(e1, e2); + + float32 triangleArea = 0.5f * D; + area += triangleArea; + + // Area weighted centroid + c += triangleArea * inv3 * (p1 + p2 + p3); + } + + // Centroid + b2Assert(area > b2_epsilon); + c *= 1.0f / area; + return c; +} + +void b2PolygonShape::Set(const b2Vec2* vertices, int32 count) +{ + b2Assert(2 <= count && count <= b2_maxPolygonVertices); + m_vertexCount = count; + + // Copy vertices. + for (int32 i = 0; i < m_vertexCount; ++i) + { + m_vertices[i] = vertices[i]; + } + + // Compute normals. Ensure the edges have non-zero length. + for (int32 i = 0; i < m_vertexCount; ++i) + { + int32 i1 = i; + int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; + b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; + b2Assert(edge.LengthSquared() > b2_epsilon * b2_epsilon); + m_normals[i] = b2Cross(edge, 1.0f); + m_normals[i].Normalize(); + } + +#ifdef _DEBUG + // Ensure the polygon is convex and the interior + // is to the left of each edge. + for (int32 i = 0; i < m_vertexCount; ++i) + { + int32 i1 = i; + int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; + b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; + + for (int32 j = 0; j < m_vertexCount; ++j) + { + // Don't check vertices on the current edge. + if (j == i1 || j == i2) + { + continue; + } + + b2Vec2 r = m_vertices[j] - m_vertices[i1]; + + // Your polygon is non-convex (it has an indentation) or + // has colinear edges. + float32 s = b2Cross(edge, r); + b2Assert(s > 0.0f); + } + } +#endif + + // Compute the polygon centroid. + m_centroid = ComputeCentroid(m_vertices, m_vertexCount); +} + +bool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const +{ + b2Vec2 pLocal = b2MulT(xf.R, p - xf.position); + + for (int32 i = 0; i < m_vertexCount; ++i) + { + float32 dot = b2Dot(m_normals[i], pLocal - m_vertices[i]); + if (dot > 0.0f) + { + return false; + } + } + + return true; +} + +bool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& xf) const +{ + // Put the ray into the polygon's frame of reference. + b2Vec2 p1 = b2MulT(xf.R, input.p1 - xf.position); + b2Vec2 p2 = b2MulT(xf.R, input.p2 - xf.position); + b2Vec2 d = p2 - p1; + + if (m_vertexCount == 2) + { + b2Vec2 v1 = m_vertices[0]; + b2Vec2 v2 = m_vertices[1]; + b2Vec2 normal = m_normals[0]; + + // q = p1 + t * d + // dot(normal, q - v1) = 0 + // dot(normal, p1 - v1) + t * dot(normal, d) = 0 + float32 numerator = b2Dot(normal, v1 - p1); + float32 denominator = b2Dot(normal, d); + + if (denominator == 0.0f) + { + return false; + } + + float32 t = numerator / denominator; + if (t < 0.0f || 1.0f < t) + { + return false; + } + + b2Vec2 q = p1 + t * d; + + // q = v1 + s * r + // s = dot(q - v1, r) / dot(r, r) + b2Vec2 r = v2 - v1; + float32 rr = b2Dot(r, r); + if (rr == 0.0f) + { + return false; + } + + float32 s = b2Dot(q - v1, r) / rr; + if (s < 0.0f || 1.0f < s) + { + return false; + } + + output->fraction = t; + if (numerator > 0.0f) + { + output->normal = -normal; + } + else + { + output->normal = normal; + } + return true; + } + else + { + float32 lower = 0.0f, upper = input.maxFraction; + + int32 index = -1; + + for (int32 i = 0; i < m_vertexCount; ++i) + { + // p = p1 + a * d + // dot(normal, p - v) = 0 + // dot(normal, p1 - v) + a * dot(normal, d) = 0 + float32 numerator = b2Dot(m_normals[i], m_vertices[i] - p1); + float32 denominator = b2Dot(m_normals[i], d); + + if (denominator == 0.0f) + { + if (numerator < 0.0f) + { + return false; + } + } + else + { + // Note: we want this predicate without division: + // lower < numerator / denominator, where denominator < 0 + // Since denominator < 0, we have to flip the inequality: + // lower < numerator / denominator <==> denominator * lower > numerator. + if (denominator < 0.0f && numerator < lower * denominator) + { + // Increase lower. + // The segment enters this half-space. + lower = numerator / denominator; + index = i; + } + else if (denominator > 0.0f && numerator < upper * denominator) + { + // Decrease upper. + // The segment exits this half-space. + upper = numerator / denominator; + } + } + + // The use of epsilon here causes the assert on lower to trip + // in some cases. Apparently the use of epsilon was to make edge + // shapes work, but now those are handled separately. + //if (upper < lower - b2_epsilon) + if (upper < lower) + { + return false; + } + } + + b2Assert(0.0f <= lower && lower <= input.maxFraction); + + if (index >= 0) + { + output->fraction = lower; + output->normal = b2Mul(xf.R, m_normals[index]); + return true; + } + } + + return false; +} + +void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf) const +{ + b2Vec2 lower = b2Mul(xf, m_vertices[0]); + b2Vec2 upper = lower; + + for (int32 i = 1; i < m_vertexCount; ++i) + { + b2Vec2 v = b2Mul(xf, m_vertices[i]); + lower = b2Min(lower, v); + upper = b2Max(upper, v); + } + + b2Vec2 r(m_radius, m_radius); + aabb->lowerBound = lower - r; + aabb->upperBound = upper + r; +} + +void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const +{ + // Polygon mass, centroid, and inertia. + // Let rho be the polygon density in mass per unit area. + // Then: + // mass = rho * int(dA) + // centroid.x = (1/mass) * rho * int(x * dA) + // centroid.y = (1/mass) * rho * int(y * dA) + // I = rho * int((x*x + y*y) * dA) + // + // We can compute these integrals by summing all the integrals + // for each triangle of the polygon. To evaluate the integral + // for a single triangle, we make a change of variables to + // the (u,v) coordinates of the triangle: + // x = x0 + e1x * u + e2x * v + // y = y0 + e1y * u + e2y * v + // where 0 <= u && 0 <= v && u + v <= 1. + // + // We integrate u from [0,1-v] and then v from [0,1]. + // We also need to use the Jacobian of the transformation: + // D = cross(e1, e2) + // + // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3) + // + // The rest of the derivation is handled by computer algebra. + + b2Assert(m_vertexCount >= 2); + + // A line segment has zero mass. + if (m_vertexCount == 2) + { + massData->center = 0.5f * (m_vertices[0] + m_vertices[1]); + massData->mass = 0.0f; + massData->I = 0.0f; + return; + } + + b2Vec2 center; center.Set(0.0f, 0.0f); + float32 area = 0.0f; + float32 I = 0.0f; + + // pRef is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + b2Vec2 pRef(0.0f, 0.0f); +#if 0 + // This code would put the reference point inside the polygon. + for (int32 i = 0; i < m_vertexCount; ++i) + { + pRef += m_vertices[i]; + } + pRef *= 1.0f / count; +#endif + + const float32 k_inv3 = 1.0f / 3.0f; + + for (int32 i = 0; i < m_vertexCount; ++i) + { + // Triangle vertices. + b2Vec2 p1 = pRef; + b2Vec2 p2 = m_vertices[i]; + b2Vec2 p3 = i + 1 < m_vertexCount ? m_vertices[i+1] : m_vertices[0]; + + b2Vec2 e1 = p2 - p1; + b2Vec2 e2 = p3 - p1; + + float32 D = b2Cross(e1, e2); + + float32 triangleArea = 0.5f * D; + area += triangleArea; + + // Area weighted centroid + center += triangleArea * k_inv3 * (p1 + p2 + p3); + + float32 px = p1.x, py = p1.y; + float32 ex1 = e1.x, ey1 = e1.y; + float32 ex2 = e2.x, ey2 = e2.y; + + float32 intx2 = k_inv3 * (0.25f * (ex1*ex1 + ex2*ex1 + ex2*ex2) + (px*ex1 + px*ex2)) + 0.5f*px*px; + float32 inty2 = k_inv3 * (0.25f * (ey1*ey1 + ey2*ey1 + ey2*ey2) + (py*ey1 + py*ey2)) + 0.5f*py*py; + + I += D * (intx2 + inty2); + } + + // Total mass + massData->mass = density * area; + + // Center of mass + b2Assert(area > b2_epsilon); + center *= 1.0f / area; + massData->center = center; + + // Inertia tensor relative to the local origin. + massData->I = density * I; +} diff --git a/AndEngine/jni/Box2D/Collision/Shapes/b2PolygonShape.h b/AndEngine/jni/Box2D/Collision/Shapes/b2PolygonShape.h new file mode 100644 index 0000000..4c67cb8 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/Shapes/b2PolygonShape.h @@ -0,0 +1,131 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_POLYGON_SHAPE_H +#define B2_POLYGON_SHAPE_H + +#include "Box2D/Collision/Shapes/b2Shape.h" + +/// A convex polygon. It is assumed that the interior of the polygon is to +/// the left of each edge. +class b2PolygonShape : public b2Shape +{ +public: + b2PolygonShape(); + + /// Implement b2Shape. + b2Shape* Clone(b2BlockAllocator* allocator) const; + + /// Copy vertices. This assumes the vertices define a convex polygon. + /// It is assumed that the exterior is the the right of each edge. + void Set(const b2Vec2* vertices, int32 vertexCount); + + /// Build vertices to represent an axis-aligned box. + /// @param hx the half-width. + /// @param hy the half-height. + void SetAsBox(float32 hx, float32 hy); + + /// Build vertices to represent an oriented box. + /// @param hx the half-width. + /// @param hy the half-height. + /// @param center the center of the box in local coordinates. + /// @param angle the rotation of the box in local coordinates. + void SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle); + + /// Set this as a single edge. + void SetAsEdge(const b2Vec2& v1, const b2Vec2& v2); + + /// @see b2Shape::TestPoint + bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; + + /// Implement b2Shape. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; + + /// @see b2Shape::ComputeAABB + void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; + + /// @see b2Shape::ComputeMass + void ComputeMass(b2MassData* massData, float32 density) const; + + /// Get the supporting vertex index in the given direction. + int32 GetSupport(const b2Vec2& d) const; + + /// Get the supporting vertex in the given direction. + const b2Vec2& GetSupportVertex(const b2Vec2& d) const; + + /// Get the vertex count. + int32 GetVertexCount() const { return m_vertexCount; } + + /// Get a vertex by index. + const b2Vec2& GetVertex(int32 index) const; + + b2Vec2 m_centroid; + b2Vec2 m_vertices[b2_maxPolygonVertices]; + b2Vec2 m_normals[b2_maxPolygonVertices]; + int32 m_vertexCount; +}; + +inline b2PolygonShape::b2PolygonShape() +{ + m_type = e_polygon; + m_radius = b2_polygonRadius; + m_vertexCount = 0; + m_centroid.SetZero(); +} + +inline int32 b2PolygonShape::GetSupport(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_vertexCount; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return bestIndex; +} + +inline const b2Vec2& b2PolygonShape::GetSupportVertex(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_vertexCount; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return m_vertices[bestIndex]; +} + +inline const b2Vec2& b2PolygonShape::GetVertex(int32 index) const +{ + b2Assert(0 <= index && index < m_vertexCount); + return m_vertices[index]; +} + +#endif diff --git a/AndEngine/jni/Box2D/Collision/Shapes/b2Shape.h b/AndEngine/jni/Box2D/Collision/Shapes/b2Shape.h new file mode 100644 index 0000000..d121790 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/Shapes/b2Shape.h @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_SHAPE_H +#define B2_SHAPE_H + +#include "Box2D/Common/b2BlockAllocator.h" +#include "Box2D/Common/b2Math.h" +#include "Box2D/Collision/b2Collision.h" + +/// This holds the mass data computed for a shape. +struct b2MassData +{ + /// The mass of the shape, usually in kilograms. + float32 mass; + + /// The position of the shape's centroid relative to the shape's origin. + b2Vec2 center; + + /// The rotational inertia of the shape about the local origin. + float32 I; +}; + +/// A shape is used for collision detection. You can create a shape however you like. +/// Shapes used for simulation in b2World are created automatically when a b2Fixture +/// is created. +class b2Shape +{ +public: + + enum Type + { + e_unknown= -1, + e_circle = 0, + e_polygon = 1, + e_typeCount = 2, + }; + + b2Shape() { m_type = e_unknown; } + virtual ~b2Shape() {} + + /// Clone the concrete shape using the provided allocator. + virtual b2Shape* Clone(b2BlockAllocator* allocator) const = 0; + + /// Get the type of this shape. You can use this to down cast to the concrete shape. + /// @return the shape type. + Type GetType() const; + + /// Test a point for containment in this shape. This only works for convex shapes. + /// @param xf the shape world transform. + /// @param p a point in world coordinates. + virtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0; + + /// Cast a ray against this shape. + /// @param output the ray-cast results. + /// @param input the ray-cast input parameters. + /// @param transform the transform to be applied to the shape. + virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const = 0; + + /// Given a transform, compute the associated axis aligned bounding box for this shape. + /// @param aabb returns the axis aligned box. + /// @param xf the world transform of the shape. + virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf) const = 0; + + /// Compute the mass properties of this shape using its dimensions and density. + /// The inertia tensor is computed about the local origin. + /// @param massData returns the mass data for this shape. + /// @param density the density in kilograms per meter squared. + virtual void ComputeMass(b2MassData* massData, float32 density) const = 0; + + Type m_type; + float32 m_radius; +}; + +inline b2Shape::Type b2Shape::GetType() const +{ + return m_type; +} + +#endif diff --git a/AndEngine/jni/Box2D/Collision/b2BroadPhase.cpp b/AndEngine/jni/Box2D/Collision/b2BroadPhase.cpp new file mode 100644 index 0000000..4030958 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2BroadPhase.cpp @@ -0,0 +1,116 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/b2BroadPhase.h" +#include + +b2BroadPhase::b2BroadPhase() +{ + m_proxyCount = 0; + + m_pairCapacity = 16; + m_pairCount = 0; + m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair)); + + m_moveCapacity = 16; + m_moveCount = 0; + m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32)); +} + +b2BroadPhase::~b2BroadPhase() +{ + b2Free(m_moveBuffer); + b2Free(m_pairBuffer); +} + +int32 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData) +{ + int32 proxyId = m_tree.CreateProxy(aabb, userData); + ++m_proxyCount; + BufferMove(proxyId); + return proxyId; +} + +void b2BroadPhase::DestroyProxy(int32 proxyId) +{ + UnBufferMove(proxyId); + --m_proxyCount; + m_tree.DestroyProxy(proxyId); +} + +void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement) +{ + bool buffer = m_tree.MoveProxy(proxyId, aabb, displacement); + if (buffer) + { + BufferMove(proxyId); + } +} + +void b2BroadPhase::BufferMove(int32 proxyId) +{ + if (m_moveCount == m_moveCapacity) + { + int32* oldBuffer = m_moveBuffer; + m_moveCapacity *= 2; + m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32)); + memcpy(m_moveBuffer, oldBuffer, m_moveCount * sizeof(int32)); + b2Free(oldBuffer); + } + + m_moveBuffer[m_moveCount] = proxyId; + ++m_moveCount; +} + +void b2BroadPhase::UnBufferMove(int32 proxyId) +{ + for (int32 i = 0; i < m_moveCount; ++i) + { + if (m_moveBuffer[i] == proxyId) + { + m_moveBuffer[i] = e_nullProxy; + return; + } + } +} + +// This is called from b2DynamicTree::Query when we are gathering pairs. +bool b2BroadPhase::QueryCallback(int32 proxyId) +{ + // A proxy cannot form a pair with itself. + if (proxyId == m_queryProxyId) + { + return true; + } + + // Grow the pair buffer as needed. + if (m_pairCount == m_pairCapacity) + { + b2Pair* oldBuffer = m_pairBuffer; + m_pairCapacity *= 2; + m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair)); + memcpy(m_pairBuffer, oldBuffer, m_pairCount * sizeof(b2Pair)); + b2Free(oldBuffer); + } + + m_pairBuffer[m_pairCount].proxyIdA = b2Min(proxyId, m_queryProxyId); + m_pairBuffer[m_pairCount].proxyIdB = b2Max(proxyId, m_queryProxyId); + ++m_pairCount; + + return true; +} diff --git a/AndEngine/jni/Box2D/Collision/b2BroadPhase.h b/AndEngine/jni/Box2D/Collision/b2BroadPhase.h new file mode 100644 index 0000000..a236815 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2BroadPhase.h @@ -0,0 +1,264 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_BROAD_PHASE_H +#define B2_BROAD_PHASE_H + +#include "Box2D/Common/b2Settings.h" +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/b2DynamicTree.h" +#include +//#include + +struct b2Pair +{ + int32 proxyIdA; + int32 proxyIdB; + int32 next; +}; + +/// The broad-phase is used for computing pairs and performing volume queries and ray casts. +/// This broad-phase does not persist pairs. Instead, this reports potentially new pairs. +/// It is up to the client to consume the new pairs and to track subsequent overlap. +class b2BroadPhase +{ +public: + + enum + { + e_nullProxy = -1, + }; + + b2BroadPhase(); + ~b2BroadPhase(); + + /// Create a proxy with an initial AABB. Pairs are not reported until + /// UpdatePairs is called. + int32 CreateProxy(const b2AABB& aabb, void* userData); + + /// Destroy a proxy. It is up to the client to remove any pairs. + void DestroyProxy(int32 proxyId); + + /// Call MoveProxy as many times as you like, then when you are done + /// call UpdatePairs to finalized the proxy pairs (for your time step). + void MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement); + + /// Get the fat AABB for a proxy. + const b2AABB& GetFatAABB(int32 proxyId) const; + + /// Get user data from a proxy. Returns NULL if the id is invalid. + void* GetUserData(int32 proxyId) const; + + /// Test overlap of fat AABBs. + bool TestOverlap(int32 proxyIdA, int32 proxyIdB) const; + + /// Get the number of proxies. + int32 GetProxyCount() const; + + /// Update the pairs. This results in pair callbacks. This can only add pairs. + template + void UpdatePairs(T* callback); + + /// Query an AABB for overlapping proxies. The callback class + /// is called for each proxy that overlaps the supplied AABB. + template + void Query(T* callback, const b2AABB& aabb) const; + + /// Ray-cast against the proxies in the tree. This relies on the callback + /// to perform a exact ray-cast in the case were the proxy contains a shape. + /// The callback also performs the any collision filtering. This has performance + /// roughly equal to k * log(n), where k is the number of collisions and n is the + /// number of proxies in the tree. + /// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). + /// @param callback a callback class that is called for each proxy that is hit by the ray. + template + void RayCast(T* callback, const b2RayCastInput& input) const; + + /// Compute the height of the embedded tree. + int32 ComputeHeight() const; + +private: + + friend class b2DynamicTree; + + void BufferMove(int32 proxyId); + void UnBufferMove(int32 proxyId); + + bool QueryCallback(int32 proxyId); + + b2DynamicTree m_tree; + + int32 m_proxyCount; + + int32* m_moveBuffer; + int32 m_moveCapacity; + int32 m_moveCount; + + b2Pair* m_pairBuffer; + int32 m_pairCapacity; + int32 m_pairCount; + + int32 m_queryProxyId; +}; + +/// This is used to sort pairs. +inline bool b2PairLessThan(const b2Pair& pair1, const b2Pair& pair2) +{ + if (pair1.proxyIdA < pair2.proxyIdA) + { + return true; + } + + if (pair1.proxyIdA == pair2.proxyIdA) + { + return pair1.proxyIdB < pair2.proxyIdB; + } + + return false; +} + +inline void* b2BroadPhase::GetUserData(int32 proxyId) const +{ + return m_tree.GetUserData(proxyId); +} + +inline bool b2BroadPhase::TestOverlap(int32 proxyIdA, int32 proxyIdB) const +{ + const b2AABB& aabbA = m_tree.GetFatAABB(proxyIdA); + const b2AABB& aabbB = m_tree.GetFatAABB(proxyIdB); + return b2TestOverlap(aabbA, aabbB); +} + +inline const b2AABB& b2BroadPhase::GetFatAABB(int32 proxyId) const +{ + return m_tree.GetFatAABB(proxyId); +} + +inline int32 b2BroadPhase::GetProxyCount() const +{ + return m_proxyCount; +} + +inline int32 b2BroadPhase::ComputeHeight() const +{ + return m_tree.ComputeHeight(); +} + +//The return value of this function should represent whether elem1 is considered less than, +//equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value. +inline int b2PairCompareQSort(const void * elem1, const void * elem2) +{ + b2Pair* pair1 = (b2Pair*) elem1; + b2Pair* pair2 = (b2Pair*) elem2; + + if (pair1->proxyIdA < pair2->proxyIdA) + { + return -1; + } + + if (pair1->proxyIdA == pair2->proxyIdA) + { + if( pair1->proxyIdB < pair2->proxyIdB ) { + return -1; + } + else if(pair1->proxyIdB > pair2->proxyIdB) { + return 1; + } + else { + return 0; + } + } + else { + return 1; + } + +} + +template +void b2BroadPhase::UpdatePairs(T* callback) +{ + // Reset pair buffer + m_pairCount = 0; + + // Perform tree queries for all moving proxies. + for (int32 i = 0; i < m_moveCount; ++i) + { + m_queryProxyId = m_moveBuffer[i]; + if (m_queryProxyId == e_nullProxy) + { + continue; + } + + // We have to query the tree with the fat AABB so that + // we don't fail to create a pair that may touch later. + const b2AABB& fatAABB = m_tree.GetFatAABB(m_queryProxyId); + + // Query tree, create pairs and add them pair buffer. + m_tree.Query(this, fatAABB); + } + + // Reset move buffer + m_moveCount = 0; + + // Sort the pair buffer to expose duplicates. + //std::sort(m_pairBuffer, m_pairBuffer + m_pairCount, b2PairLessThan); + + // FIX from http://www.box2d.org/forum/viewtopic.php?f=7&t=4756&start=0 to get rid of stl dependency + qsort(m_pairBuffer, sizeof(m_pairBuffer) / sizeof(struct b2Pair) , sizeof(struct b2Pair), b2PairCompareQSort); + + // Send the pairs back to the client. + int32 i = 0; + while (i < m_pairCount) + { + b2Pair* primaryPair = m_pairBuffer + i; + void* userDataA = m_tree.GetUserData(primaryPair->proxyIdA); + void* userDataB = m_tree.GetUserData(primaryPair->proxyIdB); + + callback->AddPair(userDataA, userDataB); + ++i; + + // Skip any duplicate pairs. + while (i < m_pairCount) + { + b2Pair* pair = m_pairBuffer + i; + if (pair->proxyIdA != primaryPair->proxyIdA || pair->proxyIdB != primaryPair->proxyIdB) + { + break; + } + ++i; + } + } + + // Try to keep the tree balanced. + m_tree.Rebalance(4); +} + + +template +inline void b2BroadPhase::Query(T* callback, const b2AABB& aabb) const +{ + m_tree.Query(callback, aabb); +} + +template +inline void b2BroadPhase::RayCast(T* callback, const b2RayCastInput& input) const +{ + m_tree.RayCast(callback, input); +} + +#endif diff --git a/AndEngine/jni/Box2D/Collision/b2CollideCircle.cpp b/AndEngine/jni/Box2D/Collision/b2CollideCircle.cpp new file mode 100644 index 0000000..deabbbf --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2CollideCircle.cpp @@ -0,0 +1,154 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/Shapes/b2CircleShape.h" +#include "Box2D/Collision/Shapes/b2PolygonShape.h" + +void b2CollideCircles( + b2Manifold* manifold, + const b2CircleShape* circleA, const b2Transform& xfA, + const b2CircleShape* circleB, const b2Transform& xfB) +{ + manifold->pointCount = 0; + + b2Vec2 pA = b2Mul(xfA, circleA->m_p); + b2Vec2 pB = b2Mul(xfB, circleB->m_p); + + b2Vec2 d = pB - pA; + float32 distSqr = b2Dot(d, d); + float32 rA = circleA->m_radius, rB = circleB->m_radius; + float32 radius = rA + rB; + if (distSqr > radius * radius) + { + return; + } + + manifold->type = b2Manifold::e_circles; + manifold->localPoint = circleA->m_p; + manifold->localNormal.SetZero(); + manifold->pointCount = 1; + + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; +} + +void b2CollidePolygonAndCircle( + b2Manifold* manifold, + const b2PolygonShape* polygonA, const b2Transform& xfA, + const b2CircleShape* circleB, const b2Transform& xfB) +{ + manifold->pointCount = 0; + + // Compute circle position in the frame of the polygon. + b2Vec2 c = b2Mul(xfB, circleB->m_p); + b2Vec2 cLocal = b2MulT(xfA, c); + + // Find the min separating edge. + int32 normalIndex = 0; + float32 separation = -b2_maxFloat; + float32 radius = polygonA->m_radius + circleB->m_radius; + int32 vertexCount = polygonA->m_vertexCount; + const b2Vec2* vertices = polygonA->m_vertices; + const b2Vec2* normals = polygonA->m_normals; + + for (int32 i = 0; i < vertexCount; ++i) + { + float32 s = b2Dot(normals[i], cLocal - vertices[i]); + + if (s > radius) + { + // Early out. + return; + } + + if (s > separation) + { + separation = s; + normalIndex = i; + } + } + + // Vertices that subtend the incident face. + int32 vertIndex1 = normalIndex; + int32 vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; + b2Vec2 v1 = vertices[vertIndex1]; + b2Vec2 v2 = vertices[vertIndex2]; + + // If the center is inside the polygon ... + if (separation < b2_epsilon) + { + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = normals[normalIndex]; + manifold->localPoint = 0.5f * (v1 + v2); + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; + return; + } + + // Compute barycentric coordinates + float32 u1 = b2Dot(cLocal - v1, v2 - v1); + float32 u2 = b2Dot(cLocal - v2, v1 - v2); + if (u1 <= 0.0f) + { + if (b2DistanceSquared(cLocal, v1) > radius * radius) + { + return; + } + + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = cLocal - v1; + manifold->localNormal.Normalize(); + manifold->localPoint = v1; + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; + } + else if (u2 <= 0.0f) + { + if (b2DistanceSquared(cLocal, v2) > radius * radius) + { + return; + } + + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = cLocal - v2; + manifold->localNormal.Normalize(); + manifold->localPoint = v2; + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; + } + else + { + b2Vec2 faceCenter = 0.5f * (v1 + v2); + float32 separation = b2Dot(cLocal - faceCenter, normals[vertIndex1]); + if (separation > radius) + { + return; + } + + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = normals[vertIndex1]; + manifold->localPoint = faceCenter; + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; + } +} diff --git a/AndEngine/jni/Box2D/Collision/b2CollidePolygon.cpp b/AndEngine/jni/Box2D/Collision/b2CollidePolygon.cpp new file mode 100644 index 0000000..2ac8779 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2CollidePolygon.cpp @@ -0,0 +1,306 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/Shapes/b2PolygonShape.h" + +// Find the separation between poly1 and poly2 for a give edge normal on poly1. +static float32 b2EdgeSeparation(const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, + const b2PolygonShape* poly2, const b2Transform& xf2) +{ + int32 count1 = poly1->m_vertexCount; + const b2Vec2* vertices1 = poly1->m_vertices; + const b2Vec2* normals1 = poly1->m_normals; + + int32 count2 = poly2->m_vertexCount; + const b2Vec2* vertices2 = poly2->m_vertices; + + b2Assert(0 <= edge1 && edge1 < count1); + + // Convert normal from poly1's frame into poly2's frame. + b2Vec2 normal1World = b2Mul(xf1.R, normals1[edge1]); + b2Vec2 normal1 = b2MulT(xf2.R, normal1World); + + // Find support vertex on poly2 for -normal. + int32 index = 0; + float32 minDot = b2_maxFloat; + + for (int32 i = 0; i < count2; ++i) + { + float32 dot = b2Dot(vertices2[i], normal1); + if (dot < minDot) + { + minDot = dot; + index = i; + } + } + + b2Vec2 v1 = b2Mul(xf1, vertices1[edge1]); + b2Vec2 v2 = b2Mul(xf2, vertices2[index]); + float32 separation = b2Dot(v2 - v1, normal1World); + return separation; +} + +// Find the max separation between poly1 and poly2 using edge normals from poly1. +static float32 b2FindMaxSeparation(int32* edgeIndex, + const b2PolygonShape* poly1, const b2Transform& xf1, + const b2PolygonShape* poly2, const b2Transform& xf2) +{ + int32 count1 = poly1->m_vertexCount; + const b2Vec2* normals1 = poly1->m_normals; + + // Vector pointing from the centroid of poly1 to the centroid of poly2. + b2Vec2 d = b2Mul(xf2, poly2->m_centroid) - b2Mul(xf1, poly1->m_centroid); + b2Vec2 dLocal1 = b2MulT(xf1.R, d); + + // Find edge normal on poly1 that has the largest projection onto d. + int32 edge = 0; + float32 maxDot = -b2_maxFloat; + for (int32 i = 0; i < count1; ++i) + { + float32 dot = b2Dot(normals1[i], dLocal1); + if (dot > maxDot) + { + maxDot = dot; + edge = i; + } + } + + // Get the separation for the edge normal. + float32 s = b2EdgeSeparation(poly1, xf1, edge, poly2, xf2); + + // Check the separation for the previous edge normal. + int32 prevEdge = edge - 1 >= 0 ? edge - 1 : count1 - 1; + float32 sPrev = b2EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2); + + // Check the separation for the next edge normal. + int32 nextEdge = edge + 1 < count1 ? edge + 1 : 0; + float32 sNext = b2EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2); + + // Find the best edge and the search direction. + int32 bestEdge; + float32 bestSeparation; + int32 increment; + if (sPrev > s && sPrev > sNext) + { + increment = -1; + bestEdge = prevEdge; + bestSeparation = sPrev; + } + else if (sNext > s) + { + increment = 1; + bestEdge = nextEdge; + bestSeparation = sNext; + } + else + { + *edgeIndex = edge; + return s; + } + + // Perform a local search for the best edge normal. + for ( ; ; ) + { + if (increment == -1) + edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1; + else + edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0; + + s = b2EdgeSeparation(poly1, xf1, edge, poly2, xf2); + + if (s > bestSeparation) + { + bestEdge = edge; + bestSeparation = s; + } + else + { + break; + } + } + + *edgeIndex = bestEdge; + return bestSeparation; +} + +static void b2FindIncidentEdge(b2ClipVertex c[2], + const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, + const b2PolygonShape* poly2, const b2Transform& xf2) +{ + int32 count1 = poly1->m_vertexCount; + const b2Vec2* normals1 = poly1->m_normals; + + int32 count2 = poly2->m_vertexCount; + const b2Vec2* vertices2 = poly2->m_vertices; + const b2Vec2* normals2 = poly2->m_normals; + + b2Assert(0 <= edge1 && edge1 < count1); + + // Get the normal of the reference edge in poly2's frame. + b2Vec2 normal1 = b2MulT(xf2.R, b2Mul(xf1.R, normals1[edge1])); + + // Find the incident edge on poly2. + int32 index = 0; + float32 minDot = b2_maxFloat; + for (int32 i = 0; i < count2; ++i) + { + float32 dot = b2Dot(normal1, normals2[i]); + if (dot < minDot) + { + minDot = dot; + index = i; + } + } + + // Build the clip vertices for the incident edge. + int32 i1 = index; + int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0; + + c[0].v = b2Mul(xf2, vertices2[i1]); + c[0].id.features.referenceEdge = (uint8)edge1; + c[0].id.features.incidentEdge = (uint8)i1; + c[0].id.features.incidentVertex = 0; + + c[1].v = b2Mul(xf2, vertices2[i2]); + c[1].id.features.referenceEdge = (uint8)edge1; + c[1].id.features.incidentEdge = (uint8)i2; + c[1].id.features.incidentVertex = 1; +} + +// Find edge normal of max separation on A - return if separating axis is found +// Find edge normal of max separation on B - return if separation axis is found +// Choose reference edge as min(minA, minB) +// Find incident edge +// Clip + +// The normal points from 1 to 2 +void b2CollidePolygons(b2Manifold* manifold, + const b2PolygonShape* polyA, const b2Transform& xfA, + const b2PolygonShape* polyB, const b2Transform& xfB) +{ + manifold->pointCount = 0; + float32 totalRadius = polyA->m_radius + polyB->m_radius; + + int32 edgeA = 0; + float32 separationA = b2FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB); + if (separationA > totalRadius) + return; + + int32 edgeB = 0; + float32 separationB = b2FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA); + if (separationB > totalRadius) + return; + + const b2PolygonShape* poly1; // reference polygon + const b2PolygonShape* poly2; // incident polygon + b2Transform xf1, xf2; + int32 edge1; // reference edge + uint8 flip; + const float32 k_relativeTol = 0.98f; + const float32 k_absoluteTol = 0.001f; + + if (separationB > k_relativeTol * separationA + k_absoluteTol) + { + poly1 = polyB; + poly2 = polyA; + xf1 = xfB; + xf2 = xfA; + edge1 = edgeB; + manifold->type = b2Manifold::e_faceB; + flip = 1; + } + else + { + poly1 = polyA; + poly2 = polyB; + xf1 = xfA; + xf2 = xfB; + edge1 = edgeA; + manifold->type = b2Manifold::e_faceA; + flip = 0; + } + + b2ClipVertex incidentEdge[2]; + b2FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); + + int32 count1 = poly1->m_vertexCount; + const b2Vec2* vertices1 = poly1->m_vertices; + + b2Vec2 v11 = vertices1[edge1]; + b2Vec2 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0]; + + b2Vec2 localTangent = v12 - v11; + localTangent.Normalize(); + + b2Vec2 localNormal = b2Cross(localTangent, 1.0f); + b2Vec2 planePoint = 0.5f * (v11 + v12); + + b2Vec2 tangent = b2Mul(xf1.R, localTangent); + b2Vec2 normal = b2Cross(tangent, 1.0f); + + v11 = b2Mul(xf1, v11); + v12 = b2Mul(xf1, v12); + + // Face offset. + float32 frontOffset = b2Dot(normal, v11); + + // Side offsets, extended by polytope skin thickness. + float32 sideOffset1 = -b2Dot(tangent, v11) + totalRadius; + float32 sideOffset2 = b2Dot(tangent, v12) + totalRadius; + + // Clip incident edge against extruded edge1 side edges. + b2ClipVertex clipPoints1[2]; + b2ClipVertex clipPoints2[2]; + int np; + + // Clip to box side 1 + np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1); + + if (np < 2) + return; + + // Clip to negative box side 1 + np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2); + + if (np < 2) + { + return; + } + + // Now clipPoints2 contains the clipped points. + manifold->localNormal = localNormal; + manifold->localPoint = planePoint; + + int32 pointCount = 0; + for (int32 i = 0; i < b2_maxManifoldPoints; ++i) + { + float32 separation = b2Dot(normal, clipPoints2[i].v) - frontOffset; + + if (separation <= totalRadius) + { + b2ManifoldPoint* cp = manifold->points + pointCount; + cp->localPoint = b2MulT(xf2, clipPoints2[i].v); + cp->id = clipPoints2[i].id; + cp->id.features.flip = flip; + ++pointCount; + } + } + + manifold->pointCount = pointCount; +} diff --git a/AndEngine/jni/Box2D/Collision/b2Collision.cpp b/AndEngine/jni/Box2D/Collision/b2Collision.cpp new file mode 100644 index 0000000..6af5afe --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2Collision.cpp @@ -0,0 +1,250 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/b2Distance.h" + +void b2WorldManifold::Initialize(const b2Manifold* manifold, + const b2Transform& xfA, float32 radiusA, + const b2Transform& xfB, float32 radiusB) +{ + if (manifold->pointCount == 0) + { + return; + } + + switch (manifold->type) + { + case b2Manifold::e_circles: + { + normal.Set(1.0f, 0.0f); + b2Vec2 pointA = b2Mul(xfA, manifold->localPoint); + b2Vec2 pointB = b2Mul(xfB, manifold->points[0].localPoint); + if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) + { + normal = pointB - pointA; + normal.Normalize(); + } + + b2Vec2 cA = pointA + radiusA * normal; + b2Vec2 cB = pointB - radiusB * normal; + points[0] = 0.5f * (cA + cB); + } + break; + + case b2Manifold::e_faceA: + { + normal = b2Mul(xfA.R, manifold->localNormal); + b2Vec2 planePoint = b2Mul(xfA, manifold->localPoint); + + for (int32 i = 0; i < manifold->pointCount; ++i) + { + b2Vec2 clipPoint = b2Mul(xfB, manifold->points[i].localPoint); + b2Vec2 cA = clipPoint + (radiusA - b2Dot(clipPoint - planePoint, normal)) * normal; + b2Vec2 cB = clipPoint - radiusB * normal; + points[i] = 0.5f * (cA + cB); + } + } + break; + + case b2Manifold::e_faceB: + { + normal = b2Mul(xfB.R, manifold->localNormal); + b2Vec2 planePoint = b2Mul(xfB, manifold->localPoint); + + for (int32 i = 0; i < manifold->pointCount; ++i) + { + b2Vec2 clipPoint = b2Mul(xfA, manifold->points[i].localPoint); + b2Vec2 cB = clipPoint + (radiusB - b2Dot(clipPoint - planePoint, normal)) * normal; + b2Vec2 cA = clipPoint - radiusA * normal; + points[i] = 0.5f * (cA + cB); + } + + // Ensure normal points from A to B. + normal = -normal; + } + break; + } +} + +void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints], + const b2Manifold* manifold1, const b2Manifold* manifold2) +{ + for (int32 i = 0; i < b2_maxManifoldPoints; ++i) + { + state1[i] = b2_nullState; + state2[i] = b2_nullState; + } + + // Detect persists and removes. + for (int32 i = 0; i < manifold1->pointCount; ++i) + { + b2ContactID id = manifold1->points[i].id; + + state1[i] = b2_removeState; + + for (int32 j = 0; j < manifold2->pointCount; ++j) + { + if (manifold2->points[j].id.key == id.key) + { + state1[i] = b2_persistState; + break; + } + } + } + + // Detect persists and adds. + for (int32 i = 0; i < manifold2->pointCount; ++i) + { + b2ContactID id = manifold2->points[i].id; + + state2[i] = b2_addState; + + for (int32 j = 0; j < manifold1->pointCount; ++j) + { + if (manifold1->points[j].id.key == id.key) + { + state2[i] = b2_persistState; + break; + } + } + } +} + +// From Real-time Collision Detection, p179. +bool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const +{ + float32 tmin = -b2_maxFloat; + float32 tmax = b2_maxFloat; + + b2Vec2 p = input.p1; + b2Vec2 d = input.p2 - input.p1; + b2Vec2 absD = b2Abs(d); + + b2Vec2 normal; + + for (int32 i = 0; i < 2; ++i) + { + if (absD(i) < b2_epsilon) + { + // Parallel. + if (p(i) < lowerBound(i) || upperBound(i) < p(i)) + { + return false; + } + } + else + { + float32 inv_d = 1.0f / d(i); + float32 t1 = (lowerBound(i) - p(i)) * inv_d; + float32 t2 = (upperBound(i) - p(i)) * inv_d; + + // Sign of the normal vector. + float32 s = -1.0f; + + if (t1 > t2) + { + b2Swap(t1, t2); + s = 1.0f; + } + + // Push the min up + if (t1 > tmin) + { + normal.SetZero(); + normal(i) = s; + tmin = t1; + } + + // Pull the max down + tmax = b2Min(tmax, t2); + + if (tmin > tmax) + { + return false; + } + } + } + + // Does the ray start inside the box? + // Does the ray intersect beyond the max fraction? + if (tmin < 0.0f || input.maxFraction < tmin) + { + return false; + } + + // Intersection. + output->fraction = tmin; + output->normal = normal; + return true; +} + +// Sutherland-Hodgman clipping. +int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], + const b2Vec2& normal, float32 offset) +{ + // Start with no output points + int32 numOut = 0; + + // Calculate the distance of end points to the line + float32 distance0 = b2Dot(normal, vIn[0].v) - offset; + float32 distance1 = b2Dot(normal, vIn[1].v) - offset; + + // If the points are behind the plane + if (distance0 <= 0.0f) vOut[numOut++] = vIn[0]; + if (distance1 <= 0.0f) vOut[numOut++] = vIn[1]; + + // If the points are on different sides of the plane + if (distance0 * distance1 < 0.0f) + { + // Find intersection point of edge and plane + float32 interp = distance0 / (distance0 - distance1); + vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v); + if (distance0 > 0.0f) + { + vOut[numOut].id = vIn[0].id; + } + else + { + vOut[numOut].id = vIn[1].id; + } + ++numOut; + } + + return numOut; +} + +bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, + const b2Transform& xfA, const b2Transform& xfB) +{ + b2DistanceInput input; + input.proxyA.Set(shapeA); + input.proxyB.Set(shapeB); + input.transformA = xfA; + input.transformB = xfB; + input.useRadii = true; + + b2SimplexCache cache; + cache.count = 0; + + b2DistanceOutput output; + + b2Distance(&output, &cache, &input); + + return output.distance < 10.0f * b2_epsilon; +} diff --git a/AndEngine/jni/Box2D/Collision/b2Collision.h b/AndEngine/jni/Box2D/Collision/b2Collision.h new file mode 100644 index 0000000..567530b --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2Collision.h @@ -0,0 +1,240 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_COLLISION_H +#define B2_COLLISION_H + +#include "Box2D/Common/b2Math.h" +#include + +/// @file +/// Structures and functions used for computing contact points, distance +/// queries, and TOI queries. + +class b2Shape; +class b2CircleShape; +class b2PolygonShape; + +const uint8 b2_nullFeature = UCHAR_MAX; + +/// Contact ids to facilitate warm starting. +union b2ContactID +{ + /// The features that intersect to form the contact point + struct Features + { + uint8 referenceEdge; ///< The edge that defines the outward contact normal. + uint8 incidentEdge; ///< The edge most anti-parallel to the reference edge. + uint8 incidentVertex; ///< The vertex (0 or 1) on the incident edge that was clipped. + uint8 flip; ///< A value of 1 indicates that the reference edge is on shape2. + } features; + uint32 key; ///< Used to quickly compare contact ids. +}; + +/// A manifold point is a contact point belonging to a contact +/// manifold. It holds details related to the geometry and dynamics +/// of the contact points. +/// The local point usage depends on the manifold type: +/// -e_circles: the local center of circleB +/// -e_faceA: the local center of cirlceB or the clip point of polygonB +/// -e_faceB: the clip point of polygonA +/// This structure is stored across time steps, so we keep it small. +/// Note: the impulses are used for internal caching and may not +/// provide reliable contact forces, especially for high speed collisions. +struct b2ManifoldPoint +{ + b2Vec2 localPoint; ///< usage depends on manifold type + float32 normalImpulse; ///< the non-penetration impulse + float32 tangentImpulse; ///< the friction impulse + b2ContactID id; ///< uniquely identifies a contact point between two shapes +}; + +/// A manifold for two touching convex shapes. +/// Box2D supports multiple types of contact: +/// - clip point versus plane with radius +/// - point versus point with radius (circles) +/// The local point usage depends on the manifold type: +/// -e_circles: the local center of circleA +/// -e_faceA: the center of faceA +/// -e_faceB: the center of faceB +/// Similarly the local normal usage: +/// -e_circles: not used +/// -e_faceA: the normal on polygonA +/// -e_faceB: the normal on polygonB +/// We store contacts in this way so that position correction can +/// account for movement, which is critical for continuous physics. +/// All contact scenarios must be expressed in one of these types. +/// This structure is stored across time steps, so we keep it small. +struct b2Manifold +{ + enum Type + { + e_circles, + e_faceA, + e_faceB + }; + + b2ManifoldPoint points[b2_maxManifoldPoints]; ///< the points of contact + b2Vec2 localNormal; ///< not use for Type::e_points + b2Vec2 localPoint; ///< usage depends on manifold type + Type type; + int32 pointCount; ///< the number of manifold points +}; + +/// This is used to compute the current state of a contact manifold. +struct b2WorldManifold +{ + /// Evaluate the manifold with supplied transforms. This assumes + /// modest motion from the original state. This does not change the + /// point count, impulses, etc. The radii must come from the shapes + /// that generated the manifold. + void Initialize(const b2Manifold* manifold, + const b2Transform& xfA, float32 radiusA, + const b2Transform& xfB, float32 radiusB); + + b2Vec2 normal; ///< world vector pointing from A to B + b2Vec2 points[b2_maxManifoldPoints]; ///< world contact point (point of intersection) +}; + +/// This is used for determining the state of contact points. +enum b2PointState +{ + b2_nullState, ///< point does not exist + b2_addState, ///< point was added in the update + b2_persistState, ///< point persisted across the update + b2_removeState ///< point was removed in the update +}; + +/// Compute the point states given two manifolds. The states pertain to the transition from manifold1 +/// to manifold2. So state1 is either persist or remove while state2 is either add or persist. +void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints], + const b2Manifold* manifold1, const b2Manifold* manifold2); + +/// Used for computing contact manifolds. +struct b2ClipVertex +{ + b2Vec2 v; + b2ContactID id; +}; + +/// Ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). +struct b2RayCastInput +{ + b2Vec2 p1, p2; + float32 maxFraction; +}; + +/// Ray-cast output data. The ray hits at p1 + fraction * (p2 - p1), where p1 and p2 +/// come from b2RayCastInput. +struct b2RayCastOutput +{ + b2Vec2 normal; + float32 fraction; +}; + +/// An axis aligned bounding box. +struct b2AABB +{ + /// Verify that the bounds are sorted. + bool IsValid() const; + + /// Get the center of the AABB. + b2Vec2 GetCenter() const + { + return 0.5f * (lowerBound + upperBound); + } + + /// Get the extents of the AABB (half-widths). + b2Vec2 GetExtents() const + { + return 0.5f * (upperBound - lowerBound); + } + + /// Combine two AABBs into this one. + void Combine(const b2AABB& aabb1, const b2AABB& aabb2) + { + lowerBound = b2Min(aabb1.lowerBound, aabb2.lowerBound); + upperBound = b2Max(aabb1.upperBound, aabb2.upperBound); + } + + /// Does this aabb contain the provided AABB. + bool Contains(const b2AABB& aabb) const + { + bool result = true; + result = result && lowerBound.x <= aabb.lowerBound.x; + result = result && lowerBound.y <= aabb.lowerBound.y; + result = result && aabb.upperBound.x <= upperBound.x; + result = result && aabb.upperBound.y <= upperBound.y; + return result; + } + + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const; + + b2Vec2 lowerBound; ///< the lower vertex + b2Vec2 upperBound; ///< the upper vertex +}; + +/// Compute the collision manifold between two circles. +void b2CollideCircles(b2Manifold* manifold, + const b2CircleShape* circle1, const b2Transform& xf1, + const b2CircleShape* circle2, const b2Transform& xf2); + +/// Compute the collision manifold between a polygon and a circle. +void b2CollidePolygonAndCircle(b2Manifold* manifold, + const b2PolygonShape* polygon, const b2Transform& xf1, + const b2CircleShape* circle, const b2Transform& xf2); + +/// Compute the collision manifold between two polygons. +void b2CollidePolygons(b2Manifold* manifold, + const b2PolygonShape* polygon1, const b2Transform& xf1, + const b2PolygonShape* polygon2, const b2Transform& xf2); + +/// Clipping for contact manifolds. +int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], + const b2Vec2& normal, float32 offset); + +/// Determine if two generic shapes overlap. +bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, + const b2Transform& xfA, const b2Transform& xfB); + +// ---------------- Inline Functions ------------------------------------------ + +inline bool b2AABB::IsValid() const +{ + b2Vec2 d = upperBound - lowerBound; + bool valid = d.x >= 0.0f && d.y >= 0.0f; + valid = valid && lowerBound.IsValid() && upperBound.IsValid(); + return valid; +} + +inline bool b2TestOverlap(const b2AABB& a, const b2AABB& b) +{ + b2Vec2 d1, d2; + d1 = b.lowerBound - a.upperBound; + d2 = a.lowerBound - b.upperBound; + + if (d1.x > 0.0f || d1.y > 0.0f) + return false; + + if (d2.x > 0.0f || d2.y > 0.0f) + return false; + + return true; +} + +#endif diff --git a/AndEngine/jni/Box2D/Collision/b2Distance.cpp b/AndEngine/jni/Box2D/Collision/b2Distance.cpp new file mode 100644 index 0000000..9160eb7 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2Distance.cpp @@ -0,0 +1,571 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/b2Distance.h" +#include "Box2D/Collision/Shapes/b2CircleShape.h" +#include "Box2D/Collision/Shapes/b2PolygonShape.h" + +// GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. +int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; + +void b2DistanceProxy::Set(const b2Shape* shape) +{ + switch (shape->GetType()) + { + case b2Shape::e_circle: + { + const b2CircleShape* circle = (b2CircleShape*)shape; + m_vertices = &circle->m_p; + m_count = 1; + m_radius = circle->m_radius; + } + break; + + case b2Shape::e_polygon: + { + const b2PolygonShape* polygon = (b2PolygonShape*)shape; + m_vertices = polygon->m_vertices; + m_count = polygon->m_vertexCount; + m_radius = polygon->m_radius; + } + break; + + default: + b2Assert(false); + } +} + + +struct b2SimplexVertex +{ + b2Vec2 wA; // support point in proxyA + b2Vec2 wB; // support point in proxyB + b2Vec2 w; // wB - wA + float32 a; // barycentric coordinate for closest point + int32 indexA; // wA index + int32 indexB; // wB index +}; + +struct b2Simplex +{ + void ReadCache( const b2SimplexCache* cache, + const b2DistanceProxy* proxyA, const b2Transform& transformA, + const b2DistanceProxy* proxyB, const b2Transform& transformB) + { + b2Assert(cache->count <= 3); + + // Copy data from cache. + m_count = cache->count; + b2SimplexVertex* vertices = &m_v1; + for (int32 i = 0; i < m_count; ++i) + { + b2SimplexVertex* v = vertices + i; + v->indexA = cache->indexA[i]; + v->indexB = cache->indexB[i]; + b2Vec2 wALocal = proxyA->GetVertex(v->indexA); + b2Vec2 wBLocal = proxyB->GetVertex(v->indexB); + v->wA = b2Mul(transformA, wALocal); + v->wB = b2Mul(transformB, wBLocal); + v->w = v->wB - v->wA; + v->a = 0.0f; + } + + // Compute the new simplex metric, if it is substantially different than + // old metric then flush the simplex. + if (m_count > 1) + { + float32 metric1 = cache->metric; + float32 metric2 = GetMetric(); + if (metric2 < 0.5f * metric1 || 2.0f * metric1 < metric2 || metric2 < b2_epsilon) + { + // Reset the simplex. + m_count = 0; + } + } + + // If the cache is empty or invalid ... + if (m_count == 0) + { + b2SimplexVertex* v = vertices + 0; + v->indexA = 0; + v->indexB = 0; + b2Vec2 wALocal = proxyA->GetVertex(0); + b2Vec2 wBLocal = proxyB->GetVertex(0); + v->wA = b2Mul(transformA, wALocal); + v->wB = b2Mul(transformB, wBLocal); + v->w = v->wB - v->wA; + m_count = 1; + } + } + + void WriteCache(b2SimplexCache* cache) const + { + cache->metric = GetMetric(); + cache->count = uint16(m_count); + const b2SimplexVertex* vertices = &m_v1; + for (int32 i = 0; i < m_count; ++i) + { + cache->indexA[i] = uint8(vertices[i].indexA); + cache->indexB[i] = uint8(vertices[i].indexB); + } + } + + b2Vec2 GetSearchDirection() const + { + switch (m_count) + { + case 1: + return -m_v1.w; + + case 2: + { + b2Vec2 e12 = m_v2.w - m_v1.w; + float32 sgn = b2Cross(e12, -m_v1.w); + if (sgn > 0.0f) + { + // Origin is left of e12. + return b2Cross(1.0f, e12); + } + else + { + // Origin is right of e12. + return b2Cross(e12, 1.0f); + } + } + + default: + b2Assert(false); + return b2Vec2_zero; + } + } + + b2Vec2 GetClosestPoint() const + { + switch (m_count) + { + case 0: + b2Assert(false); + return b2Vec2_zero; + + case 1: + return m_v1.w; + + case 2: + return m_v1.a * m_v1.w + m_v2.a * m_v2.w; + + case 3: + return b2Vec2_zero; + + default: + b2Assert(false); + return b2Vec2_zero; + } + } + + void GetWitnessPoints(b2Vec2* pA, b2Vec2* pB) const + { + switch (m_count) + { + case 0: + b2Assert(false); + break; + + case 1: + *pA = m_v1.wA; + *pB = m_v1.wB; + break; + + case 2: + *pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA; + *pB = m_v1.a * m_v1.wB + m_v2.a * m_v2.wB; + break; + + case 3: + *pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA + m_v3.a * m_v3.wA; + *pB = *pA; + break; + + default: + b2Assert(false); + break; + } + } + + float32 GetMetric() const + { + switch (m_count) + { + case 0: + b2Assert(false); + return 0.0; + + case 1: + return 0.0f; + + case 2: + return b2Distance(m_v1.w, m_v2.w); + + case 3: + return b2Cross(m_v2.w - m_v1.w, m_v3.w - m_v1.w); + + default: + b2Assert(false); + return 0.0f; + } + } + + void Solve2(); + void Solve3(); + + b2SimplexVertex m_v1, m_v2, m_v3; + int32 m_count; +}; + + +// Solve a line segment using barycentric coordinates. +// +// p = a1 * w1 + a2 * w2 +// a1 + a2 = 1 +// +// The vector from the origin to the closest point on the line is +// perpendicular to the line. +// e12 = w2 - w1 +// dot(p, e) = 0 +// a1 * dot(w1, e) + a2 * dot(w2, e) = 0 +// +// 2-by-2 linear system +// [1 1 ][a1] = [1] +// [w1.e12 w2.e12][a2] = [0] +// +// Define +// d12_1 = dot(w2, e12) +// d12_2 = -dot(w1, e12) +// d12 = d12_1 + d12_2 +// +// Solution +// a1 = d12_1 / d12 +// a2 = d12_2 / d12 +void b2Simplex::Solve2() +{ + b2Vec2 w1 = m_v1.w; + b2Vec2 w2 = m_v2.w; + b2Vec2 e12 = w2 - w1; + + // w1 region + float32 d12_2 = -b2Dot(w1, e12); + if (d12_2 <= 0.0f) + { + // a2 <= 0, so we clamp it to 0 + m_v1.a = 1.0f; + m_count = 1; + return; + } + + // w2 region + float32 d12_1 = b2Dot(w2, e12); + if (d12_1 <= 0.0f) + { + // a1 <= 0, so we clamp it to 0 + m_v2.a = 1.0f; + m_count = 1; + m_v1 = m_v2; + return; + } + + // Must be in e12 region. + float32 inv_d12 = 1.0f / (d12_1 + d12_2); + m_v1.a = d12_1 * inv_d12; + m_v2.a = d12_2 * inv_d12; + m_count = 2; +} + +// Possible regions: +// - points[2] +// - edge points[0]-points[2] +// - edge points[1]-points[2] +// - inside the triangle +void b2Simplex::Solve3() +{ + b2Vec2 w1 = m_v1.w; + b2Vec2 w2 = m_v2.w; + b2Vec2 w3 = m_v3.w; + + // Edge12 + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // a3 = 0 + b2Vec2 e12 = w2 - w1; + float32 w1e12 = b2Dot(w1, e12); + float32 w2e12 = b2Dot(w2, e12); + float32 d12_1 = w2e12; + float32 d12_2 = -w1e12; + + // Edge13 + // [1 1 ][a1] = [1] + // [w1.e13 w3.e13][a3] = [0] + // a2 = 0 + b2Vec2 e13 = w3 - w1; + float32 w1e13 = b2Dot(w1, e13); + float32 w3e13 = b2Dot(w3, e13); + float32 d13_1 = w3e13; + float32 d13_2 = -w1e13; + + // Edge23 + // [1 1 ][a2] = [1] + // [w2.e23 w3.e23][a3] = [0] + // a1 = 0 + b2Vec2 e23 = w3 - w2; + float32 w2e23 = b2Dot(w2, e23); + float32 w3e23 = b2Dot(w3, e23); + float32 d23_1 = w3e23; + float32 d23_2 = -w2e23; + + // Triangle123 + float32 n123 = b2Cross(e12, e13); + + float32 d123_1 = n123 * b2Cross(w2, w3); + float32 d123_2 = n123 * b2Cross(w3, w1); + float32 d123_3 = n123 * b2Cross(w1, w2); + + // w1 region + if (d12_2 <= 0.0f && d13_2 <= 0.0f) + { + m_v1.a = 1.0f; + m_count = 1; + return; + } + + // e12 + if (d12_1 > 0.0f && d12_2 > 0.0f && d123_3 <= 0.0f) + { + float32 inv_d12 = 1.0f / (d12_1 + d12_2); + m_v1.a = d12_1 * inv_d12; + m_v2.a = d12_2 * inv_d12; + m_count = 2; + return; + } + + // e13 + if (d13_1 > 0.0f && d13_2 > 0.0f && d123_2 <= 0.0f) + { + float32 inv_d13 = 1.0f / (d13_1 + d13_2); + m_v1.a = d13_1 * inv_d13; + m_v3.a = d13_2 * inv_d13; + m_count = 2; + m_v2 = m_v3; + return; + } + + // w2 region + if (d12_1 <= 0.0f && d23_2 <= 0.0f) + { + m_v2.a = 1.0f; + m_count = 1; + m_v1 = m_v2; + return; + } + + // w3 region + if (d13_1 <= 0.0f && d23_1 <= 0.0f) + { + m_v3.a = 1.0f; + m_count = 1; + m_v1 = m_v3; + return; + } + + // e23 + if (d23_1 > 0.0f && d23_2 > 0.0f && d123_1 <= 0.0f) + { + float32 inv_d23 = 1.0f / (d23_1 + d23_2); + m_v2.a = d23_1 * inv_d23; + m_v3.a = d23_2 * inv_d23; + m_count = 2; + m_v1 = m_v3; + return; + } + + // Must be in triangle123 + float32 inv_d123 = 1.0f / (d123_1 + d123_2 + d123_3); + m_v1.a = d123_1 * inv_d123; + m_v2.a = d123_2 * inv_d123; + m_v3.a = d123_3 * inv_d123; + m_count = 3; +} + +void b2Distance(b2DistanceOutput* output, + b2SimplexCache* cache, + const b2DistanceInput* input) +{ + ++b2_gjkCalls; + + const b2DistanceProxy* proxyA = &input->proxyA; + const b2DistanceProxy* proxyB = &input->proxyB; + + b2Transform transformA = input->transformA; + b2Transform transformB = input->transformB; + + // Initialize the simplex. + b2Simplex simplex; + simplex.ReadCache(cache, proxyA, transformA, proxyB, transformB); + + // Get simplex vertices as an array. + b2SimplexVertex* vertices = &simplex.m_v1; + const int32 k_maxIters = 20; + + // These store the vertices of the last simplex so that we + // can check for duplicates and prevent cycling. + int32 saveA[3], saveB[3]; + int32 saveCount = 0; + + b2Vec2 closestPoint = simplex.GetClosestPoint(); + float32 distanceSqr1 = closestPoint.LengthSquared(); + float32 distanceSqr2 = distanceSqr1; + + // Main iteration loop. + int32 iter = 0; + while (iter < k_maxIters) + { + // Copy simplex so we can identify duplicates. + saveCount = simplex.m_count; + for (int32 i = 0; i < saveCount; ++i) + { + saveA[i] = vertices[i].indexA; + saveB[i] = vertices[i].indexB; + } + + switch (simplex.m_count) + { + case 1: + break; + + case 2: + simplex.Solve2(); + break; + + case 3: + simplex.Solve3(); + break; + + default: + b2Assert(false); + } + + // If we have 3 points, then the origin is in the corresponding triangle. + if (simplex.m_count == 3) + { + break; + } + + // Compute closest point. + b2Vec2 p = simplex.GetClosestPoint(); + distanceSqr2 = p.LengthSquared(); + + // Ensure progress + if (distanceSqr2 >= distanceSqr1) + { + //break; + } + distanceSqr1 = distanceSqr2; + + // Get search direction. + b2Vec2 d = simplex.GetSearchDirection(); + + // Ensure the search direction is numerically fit. + if (d.LengthSquared() < b2_epsilon * b2_epsilon) + { + // The origin is probably contained by a line segment + // or triangle. Thus the shapes are overlapped. + + // We can't return zero here even though there may be overlap. + // In case the simplex is a point, segment, or triangle it is difficult + // to determine if the origin is contained in the CSO or very close to it. + break; + } + + // Compute a tentative new simplex vertex using support points. + b2SimplexVertex* vertex = vertices + simplex.m_count; + vertex->indexA = proxyA->GetSupport(b2MulT(transformA.R, -d)); + vertex->wA = b2Mul(transformA, proxyA->GetVertex(vertex->indexA)); + b2Vec2 wBLocal; + vertex->indexB = proxyB->GetSupport(b2MulT(transformB.R, d)); + vertex->wB = b2Mul(transformB, proxyB->GetVertex(vertex->indexB)); + vertex->w = vertex->wB - vertex->wA; + + // Iteration count is equated to the number of support point calls. + ++iter; + ++b2_gjkIters; + + // Check for duplicate support points. This is the main termination criteria. + bool duplicate = false; + for (int32 i = 0; i < saveCount; ++i) + { + if (vertex->indexA == saveA[i] && vertex->indexB == saveB[i]) + { + duplicate = true; + break; + } + } + + // If we found a duplicate support point we must exit to avoid cycling. + if (duplicate) + { + break; + } + + // New vertex is ok and needed. + ++simplex.m_count; + } + + b2_gjkMaxIters = b2Max(b2_gjkMaxIters, iter); + + // Prepare output. + simplex.GetWitnessPoints(&output->pointA, &output->pointB); + output->distance = b2Distance(output->pointA, output->pointB); + output->iterations = iter; + + // Cache the simplex. + simplex.WriteCache(cache); + + // Apply radii if requested. + if (input->useRadii) + { + float32 rA = proxyA->m_radius; + float32 rB = proxyB->m_radius; + + if (output->distance > rA + rB && output->distance > b2_epsilon) + { + // Shapes are still no overlapped. + // Move the witness points to the outer surface. + output->distance -= rA + rB; + b2Vec2 normal = output->pointB - output->pointA; + normal.Normalize(); + output->pointA += rA * normal; + output->pointB -= rB * normal; + } + else + { + // Shapes are overlapped when radii are considered. + // Move the witness points to the middle. + b2Vec2 p = 0.5f * (output->pointA + output->pointB); + output->pointA = p; + output->pointB = p; + output->distance = 0.0f; + } + } +} diff --git a/AndEngine/jni/Box2D/Collision/b2Distance.h b/AndEngine/jni/Box2D/Collision/b2Distance.h new file mode 100644 index 0000000..83fda23 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2Distance.h @@ -0,0 +1,141 @@ + +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_DISTANCE_H +#define B2_DISTANCE_H + +#include "Box2D/Common/b2Math.h" +#include + +class b2Shape; + +/// A distance proxy is used by the GJK algorithm. +/// It encapsulates any shape. +struct b2DistanceProxy +{ + b2DistanceProxy() : m_vertices(NULL), m_count(0), m_radius(0.0f) {} + + /// Initialize the proxy using the given shape. The shape + /// must remain in scope while the proxy is in use. + void Set(const b2Shape* shape); + + /// Get the supporting vertex index in the given direction. + int32 GetSupport(const b2Vec2& d) const; + + /// Get the supporting vertex in the given direction. + const b2Vec2& GetSupportVertex(const b2Vec2& d) const; + + /// Get the vertex count. + int32 GetVertexCount() const; + + /// Get a vertex by index. Used by b2Distance. + const b2Vec2& GetVertex(int32 index) const; + + const b2Vec2* m_vertices; + int32 m_count; + float32 m_radius; +}; + +/// Used to warm start b2Distance. +/// Set count to zero on first call. +struct b2SimplexCache +{ + float32 metric; ///< length or area + uint16 count; + uint8 indexA[3]; ///< vertices on shape A + uint8 indexB[3]; ///< vertices on shape B +}; + +/// Input for b2Distance. +/// You have to option to use the shape radii +/// in the computation. Even +struct b2DistanceInput +{ + b2DistanceProxy proxyA; + b2DistanceProxy proxyB; + b2Transform transformA; + b2Transform transformB; + bool useRadii; +}; + +/// Output for b2Distance. +struct b2DistanceOutput +{ + b2Vec2 pointA; ///< closest point on shapeA + b2Vec2 pointB; ///< closest point on shapeB + float32 distance; + int32 iterations; ///< number of GJK iterations used +}; + +/// Compute the closest points between two shapes. Supports any combination of: +/// b2CircleShape, b2PolygonShape, b2EdgeShape. The simplex cache is input/output. +/// On the first call set b2SimplexCache.count to zero. +void b2Distance(b2DistanceOutput* output, + b2SimplexCache* cache, + const b2DistanceInput* input); + + +////////////////////////////////////////////////////////////////////////// + +inline int32 b2DistanceProxy::GetVertexCount() const +{ + return m_count; +} + +inline const b2Vec2& b2DistanceProxy::GetVertex(int32 index) const +{ + b2Assert(0 <= index && index < m_count); + return m_vertices[index]; +} + +inline int32 b2DistanceProxy::GetSupport(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_count; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return bestIndex; +} + +inline const b2Vec2& b2DistanceProxy::GetSupportVertex(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_count; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return m_vertices[bestIndex]; +} + +#endif diff --git a/AndEngine/jni/Box2D/Collision/b2DynamicTree.cpp b/AndEngine/jni/Box2D/Collision/b2DynamicTree.cpp new file mode 100644 index 0000000..f0e23b6 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2DynamicTree.cpp @@ -0,0 +1,365 @@ +/* +* Copyright (c) 2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/b2DynamicTree.h" +#include +#include + +b2DynamicTree::b2DynamicTree() +{ + m_root = b2_nullNode; + + m_nodeCapacity = 16; + m_nodeCount = 0; + m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); + memset(m_nodes, 0, m_nodeCapacity * sizeof(b2DynamicTreeNode)); + + // Build a linked list for the free list. + for (int32 i = 0; i < m_nodeCapacity - 1; ++i) + { + m_nodes[i].next = i + 1; + } + m_nodes[m_nodeCapacity-1].next = b2_nullNode; + m_freeList = 0; + + m_path = 0; + + m_insertionCount = 0; +} + +b2DynamicTree::~b2DynamicTree() +{ + // This frees the entire tree in one shot. + b2Free(m_nodes); +} + +// Allocate a node from the pool. Grow the pool if necessary. +int32 b2DynamicTree::AllocateNode() +{ + // Expand the node pool as needed. + if (m_freeList == b2_nullNode) + { + b2Assert(m_nodeCount == m_nodeCapacity); + + // The free list is empty. Rebuild a bigger pool. + b2DynamicTreeNode* oldNodes = m_nodes; + m_nodeCapacity *= 2; + m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); + memcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2DynamicTreeNode)); + b2Free(oldNodes); + + // Build a linked list for the free list. The parent + // pointer becomes the "next" pointer. + for (int32 i = m_nodeCount; i < m_nodeCapacity - 1; ++i) + { + m_nodes[i].next = i + 1; + } + m_nodes[m_nodeCapacity-1].next = b2_nullNode; + m_freeList = m_nodeCount; + } + + // Peel a node off the free list. + int32 nodeId = m_freeList; + m_freeList = m_nodes[nodeId].next; + m_nodes[nodeId].parent = b2_nullNode; + m_nodes[nodeId].child1 = b2_nullNode; + m_nodes[nodeId].child2 = b2_nullNode; + ++m_nodeCount; + return nodeId; +} + +// Return a node to the pool. +void b2DynamicTree::FreeNode(int32 nodeId) +{ + b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); + b2Assert(0 < m_nodeCount); + m_nodes[nodeId].next = m_freeList; + m_freeList = nodeId; + --m_nodeCount; +} + +// Create a proxy in the tree as a leaf node. We return the index +// of the node instead of a pointer so that we can grow +// the node pool. +int32 b2DynamicTree::CreateProxy(const b2AABB& aabb, void* userData) +{ + int32 proxyId = AllocateNode(); + + // Fatten the aabb. + b2Vec2 r(b2_aabbExtension, b2_aabbExtension); + m_nodes[proxyId].aabb.lowerBound = aabb.lowerBound - r; + m_nodes[proxyId].aabb.upperBound = aabb.upperBound + r; + m_nodes[proxyId].userData = userData; + + InsertLeaf(proxyId); + + // Rebalance if necessary. + int32 iterationCount = m_nodeCount >> 4; + int32 tryCount = 0; + int32 height = ComputeHeight(); + while (height > 64 && tryCount < 10) + { + Rebalance(iterationCount); + height = ComputeHeight(); + ++tryCount; + } + + return proxyId; +} + +void b2DynamicTree::DestroyProxy(int32 proxyId) +{ + b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); + b2Assert(m_nodes[proxyId].IsLeaf()); + + RemoveLeaf(proxyId); + FreeNode(proxyId); +} + +bool b2DynamicTree::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement) +{ + b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); + + b2Assert(m_nodes[proxyId].IsLeaf()); + + if (m_nodes[proxyId].aabb.Contains(aabb)) + { + return false; + } + + RemoveLeaf(proxyId); + + // Extend AABB. + b2AABB b = aabb; + b2Vec2 r(b2_aabbExtension, b2_aabbExtension); + b.lowerBound = b.lowerBound - r; + b.upperBound = b.upperBound + r; + + // Predict AABB displacement. + b2Vec2 d = b2_aabbMultiplier * displacement; + + if (d.x < 0.0f) + { + b.lowerBound.x += d.x; + } + else + { + b.upperBound.x += d.x; + } + + if (d.y < 0.0f) + { + b.lowerBound.y += d.y; + } + else + { + b.upperBound.y += d.y; + } + + m_nodes[proxyId].aabb = b; + + InsertLeaf(proxyId); + return true; +} + +void b2DynamicTree::InsertLeaf(int32 leaf) +{ + ++m_insertionCount; + + if (m_root == b2_nullNode) + { + m_root = leaf; + m_nodes[m_root].parent = b2_nullNode; + return; + } + + // Find the best sibling for this node. + b2Vec2 center = m_nodes[leaf].aabb.GetCenter(); + int32 sibling = m_root; + if (m_nodes[sibling].IsLeaf() == false) + { + do + { + int32 child1 = m_nodes[sibling].child1; + int32 child2 = m_nodes[sibling].child2; + + b2Vec2 delta1 = b2Abs(m_nodes[child1].aabb.GetCenter() - center); + b2Vec2 delta2 = b2Abs(m_nodes[child2].aabb.GetCenter() - center); + + float32 norm1 = delta1.x + delta1.y; + float32 norm2 = delta2.x + delta2.y; + + if (norm1 < norm2) + { + sibling = child1; + } + else + { + sibling = child2; + } + + } + while(m_nodes[sibling].IsLeaf() == false); + } + + // Create a parent for the siblings. + int32 node1 = m_nodes[sibling].parent; + int32 node2 = AllocateNode(); + m_nodes[node2].parent = node1; + m_nodes[node2].userData = NULL; + m_nodes[node2].aabb.Combine(m_nodes[leaf].aabb, m_nodes[sibling].aabb); + + if (node1 != b2_nullNode) + { + if (m_nodes[m_nodes[sibling].parent].child1 == sibling) + { + m_nodes[node1].child1 = node2; + } + else + { + m_nodes[node1].child2 = node2; + } + + m_nodes[node2].child1 = sibling; + m_nodes[node2].child2 = leaf; + m_nodes[sibling].parent = node2; + m_nodes[leaf].parent = node2; + + do + { + if (m_nodes[node1].aabb.Contains(m_nodes[node2].aabb)) + { + break; + } + + m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); + node2 = node1; + node1 = m_nodes[node1].parent; + } + while(node1 != b2_nullNode); + } + else + { + m_nodes[node2].child1 = sibling; + m_nodes[node2].child2 = leaf; + m_nodes[sibling].parent = node2; + m_nodes[leaf].parent = node2; + m_root = node2; + } +} + +void b2DynamicTree::RemoveLeaf(int32 leaf) +{ + if (leaf == m_root) + { + m_root = b2_nullNode; + return; + } + + int32 node2 = m_nodes[leaf].parent; + int32 node1 = m_nodes[node2].parent; + int32 sibling; + if (m_nodes[node2].child1 == leaf) + { + sibling = m_nodes[node2].child2; + } + else + { + sibling = m_nodes[node2].child1; + } + + if (node1 != b2_nullNode) + { + // Destroy node2 and connect node1 to sibling. + if (m_nodes[node1].child1 == node2) + { + m_nodes[node1].child1 = sibling; + } + else + { + m_nodes[node1].child2 = sibling; + } + m_nodes[sibling].parent = node1; + FreeNode(node2); + + // Adjust ancestor bounds. + while (node1 != b2_nullNode) + { + b2AABB oldAABB = m_nodes[node1].aabb; + m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); + + if (oldAABB.Contains(m_nodes[node1].aabb)) + { + break; + } + + node1 = m_nodes[node1].parent; + } + } + else + { + m_root = sibling; + m_nodes[sibling].parent = b2_nullNode; + FreeNode(node2); + } +} + +void b2DynamicTree::Rebalance(int32 iterations) +{ + if (m_root == b2_nullNode) + { + return; + } + + for (int32 i = 0; i < iterations; ++i) + { + int32 node = m_root; + + uint32 bit = 0; + while (m_nodes[node].IsLeaf() == false) + { + int32* children = &m_nodes[node].child1; + node = children[(m_path >> bit) & 1]; + bit = (bit + 1) & (8* sizeof(uint32) - 1); + } + ++m_path; + + RemoveLeaf(node); + InsertLeaf(node); + } +} + +// Compute the height of a sub-tree. +int32 b2DynamicTree::ComputeHeight(int32 nodeId) const +{ + if (nodeId == b2_nullNode) + { + return 0; + } + + b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); + b2DynamicTreeNode* node = m_nodes + nodeId; + int32 height1 = ComputeHeight(node->child1); + int32 height2 = ComputeHeight(node->child2); + return 1 + b2Max(height1, height2); +} + +int32 b2DynamicTree::ComputeHeight() const +{ + return ComputeHeight(m_root); +} diff --git a/AndEngine/jni/Box2D/Collision/b2DynamicTree.h b/AndEngine/jni/Box2D/Collision/b2DynamicTree.h new file mode 100644 index 0000000..1e3eee1 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2DynamicTree.h @@ -0,0 +1,286 @@ +/* +* Copyright (c) 2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_DYNAMIC_TREE_H +#define B2_DYNAMIC_TREE_H + +#include "Box2D/Collision/b2Collision.h" + +/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. + +#define b2_nullNode (-1) + +/// A node in the dynamic tree. The client does not interact with this directly. +struct b2DynamicTreeNode +{ + bool IsLeaf() const + { + return child1 == b2_nullNode; + } + + /// This is the fattened AABB. + b2AABB aabb; + + //int32 userData; + void* userData; + + union + { + int32 parent; + int32 next; + }; + + int32 child1; + int32 child2; +}; + +/// A dynamic tree arranges data in a binary tree to accelerate +/// queries such as volume queries and ray casts. Leafs are proxies +/// with an AABB. In the tree we expand the proxy AABB by b2_fatAABBFactor +/// so that the proxy AABB is bigger than the client object. This allows the client +/// object to move by small amounts without triggering a tree update. +/// +/// Nodes are pooled and relocatable, so we use node indices rather than pointers. +class b2DynamicTree +{ +public: + + /// Constructing the tree initializes the node pool. + b2DynamicTree(); + + /// Destroy the tree, freeing the node pool. + ~b2DynamicTree(); + + /// Create a proxy. Provide a tight fitting AABB and a userData pointer. + int32 CreateProxy(const b2AABB& aabb, void* userData); + + /// Destroy a proxy. This asserts if the id is invalid. + void DestroyProxy(int32 proxyId); + + /// Move a proxy with a swepted AABB. If the proxy has moved outside of its fattened AABB, + /// then the proxy is removed from the tree and re-inserted. Otherwise + /// the function returns immediately. + /// @return true if the proxy was re-inserted. + bool MoveProxy(int32 proxyId, const b2AABB& aabb1, const b2Vec2& displacement); + + /// Perform some iterations to re-balance the tree. + void Rebalance(int32 iterations); + + /// Get proxy user data. + /// @return the proxy user data or 0 if the id is invalid. + void* GetUserData(int32 proxyId) const; + + /// Get the fat AABB for a proxy. + const b2AABB& GetFatAABB(int32 proxyId) const; + + /// Compute the height of the tree. + int32 ComputeHeight() const; + + /// Query an AABB for overlapping proxies. The callback class + /// is called for each proxy that overlaps the supplied AABB. + template + void Query(T* callback, const b2AABB& aabb) const; + + /// Ray-cast against the proxies in the tree. This relies on the callback + /// to perform a exact ray-cast in the case were the proxy contains a shape. + /// The callback also performs the any collision filtering. This has performance + /// roughly equal to k * log(n), where k is the number of collisions and n is the + /// number of proxies in the tree. + /// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). + /// @param callback a callback class that is called for each proxy that is hit by the ray. + template + void RayCast(T* callback, const b2RayCastInput& input) const; + +private: + + int32 AllocateNode(); + void FreeNode(int32 node); + + void InsertLeaf(int32 node); + void RemoveLeaf(int32 node); + + int32 ComputeHeight(int32 nodeId) const; + + int32 m_root; + + b2DynamicTreeNode* m_nodes; + int32 m_nodeCount; + int32 m_nodeCapacity; + + int32 m_freeList; + + /// This is used incrementally traverse the tree for re-balancing. + uint32 m_path; + + int32 m_insertionCount; +}; + +inline void* b2DynamicTree::GetUserData(int32 proxyId) const +{ + b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); + return m_nodes[proxyId].userData; +} + +inline const b2AABB& b2DynamicTree::GetFatAABB(int32 proxyId) const +{ + b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); + return m_nodes[proxyId].aabb; +} + +template +inline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const +{ + const int32 k_stackSize = 128; + int32 stack[k_stackSize]; + + int32 count = 0; + stack[count++] = m_root; + + while (count > 0) + { + int32 nodeId = stack[--count]; + if (nodeId == b2_nullNode) + { + continue; + } + + const b2DynamicTreeNode* node = m_nodes + nodeId; + + if (b2TestOverlap(node->aabb, aabb)) + { + if (node->IsLeaf()) + { + bool proceed = callback->QueryCallback(nodeId); + if (proceed == false) + { + return; + } + } + else + { + if (count < k_stackSize) + { + stack[count++] = node->child1; + } + + if (count < k_stackSize) + { + stack[count++] = node->child2; + } + } + } + } +} + +template +inline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) const +{ + b2Vec2 p1 = input.p1; + b2Vec2 p2 = input.p2; + b2Vec2 r = p2 - p1; + b2Assert(r.LengthSquared() > 0.0f); + r.Normalize(); + + // v is perpendicular to the segment. + b2Vec2 v = b2Cross(1.0f, r); + b2Vec2 abs_v = b2Abs(v); + + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + + float32 maxFraction = input.maxFraction; + + // Build a bounding box for the segment. + b2AABB segmentAABB; + { + b2Vec2 t = p1 + maxFraction * (p2 - p1); + segmentAABB.lowerBound = b2Min(p1, t); + segmentAABB.upperBound = b2Max(p1, t); + } + + const int32 k_stackSize = 128; + int32 stack[k_stackSize]; + + int32 count = 0; + stack[count++] = m_root; + + while (count > 0) + { + int32 nodeId = stack[--count]; + if (nodeId == b2_nullNode) + { + continue; + } + + const b2DynamicTreeNode* node = m_nodes + nodeId; + + if (b2TestOverlap(node->aabb, segmentAABB) == false) + { + continue; + } + + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + b2Vec2 c = node->aabb.GetCenter(); + b2Vec2 h = node->aabb.GetExtents(); + float32 separation = b2Abs(b2Dot(v, p1 - c)) - b2Dot(abs_v, h); + if (separation > 0.0f) + { + continue; + } + + if (node->IsLeaf()) + { + b2RayCastInput subInput; + subInput.p1 = input.p1; + subInput.p2 = input.p2; + subInput.maxFraction = maxFraction; + + float32 value = callback->RayCastCallback(subInput, nodeId); + + if (value == 0.0f) + { + // The client has terminated the ray cast. + return; + } + + if (value > 0.0f) + { + // Update segment bounding box. + maxFraction = value; + b2Vec2 t = p1 + maxFraction * (p2 - p1); + segmentAABB.lowerBound = b2Min(p1, t); + segmentAABB.upperBound = b2Max(p1, t); + } + } + else + { + if (count < k_stackSize) + { + stack[count++] = node->child1; + } + + if (count < k_stackSize) + { + stack[count++] = node->child2; + } + } + } +} + +#endif diff --git a/AndEngine/jni/Box2D/Collision/b2TimeOfImpact.cpp b/AndEngine/jni/Box2D/Collision/b2TimeOfImpact.cpp new file mode 100644 index 0000000..39158c4 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2TimeOfImpact.cpp @@ -0,0 +1,483 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/b2Distance.h" +#include "Box2D/Collision/b2TimeOfImpact.h" +#include "Box2D/Collision/Shapes/b2CircleShape.h" +#include "Box2D/Collision/Shapes/b2PolygonShape.h" + +#include + +int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters; +int32 b2_toiRootIters, b2_toiMaxRootIters; + +int32 b2_toiMaxOptIters; + +struct b2SeparationFunction +{ + enum Type + { + e_points, + e_faceA, + e_faceB + }; + + // TODO_ERIN might not need to return the separation + + float32 Initialize(const b2SimplexCache* cache, + const b2DistanceProxy* proxyA, const b2Sweep& sweepA, + const b2DistanceProxy* proxyB, const b2Sweep& sweepB) + { + m_proxyA = proxyA; + m_proxyB = proxyB; + int32 count = cache->count; + b2Assert(0 < count && count < 3); + + m_sweepA = sweepA; + m_sweepB = sweepB; + + b2Transform xfA, xfB; + m_sweepA.GetTransform(&xfA, 0.0f); + m_sweepB.GetTransform(&xfB, 0.0f); + + if (count == 1) + { + m_type = e_points; + b2Vec2 localPointA = m_proxyA->GetVertex(cache->indexA[0]); + b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]); + b2Vec2 pointA = b2Mul(xfA, localPointA); + b2Vec2 pointB = b2Mul(xfB, localPointB); + m_axis = pointB - pointA; + float32 s = m_axis.Normalize(); + return s; + } + else if (cache->indexA[0] == cache->indexA[1]) + { + // Two points on B and one on A. + m_type = e_faceB; + b2Vec2 localPointB1 = proxyB->GetVertex(cache->indexB[0]); + b2Vec2 localPointB2 = proxyB->GetVertex(cache->indexB[1]); + + m_axis = b2Cross(localPointB2 - localPointB1, 1.0f); + m_axis.Normalize(); + b2Vec2 normal = b2Mul(xfB.R, m_axis); + + m_localPoint = 0.5f * (localPointB1 + localPointB2); + b2Vec2 pointB = b2Mul(xfB, m_localPoint); + + b2Vec2 localPointA = proxyA->GetVertex(cache->indexA[0]); + b2Vec2 pointA = b2Mul(xfA, localPointA); + + float32 s = b2Dot(pointA - pointB, normal); + if (s < 0.0f) + { + m_axis = -m_axis; + s = -s; + } + return s; + } + else + { + // Two points on A and one or two points on B. + m_type = e_faceA; + b2Vec2 localPointA1 = m_proxyA->GetVertex(cache->indexA[0]); + b2Vec2 localPointA2 = m_proxyA->GetVertex(cache->indexA[1]); + + m_axis = b2Cross(localPointA2 - localPointA1, 1.0f); + m_axis.Normalize(); + b2Vec2 normal = b2Mul(xfA.R, m_axis); + + m_localPoint = 0.5f * (localPointA1 + localPointA2); + b2Vec2 pointA = b2Mul(xfA, m_localPoint); + + b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]); + b2Vec2 pointB = b2Mul(xfB, localPointB); + + float32 s = b2Dot(pointB - pointA, normal); + if (s < 0.0f) + { + m_axis = -m_axis; + s = -s; + } + return s; + } + } + + float32 FindMinSeparation(int32* indexA, int32* indexB, float32 t) const + { + b2Transform xfA, xfB; + m_sweepA.GetTransform(&xfA, t); + m_sweepB.GetTransform(&xfB, t); + + switch (m_type) + { + case e_points: + { + b2Vec2 axisA = b2MulT(xfA.R, m_axis); + b2Vec2 axisB = b2MulT(xfB.R, -m_axis); + + *indexA = m_proxyA->GetSupport(axisA); + *indexB = m_proxyB->GetSupport(axisB); + + b2Vec2 localPointA = m_proxyA->GetVertex(*indexA); + b2Vec2 localPointB = m_proxyB->GetVertex(*indexB); + + b2Vec2 pointA = b2Mul(xfA, localPointA); + b2Vec2 pointB = b2Mul(xfB, localPointB); + + float32 separation = b2Dot(pointB - pointA, m_axis); + return separation; + } + + case e_faceA: + { + b2Vec2 normal = b2Mul(xfA.R, m_axis); + b2Vec2 pointA = b2Mul(xfA, m_localPoint); + + b2Vec2 axisB = b2MulT(xfB.R, -normal); + + *indexA = -1; + *indexB = m_proxyB->GetSupport(axisB); + + b2Vec2 localPointB = m_proxyB->GetVertex(*indexB); + b2Vec2 pointB = b2Mul(xfB, localPointB); + + float32 separation = b2Dot(pointB - pointA, normal); + return separation; + } + + case e_faceB: + { + b2Vec2 normal = b2Mul(xfB.R, m_axis); + b2Vec2 pointB = b2Mul(xfB, m_localPoint); + + b2Vec2 axisA = b2MulT(xfA.R, -normal); + + *indexB = -1; + *indexA = m_proxyA->GetSupport(axisA); + + b2Vec2 localPointA = m_proxyA->GetVertex(*indexA); + b2Vec2 pointA = b2Mul(xfA, localPointA); + + float32 separation = b2Dot(pointA - pointB, normal); + return separation; + } + + default: + b2Assert(false); + *indexA = -1; + *indexB = -1; + return 0.0f; + } + } + + float32 Evaluate(int32 indexA, int32 indexB, float32 t) const + { + b2Transform xfA, xfB; + m_sweepA.GetTransform(&xfA, t); + m_sweepB.GetTransform(&xfB, t); + + switch (m_type) + { + case e_points: + { + b2Vec2 axisA = b2MulT(xfA.R, m_axis); + b2Vec2 axisB = b2MulT(xfB.R, -m_axis); + + b2Vec2 localPointA = m_proxyA->GetVertex(indexA); + b2Vec2 localPointB = m_proxyB->GetVertex(indexB); + + b2Vec2 pointA = b2Mul(xfA, localPointA); + b2Vec2 pointB = b2Mul(xfB, localPointB); + float32 separation = b2Dot(pointB - pointA, m_axis); + + return separation; + } + + case e_faceA: + { + b2Vec2 normal = b2Mul(xfA.R, m_axis); + b2Vec2 pointA = b2Mul(xfA, m_localPoint); + + b2Vec2 axisB = b2MulT(xfB.R, -normal); + + b2Vec2 localPointB = m_proxyB->GetVertex(indexB); + b2Vec2 pointB = b2Mul(xfB, localPointB); + + float32 separation = b2Dot(pointB - pointA, normal); + return separation; + } + + case e_faceB: + { + b2Vec2 normal = b2Mul(xfB.R, m_axis); + b2Vec2 pointB = b2Mul(xfB, m_localPoint); + + b2Vec2 axisA = b2MulT(xfA.R, -normal); + + b2Vec2 localPointA = m_proxyA->GetVertex(indexA); + b2Vec2 pointA = b2Mul(xfA, localPointA); + + float32 separation = b2Dot(pointA - pointB, normal); + return separation; + } + + default: + b2Assert(false); + return 0.0f; + } + } + + const b2DistanceProxy* m_proxyA; + const b2DistanceProxy* m_proxyB; + b2Sweep m_sweepA, m_sweepB; + Type m_type; + b2Vec2 m_localPoint; + b2Vec2 m_axis; +}; + +// CCD via the local separating axis method. This seeks progression +// by computing the largest time at which separation is maintained. +void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input) +{ + ++b2_toiCalls; + + output->state = b2TOIOutput::e_unknown; + output->t = input->tMax; + + const b2DistanceProxy* proxyA = &input->proxyA; + const b2DistanceProxy* proxyB = &input->proxyB; + + b2Sweep sweepA = input->sweepA; + b2Sweep sweepB = input->sweepB; + + // Large rotations can make the root finder fail, so we normalize the + // sweep angles. + sweepA.Normalize(); + sweepB.Normalize(); + + float32 tMax = input->tMax; + + float32 totalRadius = proxyA->m_radius + proxyB->m_radius; + float32 target = b2Max(b2_linearSlop, totalRadius - 3.0f * b2_linearSlop); + float32 tolerance = 0.25f * b2_linearSlop; + b2Assert(target > tolerance); + + float32 t1 = 0.0f; + const int32 k_maxIterations = 20; // TODO_ERIN b2Settings + int32 iter = 0; + + // Prepare input for distance query. + b2SimplexCache cache; + cache.count = 0; + b2DistanceInput distanceInput; + distanceInput.proxyA = input->proxyA; + distanceInput.proxyB = input->proxyB; + distanceInput.useRadii = false; + + // The outer loop progressively attempts to compute new separating axes. + // This loop terminates when an axis is repeated (no progress is made). + for(;;) + { + b2Transform xfA, xfB; + sweepA.GetTransform(&xfA, t1); + sweepB.GetTransform(&xfB, t1); + + // Get the distance between shapes. We can also use the results + // to get a separating axis. + distanceInput.transformA = xfA; + distanceInput.transformB = xfB; + b2DistanceOutput distanceOutput; + b2Distance(&distanceOutput, &cache, &distanceInput); + + // If the shapes are overlapped, we give up on continuous collision. + if (distanceOutput.distance <= 0.0f) + { + // Failure! + output->state = b2TOIOutput::e_overlapped; + output->t = 0.0f; + break; + } + + if (distanceOutput.distance < target + tolerance) + { + // Victory! + output->state = b2TOIOutput::e_touching; + output->t = t1; + break; + } + + // Initialize the separating axis. + b2SeparationFunction fcn; + fcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB); +#if 0 + // Dump the curve seen by the root finder + { + const int32 N = 100; + float32 dx = 1.0f / N; + float32 xs[N+1]; + float32 fs[N+1]; + + float32 x = 0.0f; + + for (int32 i = 0; i <= N; ++i) + { + sweepA.GetTransform(&xfA, x); + sweepB.GetTransform(&xfB, x); + float32 f = fcn.Evaluate(xfA, xfB) - target; + + printf("%g %g\n", x, f); + + xs[i] = x; + fs[i] = f; + + x += dx; + } + } +#endif + + // Compute the TOI on the separating axis. We do this by successively + // resolving the deepest point. This loop is bounded by the number of vertices. + bool done = false; + float32 t2 = tMax; + int32 pushBackIter = 0; + for (;;) + { + // Find the deepest point at t2. Store the witness point indices. + int32 indexA, indexB; + float32 s2 = fcn.FindMinSeparation(&indexA, &indexB, t2); + + // Is the final configuration separated? + if (s2 > target + tolerance) + { + // Victory! + output->state = b2TOIOutput::e_separated; + output->t = tMax; + done = true; + break; + } + + // Has the separation reached tolerance? + if (s2 > target - tolerance) + { + // Advance the sweeps + t1 = t2; + break; + } + + // Compute the initial separation of the witness points. + float32 s1 = fcn.Evaluate(indexA, indexB, t1); + + // Check for initial overlap. This might happen if the root finder + // runs out of iterations. + if (s1 < target - tolerance) + { + output->state = b2TOIOutput::e_failed; + output->t = t1; + done = true; + break; + } + + // Check for touching + if (s1 <= target + tolerance) + { + // Victory! t1 should hold the TOI (could be 0.0). + output->state = b2TOIOutput::e_touching; + output->t = t1; + done = true; + break; + } + + // Compute 1D root of: f(x) - target = 0 + int32 rootIterCount = 0; + float32 a1 = t1, a2 = t2; + for (;;) + { + // Use a mix of the secant rule and bisection. + float32 t; + if (rootIterCount & 1) + { + // Secant rule to improve convergence. + t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); + } + else + { + // Bisection to guarantee progress. + t = 0.5f * (a1 + a2); + } + + float32 s = fcn.Evaluate(indexA, indexB, t); + + if (b2Abs(s - target) < tolerance) + { + // t2 holds a tentative value for t1 + t2 = t; + break; + } + + // Ensure we continue to bracket the root. + if (s > target) + { + a1 = t; + s1 = s; + } + else + { + a2 = t; + s2 = s; + } + + ++rootIterCount; + ++b2_toiRootIters; + + if (rootIterCount == 50) + { + break; + } + } + + b2_toiMaxRootIters = b2Max(b2_toiMaxRootIters, rootIterCount); + + ++pushBackIter; + + if (pushBackIter == b2_maxPolygonVertices) + { + break; + } + } + + ++iter; + ++b2_toiIters; + + if (done) + { + break; + } + + if (iter == k_maxIterations) + { + // Root finder got stuck. Semi-victory. + output->state = b2TOIOutput::e_failed; + output->t = t1; + break; + } + } + + b2_toiMaxIters = b2Max(b2_toiMaxIters, iter); +} diff --git a/AndEngine/jni/Box2D/Collision/b2TimeOfImpact.h b/AndEngine/jni/Box2D/Collision/b2TimeOfImpact.h new file mode 100644 index 0000000..475fa13 --- /dev/null +++ b/AndEngine/jni/Box2D/Collision/b2TimeOfImpact.h @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_TIME_OF_IMPACT_H +#define B2_TIME_OF_IMPACT_H + +#include "Box2D/Common/b2Math.h" +#include "Box2D/Collision/b2Distance.h" +#include + +/// Input parameters for b2TimeOfImpact +struct b2TOIInput +{ + b2DistanceProxy proxyA; + b2DistanceProxy proxyB; + b2Sweep sweepA; + b2Sweep sweepB; + float32 tMax; // defines sweep interval [0, tMax] +}; + +// Output parameters for b2TimeOfImpact. +struct b2TOIOutput +{ + enum State + { + e_unknown, + e_failed, + e_overlapped, + e_touching, + e_separated + }; + + State state; + float32 t; +}; + +/// Compute the upper bound on time before two shapes penetrate. Time is represented as +/// a fraction between [0,tMax]. This uses a swept separating axis and may miss some intermediate, +/// non-tunneling collision. If you change the time interval, you should call this function +/// again. +/// Note: use b2Distance to compute the contact point and normal at the time of impact. +void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input); + +#endif diff --git a/AndEngine/jni/Box2D/Common/b2BlockAllocator.cpp b/AndEngine/jni/Box2D/Common/b2BlockAllocator.cpp new file mode 100644 index 0000000..6acad2a --- /dev/null +++ b/AndEngine/jni/Box2D/Common/b2BlockAllocator.cpp @@ -0,0 +1,205 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Common/b2BlockAllocator.h" +#include +#include +#include +#include + +int32 b2BlockAllocator::s_blockSizes[b2_blockSizes] = +{ + 16, // 0 + 32, // 1 + 64, // 2 + 96, // 3 + 128, // 4 + 160, // 5 + 192, // 6 + 224, // 7 + 256, // 8 + 320, // 9 + 384, // 10 + 448, // 11 + 512, // 12 + 640, // 13 +}; +uint8 b2BlockAllocator::s_blockSizeLookup[b2_maxBlockSize + 1]; +bool b2BlockAllocator::s_blockSizeLookupInitialized; + +struct b2Chunk +{ + int32 blockSize; + b2Block* blocks; +}; + +struct b2Block +{ + b2Block* next; +}; + +b2BlockAllocator::b2BlockAllocator() +{ + b2Assert(b2_blockSizes < UCHAR_MAX); + + m_chunkSpace = b2_chunkArrayIncrement; + m_chunkCount = 0; + m_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk)); + + memset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk)); + memset(m_freeLists, 0, sizeof(m_freeLists)); + + if (s_blockSizeLookupInitialized == false) + { + int32 j = 0; + for (int32 i = 1; i <= b2_maxBlockSize; ++i) + { + b2Assert(j < b2_blockSizes); + if (i <= s_blockSizes[j]) + { + s_blockSizeLookup[i] = (uint8)j; + } + else + { + ++j; + s_blockSizeLookup[i] = (uint8)j; + } + } + + s_blockSizeLookupInitialized = true; + } +} + +b2BlockAllocator::~b2BlockAllocator() +{ + for (int32 i = 0; i < m_chunkCount; ++i) + { + b2Free(m_chunks[i].blocks); + } + + b2Free(m_chunks); +} + +void* b2BlockAllocator::Allocate(int32 size) +{ + if (size == 0) + return NULL; + + b2Assert(0 < size && size <= b2_maxBlockSize); + + int32 index = s_blockSizeLookup[size]; + b2Assert(0 <= index && index < b2_blockSizes); + + if (m_freeLists[index]) + { + b2Block* block = m_freeLists[index]; + m_freeLists[index] = block->next; + return block; + } + else + { + if (m_chunkCount == m_chunkSpace) + { + b2Chunk* oldChunks = m_chunks; + m_chunkSpace += b2_chunkArrayIncrement; + m_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk)); + memcpy(m_chunks, oldChunks, m_chunkCount * sizeof(b2Chunk)); + memset(m_chunks + m_chunkCount, 0, b2_chunkArrayIncrement * sizeof(b2Chunk)); + b2Free(oldChunks); + } + + b2Chunk* chunk = m_chunks + m_chunkCount; + chunk->blocks = (b2Block*)b2Alloc(b2_chunkSize); +#if defined(_DEBUG) + memset(chunk->blocks, 0xcd, b2_chunkSize); +#endif + int32 blockSize = s_blockSizes[index]; + chunk->blockSize = blockSize; + int32 blockCount = b2_chunkSize / blockSize; + b2Assert(blockCount * blockSize <= b2_chunkSize); + for (int32 i = 0; i < blockCount - 1; ++i) + { + b2Block* block = (b2Block*)((int8*)chunk->blocks + blockSize * i); + b2Block* next = (b2Block*)((int8*)chunk->blocks + blockSize * (i + 1)); + block->next = next; + } + b2Block* last = (b2Block*)((int8*)chunk->blocks + blockSize * (blockCount - 1)); + last->next = NULL; + + m_freeLists[index] = chunk->blocks->next; + ++m_chunkCount; + + return chunk->blocks; + } +} + +void b2BlockAllocator::Free(void* p, int32 size) +{ + if (size == 0) + { + return; + } + + b2Assert(0 < size && size <= b2_maxBlockSize); + + int32 index = s_blockSizeLookup[size]; + b2Assert(0 <= index && index < b2_blockSizes); + +#ifdef _DEBUG + // Verify the memory address and size is valid. + int32 blockSize = s_blockSizes[index]; + bool found = false; + for (int32 i = 0; i < m_chunkCount; ++i) + { + b2Chunk* chunk = m_chunks + i; + if (chunk->blockSize != blockSize) + { + b2Assert( (int8*)p + blockSize <= (int8*)chunk->blocks || + (int8*)chunk->blocks + b2_chunkSize <= (int8*)p); + } + else + { + if ((int8*)chunk->blocks <= (int8*)p && (int8*)p + blockSize <= (int8*)chunk->blocks + b2_chunkSize) + { + found = true; + } + } + } + + b2Assert(found); + + memset(p, 0xfd, blockSize); +#endif + + b2Block* block = (b2Block*)p; + block->next = m_freeLists[index]; + m_freeLists[index] = block; +} + +void b2BlockAllocator::Clear() +{ + for (int32 i = 0; i < m_chunkCount; ++i) + { + b2Free(m_chunks[i].blocks); + } + + m_chunkCount = 0; + memset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk)); + + memset(m_freeLists, 0, sizeof(m_freeLists)); +} diff --git a/AndEngine/jni/Box2D/Common/b2BlockAllocator.h b/AndEngine/jni/Box2D/Common/b2BlockAllocator.h new file mode 100644 index 0000000..2c3c5dc --- /dev/null +++ b/AndEngine/jni/Box2D/Common/b2BlockAllocator.h @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_BLOCK_ALLOCATOR_H +#define B2_BLOCK_ALLOCATOR_H + +#include "Box2D/Common/b2Settings.h" + +const int32 b2_chunkSize = 4096; +const int32 b2_maxBlockSize = 640; +const int32 b2_blockSizes = 14; +const int32 b2_chunkArrayIncrement = 128; + +struct b2Block; +struct b2Chunk; + +// This is a small object allocator used for allocating small +// objects that persist for more than one time step. +// See: http://www.codeproject.com/useritems/Small_Block_Allocator.asp +class b2BlockAllocator +{ +public: + b2BlockAllocator(); + ~b2BlockAllocator(); + + void* Allocate(int32 size); + void Free(void* p, int32 size); + + void Clear(); + +private: + + b2Chunk* m_chunks; + int32 m_chunkCount; + int32 m_chunkSpace; + + b2Block* m_freeLists[b2_blockSizes]; + + static int32 s_blockSizes[b2_blockSizes]; + static uint8 s_blockSizeLookup[b2_maxBlockSize + 1]; + static bool s_blockSizeLookupInitialized; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Common/b2Math.cpp b/AndEngine/jni/Box2D/Common/b2Math.cpp new file mode 100644 index 0000000..b1e5ec3 --- /dev/null +++ b/AndEngine/jni/Box2D/Common/b2Math.cpp @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Common/b2Math.h" + +const b2Vec2 b2Vec2_zero(0.0f, 0.0f); +const b2Mat22 b2Mat22_identity(1.0f, 0.0f, 0.0f, 1.0f); +const b2Transform b2Transform_identity(b2Vec2_zero, b2Mat22_identity); + +/// Solve A * x = b, where b is a column vector. This is more efficient +/// than computing the inverse in one-shot cases. +b2Vec3 b2Mat33::Solve33(const b2Vec3& b) const +{ + float32 det = b2Dot(col1, b2Cross(col2, col3)); + if (det != 0.0f) + { + det = 1.0f / det; + } + b2Vec3 x; + x.x = det * b2Dot(b, b2Cross(col2, col3)); + x.y = det * b2Dot(col1, b2Cross(b, col3)); + x.z = det * b2Dot(col1, b2Cross(col2, b)); + return x; +} + +/// Solve A * x = b, where b is a column vector. This is more efficient +/// than computing the inverse in one-shot cases. +b2Vec2 b2Mat33::Solve22(const b2Vec2& b) const +{ + float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; + float32 det = a11 * a22 - a12 * a21; + if (det != 0.0f) + { + det = 1.0f / det; + } + b2Vec2 x; + x.x = det * (a22 * b.x - a12 * b.y); + x.y = det * (a11 * b.y - a21 * b.x); + return x; +} diff --git a/AndEngine/jni/Box2D/Common/b2Math.h b/AndEngine/jni/Box2D/Common/b2Math.h new file mode 100644 index 0000000..7983337 --- /dev/null +++ b/AndEngine/jni/Box2D/Common/b2Math.h @@ -0,0 +1,623 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_MATH_H +#define B2_MATH_H + +#include "Box2D/Common/b2Settings.h" + +#include +#include +#include +#include + +/// This function is used to ensure that a floating point number is +/// not a NaN or infinity. +inline bool b2IsValid(float32 x) +{ + if (x != x) + { + // NaN. + return false; + } + + return true; +} + +/// This is a approximate yet fast inverse square-root. +inline float32 b2InvSqrt(float32 x) +{ + union + { + float32 x; + int32 i; + } convert; + + convert.x = x; + float32 xhalf = 0.5f * x; + convert.i = 0x5f3759df - (convert.i >> 1); + x = convert.x; + x = x * (1.5f - xhalf * x * x); + return x; +} + +#define b2Sqrt(x) sqrtf(x) +#define b2Atan2(y, x) atan2f(y, x) + +inline float32 b2Abs(float32 a) +{ + return a > 0.0f ? a : -a; +} + +/// A 2D column vector. +struct b2Vec2 +{ + /// Default constructor does nothing (for performance). + b2Vec2() {} + + /// Construct using coordinates. + b2Vec2(float32 x, float32 y) : x(x), y(y) {} + + /// Set this vector to all zeros. + void SetZero() { x = 0.0f; y = 0.0f; } + + /// Set this vector to some specified coordinates. + void Set(float32 x_, float32 y_) { x = x_; y = y_; } + + /// Negate this vector. + b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; } + + /// Read from and indexed element. + float32 operator () (int32 i) const + { + return (&x)[i]; + } + + /// Write to an indexed element. + float32& operator () (int32 i) + { + return (&x)[i]; + } + + /// Add a vector to this vector. + void operator += (const b2Vec2& v) + { + x += v.x; y += v.y; + } + + /// Subtract a vector from this vector. + void operator -= (const b2Vec2& v) + { + x -= v.x; y -= v.y; + } + + /// Multiply this vector by a scalar. + void operator *= (float32 a) + { + x *= a; y *= a; + } + + /// Get the length of this vector (the norm). + float32 Length() const + { + return b2Sqrt(x * x + y * y); + } + + /// Get the length squared. For performance, use this instead of + /// b2Vec2::Length (if possible). + float32 LengthSquared() const + { + return x * x + y * y; + } + + /// Convert this vector into a unit vector. Returns the length. + float32 Normalize() + { + float32 length = Length(); + if (length < b2_epsilon) + { + return 0.0f; + } + float32 invLength = 1.0f / length; + x *= invLength; + y *= invLength; + + return length; + } + + /// Does this vector contain finite coordinates? + bool IsValid() const + { + return b2IsValid(x) && b2IsValid(y); + } + + float32 x, y; +}; + +/// A 2D column vector with 3 elements. +struct b2Vec3 +{ + /// Default constructor does nothing (for performance). + b2Vec3() {} + + /// Construct using coordinates. + b2Vec3(float32 x, float32 y, float32 z) : x(x), y(y), z(z) {} + + /// Set this vector to all zeros. + void SetZero() { x = 0.0f; y = 0.0f; z = 0.0f; } + + /// Set this vector to some specified coordinates. + void Set(float32 x_, float32 y_, float32 z_) { x = x_; y = y_; z = z_; } + + /// Negate this vector. + b2Vec3 operator -() const { b2Vec3 v; v.Set(-x, -y, -z); return v; } + + /// Add a vector to this vector. + void operator += (const b2Vec3& v) + { + x += v.x; y += v.y; z += v.z; + } + + /// Subtract a vector from this vector. + void operator -= (const b2Vec3& v) + { + x -= v.x; y -= v.y; z -= v.z; + } + + /// Multiply this vector by a scalar. + void operator *= (float32 s) + { + x *= s; y *= s; z *= s; + } + + float32 x, y, z; +}; + +/// A 2-by-2 matrix. Stored in column-major order. +struct b2Mat22 +{ + /// The default constructor does nothing (for performance). + b2Mat22() {} + + /// Construct this matrix using columns. + b2Mat22(const b2Vec2& c1, const b2Vec2& c2) + { + col1 = c1; + col2 = c2; + } + + /// Construct this matrix using scalars. + b2Mat22(float32 a11, float32 a12, float32 a21, float32 a22) + { + col1.x = a11; col1.y = a21; + col2.x = a12; col2.y = a22; + } + + /// Construct this matrix using an angle. This matrix becomes + /// an orthonormal rotation matrix. + explicit b2Mat22(float32 angle) + { + // TODO_ERIN compute sin+cos together. + float32 c = cosf(angle), s = sinf(angle); + col1.x = c; col2.x = -s; + col1.y = s; col2.y = c; + } + + /// Initialize this matrix using columns. + void Set(const b2Vec2& c1, const b2Vec2& c2) + { + col1 = c1; + col2 = c2; + } + + /// Initialize this matrix using an angle. This matrix becomes + /// an orthonormal rotation matrix. + void Set(float32 angle) + { + float32 c = cosf(angle), s = sinf(angle); + col1.x = c; col2.x = -s; + col1.y = s; col2.y = c; + } + + /// Set this to the identity matrix. + void SetIdentity() + { + col1.x = 1.0f; col2.x = 0.0f; + col1.y = 0.0f; col2.y = 1.0f; + } + + /// Set this matrix to all zeros. + void SetZero() + { + col1.x = 0.0f; col2.x = 0.0f; + col1.y = 0.0f; col2.y = 0.0f; + } + + /// Extract the angle from this matrix (assumed to be + /// a rotation matrix). + float32 GetAngle() const + { + return b2Atan2(col1.y, col1.x); + } + + b2Mat22 GetInverse() const + { + float32 a = col1.x, b = col2.x, c = col1.y, d = col2.y; + b2Mat22 B; + float32 det = a * d - b * c; + if (det != 0.0f) + { + det = 1.0f / det; + } + B.col1.x = det * d; B.col2.x = -det * b; + B.col1.y = -det * c; B.col2.y = det * a; + return B; + } + + /// Solve A * x = b, where b is a column vector. This is more efficient + /// than computing the inverse in one-shot cases. + b2Vec2 Solve(const b2Vec2& b) const + { + float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; + float32 det = a11 * a22 - a12 * a21; + if (det != 0.0f) + { + det = 1.0f / det; + } + b2Vec2 x; + x.x = det * (a22 * b.x - a12 * b.y); + x.y = det * (a11 * b.y - a21 * b.x); + return x; + } + + b2Vec2 col1, col2; +}; + +/// A 3-by-3 matrix. Stored in column-major order. +struct b2Mat33 +{ + /// The default constructor does nothing (for performance). + b2Mat33() {} + + /// Construct this matrix using columns. + b2Mat33(const b2Vec3& c1, const b2Vec3& c2, const b2Vec3& c3) + { + col1 = c1; + col2 = c2; + col3 = c3; + } + + /// Set this matrix to all zeros. + void SetZero() + { + col1.SetZero(); + col2.SetZero(); + col3.SetZero(); + } + + /// Solve A * x = b, where b is a column vector. This is more efficient + /// than computing the inverse in one-shot cases. + b2Vec3 Solve33(const b2Vec3& b) const; + + /// Solve A * x = b, where b is a column vector. This is more efficient + /// than computing the inverse in one-shot cases. Solve only the upper + /// 2-by-2 matrix equation. + b2Vec2 Solve22(const b2Vec2& b) const; + + b2Vec3 col1, col2, col3; +}; + +/// A transform contains translation and rotation. It is used to represent +/// the position and orientation of rigid frames. +struct b2Transform +{ + /// The default constructor does nothing (for performance). + b2Transform() {} + + /// Initialize using a position vector and a rotation matrix. + b2Transform(const b2Vec2& position, const b2Mat22& R) : position(position), R(R) {} + + /// Set this to the identity transform. + void SetIdentity() + { + position.SetZero(); + R.SetIdentity(); + } + + /// Set this based on the position and angle. + void Set(const b2Vec2& p, float32 angle) + { + position = p; + R.Set(angle); + } + + /// Calculate the angle that the rotation matrix represents. + float32 GetAngle() const + { + return b2Atan2(R.col1.y, R.col1.x); + } + + b2Vec2 position; + b2Mat22 R; +}; + +/// This describes the motion of a body/shape for TOI computation. +/// Shapes are defined with respect to the body origin, which may +/// no coincide with the center of mass. However, to support dynamics +/// we must interpolate the center of mass position. +struct b2Sweep +{ + /// Get the interpolated transform at a specific time. + /// @param alpha is a factor in [0,1], where 0 indicates t0. + void GetTransform(b2Transform* xf, float32 alpha) const; + + /// Advance the sweep forward, yielding a new initial state. + /// @param t the new initial time. + void Advance(float32 t); + + /// Normalize the angles. + void Normalize(); + + b2Vec2 localCenter; ///< local center of mass position + b2Vec2 c0, c; ///< center world positions + float32 a0, a; ///< world angles +}; + + +extern const b2Vec2 b2Vec2_zero; +extern const b2Mat22 b2Mat22_identity; +extern const b2Transform b2Transform_identity; + +/// Perform the dot product on two vectors. +inline float32 b2Dot(const b2Vec2& a, const b2Vec2& b) +{ + return a.x * b.x + a.y * b.y; +} + +/// Perform the cross product on two vectors. In 2D this produces a scalar. +inline float32 b2Cross(const b2Vec2& a, const b2Vec2& b) +{ + return a.x * b.y - a.y * b.x; +} + +/// Perform the cross product on a vector and a scalar. In 2D this produces +/// a vector. +inline b2Vec2 b2Cross(const b2Vec2& a, float32 s) +{ + return b2Vec2(s * a.y, -s * a.x); +} + +/// Perform the cross product on a scalar and a vector. In 2D this produces +/// a vector. +inline b2Vec2 b2Cross(float32 s, const b2Vec2& a) +{ + return b2Vec2(-s * a.y, s * a.x); +} + +/// Multiply a matrix times a vector. If a rotation matrix is provided, +/// then this transforms the vector from one frame to another. +inline b2Vec2 b2Mul(const b2Mat22& A, const b2Vec2& v) +{ + return b2Vec2(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.y * v.y); +} + +/// Multiply a matrix transpose times a vector. If a rotation matrix is provided, +/// then this transforms the vector from one frame to another (inverse transform). +inline b2Vec2 b2MulT(const b2Mat22& A, const b2Vec2& v) +{ + return b2Vec2(b2Dot(v, A.col1), b2Dot(v, A.col2)); +} + +/// Add two vectors component-wise. +inline b2Vec2 operator + (const b2Vec2& a, const b2Vec2& b) +{ + return b2Vec2(a.x + b.x, a.y + b.y); +} + +/// Subtract two vectors component-wise. +inline b2Vec2 operator - (const b2Vec2& a, const b2Vec2& b) +{ + return b2Vec2(a.x - b.x, a.y - b.y); +} + +inline b2Vec2 operator * (float32 s, const b2Vec2& a) +{ + return b2Vec2(s * a.x, s * a.y); +} + +inline bool operator == (const b2Vec2& a, const b2Vec2& b) +{ + return a.x == b.x && a.y == b.y; +} + +inline float32 b2Distance(const b2Vec2& a, const b2Vec2& b) +{ + b2Vec2 c = a - b; + return c.Length(); +} + +inline float32 b2DistanceSquared(const b2Vec2& a, const b2Vec2& b) +{ + b2Vec2 c = a - b; + return b2Dot(c, c); +} + +inline b2Vec3 operator * (float32 s, const b2Vec3& a) +{ + return b2Vec3(s * a.x, s * a.y, s * a.z); +} + +/// Add two vectors component-wise. +inline b2Vec3 operator + (const b2Vec3& a, const b2Vec3& b) +{ + return b2Vec3(a.x + b.x, a.y + b.y, a.z + b.z); +} + +/// Subtract two vectors component-wise. +inline b2Vec3 operator - (const b2Vec3& a, const b2Vec3& b) +{ + return b2Vec3(a.x - b.x, a.y - b.y, a.z - b.z); +} + +/// Perform the dot product on two vectors. +inline float32 b2Dot(const b2Vec3& a, const b2Vec3& b) +{ + return a.x * b.x + a.y * b.y + a.z * b.z; +} + +/// Perform the cross product on two vectors. +inline b2Vec3 b2Cross(const b2Vec3& a, const b2Vec3& b) +{ + return b2Vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); +} + +inline b2Mat22 operator + (const b2Mat22& A, const b2Mat22& B) +{ + return b2Mat22(A.col1 + B.col1, A.col2 + B.col2); +} + +// A * B +inline b2Mat22 b2Mul(const b2Mat22& A, const b2Mat22& B) +{ + return b2Mat22(b2Mul(A, B.col1), b2Mul(A, B.col2)); +} + +// A^T * B +inline b2Mat22 b2MulT(const b2Mat22& A, const b2Mat22& B) +{ + b2Vec2 c1(b2Dot(A.col1, B.col1), b2Dot(A.col2, B.col1)); + b2Vec2 c2(b2Dot(A.col1, B.col2), b2Dot(A.col2, B.col2)); + return b2Mat22(c1, c2); +} + +/// Multiply a matrix times a vector. +inline b2Vec3 b2Mul(const b2Mat33& A, const b2Vec3& v) +{ + return v.x * A.col1 + v.y * A.col2 + v.z * A.col3; +} + +inline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v) +{ + float32 x = T.position.x + T.R.col1.x * v.x + T.R.col2.x * v.y; + float32 y = T.position.y + T.R.col1.y * v.x + T.R.col2.y * v.y; + + return b2Vec2(x, y); +} + +inline b2Vec2 b2MulT(const b2Transform& T, const b2Vec2& v) +{ + return b2MulT(T.R, v - T.position); +} + +inline b2Vec2 b2Abs(const b2Vec2& a) +{ + return b2Vec2(b2Abs(a.x), b2Abs(a.y)); +} + +inline b2Mat22 b2Abs(const b2Mat22& A) +{ + return b2Mat22(b2Abs(A.col1), b2Abs(A.col2)); +} + +template +inline T b2Min(T a, T b) +{ + return a < b ? a : b; +} + +inline b2Vec2 b2Min(const b2Vec2& a, const b2Vec2& b) +{ + return b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y)); +} + +template +inline T b2Max(T a, T b) +{ + return a > b ? a : b; +} + +inline b2Vec2 b2Max(const b2Vec2& a, const b2Vec2& b) +{ + return b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y)); +} + +template +inline T b2Clamp(T a, T low, T high) +{ + return b2Max(low, b2Min(a, high)); +} + +inline b2Vec2 b2Clamp(const b2Vec2& a, const b2Vec2& low, const b2Vec2& high) +{ + return b2Max(low, b2Min(a, high)); +} + +template inline void b2Swap(T& a, T& b) +{ + T tmp = a; + a = b; + b = tmp; +} + +/// "Next Largest Power of 2 +/// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm +/// that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with +/// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next +/// largest power of 2. For a 32-bit value:" +inline uint32 b2NextPowerOfTwo(uint32 x) +{ + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; +} + +inline bool b2IsPowerOfTwo(uint32 x) +{ + bool result = x > 0 && (x & (x - 1)) == 0; + return result; +} + +inline void b2Sweep::GetTransform(b2Transform* xf, float32 alpha) const +{ + xf->position = (1.0f - alpha) * c0 + alpha * c; + float32 angle = (1.0f - alpha) * a0 + alpha * a; + xf->R.Set(angle); + + // Shift to origin + xf->position -= b2Mul(xf->R, localCenter); +} + +inline void b2Sweep::Advance(float32 t) +{ + c0 = (1.0f - t) * c0 + t * c; + a0 = (1.0f - t) * a0 + t * a; +} + +/// Normalize an angle in radians to be between -pi and pi +inline void b2Sweep::Normalize() +{ + float32 twoPi = 2.0f * b2_pi; + float32 d = twoPi * floorf(a0 / twoPi); + a0 -= d; + a -= d; +} + +#endif diff --git a/AndEngine/jni/Box2D/Common/b2Settings.cpp b/AndEngine/jni/Box2D/Common/b2Settings.cpp new file mode 100644 index 0000000..b6ba2b8 --- /dev/null +++ b/AndEngine/jni/Box2D/Common/b2Settings.cpp @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Common/b2Settings.h" +#include + +b2Version b2_version = {2, 1, 2}; + +// Memory allocators. Modify these to use your own allocator. +void* b2Alloc(int32 size) +{ + return malloc(size); +} + +void b2Free(void* mem) +{ + free(mem); +} diff --git a/AndEngine/jni/Box2D/Common/b2Settings.h b/AndEngine/jni/Box2D/Common/b2Settings.h new file mode 100644 index 0000000..741b58f --- /dev/null +++ b/AndEngine/jni/Box2D/Common/b2Settings.h @@ -0,0 +1,151 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_SETTINGS_H +#define B2_SETTINGS_H + +#include +#include + +#define B2_NOT_USED(x) ((void)(x)) +#define b2Assert(A) assert(A) + +typedef signed char int8; +typedef signed short int16; +typedef signed int int32; +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; +typedef float float32; + +#define b2_maxFloat FLT_MAX +#define b2_epsilon FLT_EPSILON +#define b2_pi 3.14159265359f + +/// @file +/// Global tuning constants based on meters-kilograms-seconds (MKS) units. +/// + +// Collision + +/// The maximum number of contact points between two convex shapes. +#define b2_maxManifoldPoints 2 + +/// The maximum number of vertices on a convex polygon. +#define b2_maxPolygonVertices 8 + +/// This is used to fatten AABBs in the dynamic tree. This allows proxies +/// to move by a small amount without triggering a tree adjustment. +/// This is in meters. +#define b2_aabbExtension 0.1f + +/// This is used to fatten AABBs in the dynamic tree. This is used to predict +/// the future position based on the current displacement. +/// This is a dimensionless multiplier. +#define b2_aabbMultiplier 2.0f + +/// A small length used as a collision and constraint tolerance. Usually it is +/// chosen to be numerically significant, but visually insignificant. +#define b2_linearSlop 0.005f + +/// A small angle used as a collision and constraint tolerance. Usually it is +/// chosen to be numerically significant, but visually insignificant. +#define b2_angularSlop (2.0f / 180.0f * b2_pi) + +/// The radius of the polygon/edge shape skin. This should not be modified. Making +/// this smaller means polygons will have an insufficient buffer for continuous collision. +/// Making it larger may create artifacts for vertex collision. +#define b2_polygonRadius (2.0f * b2_linearSlop) + + +// Dynamics + +/// Maximum number of contacts to be handled to solve a TOI impact. +#define b2_maxTOIContacts 32 + +/// A velocity threshold for elastic collisions. Any collision with a relative linear +/// velocity below this threshold will be treated as inelastic. +#define b2_velocityThreshold 1.0f + +/// The maximum linear position correction used when solving constraints. This helps to +/// prevent overshoot. +#define b2_maxLinearCorrection 0.2f + +/// The maximum angular position correction used when solving constraints. This helps to +/// prevent overshoot. +#define b2_maxAngularCorrection (8.0f / 180.0f * b2_pi) + +/// The maximum linear velocity of a body. This limit is very large and is used +/// to prevent numerical problems. You shouldn't need to adjust this. +#define b2_maxTranslation 2.0f +#define b2_maxTranslationSquared (b2_maxTranslation * b2_maxTranslation) + +/// The maximum angular velocity of a body. This limit is very large and is used +/// to prevent numerical problems. You shouldn't need to adjust this. +#define b2_maxRotation (0.5f * b2_pi) +#define b2_maxRotationSquared (b2_maxRotation * b2_maxRotation) + +/// This scale factor controls how fast overlap is resolved. Ideally this would be 1 so +/// that overlap is removed in one time step. However using values close to 1 often lead +/// to overshoot. +#define b2_contactBaumgarte 0.2f + +// Sleep + +/// The time that a body must be still before it will go to sleep. +#define b2_timeToSleep 0.5f + +/// A body cannot sleep if its linear velocity is above this tolerance. +#define b2_linearSleepTolerance 0.01f + +/// A body cannot sleep if its angular velocity is above this tolerance. +#define b2_angularSleepTolerance (2.0f / 180.0f * b2_pi) + +// Memory Allocation + +/// Implement this function to use your own memory allocator. +void* b2Alloc(int32 size); + +/// If you implement b2Alloc, you should also implement this function. +void b2Free(void* mem); + +/// Version numbering scheme. +/// See http://en.wikipedia.org/wiki/Software_versioning +struct b2Version +{ + int32 major; ///< significant changes + int32 minor; ///< incremental changes + int32 revision; ///< bug fixes +}; + +/// Current version. +extern b2Version b2_version; + +/// Friction mixing law. Feel free to customize this. +inline float32 b2MixFriction(float32 friction1, float32 friction2) +{ + return sqrtf(friction1 * friction2); +} + +/// Restitution mixing law. Feel free to customize this. +inline float32 b2MixRestitution(float32 restitution1, float32 restitution2) +{ + return restitution1 > restitution2 ? restitution1 : restitution2; +} + +#endif diff --git a/AndEngine/jni/Box2D/Common/b2StackAllocator.cpp b/AndEngine/jni/Box2D/Common/b2StackAllocator.cpp new file mode 100644 index 0000000..af207df --- /dev/null +++ b/AndEngine/jni/Box2D/Common/b2StackAllocator.cpp @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Common/b2StackAllocator.h" +#include "Box2D/Common/b2Math.h" + +b2StackAllocator::b2StackAllocator() +{ + m_index = 0; + m_allocation = 0; + m_maxAllocation = 0; + m_entryCount = 0; +} + +b2StackAllocator::~b2StackAllocator() +{ + b2Assert(m_index == 0); + b2Assert(m_entryCount == 0); +} + +void* b2StackAllocator::Allocate(int32 size) +{ + b2Assert(m_entryCount < b2_maxStackEntries); + + b2StackEntry* entry = m_entries + m_entryCount; + entry->size = size; + if (m_index + size > b2_stackSize) + { + entry->data = (char*)b2Alloc(size); + entry->usedMalloc = true; + } + else + { + entry->data = m_data + m_index; + entry->usedMalloc = false; + m_index += size; + } + + m_allocation += size; + m_maxAllocation = b2Max(m_maxAllocation, m_allocation); + ++m_entryCount; + + return entry->data; +} + +void b2StackAllocator::Free(void* p) +{ + b2Assert(m_entryCount > 0); + b2StackEntry* entry = m_entries + m_entryCount - 1; + b2Assert(p == entry->data); + if (entry->usedMalloc) + { + b2Free(p); + } + else + { + m_index -= entry->size; + } + m_allocation -= entry->size; + --m_entryCount; + + p = NULL; +} + +int32 b2StackAllocator::GetMaxAllocation() const +{ + return m_maxAllocation; +} diff --git a/AndEngine/jni/Box2D/Common/b2StackAllocator.h b/AndEngine/jni/Box2D/Common/b2StackAllocator.h new file mode 100644 index 0000000..a1a66fb --- /dev/null +++ b/AndEngine/jni/Box2D/Common/b2StackAllocator.h @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_STACK_ALLOCATOR_H +#define B2_STACK_ALLOCATOR_H + +#include "Box2D/Common/b2Settings.h" + +const int32 b2_stackSize = 100 * 1024; // 100k +const int32 b2_maxStackEntries = 32; + +struct b2StackEntry +{ + char* data; + int32 size; + bool usedMalloc; +}; + +// This is a stack allocator used for fast per step allocations. +// You must nest allocate/free pairs. The code will assert +// if you try to interleave multiple allocate/free pairs. +class b2StackAllocator +{ +public: + b2StackAllocator(); + ~b2StackAllocator(); + + void* Allocate(int32 size); + void Free(void* p); + + int32 GetMaxAllocation() const; + +private: + + char m_data[b2_stackSize]; + int32 m_index; + + int32 m_allocation; + int32 m_maxAllocation; + + b2StackEntry m_entries[b2_maxStackEntries]; + int32 m_entryCount; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Contact.cpp b/AndEngine/jni/Box2D/Contact.cpp new file mode 100644 index 0000000..1db0c98 --- /dev/null +++ b/AndEngine/jni/Box2D/Contact.cpp @@ -0,0 +1,105 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "Contact.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniGetWorldManifold + * Signature: (J)J + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniGetWorldManifold + (JNIEnv *env, jobject, jlong addr, jfloatArray mani) +{ + b2Contact* contact = (b2Contact*)addr; + b2WorldManifold manifold; + contact->GetWorldManifold(&manifold); + int numPoints = contact->GetManifold()->pointCount; + + float* tmp = (float*)env->GetPrimitiveArrayCritical( mani, 0 ); + tmp[0] = manifold.normal.x; + tmp[1] = manifold.normal.y; + + for( int i = 0; i < numPoints; i++ ) + { + tmp[2 + i*2] = manifold.points[i].x; + tmp[2 + i*2+1] = manifold.points[i].y; + } + + env->ReleasePrimitiveArrayCritical( mani, tmp, 0 ); + + return numPoints; +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniIsTouching + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniIsTouching + (JNIEnv *, jobject, jlong addr) +{ + b2Contact* contact = (b2Contact*)addr; + return contact->IsTouching(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniSetEnabled + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniSetEnabled + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2Contact* contact = (b2Contact*)addr; + contact->SetEnabled(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniIsEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniIsEnabled + (JNIEnv *, jobject, jlong addr) +{ + b2Contact* contact = (b2Contact*)addr; + return contact->IsEnabled(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniGetFixtureA + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniGetFixtureA + (JNIEnv *, jobject, jlong addr) +{ + b2Contact* contact = (b2Contact*)addr; + return (jlong)contact->GetFixtureA(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniGetFixtureB + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniGetFixtureB + (JNIEnv *, jobject, jlong addr) +{ + b2Contact* contact = (b2Contact*)addr; + return (jlong)contact->GetFixtureB(); +} diff --git a/AndEngine/jni/Box2D/Contact.h b/AndEngine/jni/Box2D/Contact.h new file mode 100644 index 0000000..5017c93 --- /dev/null +++ b/AndEngine/jni/Box2D/Contact.h @@ -0,0 +1,76 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_Contact */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_Contact +#define _Included_com_badlogic_gdx_physics_box2d_Contact +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniGetWorldManifold + * Signature: (J[F)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniGetWorldManifold + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniIsTouching + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniIsTouching + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniSetEnabled + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniSetEnabled + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniIsEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniIsEnabled + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniGetFixtureA + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniGetFixtureA + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Contact + * Method: jniGetFixtureB + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Contact_jniGetFixtureB + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/DistanceJoint.cpp b/AndEngine/jni/Box2D/DistanceJoint.cpp new file mode 100644 index 0000000..25917d6 --- /dev/null +++ b/AndEngine/jni/Box2D/DistanceJoint.cpp @@ -0,0 +1,89 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "DistanceJoint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniSetLength + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniSetLength + (JNIEnv *, jobject, jlong addr, jfloat len) +{ + b2DistanceJoint* joint = (b2DistanceJoint*)addr; + joint->SetLength( len ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniGetLength + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniGetLength + (JNIEnv *, jobject, jlong addr) +{ + b2DistanceJoint* joint = (b2DistanceJoint*)addr; + return joint->GetLength(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniSetFrequency + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniSetFrequency + (JNIEnv *, jobject, jlong addr, jfloat hz) +{ + b2DistanceJoint* joint = (b2DistanceJoint*)addr; + joint->SetFrequency( hz ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniGetFrequency + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniGetFrequency + (JNIEnv *, jobject, jlong addr ) +{ + b2DistanceJoint* joint = (b2DistanceJoint*)addr; + return joint->GetFrequency(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniSetDampingRatio + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniSetDampingRatio + (JNIEnv *, jobject, jlong addr, jfloat dampingRatio) +{ + b2DistanceJoint* joint = (b2DistanceJoint*)addr; + joint->SetDampingRatio( dampingRatio ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniGetDampingRatio + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniGetDampingRatio + (JNIEnv *, jobject, jlong addr ) +{ + b2DistanceJoint* joint = (b2DistanceJoint*)addr; + return joint->GetDampingRatio(); +} diff --git a/AndEngine/jni/Box2D/DistanceJoint.h b/AndEngine/jni/Box2D/DistanceJoint.h new file mode 100644 index 0000000..44d4fff --- /dev/null +++ b/AndEngine/jni/Box2D/DistanceJoint.h @@ -0,0 +1,77 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_joints_DistanceJoint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_joints_DistanceJoint +#define _Included_com_badlogic_gdx_physics_box2d_joints_DistanceJoint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniSetLength + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniSetLength + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniGetLength + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniGetLength + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniSetFrequency + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniSetFrequency + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniGetFrequency + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniGetFrequency + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniSetDampingRatio + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniSetDampingRatio + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_DistanceJoint + * Method: jniGetDampingRatio + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_DistanceJoint_jniGetDampingRatio + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2CircleContact.cpp b/AndEngine/jni/Box2D/Dynamics/Contacts/b2CircleContact.cpp new file mode 100644 index 0000000..19da090 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2CircleContact.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Contacts/b2CircleContact.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2WorldCallbacks.h" +#include "Box2D/Common/b2BlockAllocator.h" +#include "Box2D/Collision/b2TimeOfImpact.h" + +#include + +b2Contact* b2CircleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2CircleContact)); + return new (mem) b2CircleContact(fixtureA, fixtureB); +} + +void b2CircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2CircleContact*)contact)->~b2CircleContact(); + allocator->Free(contact, sizeof(b2CircleContact)); +} + +b2CircleContact::b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) + : b2Contact(fixtureA, fixtureB) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_circle); + b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); +} + +void b2CircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2CollideCircles(manifold, + (b2CircleShape*)m_fixtureA->GetShape(), xfA, + (b2CircleShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2CircleContact.h b/AndEngine/jni/Box2D/Dynamics/Contacts/b2CircleContact.h new file mode 100644 index 0000000..1c1dc32 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2CircleContact.h @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_CIRCLE_CONTACT_H +#define B2_CIRCLE_CONTACT_H + +#include "Box2D/Dynamics/Contacts/b2Contact.h" + +class b2BlockAllocator; + +class b2CircleContact : public b2Contact +{ +public: + static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2CircleContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2Contact.cpp b/AndEngine/jni/Box2D/Dynamics/Contacts/b2Contact.cpp new file mode 100644 index 0000000..e7c0bfa --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2Contact.cpp @@ -0,0 +1,226 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Contacts/b2Contact.h" +#include "Box2D/Dynamics/Contacts/b2CircleContact.h" +#include "Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h" +#include "Box2D/Dynamics/Contacts/b2PolygonContact.h" +#include "Box2D/Dynamics/Contacts/b2ContactSolver.h" + +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/b2TimeOfImpact.h" +#include "Box2D/Collision/Shapes/b2Shape.h" +#include "Box2D/Common/b2BlockAllocator.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2World.h" + +b2ContactRegister b2Contact::s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount]; +bool b2Contact::s_initialized = false; + +void b2Contact::InitializeRegisters() +{ + AddType(b2CircleContact::Create, b2CircleContact::Destroy, b2Shape::e_circle, b2Shape::e_circle); + AddType(b2PolygonAndCircleContact::Create, b2PolygonAndCircleContact::Destroy, b2Shape::e_polygon, b2Shape::e_circle); + AddType(b2PolygonContact::Create, b2PolygonContact::Destroy, b2Shape::e_polygon, b2Shape::e_polygon); +} + +void b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn, + b2Shape::Type type1, b2Shape::Type type2) +{ + b2Assert(b2Shape::e_unknown < type1 && type1 < b2Shape::e_typeCount); + b2Assert(b2Shape::e_unknown < type2 && type2 < b2Shape::e_typeCount); + + s_registers[type1][type2].createFcn = createFcn; + s_registers[type1][type2].destroyFcn = destoryFcn; + s_registers[type1][type2].primary = true; + + if (type1 != type2) + { + s_registers[type2][type1].createFcn = createFcn; + s_registers[type2][type1].destroyFcn = destoryFcn; + s_registers[type2][type1].primary = false; + } +} + +b2Contact* b2Contact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) +{ + if (s_initialized == false) + { + InitializeRegisters(); + s_initialized = true; + } + + b2Shape::Type type1 = fixtureA->GetType(); + b2Shape::Type type2 = fixtureB->GetType(); + + b2Assert(b2Shape::e_unknown < type1 && type1 < b2Shape::e_typeCount); + b2Assert(b2Shape::e_unknown < type2 && type2 < b2Shape::e_typeCount); + + b2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn; + if (createFcn) + { + if (s_registers[type1][type2].primary) + { + return createFcn(fixtureA, fixtureB, allocator); + } + else + { + return createFcn(fixtureB, fixtureA, allocator); + } + } + else + { + return NULL; + } +} + +void b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + b2Assert(s_initialized == true); + + if (contact->m_manifold.pointCount > 0) + { + contact->GetFixtureA()->GetBody()->SetAwake(true); + contact->GetFixtureB()->GetBody()->SetAwake(true); + } + + b2Shape::Type typeA = contact->GetFixtureA()->GetType(); + b2Shape::Type typeB = contact->GetFixtureB()->GetType(); + + b2Assert(b2Shape::e_unknown < typeA && typeB < b2Shape::e_typeCount); + b2Assert(b2Shape::e_unknown < typeA && typeB < b2Shape::e_typeCount); + + b2ContactDestroyFcn* destroyFcn = s_registers[typeA][typeB].destroyFcn; + destroyFcn(contact, allocator); +} + +b2Contact::b2Contact(b2Fixture* fA, b2Fixture* fB) +{ + m_flags = e_enabledFlag; + + m_fixtureA = fA; + m_fixtureB = fB; + + m_manifold.pointCount = 0; + + m_prev = NULL; + m_next = NULL; + + m_nodeA.contact = NULL; + m_nodeA.prev = NULL; + m_nodeA.next = NULL; + m_nodeA.other = NULL; + + m_nodeB.contact = NULL; + m_nodeB.prev = NULL; + m_nodeB.next = NULL; + m_nodeB.other = NULL; + + m_toiCount = 0; +} + +// Update the contact manifold and touching status. +// Note: do not assume the fixture AABBs are overlapping or are valid. +void b2Contact::Update(b2ContactListener* listener) +{ + b2Manifold oldManifold = m_manifold; + + // Re-enable this contact. + m_flags |= e_enabledFlag; + + bool touching = false; + bool wasTouching = (m_flags & e_touchingFlag) == e_touchingFlag; + + bool sensorA = m_fixtureA->IsSensor(); + bool sensorB = m_fixtureB->IsSensor(); + bool sensor = sensorA || sensorB; + + b2Body* bodyA = m_fixtureA->GetBody(); + b2Body* bodyB = m_fixtureB->GetBody(); + const b2Transform& xfA = bodyA->GetTransform(); + const b2Transform& xfB = bodyB->GetTransform(); + + // Is this contact a sensor? + if (sensor) + { + const b2Shape* shapeA = m_fixtureA->GetShape(); + const b2Shape* shapeB = m_fixtureB->GetShape(); + touching = b2TestOverlap(shapeA, shapeB, xfA, xfB); + + // Sensors don't generate manifolds. + m_manifold.pointCount = 0; + } + else + { + Evaluate(&m_manifold, xfA, xfB); + touching = m_manifold.pointCount > 0; + + // Match old contact ids to new contact ids and copy the + // stored impulses to warm start the solver. + for (int32 i = 0; i < m_manifold.pointCount; ++i) + { + b2ManifoldPoint* mp2 = m_manifold.points + i; + mp2->normalImpulse = 0.0f; + mp2->tangentImpulse = 0.0f; + b2ContactID id2 = mp2->id; + + for (int32 j = 0; j < oldManifold.pointCount; ++j) + { + b2ManifoldPoint* mp1 = oldManifold.points + j; + + if (mp1->id.key == id2.key) + { + mp2->normalImpulse = mp1->normalImpulse; + mp2->tangentImpulse = mp1->tangentImpulse; + break; + } + } + } + + if (touching != wasTouching) + { + bodyA->SetAwake(true); + bodyB->SetAwake(true); + } + } + + if (touching) + { + m_flags |= e_touchingFlag; + } + else + { + m_flags &= ~e_touchingFlag; + } + + if (wasTouching == false && touching == true && listener) + { + listener->BeginContact(this); + } + + if (wasTouching == true && touching == false && listener) + { + listener->EndContact(this); + } + + if (sensor == false && touching && listener) + { + listener->PreSolve(this, &oldManifold); + } +} diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2Contact.h b/AndEngine/jni/Box2D/Dynamics/Contacts/b2Contact.h new file mode 100644 index 0000000..4751ce9 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2Contact.h @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_CONTACT_H +#define B2_CONTACT_H + +#include "Box2D/Common/b2Math.h" +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/Shapes/b2Shape.h" +#include "Box2D/Dynamics/Contacts/b2Contact.h" +#include "Box2D/Dynamics/b2Fixture.h" + +class b2Body; +class b2Contact; +class b2Fixture; +class b2World; +class b2BlockAllocator; +class b2StackAllocator; +class b2ContactListener; + +typedef b2Contact* b2ContactCreateFcn(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); +typedef void b2ContactDestroyFcn(b2Contact* contact, b2BlockAllocator* allocator); + +struct b2ContactRegister +{ + b2ContactCreateFcn* createFcn; + b2ContactDestroyFcn* destroyFcn; + bool primary; +}; + +/// A contact edge is used to connect bodies and contacts together +/// in a contact graph where each body is a node and each contact +/// is an edge. A contact edge belongs to a doubly linked list +/// maintained in each attached body. Each contact has two contact +/// nodes, one for each attached body. +struct b2ContactEdge +{ + b2Body* other; ///< provides quick access to the other body attached. + b2Contact* contact; ///< the contact + b2ContactEdge* prev; ///< the previous contact edge in the body's contact list + b2ContactEdge* next; ///< the next contact edge in the body's contact list +}; + +/// The class manages contact between two shapes. A contact exists for each overlapping +/// AABB in the broad-phase (except if filtered). Therefore a contact object may exist +/// that has no contact points. +class b2Contact +{ +public: + + /// Get the contact manifold. Do not modify the manifold unless you understand the + /// internals of Box2D. + b2Manifold* GetManifold(); + const b2Manifold* GetManifold() const; + + /// Get the world manifold. + void GetWorldManifold(b2WorldManifold* worldManifold) const; + + /// Is this contact touching? + bool IsTouching() const; + + /// Enable/disable this contact. This can be used inside the pre-solve + /// contact listener. The contact is only disabled for the current + /// time step (or sub-step in continuous collisions). + void SetEnabled(bool flag); + + /// Has this contact been disabled? + bool IsEnabled() const; + + /// Get the next contact in the world's contact list. + b2Contact* GetNext(); + const b2Contact* GetNext() const; + + /// Get the first fixture in this contact. + b2Fixture* GetFixtureA(); + const b2Fixture* GetFixtureA() const; + + /// Get the second fixture in this contact. + b2Fixture* GetFixtureB(); + const b2Fixture* GetFixtureB() const; + + /// Evaluate this contact with your own manifold and transforms. + virtual void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) = 0; + +protected: + friend class b2ContactManager; + friend class b2World; + friend class b2ContactSolver; + friend class b2Body; + friend class b2Fixture; + + // Flags stored in m_flags + enum + { + // Used when crawling contact graph when forming islands. + e_islandFlag = 0x0001, + + // Set when the shapes are touching. + e_touchingFlag = 0x0002, + + // This contact can be disabled (by user) + e_enabledFlag = 0x0004, + + // This contact needs filtering because a fixture filter was changed. + e_filterFlag = 0x0008, + + // This bullet contact had a TOI event + e_bulletHitFlag = 0x0010, + + }; + + /// Flag this contact for filtering. Filtering will occur the next time step. + void FlagForFiltering(); + + static void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn, + b2Shape::Type typeA, b2Shape::Type typeB); + static void InitializeRegisters(); + static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2Shape::Type typeA, b2Shape::Type typeB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2Contact() : m_fixtureA(NULL), m_fixtureB(NULL) {} + b2Contact(b2Fixture* fixtureA, b2Fixture* fixtureB); + virtual ~b2Contact() {} + + void Update(b2ContactListener* listener); + + static b2ContactRegister s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount]; + static bool s_initialized; + + uint32 m_flags; + + // World pool and list pointers. + b2Contact* m_prev; + b2Contact* m_next; + + // Nodes for connecting bodies. + b2ContactEdge m_nodeA; + b2ContactEdge m_nodeB; + + b2Fixture* m_fixtureA; + b2Fixture* m_fixtureB; + + b2Manifold m_manifold; + + int32 m_toiCount; +// float32 m_toi; +}; + +inline b2Manifold* b2Contact::GetManifold() +{ + return &m_manifold; +} + +inline const b2Manifold* b2Contact::GetManifold() const +{ + return &m_manifold; +} + +inline void b2Contact::GetWorldManifold(b2WorldManifold* worldManifold) const +{ + const b2Body* bodyA = m_fixtureA->GetBody(); + const b2Body* bodyB = m_fixtureB->GetBody(); + const b2Shape* shapeA = m_fixtureA->GetShape(); + const b2Shape* shapeB = m_fixtureB->GetShape(); + + worldManifold->Initialize(&m_manifold, bodyA->GetTransform(), shapeA->m_radius, bodyB->GetTransform(), shapeB->m_radius); +} + +inline void b2Contact::SetEnabled(bool flag) +{ + if (flag) + { + m_flags |= e_enabledFlag; + } + else + { + m_flags &= ~e_enabledFlag; + } +} + +inline bool b2Contact::IsEnabled() const +{ + return (m_flags & e_enabledFlag) == e_enabledFlag; +} + +inline bool b2Contact::IsTouching() const +{ + return (m_flags & e_touchingFlag) == e_touchingFlag; +} + +inline b2Contact* b2Contact::GetNext() +{ + return m_next; +} + +inline const b2Contact* b2Contact::GetNext() const +{ + return m_next; +} + +inline b2Fixture* b2Contact::GetFixtureA() +{ + return m_fixtureA; +} + +inline const b2Fixture* b2Contact::GetFixtureA() const +{ + return m_fixtureA; +} + +inline b2Fixture* b2Contact::GetFixtureB() +{ + return m_fixtureB; +} + +inline const b2Fixture* b2Contact::GetFixtureB() const +{ + return m_fixtureB; +} + +inline void b2Contact::FlagForFiltering() +{ + m_flags |= e_filterFlag; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2ContactSolver.cpp b/AndEngine/jni/Box2D/Dynamics/Contacts/b2ContactSolver.cpp new file mode 100644 index 0000000..e2ae392 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2ContactSolver.cpp @@ -0,0 +1,623 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Contacts/b2ContactSolver.h" +#include "Box2D/Dynamics/Contacts/b2Contact.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2World.h" +#include "Box2D/Common/b2StackAllocator.h" + +#define B2_DEBUG_SOLVER 0 + +b2ContactSolver::b2ContactSolver(b2Contact** contacts, int32 contactCount, + b2StackAllocator* allocator, float32 impulseRatio) +{ + m_allocator = allocator; + + m_constraintCount = contactCount; + m_constraints = (b2ContactConstraint*)m_allocator->Allocate(m_constraintCount * sizeof(b2ContactConstraint)); + + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2Contact* contact = contacts[i]; + + b2Fixture* fixtureA = contact->m_fixtureA; + b2Fixture* fixtureB = contact->m_fixtureB; + b2Shape* shapeA = fixtureA->GetShape(); + b2Shape* shapeB = fixtureB->GetShape(); + float32 radiusA = shapeA->m_radius; + float32 radiusB = shapeB->m_radius; + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + b2Manifold* manifold = contact->GetManifold(); + + float32 friction = b2MixFriction(fixtureA->GetFriction(), fixtureB->GetFriction()); + float32 restitution = b2MixRestitution(fixtureA->GetRestitution(), fixtureB->GetRestitution()); + + b2Vec2 vA = bodyA->m_linearVelocity; + b2Vec2 vB = bodyB->m_linearVelocity; + float32 wA = bodyA->m_angularVelocity; + float32 wB = bodyB->m_angularVelocity; + + b2Assert(manifold->pointCount > 0); + + b2WorldManifold worldManifold; + worldManifold.Initialize(manifold, bodyA->m_xf, radiusA, bodyB->m_xf, radiusB); + + b2ContactConstraint* cc = m_constraints + i; + cc->bodyA = bodyA; + cc->bodyB = bodyB; + cc->manifold = manifold; + cc->normal = worldManifold.normal; + cc->pointCount = manifold->pointCount; + cc->friction = friction; + + cc->localNormal = manifold->localNormal; + cc->localPoint = manifold->localPoint; + cc->radius = radiusA + radiusB; + cc->type = manifold->type; + + for (int32 j = 0; j < cc->pointCount; ++j) + { + b2ManifoldPoint* cp = manifold->points + j; + b2ContactConstraintPoint* ccp = cc->points + j; + + ccp->normalImpulse = impulseRatio * cp->normalImpulse; + ccp->tangentImpulse = impulseRatio * cp->tangentImpulse; + + ccp->localPoint = cp->localPoint; + + ccp->rA = worldManifold.points[j] - bodyA->m_sweep.c; + ccp->rB = worldManifold.points[j] - bodyB->m_sweep.c; + + float32 rnA = b2Cross(ccp->rA, cc->normal); + float32 rnB = b2Cross(ccp->rB, cc->normal); + rnA *= rnA; + rnB *= rnB; + + float32 kNormal = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rnA + bodyB->m_invI * rnB; + + b2Assert(kNormal > b2_epsilon); + ccp->normalMass = 1.0f / kNormal; + + b2Vec2 tangent = b2Cross(cc->normal, 1.0f); + + float32 rtA = b2Cross(ccp->rA, tangent); + float32 rtB = b2Cross(ccp->rB, tangent); + rtA *= rtA; + rtB *= rtB; + + float32 kTangent = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rtA + bodyB->m_invI * rtB; + + b2Assert(kTangent > b2_epsilon); + ccp->tangentMass = 1.0f / kTangent; + + // Setup a velocity bias for restitution. + ccp->velocityBias = 0.0f; + float32 vRel = b2Dot(cc->normal, vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA)); + if (vRel < -b2_velocityThreshold) + { + ccp->velocityBias = -restitution * vRel; + } + } + + // If we have two points, then prepare the block solver. + if (cc->pointCount == 2) + { + b2ContactConstraintPoint* ccp1 = cc->points + 0; + b2ContactConstraintPoint* ccp2 = cc->points + 1; + + float32 invMassA = bodyA->m_invMass; + float32 invIA = bodyA->m_invI; + float32 invMassB = bodyB->m_invMass; + float32 invIB = bodyB->m_invI; + + float32 rn1A = b2Cross(ccp1->rA, cc->normal); + float32 rn1B = b2Cross(ccp1->rB, cc->normal); + float32 rn2A = b2Cross(ccp2->rA, cc->normal); + float32 rn2B = b2Cross(ccp2->rB, cc->normal); + + float32 k11 = invMassA + invMassB + invIA * rn1A * rn1A + invIB * rn1B * rn1B; + float32 k22 = invMassA + invMassB + invIA * rn2A * rn2A + invIB * rn2B * rn2B; + float32 k12 = invMassA + invMassB + invIA * rn1A * rn2A + invIB * rn1B * rn2B; + + // Ensure a reasonable condition number. + const float32 k_maxConditionNumber = 100.0f; + if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) + { + // K is safe to invert. + cc->K.col1.Set(k11, k12); + cc->K.col2.Set(k12, k22); + cc->normalMass = cc->K.GetInverse(); + } + else + { + // The constraints are redundant, just use one. + // TODO_ERIN use deepest? + cc->pointCount = 1; + } + } + } +} + +b2ContactSolver::~b2ContactSolver() +{ + m_allocator->Free(m_constraints); +} + +void b2ContactSolver::WarmStart() +{ + // Warm start. + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2ContactConstraint* c = m_constraints + i; + + b2Body* bodyA = c->bodyA; + b2Body* bodyB = c->bodyB; + float32 invMassA = bodyA->m_invMass; + float32 invIA = bodyA->m_invI; + float32 invMassB = bodyB->m_invMass; + float32 invIB = bodyB->m_invI; + b2Vec2 normal = c->normal; + b2Vec2 tangent = b2Cross(normal, 1.0f); + + for (int32 j = 0; j < c->pointCount; ++j) + { + b2ContactConstraintPoint* ccp = c->points + j; + b2Vec2 P = ccp->normalImpulse * normal + ccp->tangentImpulse * tangent; + bodyA->m_angularVelocity -= invIA * b2Cross(ccp->rA, P); + bodyA->m_linearVelocity -= invMassA * P; + bodyB->m_angularVelocity += invIB * b2Cross(ccp->rB, P); + bodyB->m_linearVelocity += invMassB * P; + } + } +} + +void b2ContactSolver::SolveVelocityConstraints() +{ + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2ContactConstraint* c = m_constraints + i; + b2Body* bodyA = c->bodyA; + b2Body* bodyB = c->bodyB; + float32 wA = bodyA->m_angularVelocity; + float32 wB = bodyB->m_angularVelocity; + b2Vec2 vA = bodyA->m_linearVelocity; + b2Vec2 vB = bodyB->m_linearVelocity; + float32 invMassA = bodyA->m_invMass; + float32 invIA = bodyA->m_invI; + float32 invMassB = bodyB->m_invMass; + float32 invIB = bodyB->m_invI; + b2Vec2 normal = c->normal; + b2Vec2 tangent = b2Cross(normal, 1.0f); + float32 friction = c->friction; + + b2Assert(c->pointCount == 1 || c->pointCount == 2); + + // Solve tangent constraints + for (int32 j = 0; j < c->pointCount; ++j) + { + b2ContactConstraintPoint* ccp = c->points + j; + + // Relative velocity at contact + b2Vec2 dv = vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA); + + // Compute tangent force + float32 vt = b2Dot(dv, tangent); + float32 lambda = ccp->tangentMass * (-vt); + + // b2Clamp the accumulated force + float32 maxFriction = friction * ccp->normalImpulse; + float32 newImpulse = b2Clamp(ccp->tangentImpulse + lambda, -maxFriction, maxFriction); + lambda = newImpulse - ccp->tangentImpulse; + + // Apply contact impulse + b2Vec2 P = lambda * tangent; + + vA -= invMassA * P; + wA -= invIA * b2Cross(ccp->rA, P); + + vB += invMassB * P; + wB += invIB * b2Cross(ccp->rB, P); + + ccp->tangentImpulse = newImpulse; + } + + // Solve normal constraints + if (c->pointCount == 1) + { + b2ContactConstraintPoint* ccp = c->points + 0; + + // Relative velocity at contact + b2Vec2 dv = vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA); + + // Compute normal impulse + float32 vn = b2Dot(dv, normal); + float32 lambda = -ccp->normalMass * (vn - ccp->velocityBias); + + // b2Clamp the accumulated impulse + float32 newImpulse = b2Max(ccp->normalImpulse + lambda, 0.0f); + lambda = newImpulse - ccp->normalImpulse; + + // Apply contact impulse + b2Vec2 P = lambda * normal; + vA -= invMassA * P; + wA -= invIA * b2Cross(ccp->rA, P); + + vB += invMassB * P; + wB += invIB * b2Cross(ccp->rB, P); + ccp->normalImpulse = newImpulse; + } + else + { + // Block solver developed in collaboration with Dirk Gregorius (back in 01/07 on Box2D_Lite). + // Build the mini LCP for this contact patch + // + // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = 1..2 + // + // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) + // b = vn_0 - velocityBias + // + // The system is solved using the "Total enumeration method" (s. Murty). The complementary constraint vn_i * x_i + // implies that we must have in any solution either vn_i = 0 or x_i = 0. So for the 2D contact problem the cases + // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and vn1 = 0 need to be tested. The first valid + // solution that satisfies the problem is chosen. + // + // In order to account of the accumulated impulse 'a' (because of the iterative nature of the solver which only requires + // that the accumulated impulse is clamped and not the incremental impulse) we change the impulse variable (x_i). + // + // Substitute: + // + // x = x' - a + // + // Plug into above equation: + // + // vn = A * x + b + // = A * (x' - a) + b + // = A * x' + b - A * a + // = A * x' + b' + // b' = b - A * a; + + b2ContactConstraintPoint* cp1 = c->points + 0; + b2ContactConstraintPoint* cp2 = c->points + 1; + + b2Vec2 a(cp1->normalImpulse, cp2->normalImpulse); + b2Assert(a.x >= 0.0f && a.y >= 0.0f); + + // Relative velocity at contact + b2Vec2 dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); + b2Vec2 dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); + + // Compute normal velocity + float32 vn1 = b2Dot(dv1, normal); + float32 vn2 = b2Dot(dv2, normal); + + b2Vec2 b; + b.x = vn1 - cp1->velocityBias; + b.y = vn2 - cp2->velocityBias; + b -= b2Mul(c->K, a); + + const float32 k_errorTol = 1e-3f; + B2_NOT_USED(k_errorTol); + + for (;;) + { + // + // Case 1: vn = 0 + // + // 0 = A * x' + b' + // + // Solve for x': + // + // x' = - inv(A) * b' + // + b2Vec2 x = - b2Mul(c->normalMass, b); + + if (x.x >= 0.0f && x.y >= 0.0f) + { + // Resubstitute for the incremental impulse + b2Vec2 d = x - a; + + // Apply incremental impulse + b2Vec2 P1 = d.x * normal; + b2Vec2 P2 = d.y * normal; + vA -= invMassA * (P1 + P2); + wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += invMassB * (P1 + P2); + wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + + // Accumulate + cp1->normalImpulse = x.x; + cp2->normalImpulse = x.y; + +#if B2_DEBUG_SOLVER == 1 + // Postconditions + dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); + dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); + + // Compute normal velocity + vn1 = b2Dot(dv1, normal); + vn2 = b2Dot(dv2, normal); + + b2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol); + b2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol); +#endif + break; + } + + // + // Case 2: vn1 = 0 and x2 = 0 + // + // 0 = a11 * x1' + a12 * 0 + b1' + // vn2 = a21 * x1' + a22 * 0 + b2' + // + x.x = - cp1->normalMass * b.x; + x.y = 0.0f; + vn1 = 0.0f; + vn2 = c->K.col1.y * x.x + b.y; + + if (x.x >= 0.0f && vn2 >= 0.0f) + { + // Resubstitute for the incremental impulse + b2Vec2 d = x - a; + + // Apply incremental impulse + b2Vec2 P1 = d.x * normal; + b2Vec2 P2 = d.y * normal; + vA -= invMassA * (P1 + P2); + wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += invMassB * (P1 + P2); + wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + + // Accumulate + cp1->normalImpulse = x.x; + cp2->normalImpulse = x.y; + +#if B2_DEBUG_SOLVER == 1 + // Postconditions + dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); + + // Compute normal velocity + vn1 = b2Dot(dv1, normal); + + b2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol); +#endif + break; + } + + + // + // Case 3: vn2 = 0 and x1 = 0 + // + // vn1 = a11 * 0 + a12 * x2' + b1' + // 0 = a21 * 0 + a22 * x2' + b2' + // + x.x = 0.0f; + x.y = - cp2->normalMass * b.y; + vn1 = c->K.col2.x * x.y + b.x; + vn2 = 0.0f; + + if (x.y >= 0.0f && vn1 >= 0.0f) + { + // Resubstitute for the incremental impulse + b2Vec2 d = x - a; + + // Apply incremental impulse + b2Vec2 P1 = d.x * normal; + b2Vec2 P2 = d.y * normal; + vA -= invMassA * (P1 + P2); + wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += invMassB * (P1 + P2); + wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + + // Accumulate + cp1->normalImpulse = x.x; + cp2->normalImpulse = x.y; + +#if B2_DEBUG_SOLVER == 1 + // Postconditions + dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); + + // Compute normal velocity + vn2 = b2Dot(dv2, normal); + + b2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol); +#endif + break; + } + + // + // Case 4: x1 = 0 and x2 = 0 + // + // vn1 = b1 + // vn2 = b2; + x.x = 0.0f; + x.y = 0.0f; + vn1 = b.x; + vn2 = b.y; + + if (vn1 >= 0.0f && vn2 >= 0.0f ) + { + // Resubstitute for the incremental impulse + b2Vec2 d = x - a; + + // Apply incremental impulse + b2Vec2 P1 = d.x * normal; + b2Vec2 P2 = d.y * normal; + vA -= invMassA * (P1 + P2); + wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += invMassB * (P1 + P2); + wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + + // Accumulate + cp1->normalImpulse = x.x; + cp2->normalImpulse = x.y; + + break; + } + + // No solution, give up. This is hit sometimes, but it doesn't seem to matter. + break; + } + } + + bodyA->m_linearVelocity = vA; + bodyA->m_angularVelocity = wA; + bodyB->m_linearVelocity = vB; + bodyB->m_angularVelocity = wB; + } +} + +void b2ContactSolver::StoreImpulses() +{ + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2ContactConstraint* c = m_constraints + i; + b2Manifold* m = c->manifold; + + for (int32 j = 0; j < c->pointCount; ++j) + { + m->points[j].normalImpulse = c->points[j].normalImpulse; + m->points[j].tangentImpulse = c->points[j].tangentImpulse; + } + } +} + +struct b2PositionSolverManifold +{ + void Initialize(b2ContactConstraint* cc, int32 index) + { + b2Assert(cc->pointCount > 0); + + switch (cc->type) + { + case b2Manifold::e_circles: + { + b2Vec2 pointA = cc->bodyA->GetWorldPoint(cc->localPoint); + b2Vec2 pointB = cc->bodyB->GetWorldPoint(cc->points[0].localPoint); + if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) + { + normal = pointB - pointA; + normal.Normalize(); + } + else + { + normal.Set(1.0f, 0.0f); + } + + point = 0.5f * (pointA + pointB); + separation = b2Dot(pointB - pointA, normal) - cc->radius; + } + break; + + case b2Manifold::e_faceA: + { + normal = cc->bodyA->GetWorldVector(cc->localNormal); + b2Vec2 planePoint = cc->bodyA->GetWorldPoint(cc->localPoint); + + b2Vec2 clipPoint = cc->bodyB->GetWorldPoint(cc->points[index].localPoint); + separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + point = clipPoint; + } + break; + + case b2Manifold::e_faceB: + { + normal = cc->bodyB->GetWorldVector(cc->localNormal); + b2Vec2 planePoint = cc->bodyB->GetWorldPoint(cc->localPoint); + + b2Vec2 clipPoint = cc->bodyA->GetWorldPoint(cc->points[index].localPoint); + separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + point = clipPoint; + + // Ensure normal points from A to B + normal = -normal; + } + break; + } + } + + b2Vec2 normal; + b2Vec2 point; + float32 separation; +}; + +// Sequential solver. +bool b2ContactSolver::SolvePositionConstraints(float32 baumgarte) +{ + float32 minSeparation = 0.0f; + + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2ContactConstraint* c = m_constraints + i; + b2Body* bodyA = c->bodyA; + b2Body* bodyB = c->bodyB; + + float32 invMassA = bodyA->m_mass * bodyA->m_invMass; + float32 invIA = bodyA->m_mass * bodyA->m_invI; + float32 invMassB = bodyB->m_mass * bodyB->m_invMass; + float32 invIB = bodyB->m_mass * bodyB->m_invI; + + // Solve normal constraints + for (int32 j = 0; j < c->pointCount; ++j) + { + b2PositionSolverManifold psm; + psm.Initialize(c, j); + b2Vec2 normal = psm.normal; + + b2Vec2 point = psm.point; + float32 separation = psm.separation; + + b2Vec2 rA = point - bodyA->m_sweep.c; + b2Vec2 rB = point - bodyB->m_sweep.c; + + // Track max constraint error. + minSeparation = b2Min(minSeparation, separation); + + // Prevent large corrections and allow slop. + float32 C = b2Clamp(baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); + + // Compute the effective mass. + float32 rnA = b2Cross(rA, normal); + float32 rnB = b2Cross(rB, normal); + float32 K = invMassA + invMassB + invIA * rnA * rnA + invIB * rnB * rnB; + + // Compute normal impulse + float32 impulse = K > 0.0f ? - C / K : 0.0f; + + b2Vec2 P = impulse * normal; + + bodyA->m_sweep.c -= invMassA * P; + bodyA->m_sweep.a -= invIA * b2Cross(rA, P); + bodyA->SynchronizeTransform(); + + bodyB->m_sweep.c += invMassB * P; + bodyB->m_sweep.a += invIB * b2Cross(rB, P); + bodyB->SynchronizeTransform(); + } + } + + // We can't expect minSpeparation >= -b2_linearSlop because we don't + // push the separation above -b2_linearSlop. + return minSeparation >= -1.5f * b2_linearSlop; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2ContactSolver.h b/AndEngine/jni/Box2D/Dynamics/Contacts/b2ContactSolver.h new file mode 100644 index 0000000..d2dd782 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2ContactSolver.h @@ -0,0 +1,78 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_CONTACT_SOLVER_H +#define B2_CONTACT_SOLVER_H + +#include "Box2D/Common/b2Math.h" +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Dynamics/b2Island.h" + +class b2Contact; +class b2Body; +class b2StackAllocator; + +struct b2ContactConstraintPoint +{ + b2Vec2 localPoint; + b2Vec2 rA; + b2Vec2 rB; + float32 normalImpulse; + float32 tangentImpulse; + float32 normalMass; + float32 tangentMass; + float32 velocityBias; +}; + +struct b2ContactConstraint +{ + b2ContactConstraintPoint points[b2_maxManifoldPoints]; + b2Vec2 localNormal; + b2Vec2 localPoint; + b2Vec2 normal; + b2Mat22 normalMass; + b2Mat22 K; + b2Body* bodyA; + b2Body* bodyB; + b2Manifold::Type type; + float32 radius; + float32 friction; + int32 pointCount; + b2Manifold* manifold; +}; + +class b2ContactSolver +{ +public: + b2ContactSolver(b2Contact** contacts, int32 contactCount, + b2StackAllocator* allocator, float32 impulseRatio); + + ~b2ContactSolver(); + + void WarmStart(); + void SolveVelocityConstraints(); + void StoreImpulses(); + + bool SolvePositionConstraints(float32 baumgarte); + + b2StackAllocator* m_allocator; + b2ContactConstraint* m_constraints; + int m_constraintCount; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp b/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp new file mode 100644 index 0000000..e43b189 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h" +#include "Box2D/Common/b2BlockAllocator.h" +#include "Box2D/Collision/b2TimeOfImpact.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2WorldCallbacks.h" + +#include + +b2Contact* b2PolygonAndCircleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2PolygonAndCircleContact)); + return new (mem) b2PolygonAndCircleContact(fixtureA, fixtureB); +} + +void b2PolygonAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2PolygonAndCircleContact*)contact)->~b2PolygonAndCircleContact(); + allocator->Free(contact, sizeof(b2PolygonAndCircleContact)); +} + +b2PolygonAndCircleContact::b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) +: b2Contact(fixtureA, fixtureB) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); + b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); +} + +void b2PolygonAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2CollidePolygonAndCircle( manifold, + (b2PolygonShape*)m_fixtureA->GetShape(), xfA, + (b2CircleShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h b/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h new file mode 100644 index 0000000..26fac3a --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_POLYGON_AND_CIRCLE_CONTACT_H +#define B2_POLYGON_AND_CIRCLE_CONTACT_H + +#include "Box2D/Dynamics/Contacts/b2Contact.h" + +class b2BlockAllocator; + +class b2PolygonAndCircleContact : public b2Contact +{ +public: + static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2PolygonAndCircleContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonContact.cpp b/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonContact.cpp new file mode 100644 index 0000000..470d3cb --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonContact.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Contacts/b2PolygonContact.h" +#include "Box2D/Common/b2BlockAllocator.h" +#include "Box2D/Collision/b2TimeOfImpact.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2WorldCallbacks.h" + +#include + +b2Contact* b2PolygonContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2PolygonContact)); + return new (mem) b2PolygonContact(fixtureA, fixtureB); +} + +void b2PolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2PolygonContact*)contact)->~b2PolygonContact(); + allocator->Free(contact, sizeof(b2PolygonContact)); +} + +b2PolygonContact::b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB) + : b2Contact(fixtureA, fixtureB) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); + b2Assert(m_fixtureB->GetType() == b2Shape::e_polygon); +} + +void b2PolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2CollidePolygons( manifold, + (b2PolygonShape*)m_fixtureA->GetShape(), xfA, + (b2PolygonShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonContact.h b/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonContact.h new file mode 100644 index 0000000..672450a --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2PolygonContact.h @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_POLYGON_CONTACT_H +#define B2_POLYGON_CONTACT_H + +#include "Box2D/Dynamics/Contacts/b2Contact.h" + +class b2BlockAllocator; + +class b2PolygonContact : public b2Contact +{ +public: + static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2PolygonContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2TOISolver.cpp b/AndEngine/jni/Box2D/Dynamics/Contacts/b2TOISolver.cpp new file mode 100644 index 0000000..56e52ce --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2TOISolver.cpp @@ -0,0 +1,231 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Contacts/b2TOISolver.h" +#include "Box2D/Dynamics/Contacts/b2Contact.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Common/b2StackAllocator.h" + +struct b2TOIConstraint +{ + b2Vec2 localPoints[b2_maxManifoldPoints]; + b2Vec2 localNormal; + b2Vec2 localPoint; + b2Manifold::Type type; + float32 radius; + int32 pointCount; + b2Body* bodyA; + b2Body* bodyB; +}; + +b2TOISolver::b2TOISolver(b2StackAllocator* allocator) +{ + m_allocator = allocator; + m_constraints = NULL; + m_count = NULL; + m_toiBody = NULL; +} + +b2TOISolver::~b2TOISolver() +{ + Clear(); +} + +void b2TOISolver::Clear() +{ + if (m_allocator && m_constraints) + { + m_allocator->Free(m_constraints); + m_constraints = NULL; + } +} + +void b2TOISolver::Initialize(b2Contact** contacts, int32 count, b2Body* toiBody) +{ + Clear(); + + m_count = count; + m_toiBody = toiBody; + + m_constraints = (b2TOIConstraint*) m_allocator->Allocate(m_count * sizeof(b2TOIConstraint)); + + for (int32 i = 0; i < m_count; ++i) + { + b2Contact* contact = contacts[i]; + + b2Fixture* fixtureA = contact->GetFixtureA(); + b2Fixture* fixtureB = contact->GetFixtureB(); + b2Shape* shapeA = fixtureA->GetShape(); + b2Shape* shapeB = fixtureB->GetShape(); + float32 radiusA = shapeA->m_radius; + float32 radiusB = shapeB->m_radius; + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + b2Manifold* manifold = contact->GetManifold(); + + b2Assert(manifold->pointCount > 0); + + b2TOIConstraint* constraint = m_constraints + i; + constraint->bodyA = bodyA; + constraint->bodyB = bodyB; + constraint->localNormal = manifold->localNormal; + constraint->localPoint = manifold->localPoint; + constraint->type = manifold->type; + constraint->pointCount = manifold->pointCount; + constraint->radius = radiusA + radiusB; + + for (int32 j = 0; j < constraint->pointCount; ++j) + { + b2ManifoldPoint* cp = manifold->points + j; + constraint->localPoints[j] = cp->localPoint; + } + } +} + +struct b2TOISolverManifold +{ + void Initialize(b2TOIConstraint* cc, int32 index) + { + b2Assert(cc->pointCount > 0); + + switch (cc->type) + { + case b2Manifold::e_circles: + { + b2Vec2 pointA = cc->bodyA->GetWorldPoint(cc->localPoint); + b2Vec2 pointB = cc->bodyB->GetWorldPoint(cc->localPoints[0]); + if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) + { + normal = pointB - pointA; + normal.Normalize(); + } + else + { + normal.Set(1.0f, 0.0f); + } + + point = 0.5f * (pointA + pointB); + separation = b2Dot(pointB - pointA, normal) - cc->radius; + } + break; + + case b2Manifold::e_faceA: + { + normal = cc->bodyA->GetWorldVector(cc->localNormal); + b2Vec2 planePoint = cc->bodyA->GetWorldPoint(cc->localPoint); + + b2Vec2 clipPoint = cc->bodyB->GetWorldPoint(cc->localPoints[index]); + separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + point = clipPoint; + } + break; + + case b2Manifold::e_faceB: + { + normal = cc->bodyB->GetWorldVector(cc->localNormal); + b2Vec2 planePoint = cc->bodyB->GetWorldPoint(cc->localPoint); + + b2Vec2 clipPoint = cc->bodyA->GetWorldPoint(cc->localPoints[index]); + separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + point = clipPoint; + + // Ensure normal points from A to B + normal = -normal; + } + break; + } + } + + b2Vec2 normal; + b2Vec2 point; + float32 separation; +}; + +// Push out the toi body to provide clearance for further simulation. +bool b2TOISolver::Solve(float32 baumgarte) +{ + float32 minSeparation = 0.0f; + + for (int32 i = 0; i < m_count; ++i) + { + b2TOIConstraint* c = m_constraints + i; + b2Body* bodyA = c->bodyA; + b2Body* bodyB = c->bodyB; + + float32 massA = bodyA->m_mass; + float32 massB = bodyB->m_mass; + + // Only the TOI body should move. + if (bodyA == m_toiBody) + { + massB = 0.0f; + } + else + { + massA = 0.0f; + } + + float32 invMassA = massA * bodyA->m_invMass; + float32 invIA = massA * bodyA->m_invI; + float32 invMassB = massB * bodyB->m_invMass; + float32 invIB = massB * bodyB->m_invI; + + // Solve normal constraints + for (int32 j = 0; j < c->pointCount; ++j) + { + b2TOISolverManifold psm; + psm.Initialize(c, j); + b2Vec2 normal = psm.normal; + + b2Vec2 point = psm.point; + float32 separation = psm.separation; + + b2Vec2 rA = point - bodyA->m_sweep.c; + b2Vec2 rB = point - bodyB->m_sweep.c; + + // Track max constraint error. + minSeparation = b2Min(minSeparation, separation); + + // Prevent large corrections and allow slop. + float32 C = b2Clamp(baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); + + // Compute the effective mass. + float32 rnA = b2Cross(rA, normal); + float32 rnB = b2Cross(rB, normal); + float32 K = invMassA + invMassB + invIA * rnA * rnA + invIB * rnB * rnB; + + // Compute normal impulse + float32 impulse = K > 0.0f ? - C / K : 0.0f; + + b2Vec2 P = impulse * normal; + + bodyA->m_sweep.c -= invMassA * P; + bodyA->m_sweep.a -= invIA * b2Cross(rA, P); + bodyA->SynchronizeTransform(); + + bodyB->m_sweep.c += invMassB * P; + bodyB->m_sweep.a += invIB * b2Cross(rB, P); + bodyB->SynchronizeTransform(); + } + } + + // We can't expect minSpeparation >= -b2_linearSlop because we don't + // push the separation above -b2_linearSlop. + return minSeparation >= -1.5f * b2_linearSlop; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Contacts/b2TOISolver.h b/AndEngine/jni/Box2D/Dynamics/Contacts/b2TOISolver.h new file mode 100644 index 0000000..ec15ced --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Contacts/b2TOISolver.h @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_TOI_SOLVER_H +#define B2_TOI_SOLVER_H + +#include "Box2D/Common/b2Math.h" + +class b2Contact; +class b2Body; +struct b2TOIConstraint; +class b2StackAllocator; + +/// This is a pure position solver for a single movable body in contact with +/// multiple non-moving bodies. +class b2TOISolver +{ +public: + b2TOISolver(b2StackAllocator* allocator); + ~b2TOISolver(); + + void Initialize(b2Contact** contacts, int32 contactCount, b2Body* toiBody); + void Clear(); + + // Perform one solver iteration. Returns true if converged. + bool Solve(float32 baumgarte); + +private: + + b2TOIConstraint* m_constraints; + int32 m_count; + b2Body* m_toiBody; + b2StackAllocator* m_allocator; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2DistanceJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2DistanceJoint.cpp new file mode 100644 index 0000000..6d8b3f1 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2DistanceJoint.cpp @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2DistanceJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +// 1-D constrained system +// m (v2 - v1) = lambda +// v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. +// x2 = x1 + h * v2 + +// 1-D mass-damper-spring system +// m (v2 - v1) + h * d * v2 + h * k * + +// C = norm(p2 - p1) - L +// u = (p2 - p1) / norm(p2 - p1) +// Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) +// J = [-u -cross(r1, u) u cross(r2, u)] +// K = J * invM * JT +// = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 + +void b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2, + const b2Vec2& anchor1, const b2Vec2& anchor2) +{ + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor1); + localAnchorB = bodyB->GetLocalPoint(anchor2); + b2Vec2 d = anchor2 - anchor1; + length = d.Length(); +} + + +b2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def) +: b2Joint(def) +{ + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = def->localAnchorB; + m_length = def->length; + m_frequencyHz = def->frequencyHz; + m_dampingRatio = def->dampingRatio; + m_impulse = 0.0f; + m_gamma = 0.0f; + m_bias = 0.0f; +} + +void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + // Compute the effective mass matrix. + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + m_u = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + + // Handle singularity. + float32 length = m_u.Length(); + if (length > b2_linearSlop) + { + m_u *= 1.0f / length; + } + else + { + m_u.Set(0.0f, 0.0f); + } + + float32 cr1u = b2Cross(r1, m_u); + float32 cr2u = b2Cross(r2, m_u); + float32 invMass = b1->m_invMass + b1->m_invI * cr1u * cr1u + b2->m_invMass + b2->m_invI * cr2u * cr2u; + + m_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f; + + if (m_frequencyHz > 0.0f) + { + float32 C = length - m_length; + + // Frequency + float32 omega = 2.0f * b2_pi * m_frequencyHz; + + // Damping coefficient + float32 d = 2.0f * m_mass * m_dampingRatio * omega; + + // Spring stiffness + float32 k = m_mass * omega * omega; + + // magic formulas + m_gamma = step.dt * (d + step.dt * k); + m_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f; + m_bias = C * step.dt * k * m_gamma; + + m_mass = invMass + m_gamma; + m_mass = m_mass != 0.0f ? 1.0f / m_mass : 0.0f; + } + + if (step.warmStarting) + { + // Scale the impulse to support a variable time step. + m_impulse *= step.dtRatio; + + b2Vec2 P = m_impulse * m_u; + b1->m_linearVelocity -= b1->m_invMass * P; + b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); + b2->m_linearVelocity += b2->m_invMass * P; + b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); + } + else + { + m_impulse = 0.0f; + } +} + +void b2DistanceJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + B2_NOT_USED(step); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + // Cdot = dot(u, v + cross(w, r)) + b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); + b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); + float32 Cdot = b2Dot(m_u, v2 - v1); + + float32 impulse = -m_mass * (Cdot + m_bias + m_gamma * m_impulse); + m_impulse += impulse; + + b2Vec2 P = impulse * m_u; + b1->m_linearVelocity -= b1->m_invMass * P; + b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); + b2->m_linearVelocity += b2->m_invMass * P; + b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); +} + +bool b2DistanceJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + if (m_frequencyHz > 0.0f) + { + // There is no position correction for soft distance constraints. + return true; + } + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + + float32 length = d.Normalize(); + float32 C = length - m_length; + C = b2Clamp(C, -b2_maxLinearCorrection, b2_maxLinearCorrection); + + float32 impulse = -m_mass * C; + m_u = d; + b2Vec2 P = impulse * m_u; + + b1->m_sweep.c -= b1->m_invMass * P; + b1->m_sweep.a -= b1->m_invI * b2Cross(r1, P); + b2->m_sweep.c += b2->m_invMass * P; + b2->m_sweep.a += b2->m_invI * b2Cross(r2, P); + + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + + return b2Abs(C) < b2_linearSlop; +} + +b2Vec2 b2DistanceJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2DistanceJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +b2Vec2 b2DistanceJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 F = (inv_dt * m_impulse) * m_u; + return F; +} + +float32 b2DistanceJoint::GetReactionTorque(float32 inv_dt) const +{ + B2_NOT_USED(inv_dt); + return 0.0f; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2DistanceJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2DistanceJoint.h new file mode 100644 index 0000000..ee06655 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2DistanceJoint.h @@ -0,0 +1,140 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_DISTANCE_JOINT_H +#define B2_DISTANCE_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +/// Distance joint definition. This requires defining an +/// anchor point on both bodies and the non-zero length of the +/// distance joint. The definition uses local anchor points +/// so that the initial configuration can violate the constraint +/// slightly. This helps when saving and loading a game. +/// @warning Do not use a zero or short length. +struct b2DistanceJointDef : public b2JointDef +{ + b2DistanceJointDef() + { + type = e_distanceJoint; + localAnchorA.Set(0.0f, 0.0f); + localAnchorB.Set(0.0f, 0.0f); + length = 1.0f; + frequencyHz = 0.0f; + dampingRatio = 0.0f; + } + + /// Initialize the bodies, anchors, and length using the world + /// anchors. + void Initialize(b2Body* bodyA, b2Body* bodyB, + const b2Vec2& anchorA, const b2Vec2& anchorB); + + /// The local anchor point relative to body1's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to body2's origin. + b2Vec2 localAnchorB; + + /// The natural length between the anchor points. + float32 length; + + /// The mass-spring-damper frequency in Hertz. + float32 frequencyHz; + + /// The damping ratio. 0 = no damping, 1 = critical damping. + float32 dampingRatio; +}; + +/// A distance joint constrains two points on two bodies +/// to remain at a fixed distance from each other. You can view +/// this as a massless, rigid rod. +class b2DistanceJoint : public b2Joint +{ +public: + + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Set/get the natural length. + /// Manipulating the length can lead to non-physical behavior when the frequency is zero. + void SetLength(float32 length); + float32 GetLength() const; + + // Set/get frequency in Hz. + void SetFrequency(float32 hz); + float32 GetFrequency() const; + + // Set/get damping ratio. + void SetDampingRatio(float32 ratio); + float32 GetDampingRatio() const; + +protected: + + friend class b2Joint; + b2DistanceJoint(const b2DistanceJointDef* data); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchor1; + b2Vec2 m_localAnchor2; + b2Vec2 m_u; + float32 m_frequencyHz; + float32 m_dampingRatio; + float32 m_gamma; + float32 m_bias; + float32 m_impulse; + float32 m_mass; + float32 m_length; +}; + +inline void b2DistanceJoint::SetLength(float32 length) +{ + m_length = length; +} + +inline float32 b2DistanceJoint::GetLength() const +{ + return m_length; +} + +inline void b2DistanceJoint::SetFrequency(float32 hz) +{ + m_frequencyHz = hz; +} + +inline float32 b2DistanceJoint::GetFrequency() const +{ + return m_frequencyHz; +} + +inline void b2DistanceJoint::SetDampingRatio(float32 ratio) +{ + m_dampingRatio = ratio; +} + +inline float32 b2DistanceJoint::GetDampingRatio() const +{ + return m_dampingRatio; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2FrictionJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2FrictionJoint.cpp new file mode 100644 index 0000000..f387dc6 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2FrictionJoint.cpp @@ -0,0 +1,229 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2FrictionJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +// Point-to-point constraint +// Cdot = v2 - v1 +// = v2 + cross(w2, r2) - v1 - cross(w1, r1) +// J = [-I -r1_skew I r2_skew ] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +// Angle constraint +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// K = invI1 + invI2 + +void b2FrictionJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor) +{ + bodyA = bA; + bodyB = bB; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); +} + +b2FrictionJoint::b2FrictionJoint(const b2FrictionJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + + m_linearImpulse.SetZero(); + m_angularImpulse = 0.0f; + + m_maxForce = def->maxForce; + m_maxTorque = def->maxTorque; +} + +void b2FrictionJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + // Compute the effective mass matrix. + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + + float32 mA = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + b2Mat22 K1; + K1.col1.x = mA + mB; K1.col2.x = 0.0f; + K1.col1.y = 0.0f; K1.col2.y = mA + mB; + + b2Mat22 K2; + K2.col1.x = iA * rA.y * rA.y; K2.col2.x = -iA * rA.x * rA.y; + K2.col1.y = -iA * rA.x * rA.y; K2.col2.y = iA * rA.x * rA.x; + + b2Mat22 K3; + K3.col1.x = iB * rB.y * rB.y; K3.col2.x = -iB * rB.x * rB.y; + K3.col1.y = -iB * rB.x * rB.y; K3.col2.y = iB * rB.x * rB.x; + + b2Mat22 K = K1 + K2 + K3; + m_linearMass = K.GetInverse(); + + m_angularMass = iA + iB; + if (m_angularMass > 0.0f) + { + m_angularMass = 1.0f / m_angularMass; + } + + if (step.warmStarting) + { + // Scale impulses to support a variable time step. + m_linearImpulse *= step.dtRatio; + m_angularImpulse *= step.dtRatio; + + b2Vec2 P(m_linearImpulse.x, m_linearImpulse.y); + + bA->m_linearVelocity -= mA * P; + bA->m_angularVelocity -= iA * (b2Cross(rA, P) + m_angularImpulse); + + bB->m_linearVelocity += mB * P; + bB->m_angularVelocity += iB * (b2Cross(rB, P) + m_angularImpulse); + } + else + { + m_linearImpulse.SetZero(); + m_angularImpulse = 0.0f; + } +} + +void b2FrictionJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + B2_NOT_USED(step); + + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + b2Vec2 vA = bA->m_linearVelocity; + float32 wA = bA->m_angularVelocity; + b2Vec2 vB = bB->m_linearVelocity; + float32 wB = bB->m_angularVelocity; + + float32 mA = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + // Solve angular friction + { + float32 Cdot = wB - wA; + float32 impulse = -m_angularMass * Cdot; + + float32 oldImpulse = m_angularImpulse; + float32 maxImpulse = step.dt * m_maxTorque; + m_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_angularImpulse - oldImpulse; + + wA -= iA * impulse; + wB += iB * impulse; + } + + // Solve linear friction + { + b2Vec2 Cdot = vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA); + + b2Vec2 impulse = -b2Mul(m_linearMass, Cdot); + b2Vec2 oldImpulse = m_linearImpulse; + m_linearImpulse += impulse; + + float32 maxImpulse = step.dt * m_maxForce; + + if (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse) + { + m_linearImpulse.Normalize(); + m_linearImpulse *= maxImpulse; + } + + impulse = m_linearImpulse - oldImpulse; + + vA -= mA * impulse; + wA -= iA * b2Cross(rA, impulse); + + vB += mB * impulse; + wB += iB * b2Cross(rB, impulse); + } + + bA->m_linearVelocity = vA; + bA->m_angularVelocity = wA; + bB->m_linearVelocity = vB; + bB->m_angularVelocity = wB; +} + +bool b2FrictionJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + return true; +} + +b2Vec2 b2FrictionJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2FrictionJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2FrictionJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * m_linearImpulse; +} + +float32 b2FrictionJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_angularImpulse; +} + +void b2FrictionJoint::SetMaxForce(float32 force) +{ + b2Assert(b2IsValid(force) && force >= 0.0f); + m_maxForce = force; +} + +float32 b2FrictionJoint::GetMaxForce() const +{ + return m_maxForce; +} + +void b2FrictionJoint::SetMaxTorque(float32 torque) +{ + b2Assert(b2IsValid(torque) && torque >= 0.0f); + m_maxTorque = torque; +} + +float32 b2FrictionJoint::GetMaxTorque() const +{ + return m_maxTorque; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2FrictionJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2FrictionJoint.h new file mode 100644 index 0000000..f97f99c --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2FrictionJoint.h @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_FRICTION_JOINT_H +#define B2_FRICTION_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +/// Friction joint definition. +struct b2FrictionJointDef : public b2JointDef +{ + b2FrictionJointDef() + { + type = e_frictionJoint; + localAnchorA.SetZero(); + localAnchorB.SetZero(); + maxForce = 0.0f; + maxTorque = 0.0f; + } + + /// Initialize the bodies, anchors, axis, and reference angle using the world + /// anchor and world axis. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The maximum friction force in N. + float32 maxForce; + + /// The maximum friction torque in N-m. + float32 maxTorque; +}; + +/// Friction joint. This is used for top-down friction. +/// It provides 2D translational friction and angular friction. +class b2FrictionJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Set the maximum friction force in N. + void SetMaxForce(float32 force); + + /// Get the maximum friction force in N. + float32 GetMaxForce() const; + + /// Set the maximum friction torque in N*m. + void SetMaxTorque(float32 torque); + + /// Get the maximum friction torque in N*m. + float32 GetMaxTorque() const; + +protected: + + friend class b2Joint; + + b2FrictionJoint(const b2FrictionJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + + b2Mat22 m_linearMass; + float32 m_angularMass; + + b2Vec2 m_linearImpulse; + float32 m_angularImpulse; + + float32 m_maxForce; + float32 m_maxTorque; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2GearJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2GearJoint.cpp new file mode 100644 index 0000000..b396247 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2GearJoint.cpp @@ -0,0 +1,259 @@ +/* +* Copyright (c) 2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2GearJoint.h" +#include "Box2D/Dynamics/Joints/b2RevoluteJoint.h" +#include "Box2D/Dynamics/Joints/b2PrismaticJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +// Gear Joint: +// C0 = (coordinate1 + ratio * coordinate2)_initial +// C = C0 - (cordinate1 + ratio * coordinate2) = 0 +// Cdot = -(Cdot1 + ratio * Cdot2) +// J = -[J1 ratio * J2] +// K = J * invM * JT +// = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T +// +// Revolute: +// coordinate = rotation +// Cdot = angularVelocity +// J = [0 0 1] +// K = J * invM * JT = invI +// +// Prismatic: +// coordinate = dot(p - pg, ug) +// Cdot = dot(v + cross(w, r), ug) +// J = [ug cross(r, ug)] +// K = J * invM * JT = invMass + invI * cross(r, ug)^2 + +b2GearJoint::b2GearJoint(const b2GearJointDef* def) +: b2Joint(def) +{ + b2JointType type1 = def->joint1->GetType(); + b2JointType type2 = def->joint2->GetType(); + + b2Assert(type1 == e_revoluteJoint || type1 == e_prismaticJoint); + b2Assert(type2 == e_revoluteJoint || type2 == e_prismaticJoint); + b2Assert(def->joint1->GetBodyA()->GetType() == b2_staticBody); + b2Assert(def->joint2->GetBodyA()->GetType() == b2_staticBody); + + m_revolute1 = NULL; + m_prismatic1 = NULL; + m_revolute2 = NULL; + m_prismatic2 = NULL; + + float32 coordinate1, coordinate2; + + m_ground1 = def->joint1->GetBodyA(); + m_bodyA = def->joint1->GetBodyB(); + if (type1 == e_revoluteJoint) + { + m_revolute1 = (b2RevoluteJoint*)def->joint1; + m_groundAnchor1 = m_revolute1->m_localAnchor1; + m_localAnchor1 = m_revolute1->m_localAnchor2; + coordinate1 = m_revolute1->GetJointAngle(); + } + else + { + m_prismatic1 = (b2PrismaticJoint*)def->joint1; + m_groundAnchor1 = m_prismatic1->m_localAnchor1; + m_localAnchor1 = m_prismatic1->m_localAnchor2; + coordinate1 = m_prismatic1->GetJointTranslation(); + } + + m_ground2 = def->joint2->GetBodyA(); + m_bodyB = def->joint2->GetBodyB(); + if (type2 == e_revoluteJoint) + { + m_revolute2 = (b2RevoluteJoint*)def->joint2; + m_groundAnchor2 = m_revolute2->m_localAnchor1; + m_localAnchor2 = m_revolute2->m_localAnchor2; + coordinate2 = m_revolute2->GetJointAngle(); + } + else + { + m_prismatic2 = (b2PrismaticJoint*)def->joint2; + m_groundAnchor2 = m_prismatic2->m_localAnchor1; + m_localAnchor2 = m_prismatic2->m_localAnchor2; + coordinate2 = m_prismatic2->GetJointTranslation(); + } + + m_ratio = def->ratio; + + m_constant = coordinate1 + m_ratio * coordinate2; + + m_impulse = 0.0f; +} + +void b2GearJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* g1 = m_ground1; + b2Body* g2 = m_ground2; + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + float32 K = 0.0f; + m_J.SetZero(); + + if (m_revolute1) + { + m_J.angularA = -1.0f; + K += b1->m_invI; + } + else + { + b2Vec2 ug = b2Mul(g1->GetTransform().R, m_prismatic1->m_localXAxis1); + b2Vec2 r = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + float32 crug = b2Cross(r, ug); + m_J.linearA = -ug; + m_J.angularA = -crug; + K += b1->m_invMass + b1->m_invI * crug * crug; + } + + if (m_revolute2) + { + m_J.angularB = -m_ratio; + K += m_ratio * m_ratio * b2->m_invI; + } + else + { + b2Vec2 ug = b2Mul(g2->GetTransform().R, m_prismatic2->m_localXAxis1); + b2Vec2 r = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + float32 crug = b2Cross(r, ug); + m_J.linearB = -m_ratio * ug; + m_J.angularB = -m_ratio * crug; + K += m_ratio * m_ratio * (b2->m_invMass + b2->m_invI * crug * crug); + } + + // Compute effective mass. + m_mass = K > 0.0f ? 1.0f / K : 0.0f; + + if (step.warmStarting) + { + // Warm starting. + b1->m_linearVelocity += b1->m_invMass * m_impulse * m_J.linearA; + b1->m_angularVelocity += b1->m_invI * m_impulse * m_J.angularA; + b2->m_linearVelocity += b2->m_invMass * m_impulse * m_J.linearB; + b2->m_angularVelocity += b2->m_invI * m_impulse * m_J.angularB; + } + else + { + m_impulse = 0.0f; + } +} + +void b2GearJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + B2_NOT_USED(step); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + float32 Cdot = m_J.Compute( b1->m_linearVelocity, b1->m_angularVelocity, + b2->m_linearVelocity, b2->m_angularVelocity); + + float32 impulse = m_mass * (-Cdot); + m_impulse += impulse; + + b1->m_linearVelocity += b1->m_invMass * impulse * m_J.linearA; + b1->m_angularVelocity += b1->m_invI * impulse * m_J.angularA; + b2->m_linearVelocity += b2->m_invMass * impulse * m_J.linearB; + b2->m_angularVelocity += b2->m_invI * impulse * m_J.angularB; +} + +bool b2GearJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + float32 linearError = 0.0f; + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + float32 coordinate1, coordinate2; + if (m_revolute1) + { + coordinate1 = m_revolute1->GetJointAngle(); + } + else + { + coordinate1 = m_prismatic1->GetJointTranslation(); + } + + if (m_revolute2) + { + coordinate2 = m_revolute2->GetJointAngle(); + } + else + { + coordinate2 = m_prismatic2->GetJointTranslation(); + } + + float32 C = m_constant - (coordinate1 + m_ratio * coordinate2); + + float32 impulse = m_mass * (-C); + + b1->m_sweep.c += b1->m_invMass * impulse * m_J.linearA; + b1->m_sweep.a += b1->m_invI * impulse * m_J.angularA; + b2->m_sweep.c += b2->m_invMass * impulse * m_J.linearB; + b2->m_sweep.a += b2->m_invI * impulse * m_J.angularB; + + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + + // TODO_ERIN not implemented + return linearError < b2_linearSlop; +} + +b2Vec2 b2GearJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2GearJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +b2Vec2 b2GearJoint::GetReactionForce(float32 inv_dt) const +{ + // TODO_ERIN not tested + b2Vec2 P = m_impulse * m_J.linearB; + return inv_dt * P; +} + +float32 b2GearJoint::GetReactionTorque(float32 inv_dt) const +{ + // TODO_ERIN not tested + b2Vec2 r = b2Mul(m_bodyB->GetTransform().R, m_localAnchor2 - m_bodyB->GetLocalCenter()); + b2Vec2 P = m_impulse * m_J.linearB; + float32 L = m_impulse * m_J.angularB - b2Cross(r, P); + return inv_dt * L; +} + +void b2GearJoint::SetRatio(float32 ratio) +{ + b2Assert(b2IsValid(ratio)); + m_ratio = ratio; +} + +float32 b2GearJoint::GetRatio() const +{ + return m_ratio; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2GearJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2GearJoint.h new file mode 100644 index 0000000..4978088 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2GearJoint.h @@ -0,0 +1,111 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_GEAR_JOINT_H +#define B2_GEAR_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +class b2RevoluteJoint; +class b2PrismaticJoint; + +/// Gear joint definition. This definition requires two existing +/// revolute or prismatic joints (any combination will work). +/// The provided joints must attach a dynamic body to a static body. +struct b2GearJointDef : public b2JointDef +{ + b2GearJointDef() + { + type = e_gearJoint; + joint1 = NULL; + joint2 = NULL; + ratio = 1.0f; + } + + /// The first revolute/prismatic joint attached to the gear joint. + b2Joint* joint1; + + /// The second revolute/prismatic joint attached to the gear joint. + b2Joint* joint2; + + /// The gear ratio. + /// @see b2GearJoint for explanation. + float32 ratio; +}; + +/// A gear joint is used to connect two joints together. Either joint +/// can be a revolute or prismatic joint. You specify a gear ratio +/// to bind the motions together: +/// coordinate1 + ratio * coordinate2 = constant +/// The ratio can be negative or positive. If one joint is a revolute joint +/// and the other joint is a prismatic joint, then the ratio will have units +/// of length or units of 1/length. +/// @warning The revolute and prismatic joints must be attached to +/// fixed bodies (which must be body1 on those joints). +class b2GearJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Set/Get the gear ratio. + void SetRatio(float32 ratio); + float32 GetRatio() const; + +protected: + + friend class b2Joint; + b2GearJoint(const b2GearJointDef* data); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte); + + b2Body* m_ground1; + b2Body* m_ground2; + + // One of these is NULL. + b2RevoluteJoint* m_revolute1; + b2PrismaticJoint* m_prismatic1; + + // One of these is NULL. + b2RevoluteJoint* m_revolute2; + b2PrismaticJoint* m_prismatic2; + + b2Vec2 m_groundAnchor1; + b2Vec2 m_groundAnchor2; + + b2Vec2 m_localAnchor1; + b2Vec2 m_localAnchor2; + + b2Jacobian m_J; + + float32 m_constant; + float32 m_ratio; + + // Effective mass + float32 m_mass; + + // Impulse for accumulation/warm starting. + float32 m_impulse; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.cpp new file mode 100644 index 0000000..2429667 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.cpp @@ -0,0 +1,186 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2Joint.h" +#include "Box2D/Dynamics/Joints/b2DistanceJoint.h" +#include "Box2D/Dynamics/Joints/b2LineJoint.h" +#include "Box2D/Dynamics/Joints/b2MouseJoint.h" +#include "Box2D/Dynamics/Joints/b2RevoluteJoint.h" +#include "Box2D/Dynamics/Joints/b2PrismaticJoint.h" +#include "Box2D/Dynamics/Joints/b2PulleyJoint.h" +#include "Box2D/Dynamics/Joints/b2GearJoint.h" +#include "Box2D/Dynamics/Joints/b2WeldJoint.h" +#include "Box2D/Dynamics/Joints/b2FrictionJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2World.h" +#include "Box2D/Common/b2BlockAllocator.h" + +#include + +b2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator) +{ + b2Joint* joint = NULL; + + switch (def->type) + { + case e_distanceJoint: + { + void* mem = allocator->Allocate(sizeof(b2DistanceJoint)); + joint = new (mem) b2DistanceJoint((b2DistanceJointDef*)def); + } + break; + + case e_mouseJoint: + { + void* mem = allocator->Allocate(sizeof(b2MouseJoint)); + joint = new (mem) b2MouseJoint((b2MouseJointDef*)def); + } + break; + + case e_prismaticJoint: + { + void* mem = allocator->Allocate(sizeof(b2PrismaticJoint)); + joint = new (mem) b2PrismaticJoint((b2PrismaticJointDef*)def); + } + break; + + case e_revoluteJoint: + { + void* mem = allocator->Allocate(sizeof(b2RevoluteJoint)); + joint = new (mem) b2RevoluteJoint((b2RevoluteJointDef*)def); + } + break; + + case e_pulleyJoint: + { + void* mem = allocator->Allocate(sizeof(b2PulleyJoint)); + joint = new (mem) b2PulleyJoint((b2PulleyJointDef*)def); + } + break; + + case e_gearJoint: + { + void* mem = allocator->Allocate(sizeof(b2GearJoint)); + joint = new (mem) b2GearJoint((b2GearJointDef*)def); + } + break; + + case e_lineJoint: + { + void* mem = allocator->Allocate(sizeof(b2LineJoint)); + joint = new (mem) b2LineJoint((b2LineJointDef*)def); + } + break; + + case e_weldJoint: + { + void* mem = allocator->Allocate(sizeof(b2WeldJoint)); + joint = new (mem) b2WeldJoint((b2WeldJointDef*)def); + } + break; + + case e_frictionJoint: + { + void* mem = allocator->Allocate(sizeof(b2FrictionJoint)); + joint = new (mem) b2FrictionJoint((b2FrictionJointDef*)def); + } + break; + + default: + b2Assert(false); + break; + } + + return joint; +} + +void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) +{ + joint->~b2Joint(); + switch (joint->m_type) + { + case e_distanceJoint: + allocator->Free(joint, sizeof(b2DistanceJoint)); + break; + + case e_mouseJoint: + allocator->Free(joint, sizeof(b2MouseJoint)); + break; + + case e_prismaticJoint: + allocator->Free(joint, sizeof(b2PrismaticJoint)); + break; + + case e_revoluteJoint: + allocator->Free(joint, sizeof(b2RevoluteJoint)); + break; + + case e_pulleyJoint: + allocator->Free(joint, sizeof(b2PulleyJoint)); + break; + + case e_gearJoint: + allocator->Free(joint, sizeof(b2GearJoint)); + break; + + case e_lineJoint: + allocator->Free(joint, sizeof(b2LineJoint)); + break; + + case e_weldJoint: + allocator->Free(joint, sizeof(b2WeldJoint)); + break; + + case e_frictionJoint: + allocator->Free(joint, sizeof(b2FrictionJoint)); + break; + + default: + b2Assert(false); + break; + } +} + +b2Joint::b2Joint(const b2JointDef* def) +{ + b2Assert(def->bodyA != def->bodyB); + + m_type = def->type; + m_prev = NULL; + m_next = NULL; + m_bodyA = def->bodyA; + m_bodyB = def->bodyB; + m_collideConnected = def->collideConnected; + m_islandFlag = false; + m_userData = def->userData; + + m_edgeA.joint = NULL; + m_edgeA.other = NULL; + m_edgeA.prev = NULL; + m_edgeA.next = NULL; + + m_edgeB.joint = NULL; + m_edgeB.other = NULL; + m_edgeB.prev = NULL; + m_edgeB.next = NULL; +} + +bool b2Joint::IsActive() const +{ + return m_bodyA->IsActive() && m_bodyB->IsActive(); +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.h new file mode 100644 index 0000000..eb8d075 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2Joint.h @@ -0,0 +1,226 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_JOINT_H +#define B2_JOINT_H + +#include "Box2D/Common/b2Math.h" + +class b2Body; +class b2Joint; +struct b2TimeStep; +class b2BlockAllocator; + +enum b2JointType +{ + e_unknownJoint, + e_revoluteJoint, + e_prismaticJoint, + e_distanceJoint, + e_pulleyJoint, + e_mouseJoint, + e_gearJoint, + e_lineJoint, + e_weldJoint, + e_frictionJoint, +}; + +enum b2LimitState +{ + e_inactiveLimit, + e_atLowerLimit, + e_atUpperLimit, + e_equalLimits +}; + +struct b2Jacobian +{ + b2Vec2 linearA; + float32 angularA; + b2Vec2 linearB; + float32 angularB; + + void SetZero(); + void Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); + float32 Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); +}; + +/// A joint edge is used to connect bodies and joints together +/// in a joint graph where each body is a node and each joint +/// is an edge. A joint edge belongs to a doubly linked list +/// maintained in each attached body. Each joint has two joint +/// nodes, one for each attached body. +struct b2JointEdge +{ + b2Body* other; ///< provides quick access to the other body attached. + b2Joint* joint; ///< the joint + b2JointEdge* prev; ///< the previous joint edge in the body's joint list + b2JointEdge* next; ///< the next joint edge in the body's joint list +}; + +/// Joint definitions are used to construct joints. +struct b2JointDef +{ + b2JointDef() + { + type = e_unknownJoint; + userData = NULL; + bodyA = NULL; + bodyB = NULL; + collideConnected = false; + } + + /// The joint type is set automatically for concrete joint types. + b2JointType type; + + /// Use this to attach application specific data to your joints. + void* userData; + + /// The first attached body. + b2Body* bodyA; + + /// The second attached body. + b2Body* bodyB; + + /// Set this flag to true if the attached bodies should collide. + bool collideConnected; +}; + +/// The base joint class. Joints are used to constraint two bodies together in +/// various fashions. Some joints also feature limits and motors. +class b2Joint +{ +public: + + /// Get the type of the concrete joint. + b2JointType GetType() const; + + /// Get the first body attached to this joint. + b2Body* GetBodyA(); + + /// Get the second body attached to this joint. + b2Body* GetBodyB(); + + /// Get the anchor point on bodyA in world coordinates. + virtual b2Vec2 GetAnchorA() const = 0; + + /// Get the anchor point on bodyB in world coordinates. + virtual b2Vec2 GetAnchorB() const = 0; + + /// Get the reaction force on body2 at the joint anchor in Newtons. + virtual b2Vec2 GetReactionForce(float32 inv_dt) const = 0; + + /// Get the reaction torque on body2 in N*m. + virtual float32 GetReactionTorque(float32 inv_dt) const = 0; + + /// Get the next joint the world joint list. + b2Joint* GetNext(); + + /// Get the user data pointer. + void* GetUserData() const; + + /// Set the user data pointer. + void SetUserData(void* data); + + /// Short-cut function to determine if either body is inactive. + bool IsActive() const; + +protected: + friend class b2World; + friend class b2Body; + friend class b2Island; + + static b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator); + static void Destroy(b2Joint* joint, b2BlockAllocator* allocator); + + b2Joint(const b2JointDef* def); + virtual ~b2Joint() {} + + virtual void InitVelocityConstraints(const b2TimeStep& step) = 0; + virtual void SolveVelocityConstraints(const b2TimeStep& step) = 0; + + // This returns true if the position errors are within tolerance. + virtual bool SolvePositionConstraints(float32 baumgarte) = 0; + + b2JointType m_type; + b2Joint* m_prev; + b2Joint* m_next; + b2JointEdge m_edgeA; + b2JointEdge m_edgeB; + b2Body* m_bodyA; + b2Body* m_bodyB; + + bool m_islandFlag; + bool m_collideConnected; + + void* m_userData; + + // Cache here per time step to reduce cache misses. + b2Vec2 m_localCenterA, m_localCenterB; + float32 m_invMassA, m_invIA; + float32 m_invMassB, m_invIB; +}; + +inline void b2Jacobian::SetZero() +{ + linearA.SetZero(); angularA = 0.0f; + linearB.SetZero(); angularB = 0.0f; +} + +inline void b2Jacobian::Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) +{ + linearA = x1; angularA = a1; + linearB = x2; angularB = a2; +} + +inline float32 b2Jacobian::Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) +{ + return b2Dot(linearA, x1) + angularA * a1 + b2Dot(linearB, x2) + angularB * a2; +} + +inline b2JointType b2Joint::GetType() const +{ + return m_type; +} + +inline b2Body* b2Joint::GetBodyA() +{ + return m_bodyA; +} + +inline b2Body* b2Joint::GetBodyB() +{ + return m_bodyB; +} + +inline b2Joint* b2Joint::GetNext() +{ + return m_next; +} + +inline void* b2Joint::GetUserData() const +{ + return m_userData; +} + +inline void b2Joint::SetUserData(void* data) +{ + m_userData = data; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2LineJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2LineJoint.cpp new file mode 100644 index 0000000..ed39fce --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2LineJoint.cpp @@ -0,0 +1,591 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2LineJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +// Linear constraint (point-to-line) +// d = p2 - p1 = x2 + r2 - x1 - r1 +// C = dot(perp, d) +// Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - cross(w1, r1)) +// = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + dot(cross(r2, perp), v2) +// J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] +// +// K = J * invM * JT +// +// J = [-a -s1 a s2] +// a = perp +// s1 = cross(d + r1, a) = cross(p2 - x1, a) +// s2 = cross(r2, a) = cross(p2 - x2, a) + + +// Motor/Limit linear constraint +// C = dot(ax1, d) +// Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + dot(cross(r2, ax1), v2) +// J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] + +// Block Solver +// We develop a block solver that includes the joint limit. This makes the limit stiff (inelastic) even +// when the mass has poor distribution (leading to large torques about the joint anchor points). +// +// The Jacobian has 3 rows: +// J = [-uT -s1 uT s2] // linear +// [-vT -a1 vT a2] // limit +// +// u = perp +// v = axis +// s1 = cross(d + r1, u), s2 = cross(r2, u) +// a1 = cross(d + r1, v), a2 = cross(r2, v) + +// M * (v2 - v1) = JT * df +// J * v2 = bias +// +// v2 = v1 + invM * JT * df +// J * (v1 + invM * JT * df) = bias +// K * df = bias - J * v1 = -Cdot +// K = J * invM * JT +// Cdot = J * v1 - bias +// +// Now solve for f2. +// df = f2 - f1 +// K * (f2 - f1) = -Cdot +// f2 = invK * (-Cdot) + f1 +// +// Clamp accumulated limit impulse. +// lower: f2(2) = max(f2(2), 0) +// upper: f2(2) = min(f2(2), 0) +// +// Solve for correct f2(1) +// K(1,1) * f2(1) = -Cdot(1) - K(1,2) * f2(2) + K(1,1:2) * f1 +// = -Cdot(1) - K(1,2) * f2(2) + K(1,1) * f1(1) + K(1,2) * f1(2) +// K(1,1) * f2(1) = -Cdot(1) - K(1,2) * (f2(2) - f1(2)) + K(1,1) * f1(1) +// f2(1) = invK(1,1) * (-Cdot(1) - K(1,2) * (f2(2) - f1(2))) + f1(1) +// +// Now compute impulse to be applied: +// df = f2 - f1 + +void b2LineJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) +{ + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + localAxisA = bodyA->GetLocalVector(axis); +} + +b2LineJoint::b2LineJoint(const b2LineJointDef* def) +: b2Joint(def) +{ + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = def->localAnchorB; + m_localXAxis1 = def->localAxisA; + m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); + + m_impulse.SetZero(); + m_motorMass = 0.0; + m_motorImpulse = 0.0f; + + m_lowerTranslation = def->lowerTranslation; + m_upperTranslation = def->upperTranslation; + m_maxMotorForce = def->maxMotorForce; + m_motorSpeed = def->motorSpeed; + m_enableLimit = def->enableLimit; + m_enableMotor = def->enableMotor; + m_limitState = e_inactiveLimit; + + m_axis.SetZero(); + m_perp.SetZero(); +} + +void b2LineJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + m_localCenterA = b1->GetLocalCenter(); + m_localCenterB = b2->GetLocalCenter(); + + b2Transform xf1 = b1->GetTransform(); + b2Transform xf2 = b2->GetTransform(); + + // Compute the effective masses. + b2Vec2 r1 = b2Mul(xf1.R, m_localAnchor1 - m_localCenterA); + b2Vec2 r2 = b2Mul(xf2.R, m_localAnchor2 - m_localCenterB); + b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + + m_invMassA = b1->m_invMass; + m_invIA = b1->m_invI; + m_invMassB = b2->m_invMass; + m_invIB = b2->m_invI; + + // Compute motor Jacobian and effective mass. + { + m_axis = b2Mul(xf1.R, m_localXAxis1); + m_a1 = b2Cross(d + r1, m_axis); + m_a2 = b2Cross(r2, m_axis); + + m_motorMass = m_invMassA + m_invMassB + m_invIA * m_a1 * m_a1 + m_invIB * m_a2 * m_a2; + if (m_motorMass > b2_epsilon) + { + m_motorMass = 1.0f / m_motorMass; + } + else + { + m_motorMass = 0.0f; + } + } + + // Prismatic constraint. + { + m_perp = b2Mul(xf1.R, m_localYAxis1); + + m_s1 = b2Cross(d + r1, m_perp); + m_s2 = b2Cross(r2, m_perp); + + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; + float32 k22 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; + + m_K.col1.Set(k11, k12); + m_K.col2.Set(k12, k22); + } + + // Compute motor and limit terms. + if (m_enableLimit) + { + float32 jointTranslation = b2Dot(m_axis, d); + if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) + { + m_limitState = e_equalLimits; + } + else if (jointTranslation <= m_lowerTranslation) + { + if (m_limitState != e_atLowerLimit) + { + m_limitState = e_atLowerLimit; + m_impulse.y = 0.0f; + } + } + else if (jointTranslation >= m_upperTranslation) + { + if (m_limitState != e_atUpperLimit) + { + m_limitState = e_atUpperLimit; + m_impulse.y = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + m_impulse.y = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + } + + if (m_enableMotor == false) + { + m_motorImpulse = 0.0f; + } + + if (step.warmStarting) + { + // Account for variable time step. + m_impulse *= step.dtRatio; + m_motorImpulse *= step.dtRatio; + + b2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.y) * m_axis; + float32 L1 = m_impulse.x * m_s1 + (m_motorImpulse + m_impulse.y) * m_a1; + float32 L2 = m_impulse.x * m_s2 + (m_motorImpulse + m_impulse.y) * m_a2; + + b1->m_linearVelocity -= m_invMassA * P; + b1->m_angularVelocity -= m_invIA * L1; + + b2->m_linearVelocity += m_invMassB * P; + b2->m_angularVelocity += m_invIB * L2; + } + else + { + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + } +} + +void b2LineJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 v1 = b1->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w2 = b2->m_angularVelocity; + + // Solve linear motor constraint. + if (m_enableMotor && m_limitState != e_equalLimits) + { + float32 Cdot = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; + float32 impulse = m_motorMass * (m_motorSpeed - Cdot); + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = step.dt * m_maxMotorForce; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + b2Vec2 P = impulse * m_axis; + float32 L1 = impulse * m_a1; + float32 L2 = impulse * m_a2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + + float32 Cdot1 = b2Dot(m_perp, v2 - v1) + m_s2 * w2 - m_s1 * w1; + + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + // Solve prismatic and limit constraint in block form. + float32 Cdot2 = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; + b2Vec2 Cdot(Cdot1, Cdot2); + + b2Vec2 f1 = m_impulse; + b2Vec2 df = m_K.Solve(-Cdot); + m_impulse += df; + + if (m_limitState == e_atLowerLimit) + { + m_impulse.y = b2Max(m_impulse.y, 0.0f); + } + else if (m_limitState == e_atUpperLimit) + { + m_impulse.y = b2Min(m_impulse.y, 0.0f); + } + + // f2(1) = invK(1,1) * (-Cdot(1) - K(1,2) * (f2(2) - f1(2))) + f1(1) + float32 b = -Cdot1 - (m_impulse.y - f1.y) * m_K.col2.x; + float32 f2r; + if (m_K.col1.x != 0.0f) + { + f2r = b / m_K.col1.x + f1.x; + } + else + { + f2r = f1.x; + } + + m_impulse.x = f2r; + + df = m_impulse - f1; + + b2Vec2 P = df.x * m_perp + df.y * m_axis; + float32 L1 = df.x * m_s1 + df.y * m_a1; + float32 L2 = df.x * m_s2 + df.y * m_a2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + else + { + // Limit is inactive, just solve the prismatic constraint in block form. + float32 df; + if (m_K.col1.x != 0.0f) + { + df = - Cdot1 / m_K.col1.x; + } + else + { + df = 0.0f; + } + m_impulse.x += df; + + b2Vec2 P = df * m_perp; + float32 L1 = df * m_s1; + float32 L2 = df * m_s2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + + b1->m_linearVelocity = v1; + b1->m_angularVelocity = w1; + b2->m_linearVelocity = v2; + b2->m_angularVelocity = w2; +} + +bool b2LineJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 c1 = b1->m_sweep.c; + float32 a1 = b1->m_sweep.a; + + b2Vec2 c2 = b2->m_sweep.c; + float32 a2 = b2->m_sweep.a; + + // Solve linear limit constraint. + float32 linearError = 0.0f, angularError = 0.0f; + bool active = false; + float32 C2 = 0.0f; + + b2Mat22 R1(a1), R2(a2); + + b2Vec2 r1 = b2Mul(R1, m_localAnchor1 - m_localCenterA); + b2Vec2 r2 = b2Mul(R2, m_localAnchor2 - m_localCenterB); + b2Vec2 d = c2 + r2 - c1 - r1; + + if (m_enableLimit) + { + m_axis = b2Mul(R1, m_localXAxis1); + + m_a1 = b2Cross(d + r1, m_axis); + m_a2 = b2Cross(r2, m_axis); + + float32 translation = b2Dot(m_axis, d); + if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) + { + // Prevent large angular corrections + C2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); + linearError = b2Abs(translation); + active = true; + } + else if (translation <= m_lowerTranslation) + { + // Prevent large linear corrections and allow some slop. + C2 = b2Clamp(translation - m_lowerTranslation + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); + linearError = m_lowerTranslation - translation; + active = true; + } + else if (translation >= m_upperTranslation) + { + // Prevent large linear corrections and allow some slop. + C2 = b2Clamp(translation - m_upperTranslation - b2_linearSlop, 0.0f, b2_maxLinearCorrection); + linearError = translation - m_upperTranslation; + active = true; + } + } + + m_perp = b2Mul(R1, m_localYAxis1); + + m_s1 = b2Cross(d + r1, m_perp); + m_s2 = b2Cross(r2, m_perp); + + b2Vec2 impulse; + float32 C1; + C1 = b2Dot(m_perp, d); + + linearError = b2Max(linearError, b2Abs(C1)); + angularError = 0.0f; + + if (active) + { + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; + float32 k22 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; + + m_K.col1.Set(k11, k12); + m_K.col2.Set(k12, k22); + + b2Vec2 C; + C.x = C1; + C.y = C2; + + impulse = m_K.Solve(-C); + } + else + { + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + + float32 impulse1; + if (k11 != 0.0f) + { + impulse1 = - C1 / k11; + } + else + { + impulse1 = 0.0f; + } + + impulse.x = impulse1; + impulse.y = 0.0f; + } + + b2Vec2 P = impulse.x * m_perp + impulse.y * m_axis; + float32 L1 = impulse.x * m_s1 + impulse.y * m_a1; + float32 L2 = impulse.x * m_s2 + impulse.y * m_a2; + + c1 -= m_invMassA * P; + a1 -= m_invIA * L1; + c2 += m_invMassB * P; + a2 += m_invIB * L2; + + // TODO_ERIN remove need for this. + b1->m_sweep.c = c1; + b1->m_sweep.a = a1; + b2->m_sweep.c = c2; + b2->m_sweep.a = a2; + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + + return linearError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2LineJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2LineJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +b2Vec2 b2LineJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_impulse.y) * m_axis); +} + +float32 b2LineJoint::GetReactionTorque(float32 inv_dt) const +{ + B2_NOT_USED(inv_dt); + return 0.0f; +} + +float32 b2LineJoint::GetJointTranslation() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); + b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); + b2Vec2 d = p2 - p1; + b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + + float32 translation = b2Dot(d, axis); + return translation; +} + +float32 b2LineJoint::GetJointSpeed() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 p1 = b1->m_sweep.c + r1; + b2Vec2 p2 = b2->m_sweep.c + r2; + b2Vec2 d = p2 - p1; + b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + + b2Vec2 v1 = b1->m_linearVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + float32 w2 = b2->m_angularVelocity; + + float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); + return speed; +} + +bool b2LineJoint::IsLimitEnabled() const +{ + return m_enableLimit; +} + +void b2LineJoint::EnableLimit(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableLimit = flag; +} + +float32 b2LineJoint::GetLowerLimit() const +{ + return m_lowerTranslation; +} + +float32 b2LineJoint::GetUpperLimit() const +{ + return m_upperTranslation; +} + +void b2LineJoint::SetLimits(float32 lower, float32 upper) +{ + b2Assert(lower <= upper); + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_lowerTranslation = lower; + m_upperTranslation = upper; +} + +bool b2LineJoint::IsMotorEnabled() const +{ + return m_enableMotor; +} + +void b2LineJoint::EnableMotor(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableMotor = flag; +} + +void b2LineJoint::SetMotorSpeed(float32 speed) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_motorSpeed = speed; +} + +void b2LineJoint::SetMaxMotorForce(float32 force) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_maxMotorForce = force; +} + +float32 b2LineJoint::GetMotorForce() const +{ + return m_motorImpulse; +} + + + + + diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2LineJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2LineJoint.h new file mode 100644 index 0000000..b44892a --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2LineJoint.h @@ -0,0 +1,170 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_LINE_JOINT_H +#define B2_LINE_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +/// Line joint definition. This requires defining a line of +/// motion using an axis and an anchor point. The definition uses local +/// anchor points and a local axis so that the initial configuration +/// can violate the constraint slightly. The joint translation is zero +/// when the local anchor points coincide in world space. Using local +/// anchors and a local axis helps when saving and loading a game. +struct b2LineJointDef : public b2JointDef +{ + b2LineJointDef() + { + type = e_lineJoint; + localAnchorA.SetZero(); + localAnchorB.SetZero(); + localAxisA.Set(1.0f, 0.0f); + enableLimit = false; + lowerTranslation = 0.0f; + upperTranslation = 0.0f; + enableMotor = false; + maxMotorForce = 0.0f; + motorSpeed = 0.0f; + } + + /// Initialize the bodies, anchors, axis, and reference angle using the world + /// anchor and world axis. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); + + /// The local anchor point relative to body1's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to body2's origin. + b2Vec2 localAnchorB; + + /// The local translation axis in body1. + b2Vec2 localAxisA; + + /// Enable/disable the joint limit. + bool enableLimit; + + /// The lower translation limit, usually in meters. + float32 lowerTranslation; + + /// The upper translation limit, usually in meters. + float32 upperTranslation; + + /// Enable/disable the joint motor. + bool enableMotor; + + /// The maximum motor torque, usually in N-m. + float32 maxMotorForce; + + /// The desired motor speed in radians per second. + float32 motorSpeed; +}; + +/// A line joint. This joint provides two degrees of freedom: translation +/// along an axis fixed in body1 and rotation in the plane. You can use a +/// joint limit to restrict the range of motion and a joint motor to drive +/// the motion or to model joint friction. +class b2LineJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Get the current joint translation, usually in meters. + float32 GetJointTranslation() const; + + /// Get the current joint translation speed, usually in meters per second. + float32 GetJointSpeed() const; + + /// Is the joint limit enabled? + bool IsLimitEnabled() const; + + /// Enable/disable the joint limit. + void EnableLimit(bool flag); + + /// Get the lower joint limit, usually in meters. + float32 GetLowerLimit() const; + + /// Get the upper joint limit, usually in meters. + float32 GetUpperLimit() const; + + /// Set the joint limits, usually in meters. + void SetLimits(float32 lower, float32 upper); + + /// Is the joint motor enabled? + bool IsMotorEnabled() const; + + /// Enable/disable the joint motor. + void EnableMotor(bool flag); + + /// Set the motor speed, usually in meters per second. + void SetMotorSpeed(float32 speed); + + /// Get the motor speed, usually in meters per second. + float32 GetMotorSpeed() const; + + /// Set/Get the maximum motor force, usually in N. + void SetMaxMotorForce(float32 force); + float32 GetMaxMotorForce() const; + + /// Get the current motor force, usually in N. + float32 GetMotorForce() const; + +protected: + + friend class b2Joint; + b2LineJoint(const b2LineJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchor1; + b2Vec2 m_localAnchor2; + b2Vec2 m_localXAxis1; + b2Vec2 m_localYAxis1; + + b2Vec2 m_axis, m_perp; + float32 m_s1, m_s2; + float32 m_a1, m_a2; + + b2Mat22 m_K; + b2Vec2 m_impulse; + + float32 m_motorMass; // effective mass for motor/limit translational constraint. + float32 m_motorImpulse; + + float32 m_lowerTranslation; + float32 m_upperTranslation; + float32 m_maxMotorForce; + float32 m_motorSpeed; + + bool m_enableLimit; + bool m_enableMotor; + b2LimitState m_limitState; +}; + +inline float32 b2LineJoint::GetMotorSpeed() const +{ + return m_motorSpeed; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2MouseJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2MouseJoint.cpp new file mode 100644 index 0000000..519e786 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2MouseJoint.cpp @@ -0,0 +1,198 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2MouseJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" +#include + +// p = attached point, m = mouse point +// C = p - m +// Cdot = v +// = v + cross(w, r) +// J = [I r_skew] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +b2MouseJoint::b2MouseJoint(const b2MouseJointDef* def) +: b2Joint(def) +{ + b2Assert(def->target.IsValid()); + b2Assert(b2IsValid(def->maxForce) && def->maxForce >= 0.0f); + b2Assert(b2IsValid(def->frequencyHz) && def->frequencyHz >= 0.0f); + b2Assert(b2IsValid(def->dampingRatio) && def->dampingRatio >= 0.0f); + + m_target = def->target; + m_localAnchor = b2MulT(m_bodyB->GetTransform(), m_target); + + m_maxForce = def->maxForce; + m_impulse.SetZero(); + + m_frequencyHz = def->frequencyHz; + m_dampingRatio = def->dampingRatio; + + m_beta = 0.0f; + m_gamma = 0.0f; +} + +void b2MouseJoint::SetTarget(const b2Vec2& target) +{ + if (m_bodyB->IsAwake() == false) + { + m_bodyB->SetAwake(true); + } + m_target = target; +} + +const b2Vec2& b2MouseJoint::GetTarget() const +{ + return m_target; +} + +void b2MouseJoint::SetMaxForce(float32 force) +{ + m_maxForce = force; +} + +float32 b2MouseJoint::GetMaxForce() const +{ + return m_maxForce; +} + +void b2MouseJoint::SetFrequency(float32 hz) +{ + m_frequencyHz = hz; +} + +float32 b2MouseJoint::GetFrequency() const +{ + return m_frequencyHz; +} + +void b2MouseJoint::SetDampingRatio(float32 ratio) +{ + m_dampingRatio = ratio; +} + +float32 b2MouseJoint::GetDampingRatio() const +{ + return m_dampingRatio; +} + +void b2MouseJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b = m_bodyB; + + float32 mass = b->GetMass(); + + // Frequency + float32 omega = 2.0f * b2_pi * m_frequencyHz; + + // Damping coefficient + float32 d = 2.0f * mass * m_dampingRatio * omega; + + // Spring stiffness + float32 k = mass * (omega * omega); + + // magic formulas + // gamma has units of inverse mass. + // beta has units of inverse time. + b2Assert(d + step.dt * k > b2_epsilon); + m_gamma = step.dt * (d + step.dt * k); + if (m_gamma != 0.0f) + { + m_gamma = 1.0f / m_gamma; + } + m_beta = step.dt * k * m_gamma; + + // Compute the effective mass matrix. + b2Vec2 r = b2Mul(b->GetTransform().R, m_localAnchor - b->GetLocalCenter()); + + // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * invI2 * skew(r2)] + // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y -r1.x*r1.y] + // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] + float32 invMass = b->m_invMass; + float32 invI = b->m_invI; + + b2Mat22 K1; + K1.col1.x = invMass; K1.col2.x = 0.0f; + K1.col1.y = 0.0f; K1.col2.y = invMass; + + b2Mat22 K2; + K2.col1.x = invI * r.y * r.y; K2.col2.x = -invI * r.x * r.y; + K2.col1.y = -invI * r.x * r.y; K2.col2.y = invI * r.x * r.x; + + b2Mat22 K = K1 + K2; + K.col1.x += m_gamma; + K.col2.y += m_gamma; + + m_mass = K.GetInverse(); + + m_C = b->m_sweep.c + r - m_target; + + // Cheat with some damping + b->m_angularVelocity *= 0.98f; + + // Warm starting. + m_impulse *= step.dtRatio; + b->m_linearVelocity += invMass * m_impulse; + b->m_angularVelocity += invI * b2Cross(r, m_impulse); +} + +void b2MouseJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b = m_bodyB; + + b2Vec2 r = b2Mul(b->GetTransform().R, m_localAnchor - b->GetLocalCenter()); + + // Cdot = v + cross(w, r) + b2Vec2 Cdot = b->m_linearVelocity + b2Cross(b->m_angularVelocity, r); + b2Vec2 impulse = b2Mul(m_mass, -(Cdot + m_beta * m_C + m_gamma * m_impulse)); + + b2Vec2 oldImpulse = m_impulse; + m_impulse += impulse; + float32 maxImpulse = step.dt * m_maxForce; + if (m_impulse.LengthSquared() > maxImpulse * maxImpulse) + { + m_impulse *= maxImpulse / m_impulse.Length(); + } + impulse = m_impulse - oldImpulse; + + b->m_linearVelocity += b->m_invMass * impulse; + b->m_angularVelocity += b->m_invI * b2Cross(r, impulse); +} + +b2Vec2 b2MouseJoint::GetAnchorA() const +{ + return m_target; +} + +b2Vec2 b2MouseJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor); +} + +b2Vec2 b2MouseJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * m_impulse; +} + +float32 b2MouseJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * 0.0f; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2MouseJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2MouseJoint.h new file mode 100644 index 0000000..42bf7c8 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2MouseJoint.h @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_MOUSE_JOINT_H +#define B2_MOUSE_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +/// Mouse joint definition. This requires a world target point, +/// tuning parameters, and the time step. +struct b2MouseJointDef : public b2JointDef +{ + b2MouseJointDef() + { + type = e_mouseJoint; + target.Set(0.0f, 0.0f); + maxForce = 0.0f; + frequencyHz = 5.0f; + dampingRatio = 0.7f; + } + + /// The initial world target point. This is assumed + /// to coincide with the body anchor initially. + b2Vec2 target; + + /// The maximum constraint force that can be exerted + /// to move the candidate body. Usually you will express + /// as some multiple of the weight (multiplier * mass * gravity). + float32 maxForce; + + /// The response speed. + float32 frequencyHz; + + /// The damping ratio. 0 = no damping, 1 = critical damping. + float32 dampingRatio; +}; + +/// A mouse joint is used to make a point on a body track a +/// specified world point. This a soft constraint with a maximum +/// force. This allows the constraint to stretch and without +/// applying huge forces. +/// NOTE: this joint is not documented in the manual because it was +/// developed to be used in the testbed. If you want to learn how to +/// use the mouse joint, look at the testbed. +class b2MouseJoint : public b2Joint +{ +public: + + /// Implements b2Joint. + b2Vec2 GetAnchorA() const; + + /// Implements b2Joint. + b2Vec2 GetAnchorB() const; + + /// Implements b2Joint. + b2Vec2 GetReactionForce(float32 inv_dt) const; + + /// Implements b2Joint. + float32 GetReactionTorque(float32 inv_dt) const; + + /// Use this to update the target point. + void SetTarget(const b2Vec2& target); + const b2Vec2& GetTarget() const; + + /// Set/get the maximum force in Newtons. + void SetMaxForce(float32 force); + float32 GetMaxForce() const; + + /// Set/get the frequency in Hertz. + void SetFrequency(float32 hz); + float32 GetFrequency() const; + + /// Set/get the damping ratio (dimensionless). + void SetDampingRatio(float32 ratio); + float32 GetDampingRatio() const; + +protected: + friend class b2Joint; + + b2MouseJoint(const b2MouseJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte) { B2_NOT_USED(baumgarte); return true; } + + b2Vec2 m_localAnchor; + b2Vec2 m_target; + b2Vec2 m_impulse; + + b2Mat22 m_mass; // effective mass for point-to-point constraint. + b2Vec2 m_C; // position error + float32 m_maxForce; + float32 m_frequencyHz; + float32 m_dampingRatio; + float32 m_beta; + float32 m_gamma; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp new file mode 100644 index 0000000..a50b59b --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp @@ -0,0 +1,586 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2PrismaticJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +// Linear constraint (point-to-line) +// d = p2 - p1 = x2 + r2 - x1 - r1 +// C = dot(perp, d) +// Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - cross(w1, r1)) +// = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + dot(cross(r2, perp), v2) +// J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] +// +// Angular constraint +// C = a2 - a1 + a_initial +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// +// K = J * invM * JT +// +// J = [-a -s1 a s2] +// [0 -1 0 1] +// a = perp +// s1 = cross(d + r1, a) = cross(p2 - x1, a) +// s2 = cross(r2, a) = cross(p2 - x2, a) + + +// Motor/Limit linear constraint +// C = dot(ax1, d) +// Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + dot(cross(r2, ax1), v2) +// J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] + +// Block Solver +// We develop a block solver that includes the joint limit. This makes the limit stiff (inelastic) even +// when the mass has poor distribution (leading to large torques about the joint anchor points). +// +// The Jacobian has 3 rows: +// J = [-uT -s1 uT s2] // linear +// [0 -1 0 1] // angular +// [-vT -a1 vT a2] // limit +// +// u = perp +// v = axis +// s1 = cross(d + r1, u), s2 = cross(r2, u) +// a1 = cross(d + r1, v), a2 = cross(r2, v) + +// M * (v2 - v1) = JT * df +// J * v2 = bias +// +// v2 = v1 + invM * JT * df +// J * (v1 + invM * JT * df) = bias +// K * df = bias - J * v1 = -Cdot +// K = J * invM * JT +// Cdot = J * v1 - bias +// +// Now solve for f2. +// df = f2 - f1 +// K * (f2 - f1) = -Cdot +// f2 = invK * (-Cdot) + f1 +// +// Clamp accumulated limit impulse. +// lower: f2(3) = max(f2(3), 0) +// upper: f2(3) = min(f2(3), 0) +// +// Solve for correct f2(1:2) +// K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 +// = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) +// K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + K(1:2,1:2) * f1(1:2) +// f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + f1(1:2) +// +// Now compute impulse to be applied: +// df = f2 - f1 + +void b2PrismaticJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) +{ + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + localAxis1 = bodyA->GetLocalVector(axis); + referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); +} + +b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) +: b2Joint(def) +{ + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = def->localAnchorB; + m_localXAxis1 = def->localAxis1; + m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); + m_refAngle = def->referenceAngle; + + m_impulse.SetZero(); + m_motorMass = 0.0; + m_motorImpulse = 0.0f; + + m_lowerTranslation = def->lowerTranslation; + m_upperTranslation = def->upperTranslation; + m_maxMotorForce = def->maxMotorForce; + m_motorSpeed = def->motorSpeed; + m_enableLimit = def->enableLimit; + m_enableMotor = def->enableMotor; + m_limitState = e_inactiveLimit; + + m_axis.SetZero(); + m_perp.SetZero(); +} + +void b2PrismaticJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + m_localCenterA = b1->GetLocalCenter(); + m_localCenterB = b2->GetLocalCenter(); + + b2Transform xf1 = b1->GetTransform(); + b2Transform xf2 = b2->GetTransform(); + + // Compute the effective masses. + b2Vec2 r1 = b2Mul(xf1.R, m_localAnchor1 - m_localCenterA); + b2Vec2 r2 = b2Mul(xf2.R, m_localAnchor2 - m_localCenterB); + b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + + m_invMassA = b1->m_invMass; + m_invIA = b1->m_invI; + m_invMassB = b2->m_invMass; + m_invIB = b2->m_invI; + + // Compute motor Jacobian and effective mass. + { + m_axis = b2Mul(xf1.R, m_localXAxis1); + m_a1 = b2Cross(d + r1, m_axis); + m_a2 = b2Cross(r2, m_axis); + + m_motorMass = m_invMassA + m_invMassB + m_invIA * m_a1 * m_a1 + m_invIB * m_a2 * m_a2; + if (m_motorMass > b2_epsilon) + { + m_motorMass = 1.0f / m_motorMass; + } + } + + // Prismatic constraint. + { + m_perp = b2Mul(xf1.R, m_localYAxis1); + + m_s1 = b2Cross(d + r1, m_perp); + m_s2 = b2Cross(r2, m_perp); + + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 + i2 * m_s2; + float32 k13 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; + float32 k22 = i1 + i2; + float32 k23 = i1 * m_a1 + i2 * m_a2; + float32 k33 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; + + m_K.col1.Set(k11, k12, k13); + m_K.col2.Set(k12, k22, k23); + m_K.col3.Set(k13, k23, k33); + } + + // Compute motor and limit terms. + if (m_enableLimit) + { + float32 jointTranslation = b2Dot(m_axis, d); + if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) + { + m_limitState = e_equalLimits; + } + else if (jointTranslation <= m_lowerTranslation) + { + if (m_limitState != e_atLowerLimit) + { + m_limitState = e_atLowerLimit; + m_impulse.z = 0.0f; + } + } + else if (jointTranslation >= m_upperTranslation) + { + if (m_limitState != e_atUpperLimit) + { + m_limitState = e_atUpperLimit; + m_impulse.z = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + m_impulse.z = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + m_impulse.z = 0.0f; + } + + if (m_enableMotor == false) + { + m_motorImpulse = 0.0f; + } + + if (step.warmStarting) + { + // Account for variable time step. + m_impulse *= step.dtRatio; + m_motorImpulse *= step.dtRatio; + + b2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis; + float32 L1 = m_impulse.x * m_s1 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a1; + float32 L2 = m_impulse.x * m_s2 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a2; + + b1->m_linearVelocity -= m_invMassA * P; + b1->m_angularVelocity -= m_invIA * L1; + + b2->m_linearVelocity += m_invMassB * P; + b2->m_angularVelocity += m_invIB * L2; + } + else + { + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + } +} + +void b2PrismaticJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 v1 = b1->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w2 = b2->m_angularVelocity; + + // Solve linear motor constraint. + if (m_enableMotor && m_limitState != e_equalLimits) + { + float32 Cdot = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; + float32 impulse = m_motorMass * (m_motorSpeed - Cdot); + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = step.dt * m_maxMotorForce; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + b2Vec2 P = impulse * m_axis; + float32 L1 = impulse * m_a1; + float32 L2 = impulse * m_a2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + + b2Vec2 Cdot1; + Cdot1.x = b2Dot(m_perp, v2 - v1) + m_s2 * w2 - m_s1 * w1; + Cdot1.y = w2 - w1; + + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + // Solve prismatic and limit constraint in block form. + float32 Cdot2; + Cdot2 = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; + b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); + + b2Vec3 f1 = m_impulse; + b2Vec3 df = m_K.Solve33(-Cdot); + m_impulse += df; + + if (m_limitState == e_atLowerLimit) + { + m_impulse.z = b2Max(m_impulse.z, 0.0f); + } + else if (m_limitState == e_atUpperLimit) + { + m_impulse.z = b2Min(m_impulse.z, 0.0f); + } + + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + f1(1:2) + b2Vec2 b = -Cdot1 - (m_impulse.z - f1.z) * b2Vec2(m_K.col3.x, m_K.col3.y); + b2Vec2 f2r = m_K.Solve22(b) + b2Vec2(f1.x, f1.y); + m_impulse.x = f2r.x; + m_impulse.y = f2r.y; + + df = m_impulse - f1; + + b2Vec2 P = df.x * m_perp + df.z * m_axis; + float32 L1 = df.x * m_s1 + df.y + df.z * m_a1; + float32 L2 = df.x * m_s2 + df.y + df.z * m_a2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + else + { + // Limit is inactive, just solve the prismatic constraint in block form. + b2Vec2 df = m_K.Solve22(-Cdot1); + m_impulse.x += df.x; + m_impulse.y += df.y; + + b2Vec2 P = df.x * m_perp; + float32 L1 = df.x * m_s1 + df.y; + float32 L2 = df.x * m_s2 + df.y; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + + b1->m_linearVelocity = v1; + b1->m_angularVelocity = w1; + b2->m_linearVelocity = v2; + b2->m_angularVelocity = w2; +} + +bool b2PrismaticJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 c1 = b1->m_sweep.c; + float32 a1 = b1->m_sweep.a; + + b2Vec2 c2 = b2->m_sweep.c; + float32 a2 = b2->m_sweep.a; + + // Solve linear limit constraint. + float32 linearError = 0.0f, angularError = 0.0f; + bool active = false; + float32 C2 = 0.0f; + + b2Mat22 R1(a1), R2(a2); + + b2Vec2 r1 = b2Mul(R1, m_localAnchor1 - m_localCenterA); + b2Vec2 r2 = b2Mul(R2, m_localAnchor2 - m_localCenterB); + b2Vec2 d = c2 + r2 - c1 - r1; + + if (m_enableLimit) + { + m_axis = b2Mul(R1, m_localXAxis1); + + m_a1 = b2Cross(d + r1, m_axis); + m_a2 = b2Cross(r2, m_axis); + + float32 translation = b2Dot(m_axis, d); + if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) + { + // Prevent large angular corrections + C2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); + linearError = b2Abs(translation); + active = true; + } + else if (translation <= m_lowerTranslation) + { + // Prevent large linear corrections and allow some slop. + C2 = b2Clamp(translation - m_lowerTranslation + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); + linearError = m_lowerTranslation - translation; + active = true; + } + else if (translation >= m_upperTranslation) + { + // Prevent large linear corrections and allow some slop. + C2 = b2Clamp(translation - m_upperTranslation - b2_linearSlop, 0.0f, b2_maxLinearCorrection); + linearError = translation - m_upperTranslation; + active = true; + } + } + + m_perp = b2Mul(R1, m_localYAxis1); + + m_s1 = b2Cross(d + r1, m_perp); + m_s2 = b2Cross(r2, m_perp); + + b2Vec3 impulse; + b2Vec2 C1; + C1.x = b2Dot(m_perp, d); + C1.y = a2 - a1 - m_refAngle; + + linearError = b2Max(linearError, b2Abs(C1.x)); + angularError = b2Abs(C1.y); + + if (active) + { + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 + i2 * m_s2; + float32 k13 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; + float32 k22 = i1 + i2; + float32 k23 = i1 * m_a1 + i2 * m_a2; + float32 k33 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; + + m_K.col1.Set(k11, k12, k13); + m_K.col2.Set(k12, k22, k23); + m_K.col3.Set(k13, k23, k33); + + b2Vec3 C; + C.x = C1.x; + C.y = C1.y; + C.z = C2; + + impulse = m_K.Solve33(-C); + } + else + { + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 + i2 * m_s2; + float32 k22 = i1 + i2; + + m_K.col1.Set(k11, k12, 0.0f); + m_K.col2.Set(k12, k22, 0.0f); + + b2Vec2 impulse1 = m_K.Solve22(-C1); + impulse.x = impulse1.x; + impulse.y = impulse1.y; + impulse.z = 0.0f; + } + + b2Vec2 P = impulse.x * m_perp + impulse.z * m_axis; + float32 L1 = impulse.x * m_s1 + impulse.y + impulse.z * m_a1; + float32 L2 = impulse.x * m_s2 + impulse.y + impulse.z * m_a2; + + c1 -= m_invMassA * P; + a1 -= m_invIA * L1; + c2 += m_invMassB * P; + a2 += m_invIB * L2; + + // TODO_ERIN remove need for this. + b1->m_sweep.c = c1; + b1->m_sweep.a = a1; + b2->m_sweep.c = c2; + b2->m_sweep.a = a2; + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + + return linearError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2PrismaticJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2PrismaticJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +b2Vec2 b2PrismaticJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis); +} + +float32 b2PrismaticJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_impulse.y; +} + +float32 b2PrismaticJoint::GetJointTranslation() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); + b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); + b2Vec2 d = p2 - p1; + b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + + float32 translation = b2Dot(d, axis); + return translation; +} + +float32 b2PrismaticJoint::GetJointSpeed() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 p1 = b1->m_sweep.c + r1; + b2Vec2 p2 = b2->m_sweep.c + r2; + b2Vec2 d = p2 - p1; + b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + + b2Vec2 v1 = b1->m_linearVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + float32 w2 = b2->m_angularVelocity; + + float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); + return speed; +} + +bool b2PrismaticJoint::IsLimitEnabled() const +{ + return m_enableLimit; +} + +void b2PrismaticJoint::EnableLimit(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableLimit = flag; +} + +float32 b2PrismaticJoint::GetLowerLimit() const +{ + return m_lowerTranslation; +} + +float32 b2PrismaticJoint::GetUpperLimit() const +{ + return m_upperTranslation; +} + +void b2PrismaticJoint::SetLimits(float32 lower, float32 upper) +{ + b2Assert(lower <= upper); + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_lowerTranslation = lower; + m_upperTranslation = upper; +} + +bool b2PrismaticJoint::IsMotorEnabled() const +{ + return m_enableMotor; +} + +void b2PrismaticJoint::EnableMotor(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableMotor = flag; +} + +void b2PrismaticJoint::SetMotorSpeed(float32 speed) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_motorSpeed = speed; +} + +void b2PrismaticJoint::SetMaxMotorForce(float32 force) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_maxMotorForce = force; +} + +float32 b2PrismaticJoint::GetMotorForce() const +{ + return m_motorImpulse; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2PrismaticJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2PrismaticJoint.h new file mode 100644 index 0000000..f162253 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2PrismaticJoint.h @@ -0,0 +1,175 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_PRISMATIC_JOINT_H +#define B2_PRISMATIC_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +/// Prismatic joint definition. This requires defining a line of +/// motion using an axis and an anchor point. The definition uses local +/// anchor points and a local axis so that the initial configuration +/// can violate the constraint slightly. The joint translation is zero +/// when the local anchor points coincide in world space. Using local +/// anchors and a local axis helps when saving and loading a game. +/// @warning at least one body should by dynamic with a non-fixed rotation. +struct b2PrismaticJointDef : public b2JointDef +{ + b2PrismaticJointDef() + { + type = e_prismaticJoint; + localAnchorA.SetZero(); + localAnchorB.SetZero(); + localAxis1.Set(1.0f, 0.0f); + referenceAngle = 0.0f; + enableLimit = false; + lowerTranslation = 0.0f; + upperTranslation = 0.0f; + enableMotor = false; + maxMotorForce = 0.0f; + motorSpeed = 0.0f; + } + + /// Initialize the bodies, anchors, axis, and reference angle using the world + /// anchor and world axis. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); + + /// The local anchor point relative to body1's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to body2's origin. + b2Vec2 localAnchorB; + + /// The local translation axis in body1. + b2Vec2 localAxis1; + + /// The constrained angle between the bodies: body2_angle - body1_angle. + float32 referenceAngle; + + /// Enable/disable the joint limit. + bool enableLimit; + + /// The lower translation limit, usually in meters. + float32 lowerTranslation; + + /// The upper translation limit, usually in meters. + float32 upperTranslation; + + /// Enable/disable the joint motor. + bool enableMotor; + + /// The maximum motor torque, usually in N-m. + float32 maxMotorForce; + + /// The desired motor speed in radians per second. + float32 motorSpeed; +}; + +/// A prismatic joint. This joint provides one degree of freedom: translation +/// along an axis fixed in body1. Relative rotation is prevented. You can +/// use a joint limit to restrict the range of motion and a joint motor to +/// drive the motion or to model joint friction. +class b2PrismaticJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Get the current joint translation, usually in meters. + float32 GetJointTranslation() const; + + /// Get the current joint translation speed, usually in meters per second. + float32 GetJointSpeed() const; + + /// Is the joint limit enabled? + bool IsLimitEnabled() const; + + /// Enable/disable the joint limit. + void EnableLimit(bool flag); + + /// Get the lower joint limit, usually in meters. + float32 GetLowerLimit() const; + + /// Get the upper joint limit, usually in meters. + float32 GetUpperLimit() const; + + /// Set the joint limits, usually in meters. + void SetLimits(float32 lower, float32 upper); + + /// Is the joint motor enabled? + bool IsMotorEnabled() const; + + /// Enable/disable the joint motor. + void EnableMotor(bool flag); + + /// Set the motor speed, usually in meters per second. + void SetMotorSpeed(float32 speed); + + /// Get the motor speed, usually in meters per second. + float32 GetMotorSpeed() const; + + /// Set the maximum motor force, usually in N. + void SetMaxMotorForce(float32 force); + + /// Get the current motor force, usually in N. + float32 GetMotorForce() const; + +protected: + friend class b2Joint; + friend class b2GearJoint; + b2PrismaticJoint(const b2PrismaticJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchor1; + b2Vec2 m_localAnchor2; + b2Vec2 m_localXAxis1; + b2Vec2 m_localYAxis1; + float32 m_refAngle; + + b2Vec2 m_axis, m_perp; + float32 m_s1, m_s2; + float32 m_a1, m_a2; + + b2Mat33 m_K; + b2Vec3 m_impulse; + + float32 m_motorMass; // effective mass for motor/limit translational constraint. + float32 m_motorImpulse; + + float32 m_lowerTranslation; + float32 m_upperTranslation; + float32 m_maxMotorForce; + float32 m_motorSpeed; + + bool m_enableLimit; + bool m_enableMotor; + b2LimitState m_limitState; +}; + +inline float32 b2PrismaticJoint::GetMotorSpeed() const +{ + return m_motorSpeed; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2PulleyJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2PulleyJoint.cpp new file mode 100644 index 0000000..2159711 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2PulleyJoint.cpp @@ -0,0 +1,427 @@ +/* +* Copyright (c) 2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2PulleyJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +// Pulley: +// length1 = norm(p1 - s1) +// length2 = norm(p2 - s2) +// C0 = (length1 + ratio * length2)_initial +// C = C0 - (length1 + ratio * length2) >= 0 +// u1 = (p1 - s1) / norm(p1 - s1) +// u2 = (p2 - s2) / norm(p2 - s2) +// Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) +// J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] +// K = J * invM * JT +// = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * cross(r2, u2)^2) +// +// Limit: +// C = maxLength - length +// u = (p - s) / norm(p - s) +// Cdot = -dot(u, v + cross(w, r)) +// K = invMass + invI * cross(r, u)^2 +// 0 <= impulse + +void b2PulleyJointDef::Initialize(b2Body* b1, b2Body* b2, + const b2Vec2& ga1, const b2Vec2& ga2, + const b2Vec2& anchor1, const b2Vec2& anchor2, + float32 r) +{ + bodyA = b1; + bodyB = b2; + groundAnchorA = ga1; + groundAnchorB = ga2; + localAnchorA = bodyA->GetLocalPoint(anchor1); + localAnchorB = bodyB->GetLocalPoint(anchor2); + b2Vec2 d1 = anchor1 - ga1; + lengthA = d1.Length(); + b2Vec2 d2 = anchor2 - ga2; + lengthB = d2.Length(); + ratio = r; + b2Assert(ratio > b2_epsilon); + float32 C = lengthA + ratio * lengthB; + maxLengthA = C - ratio * b2_minPulleyLength; + maxLengthB = (C - b2_minPulleyLength) / ratio; +} + +b2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def) +: b2Joint(def) +{ + m_groundAnchor1 = def->groundAnchorA; + m_groundAnchor2 = def->groundAnchorB; + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = def->localAnchorB; + + b2Assert(def->ratio != 0.0f); + m_ratio = def->ratio; + + m_constant = def->lengthA + m_ratio * def->lengthB; + + m_maxLength1 = b2Min(def->maxLengthA, m_constant - m_ratio * b2_minPulleyLength); + m_maxLength2 = b2Min(def->maxLengthB, (m_constant - b2_minPulleyLength) / m_ratio); + + m_impulse = 0.0f; + m_limitImpulse1 = 0.0f; + m_limitImpulse2 = 0.0f; +} + +void b2PulleyJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + b2Vec2 p1 = b1->m_sweep.c + r1; + b2Vec2 p2 = b2->m_sweep.c + r2; + + b2Vec2 s1 = m_groundAnchor1; + b2Vec2 s2 = m_groundAnchor2; + + // Get the pulley axes. + m_u1 = p1 - s1; + m_u2 = p2 - s2; + + float32 length1 = m_u1.Length(); + float32 length2 = m_u2.Length(); + + if (length1 > b2_linearSlop) + { + m_u1 *= 1.0f / length1; + } + else + { + m_u1.SetZero(); + } + + if (length2 > b2_linearSlop) + { + m_u2 *= 1.0f / length2; + } + else + { + m_u2.SetZero(); + } + + float32 C = m_constant - length1 - m_ratio * length2; + if (C > 0.0f) + { + m_state = e_inactiveLimit; + m_impulse = 0.0f; + } + else + { + m_state = e_atUpperLimit; + } + + if (length1 < m_maxLength1) + { + m_limitState1 = e_inactiveLimit; + m_limitImpulse1 = 0.0f; + } + else + { + m_limitState1 = e_atUpperLimit; + } + + if (length2 < m_maxLength2) + { + m_limitState2 = e_inactiveLimit; + m_limitImpulse2 = 0.0f; + } + else + { + m_limitState2 = e_atUpperLimit; + } + + // Compute effective mass. + float32 cr1u1 = b2Cross(r1, m_u1); + float32 cr2u2 = b2Cross(r2, m_u2); + + m_limitMass1 = b1->m_invMass + b1->m_invI * cr1u1 * cr1u1; + m_limitMass2 = b2->m_invMass + b2->m_invI * cr2u2 * cr2u2; + m_pulleyMass = m_limitMass1 + m_ratio * m_ratio * m_limitMass2; + b2Assert(m_limitMass1 > b2_epsilon); + b2Assert(m_limitMass2 > b2_epsilon); + b2Assert(m_pulleyMass > b2_epsilon); + m_limitMass1 = 1.0f / m_limitMass1; + m_limitMass2 = 1.0f / m_limitMass2; + m_pulleyMass = 1.0f / m_pulleyMass; + + if (step.warmStarting) + { + // Scale impulses to support variable time steps. + m_impulse *= step.dtRatio; + m_limitImpulse1 *= step.dtRatio; + m_limitImpulse2 *= step.dtRatio; + + // Warm starting. + b2Vec2 P1 = -(m_impulse + m_limitImpulse1) * m_u1; + b2Vec2 P2 = (-m_ratio * m_impulse - m_limitImpulse2) * m_u2; + b1->m_linearVelocity += b1->m_invMass * P1; + b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); + b2->m_linearVelocity += b2->m_invMass * P2; + b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); + } + else + { + m_impulse = 0.0f; + m_limitImpulse1 = 0.0f; + m_limitImpulse2 = 0.0f; + } +} + +void b2PulleyJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + B2_NOT_USED(step); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + if (m_state == e_atUpperLimit) + { + b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); + b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); + + float32 Cdot = -b2Dot(m_u1, v1) - m_ratio * b2Dot(m_u2, v2); + float32 impulse = m_pulleyMass * (-Cdot); + float32 oldImpulse = m_impulse; + m_impulse = b2Max(0.0f, m_impulse + impulse); + impulse = m_impulse - oldImpulse; + + b2Vec2 P1 = -impulse * m_u1; + b2Vec2 P2 = -m_ratio * impulse * m_u2; + b1->m_linearVelocity += b1->m_invMass * P1; + b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); + b2->m_linearVelocity += b2->m_invMass * P2; + b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); + } + + if (m_limitState1 == e_atUpperLimit) + { + b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); + + float32 Cdot = -b2Dot(m_u1, v1); + float32 impulse = -m_limitMass1 * Cdot; + float32 oldImpulse = m_limitImpulse1; + m_limitImpulse1 = b2Max(0.0f, m_limitImpulse1 + impulse); + impulse = m_limitImpulse1 - oldImpulse; + + b2Vec2 P1 = -impulse * m_u1; + b1->m_linearVelocity += b1->m_invMass * P1; + b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); + } + + if (m_limitState2 == e_atUpperLimit) + { + b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); + + float32 Cdot = -b2Dot(m_u2, v2); + float32 impulse = -m_limitMass2 * Cdot; + float32 oldImpulse = m_limitImpulse2; + m_limitImpulse2 = b2Max(0.0f, m_limitImpulse2 + impulse); + impulse = m_limitImpulse2 - oldImpulse; + + b2Vec2 P2 = -impulse * m_u2; + b2->m_linearVelocity += b2->m_invMass * P2; + b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); + } +} + +bool b2PulleyJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 s1 = m_groundAnchor1; + b2Vec2 s2 = m_groundAnchor2; + + float32 linearError = 0.0f; + + if (m_state == e_atUpperLimit) + { + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + b2Vec2 p1 = b1->m_sweep.c + r1; + b2Vec2 p2 = b2->m_sweep.c + r2; + + // Get the pulley axes. + m_u1 = p1 - s1; + m_u2 = p2 - s2; + + float32 length1 = m_u1.Length(); + float32 length2 = m_u2.Length(); + + if (length1 > b2_linearSlop) + { + m_u1 *= 1.0f / length1; + } + else + { + m_u1.SetZero(); + } + + if (length2 > b2_linearSlop) + { + m_u2 *= 1.0f / length2; + } + else + { + m_u2.SetZero(); + } + + float32 C = m_constant - length1 - m_ratio * length2; + linearError = b2Max(linearError, -C); + + C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); + float32 impulse = -m_pulleyMass * C; + + b2Vec2 P1 = -impulse * m_u1; + b2Vec2 P2 = -m_ratio * impulse * m_u2; + + b1->m_sweep.c += b1->m_invMass * P1; + b1->m_sweep.a += b1->m_invI * b2Cross(r1, P1); + b2->m_sweep.c += b2->m_invMass * P2; + b2->m_sweep.a += b2->m_invI * b2Cross(r2, P2); + + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + } + + if (m_limitState1 == e_atUpperLimit) + { + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 p1 = b1->m_sweep.c + r1; + + m_u1 = p1 - s1; + float32 length1 = m_u1.Length(); + + if (length1 > b2_linearSlop) + { + m_u1 *= 1.0f / length1; + } + else + { + m_u1.SetZero(); + } + + float32 C = m_maxLength1 - length1; + linearError = b2Max(linearError, -C); + C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); + float32 impulse = -m_limitMass1 * C; + + b2Vec2 P1 = -impulse * m_u1; + b1->m_sweep.c += b1->m_invMass * P1; + b1->m_sweep.a += b1->m_invI * b2Cross(r1, P1); + + b1->SynchronizeTransform(); + } + + if (m_limitState2 == e_atUpperLimit) + { + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 p2 = b2->m_sweep.c + r2; + + m_u2 = p2 - s2; + float32 length2 = m_u2.Length(); + + if (length2 > b2_linearSlop) + { + m_u2 *= 1.0f / length2; + } + else + { + m_u2.SetZero(); + } + + float32 C = m_maxLength2 - length2; + linearError = b2Max(linearError, -C); + C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); + float32 impulse = -m_limitMass2 * C; + + b2Vec2 P2 = -impulse * m_u2; + b2->m_sweep.c += b2->m_invMass * P2; + b2->m_sweep.a += b2->m_invI * b2Cross(r2, P2); + + b2->SynchronizeTransform(); + } + + return linearError < b2_linearSlop; +} + +b2Vec2 b2PulleyJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2PulleyJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +b2Vec2 b2PulleyJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 P = m_impulse * m_u2; + return inv_dt * P; +} + +float32 b2PulleyJoint::GetReactionTorque(float32 inv_dt) const +{ + B2_NOT_USED(inv_dt); + return 0.0f; +} + +b2Vec2 b2PulleyJoint::GetGroundAnchorA() const +{ + return m_groundAnchor1; +} + +b2Vec2 b2PulleyJoint::GetGroundAnchorB() const +{ + return m_groundAnchor2; +} + +float32 b2PulleyJoint::GetLength1() const +{ + b2Vec2 p = m_bodyA->GetWorldPoint(m_localAnchor1); + b2Vec2 s = m_groundAnchor1; + b2Vec2 d = p - s; + return d.Length(); +} + +float32 b2PulleyJoint::GetLength2() const +{ + b2Vec2 p = m_bodyB->GetWorldPoint(m_localAnchor2); + b2Vec2 s = m_groundAnchor2; + b2Vec2 d = p - s; + return d.Length(); +} + +float32 b2PulleyJoint::GetRatio() const +{ + return m_ratio; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2PulleyJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2PulleyJoint.h new file mode 100644 index 0000000..2605292 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2PulleyJoint.h @@ -0,0 +1,148 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_PULLEY_JOINT_H +#define B2_PULLEY_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +const float32 b2_minPulleyLength = 2.0f; + +/// Pulley joint definition. This requires two ground anchors, +/// two dynamic body anchor points, max lengths for each side, +/// and a pulley ratio. +struct b2PulleyJointDef : public b2JointDef +{ + b2PulleyJointDef() + { + type = e_pulleyJoint; + groundAnchorA.Set(-1.0f, 1.0f); + groundAnchorB.Set(1.0f, 1.0f); + localAnchorA.Set(-1.0f, 0.0f); + localAnchorB.Set(1.0f, 0.0f); + lengthA = 0.0f; + maxLengthA = 0.0f; + lengthB = 0.0f; + maxLengthB = 0.0f; + ratio = 1.0f; + collideConnected = true; + } + + /// Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors. + void Initialize(b2Body* bodyA, b2Body* bodyB, + const b2Vec2& groundAnchorA, const b2Vec2& groundAnchorB, + const b2Vec2& anchorA, const b2Vec2& anchorB, + float32 ratio); + + /// The first ground anchor in world coordinates. This point never moves. + b2Vec2 groundAnchorA; + + /// The second ground anchor in world coordinates. This point never moves. + b2Vec2 groundAnchorB; + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The a reference length for the segment attached to bodyA. + float32 lengthA; + + /// The maximum length of the segment attached to bodyA. + float32 maxLengthA; + + /// The a reference length for the segment attached to bodyB. + float32 lengthB; + + /// The maximum length of the segment attached to bodyB. + float32 maxLengthB; + + /// The pulley ratio, used to simulate a block-and-tackle. + float32 ratio; +}; + +/// The pulley joint is connected to two bodies and two fixed ground points. +/// The pulley supports a ratio such that: +/// length1 + ratio * length2 <= constant +/// Yes, the force transmitted is scaled by the ratio. +/// The pulley also enforces a maximum length limit on both sides. This is +/// useful to prevent one side of the pulley hitting the top. +class b2PulleyJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Get the first ground anchor. + b2Vec2 GetGroundAnchorA() const; + + /// Get the second ground anchor. + b2Vec2 GetGroundAnchorB() const; + + /// Get the current length of the segment attached to body1. + float32 GetLength1() const; + + /// Get the current length of the segment attached to body2. + float32 GetLength2() const; + + /// Get the pulley ratio. + float32 GetRatio() const; + +protected: + + friend class b2Joint; + b2PulleyJoint(const b2PulleyJointDef* data); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_groundAnchor1; + b2Vec2 m_groundAnchor2; + b2Vec2 m_localAnchor1; + b2Vec2 m_localAnchor2; + + b2Vec2 m_u1; + b2Vec2 m_u2; + + float32 m_constant; + float32 m_ratio; + + float32 m_maxLength1; + float32 m_maxLength2; + + // Effective masses + float32 m_pulleyMass; + float32 m_limitMass1; + float32 m_limitMass2; + + // Impulses for accumulation/warm starting. + float32 m_impulse; + float32 m_limitImpulse1; + float32 m_limitImpulse2; + + b2LimitState m_state; + b2LimitState m_limitState1; + b2LimitState m_limitState2; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp new file mode 100644 index 0000000..ba8fa22 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp @@ -0,0 +1,478 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2RevoluteJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +// Point-to-point constraint +// C = p2 - p1 +// Cdot = v2 - v1 +// = v2 + cross(w2, r2) - v1 - cross(w1, r1) +// J = [-I -r1_skew I r2_skew ] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +// Motor constraint +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// K = invI1 + invI2 + +void b2RevoluteJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor) +{ + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); +} + +b2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def) +: b2Joint(def) +{ + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = def->localAnchorB; + m_referenceAngle = def->referenceAngle; + + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + + m_lowerAngle = def->lowerAngle; + m_upperAngle = def->upperAngle; + m_maxMotorTorque = def->maxMotorTorque; + m_motorSpeed = def->motorSpeed; + m_enableLimit = def->enableLimit; + m_enableMotor = def->enableMotor; + m_limitState = e_inactiveLimit; +} + +void b2RevoluteJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + if (m_enableMotor || m_enableLimit) + { + // You cannot create a rotation limit between bodies that + // both have fixed rotation. + b2Assert(b1->m_invI > 0.0f || b2->m_invI > 0.0f); + } + + // Compute the effective mass matrix. + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + + // Matlab + // K = [ m1+r1y^2*i1+m2+r2y^2*i2, -r1y*i1*r1x-r2y*i2*r2x, -r1y*i1-r2y*i2] + // [ -r1y*i1*r1x-r2y*i2*r2x, m1+r1x^2*i1+m2+r2x^2*i2, r1x*i1+r2x*i2] + // [ -r1y*i1-r2y*i2, r1x*i1+r2x*i2, i1+i2] + + float32 m1 = b1->m_invMass, m2 = b2->m_invMass; + float32 i1 = b1->m_invI, i2 = b2->m_invI; + + m_mass.col1.x = m1 + m2 + r1.y * r1.y * i1 + r2.y * r2.y * i2; + m_mass.col2.x = -r1.y * r1.x * i1 - r2.y * r2.x * i2; + m_mass.col3.x = -r1.y * i1 - r2.y * i2; + m_mass.col1.y = m_mass.col2.x; + m_mass.col2.y = m1 + m2 + r1.x * r1.x * i1 + r2.x * r2.x * i2; + m_mass.col3.y = r1.x * i1 + r2.x * i2; + m_mass.col1.z = m_mass.col3.x; + m_mass.col2.z = m_mass.col3.y; + m_mass.col3.z = i1 + i2; + + m_motorMass = i1 + i2; + if (m_motorMass > 0.0f) + { + m_motorMass = 1.0f / m_motorMass; + } + + if (m_enableMotor == false) + { + m_motorImpulse = 0.0f; + } + + if (m_enableLimit) + { + float32 jointAngle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; + if (b2Abs(m_upperAngle - m_lowerAngle) < 2.0f * b2_angularSlop) + { + m_limitState = e_equalLimits; + } + else if (jointAngle <= m_lowerAngle) + { + if (m_limitState != e_atLowerLimit) + { + m_impulse.z = 0.0f; + } + m_limitState = e_atLowerLimit; + } + else if (jointAngle >= m_upperAngle) + { + if (m_limitState != e_atUpperLimit) + { + m_impulse.z = 0.0f; + } + m_limitState = e_atUpperLimit; + } + else + { + m_limitState = e_inactiveLimit; + m_impulse.z = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + } + + if (step.warmStarting) + { + // Scale impulses to support a variable time step. + m_impulse *= step.dtRatio; + m_motorImpulse *= step.dtRatio; + + b2Vec2 P(m_impulse.x, m_impulse.y); + + b1->m_linearVelocity -= m1 * P; + b1->m_angularVelocity -= i1 * (b2Cross(r1, P) + m_motorImpulse + m_impulse.z); + + b2->m_linearVelocity += m2 * P; + b2->m_angularVelocity += i2 * (b2Cross(r2, P) + m_motorImpulse + m_impulse.z); + } + else + { + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + } +} + +void b2RevoluteJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 v1 = b1->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w2 = b2->m_angularVelocity; + + float32 m1 = b1->m_invMass, m2 = b2->m_invMass; + float32 i1 = b1->m_invI, i2 = b2->m_invI; + + // Solve motor constraint. + if (m_enableMotor && m_limitState != e_equalLimits) + { + float32 Cdot = w2 - w1 - m_motorSpeed; + float32 impulse = m_motorMass * (-Cdot); + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = step.dt * m_maxMotorTorque; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + w1 -= i1 * impulse; + w2 += i2 * impulse; + } + + // Solve limit constraint. + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + // Solve point-to-point constraint + b2Vec2 Cdot1 = v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1); + float32 Cdot2 = w2 - w1; + b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); + + b2Vec3 impulse = m_mass.Solve33(-Cdot); + + if (m_limitState == e_equalLimits) + { + m_impulse += impulse; + } + else if (m_limitState == e_atLowerLimit) + { + float32 newImpulse = m_impulse.z + impulse.z; + if (newImpulse < 0.0f) + { + b2Vec2 reduced = m_mass.Solve22(-Cdot1); + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -m_impulse.z; + m_impulse.x += reduced.x; + m_impulse.y += reduced.y; + m_impulse.z = 0.0f; + } + } + else if (m_limitState == e_atUpperLimit) + { + float32 newImpulse = m_impulse.z + impulse.z; + if (newImpulse > 0.0f) + { + b2Vec2 reduced = m_mass.Solve22(-Cdot1); + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -m_impulse.z; + m_impulse.x += reduced.x; + m_impulse.y += reduced.y; + m_impulse.z = 0.0f; + } + } + + b2Vec2 P(impulse.x, impulse.y); + + v1 -= m1 * P; + w1 -= i1 * (b2Cross(r1, P) + impulse.z); + + v2 += m2 * P; + w2 += i2 * (b2Cross(r2, P) + impulse.z); + } + else + { + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + // Solve point-to-point constraint + b2Vec2 Cdot = v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1); + b2Vec2 impulse = m_mass.Solve22(-Cdot); + + m_impulse.x += impulse.x; + m_impulse.y += impulse.y; + + v1 -= m1 * impulse; + w1 -= i1 * b2Cross(r1, impulse); + + v2 += m2 * impulse; + w2 += i2 * b2Cross(r2, impulse); + } + + b1->m_linearVelocity = v1; + b1->m_angularVelocity = w1; + b2->m_linearVelocity = v2; + b2->m_angularVelocity = w2; +} + +bool b2RevoluteJoint::SolvePositionConstraints(float32 baumgarte) +{ + // TODO_ERIN block solve with limit. + + B2_NOT_USED(baumgarte); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + float32 angularError = 0.0f; + float32 positionError = 0.0f; + + // Solve angular limit constraint. + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + float32 angle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; + float32 limitImpulse = 0.0f; + + if (m_limitState == e_equalLimits) + { + // Prevent large angular corrections + float32 C = b2Clamp(angle - m_lowerAngle, -b2_maxAngularCorrection, b2_maxAngularCorrection); + limitImpulse = -m_motorMass * C; + angularError = b2Abs(C); + } + else if (m_limitState == e_atLowerLimit) + { + float32 C = angle - m_lowerAngle; + angularError = -C; + + // Prevent large angular corrections and allow some slop. + C = b2Clamp(C + b2_angularSlop, -b2_maxAngularCorrection, 0.0f); + limitImpulse = -m_motorMass * C; + } + else if (m_limitState == e_atUpperLimit) + { + float32 C = angle - m_upperAngle; + angularError = C; + + // Prevent large angular corrections and allow some slop. + C = b2Clamp(C - b2_angularSlop, 0.0f, b2_maxAngularCorrection); + limitImpulse = -m_motorMass * C; + } + + b1->m_sweep.a -= b1->m_invI * limitImpulse; + b2->m_sweep.a += b2->m_invI * limitImpulse; + + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + } + + // Solve point-to-point constraint. + { + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + b2Vec2 C = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + positionError = C.Length(); + + float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; + float32 invI1 = b1->m_invI, invI2 = b2->m_invI; + + // Handle large detachment. + const float32 k_allowedStretch = 10.0f * b2_linearSlop; + if (C.LengthSquared() > k_allowedStretch * k_allowedStretch) + { + // Use a particle solution (no rotation). + b2Vec2 u = C; u.Normalize(); + float32 m = invMass1 + invMass2; + if (m > 0.0f) + { + m = 1.0f / m; + } + b2Vec2 impulse = m * (-C); + const float32 k_beta = 0.5f; + b1->m_sweep.c -= k_beta * invMass1 * impulse; + b2->m_sweep.c += k_beta * invMass2 * impulse; + + C = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + } + + b2Mat22 K1; + K1.col1.x = invMass1 + invMass2; K1.col2.x = 0.0f; + K1.col1.y = 0.0f; K1.col2.y = invMass1 + invMass2; + + b2Mat22 K2; + K2.col1.x = invI1 * r1.y * r1.y; K2.col2.x = -invI1 * r1.x * r1.y; + K2.col1.y = -invI1 * r1.x * r1.y; K2.col2.y = invI1 * r1.x * r1.x; + + b2Mat22 K3; + K3.col1.x = invI2 * r2.y * r2.y; K3.col2.x = -invI2 * r2.x * r2.y; + K3.col1.y = -invI2 * r2.x * r2.y; K3.col2.y = invI2 * r2.x * r2.x; + + b2Mat22 K = K1 + K2 + K3; + b2Vec2 impulse = K.Solve(-C); + + b1->m_sweep.c -= b1->m_invMass * impulse; + b1->m_sweep.a -= b1->m_invI * b2Cross(r1, impulse); + + b2->m_sweep.c += b2->m_invMass * impulse; + b2->m_sweep.a += b2->m_invI * b2Cross(r2, impulse); + + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + } + + return positionError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2RevoluteJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2RevoluteJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +b2Vec2 b2RevoluteJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 P(m_impulse.x, m_impulse.y); + return inv_dt * P; +} + +float32 b2RevoluteJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_impulse.z; +} + +float32 b2RevoluteJoint::GetJointAngle() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + return b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; +} + +float32 b2RevoluteJoint::GetJointSpeed() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + return b2->m_angularVelocity - b1->m_angularVelocity; +} + +bool b2RevoluteJoint::IsMotorEnabled() const +{ + return m_enableMotor; +} + +void b2RevoluteJoint::EnableMotor(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableMotor = flag; +} + +float32 b2RevoluteJoint::GetMotorTorque() const +{ + return m_motorImpulse; +} + +void b2RevoluteJoint::SetMotorSpeed(float32 speed) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_motorSpeed = speed; +} + +void b2RevoluteJoint::SetMaxMotorTorque(float32 torque) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_maxMotorTorque = torque; +} + +bool b2RevoluteJoint::IsLimitEnabled() const +{ + return m_enableLimit; +} + +void b2RevoluteJoint::EnableLimit(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableLimit = flag; +} + +float32 b2RevoluteJoint::GetLowerLimit() const +{ + return m_lowerAngle; +} + +float32 b2RevoluteJoint::GetUpperLimit() const +{ + return m_upperAngle; +} + +void b2RevoluteJoint::SetLimits(float32 lower, float32 upper) +{ + b2Assert(lower <= upper); + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_lowerAngle = lower; + m_upperAngle = upper; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2RevoluteJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2RevoluteJoint.h new file mode 100644 index 0000000..bf54b05 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2RevoluteJoint.h @@ -0,0 +1,174 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_REVOLUTE_JOINT_H +#define B2_REVOLUTE_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +/// Revolute joint definition. This requires defining an +/// anchor point where the bodies are joined. The definition +/// uses local anchor points so that the initial configuration +/// can violate the constraint slightly. You also need to +/// specify the initial relative angle for joint limits. This +/// helps when saving and loading a game. +/// The local anchor points are measured from the body's origin +/// rather than the center of mass because: +/// 1. you might not know where the center of mass will be. +/// 2. if you add/remove shapes from a body and recompute the mass, +/// the joints will be broken. +struct b2RevoluteJointDef : public b2JointDef +{ + b2RevoluteJointDef() + { + type = e_revoluteJoint; + localAnchorA.Set(0.0f, 0.0f); + localAnchorB.Set(0.0f, 0.0f); + referenceAngle = 0.0f; + lowerAngle = 0.0f; + upperAngle = 0.0f; + maxMotorTorque = 0.0f; + motorSpeed = 0.0f; + enableLimit = false; + enableMotor = false; + } + + /// Initialize the bodies, anchors, and reference angle using a world + /// anchor point. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); + + /// The local anchor point relative to body1's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to body2's origin. + b2Vec2 localAnchorB; + + /// The body2 angle minus body1 angle in the reference state (radians). + float32 referenceAngle; + + /// A flag to enable joint limits. + bool enableLimit; + + /// The lower angle for the joint limit (radians). + float32 lowerAngle; + + /// The upper angle for the joint limit (radians). + float32 upperAngle; + + /// A flag to enable the joint motor. + bool enableMotor; + + /// The desired motor speed. Usually in radians per second. + float32 motorSpeed; + + /// The maximum motor torque used to achieve the desired motor speed. + /// Usually in N-m. + float32 maxMotorTorque; +}; + +/// A revolute joint constrains two bodies to share a common point while they +/// are free to rotate about the point. The relative rotation about the shared +/// point is the joint angle. You can limit the relative rotation with +/// a joint limit that specifies a lower and upper angle. You can use a motor +/// to drive the relative rotation about the shared point. A maximum motor torque +/// is provided so that infinite forces are not generated. +class b2RevoluteJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Get the current joint angle in radians. + float32 GetJointAngle() const; + + /// Get the current joint angle speed in radians per second. + float32 GetJointSpeed() const; + + /// Is the joint limit enabled? + bool IsLimitEnabled() const; + + /// Enable/disable the joint limit. + void EnableLimit(bool flag); + + /// Get the lower joint limit in radians. + float32 GetLowerLimit() const; + + /// Get the upper joint limit in radians. + float32 GetUpperLimit() const; + + /// Set the joint limits in radians. + void SetLimits(float32 lower, float32 upper); + + /// Is the joint motor enabled? + bool IsMotorEnabled() const; + + /// Enable/disable the joint motor. + void EnableMotor(bool flag); + + /// Set the motor speed in radians per second. + void SetMotorSpeed(float32 speed); + + /// Get the motor speed in radians per second. + float32 GetMotorSpeed() const; + + /// Set the maximum motor torque, usually in N-m. + void SetMaxMotorTorque(float32 torque); + + /// Get the current motor torque, usually in N-m. + float32 GetMotorTorque() const; + +protected: + + friend class b2Joint; + friend class b2GearJoint; + + b2RevoluteJoint(const b2RevoluteJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchor1; // relative + b2Vec2 m_localAnchor2; + b2Vec3 m_impulse; + float32 m_motorImpulse; + + b2Mat33 m_mass; // effective mass for point-to-point constraint. + float32 m_motorMass; // effective mass for motor/limit angular constraint. + + bool m_enableMotor; + float32 m_maxMotorTorque; + float32 m_motorSpeed; + + bool m_enableLimit; + float32 m_referenceAngle; + float32 m_lowerAngle; + float32 m_upperAngle; + b2LimitState m_limitState; +}; + +inline float32 b2RevoluteJoint::GetMotorSpeed() const +{ + return m_motorSpeed; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2WeldJoint.cpp b/AndEngine/jni/Box2D/Dynamics/Joints/b2WeldJoint.cpp new file mode 100644 index 0000000..abe4ab3 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2WeldJoint.cpp @@ -0,0 +1,219 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/Joints/b2WeldJoint.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +// Point-to-point constraint +// C = p2 - p1 +// Cdot = v2 - v1 +// = v2 + cross(w2, r2) - v1 - cross(w1, r1) +// J = [-I -r1_skew I r2_skew ] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +// Angle constraint +// C = angle2 - angle1 - referenceAngle +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// K = invI1 + invI2 + +void b2WeldJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor) +{ + bodyA = bA; + bodyB = bB; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); +} + +b2WeldJoint::b2WeldJoint(const b2WeldJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + m_referenceAngle = def->referenceAngle; + + m_impulse.SetZero(); +} + +void b2WeldJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + // Compute the effective mass matrix. + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + + float32 mA = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + m_mass.col1.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + m_mass.col2.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + m_mass.col3.x = -rA.y * iA - rB.y * iB; + m_mass.col1.y = m_mass.col2.x; + m_mass.col2.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + m_mass.col3.y = rA.x * iA + rB.x * iB; + m_mass.col1.z = m_mass.col3.x; + m_mass.col2.z = m_mass.col3.y; + m_mass.col3.z = iA + iB; + + if (step.warmStarting) + { + // Scale impulses to support a variable time step. + m_impulse *= step.dtRatio; + + b2Vec2 P(m_impulse.x, m_impulse.y); + + bA->m_linearVelocity -= mA * P; + bA->m_angularVelocity -= iA * (b2Cross(rA, P) + m_impulse.z); + + bB->m_linearVelocity += mB * P; + bB->m_angularVelocity += iB * (b2Cross(rB, P) + m_impulse.z); + } + else + { + m_impulse.SetZero(); + } +} + +void b2WeldJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + B2_NOT_USED(step); + + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + b2Vec2 vA = bA->m_linearVelocity; + float32 wA = bA->m_angularVelocity; + b2Vec2 vB = bB->m_linearVelocity; + float32 wB = bB->m_angularVelocity; + + float32 mA = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + // Solve point-to-point constraint + b2Vec2 Cdot1 = vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA); + float32 Cdot2 = wB - wA; + b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); + + b2Vec3 impulse = m_mass.Solve33(-Cdot); + m_impulse += impulse; + + b2Vec2 P(impulse.x, impulse.y); + + vA -= mA * P; + wA -= iA * (b2Cross(rA, P) + impulse.z); + + vB += mB * P; + wB += iB * (b2Cross(rB, P) + impulse.z); + + bA->m_linearVelocity = vA; + bA->m_angularVelocity = wA; + bB->m_linearVelocity = vB; + bB->m_angularVelocity = wB; +} + +bool b2WeldJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + float32 mA = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + b2Vec2 C1 = bB->m_sweep.c + rB - bA->m_sweep.c - rA; + float32 C2 = bB->m_sweep.a - bA->m_sweep.a - m_referenceAngle; + + // Handle large detachment. + const float32 k_allowedStretch = 10.0f * b2_linearSlop; + float32 positionError = C1.Length(); + float32 angularError = b2Abs(C2); + if (positionError > k_allowedStretch) + { + iA *= 1.0f; + iB *= 1.0f; + } + + m_mass.col1.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + m_mass.col2.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + m_mass.col3.x = -rA.y * iA - rB.y * iB; + m_mass.col1.y = m_mass.col2.x; + m_mass.col2.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + m_mass.col3.y = rA.x * iA + rB.x * iB; + m_mass.col1.z = m_mass.col3.x; + m_mass.col2.z = m_mass.col3.y; + m_mass.col3.z = iA + iB; + + b2Vec3 C(C1.x, C1.y, C2); + + b2Vec3 impulse = m_mass.Solve33(-C); + + b2Vec2 P(impulse.x, impulse.y); + + bA->m_sweep.c -= mA * P; + bA->m_sweep.a -= iA * (b2Cross(rA, P) + impulse.z); + + bB->m_sweep.c += mB * P; + bB->m_sweep.a += iB * (b2Cross(rB, P) + impulse.z); + + bA->SynchronizeTransform(); + bB->SynchronizeTransform(); + + return positionError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2WeldJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2WeldJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2WeldJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 P(m_impulse.x, m_impulse.y); + return inv_dt * P; +} + +float32 b2WeldJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_impulse.z; +} diff --git a/AndEngine/jni/Box2D/Dynamics/Joints/b2WeldJoint.h b/AndEngine/jni/Box2D/Dynamics/Joints/b2WeldJoint.h new file mode 100644 index 0000000..a0face1 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/Joints/b2WeldJoint.h @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_WELD_JOINT_H +#define B2_WELD_JOINT_H + +#include "Box2D/Dynamics/Joints/b2Joint.h" + +/// Weld joint definition. You need to specify local anchor points +/// where they are attached and the relative body angle. The position +/// of the anchor points is important for computing the reaction torque. +struct b2WeldJointDef : public b2JointDef +{ + b2WeldJointDef() + { + type = e_weldJoint; + localAnchorA.Set(0.0f, 0.0f); + localAnchorB.Set(0.0f, 0.0f); + referenceAngle = 0.0f; + } + + /// Initialize the bodies, anchors, and reference angle using a world + /// anchor point. + void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& anchor); + + /// The local anchor point relative to body1's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to body2's origin. + b2Vec2 localAnchorB; + + /// The body2 angle minus body1 angle in the reference state (radians). + float32 referenceAngle; +}; + +/// A weld joint essentially glues two bodies together. A weld joint may +/// distort somewhat because the island constraint solver is approximate. +class b2WeldJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + +protected: + + friend class b2Joint; + + b2WeldJoint(const b2WeldJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + float32 m_referenceAngle; + + b2Vec3 m_impulse; + + b2Mat33 m_mass; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/b2Body.cpp b/AndEngine/jni/Box2D/Dynamics/b2Body.cpp new file mode 100644 index 0000000..729f5a6 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2Body.cpp @@ -0,0 +1,470 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2World.h" +#include "Box2D/Dynamics/Contacts/b2Contact.h" +#include "Box2D/Dynamics/Joints/b2Joint.h" + +b2Body::b2Body(const b2BodyDef* bd, b2World* world) +{ + b2Assert(bd->position.IsValid()); + b2Assert(bd->linearVelocity.IsValid()); + b2Assert(b2IsValid(bd->angle)); + b2Assert(b2IsValid(bd->angularVelocity)); + b2Assert(b2IsValid(bd->inertiaScale) && bd->inertiaScale >= 0.0f); + b2Assert(b2IsValid(bd->angularDamping) && bd->angularDamping >= 0.0f); + b2Assert(b2IsValid(bd->linearDamping) && bd->linearDamping >= 0.0f); + + m_flags = 0; + + if (bd->bullet) + { + m_flags |= e_bulletFlag; + } + if (bd->fixedRotation) + { + m_flags |= e_fixedRotationFlag; + } + if (bd->allowSleep) + { + m_flags |= e_autoSleepFlag; + } + if (bd->awake) + { + m_flags |= e_awakeFlag; + } + if (bd->active) + { + m_flags |= e_activeFlag; + } + + m_world = world; + + m_xf.position = bd->position; + m_xf.R.Set(bd->angle); + + m_sweep.localCenter.SetZero(); + m_sweep.a0 = m_sweep.a = bd->angle; + m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + + m_jointList = NULL; + m_contactList = NULL; + m_prev = NULL; + m_next = NULL; + + m_linearVelocity = bd->linearVelocity; + m_angularVelocity = bd->angularVelocity; + + m_linearDamping = bd->linearDamping; + m_angularDamping = bd->angularDamping; + + m_force.SetZero(); + m_torque = 0.0f; + + m_sleepTime = 0.0f; + + m_type = bd->type; + + if (m_type == b2_dynamicBody) + { + m_mass = 1.0f; + m_invMass = 1.0f; + } + else + { + m_mass = 0.0f; + m_invMass = 0.0f; + } + + m_I = 0.0f; + m_invI = 0.0f; + + m_userData = bd->userData; + + m_fixtureList = NULL; + m_fixtureCount = 0; +} + +b2Body::~b2Body() +{ + // shapes and joints are destroyed in b2World::Destroy +} + +void b2Body::SetType(b2BodyType type) +{ + if (m_type == type) + { + return; + } + + m_type = type; + + ResetMassData(); + + if (m_type == b2_staticBody) + { + m_linearVelocity.SetZero(); + m_angularVelocity = 0.0f; + } + + SetAwake(true); + + m_force.SetZero(); + m_torque = 0.0f; + + // Since the body type changed, we need to flag contacts for filtering. + for (b2ContactEdge* ce = m_contactList; ce; ce = ce->next) + { + ce->contact->FlagForFiltering(); + } +} + +b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return NULL; + } + + b2BlockAllocator* allocator = &m_world->m_blockAllocator; + + void* memory = allocator->Allocate(sizeof(b2Fixture)); + b2Fixture* fixture = new (memory) b2Fixture; + fixture->Create(allocator, this, def); + + if (m_flags & e_activeFlag) + { + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + fixture->CreateProxy(broadPhase, m_xf); + } + + fixture->m_next = m_fixtureList; + m_fixtureList = fixture; + ++m_fixtureCount; + + fixture->m_body = this; + + // Adjust mass properties if needed. + if (fixture->m_density > 0.0f) + { + ResetMassData(); + } + + // Let the world know we have a new fixture. This will cause new contacts + // to be created at the beginning of the next time step. + m_world->m_flags |= b2World::e_newFixture; + + return fixture; +} + +b2Fixture* b2Body::CreateFixture(const b2Shape* shape, float32 density) +{ + b2FixtureDef def; + def.shape = shape; + def.density = density; + + return CreateFixture(&def); +} + +void b2Body::DestroyFixture(b2Fixture* fixture) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return; + } + + b2Assert(fixture->m_body == this); + + // Remove the fixture from this body's singly linked list. + b2Assert(m_fixtureCount > 0); + b2Fixture** node = &m_fixtureList; + bool found = false; + while (*node != NULL) + { + if (*node == fixture) + { + *node = fixture->m_next; + found = true; + break; + } + + node = &(*node)->m_next; + } + + // You tried to remove a shape that is not attached to this body. + b2Assert(found); + + // Destroy any contacts associated with the fixture. + b2ContactEdge* edge = m_contactList; + while (edge) + { + b2Contact* c = edge->contact; + edge = edge->next; + + b2Fixture* fixtureA = c->GetFixtureA(); + b2Fixture* fixtureB = c->GetFixtureB(); + + if (fixture == fixtureA || fixture == fixtureB) + { + // This destroys the contact and removes it from + // this body's contact list. + m_world->m_contactManager.Destroy(c); + } + } + + b2BlockAllocator* allocator = &m_world->m_blockAllocator; + + if (m_flags & e_activeFlag) + { + b2Assert(fixture->m_proxyId != b2BroadPhase::e_nullProxy); + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + fixture->DestroyProxy(broadPhase); + } + else + { + b2Assert(fixture->m_proxyId == b2BroadPhase::e_nullProxy); + } + + fixture->Destroy(allocator); + fixture->m_body = NULL; + fixture->m_next = NULL; + fixture->~b2Fixture(); + allocator->Free(fixture, sizeof(b2Fixture)); + + --m_fixtureCount; + + // Reset the mass data. + ResetMassData(); +} + +void b2Body::ResetMassData() +{ + // Compute mass data from shapes. Each shape has its own density. + m_mass = 0.0f; + m_invMass = 0.0f; + m_I = 0.0f; + m_invI = 0.0f; + m_sweep.localCenter.SetZero(); + + // Static and kinematic bodies have zero mass. + if (m_type == b2_staticBody || m_type == b2_kinematicBody) + { + m_sweep.c0 = m_sweep.c = m_xf.position; + return; + } + + b2Assert(m_type == b2_dynamicBody); + + // Accumulate mass over all fixtures. + b2Vec2 center = b2Vec2_zero; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + if (f->m_density == 0.0f) + { + continue; + } + + b2MassData massData; + f->GetMassData(&massData); + m_mass += massData.mass; + center += massData.mass * massData.center; + m_I += massData.I; + } + + // Compute center of mass. + if (m_mass > 0.0f) + { + m_invMass = 1.0f / m_mass; + center *= m_invMass; + } + else + { + // Force all dynamic bodies to have a positive mass. + m_mass = 1.0f; + m_invMass = 1.0f; + } + + if (m_I > 0.0f && (m_flags & e_fixedRotationFlag) == 0) + { + // Center the inertia about the center of mass. + m_I -= m_mass * b2Dot(center, center); + b2Assert(m_I > 0.0f); + m_invI = 1.0f / m_I; + + } + else + { + m_I = 0.0f; + m_invI = 0.0f; + } + + // Move center of mass. + b2Vec2 oldCenter = m_sweep.c; + m_sweep.localCenter = center; + m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + + // Update center of mass velocity. + m_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter); +} + +void b2Body::SetMassData(const b2MassData* massData) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return; + } + + if (m_type != b2_dynamicBody) + { + return; + } + + m_invMass = 0.0f; + m_I = 0.0f; + m_invI = 0.0f; + + m_mass = massData->mass; + if (m_mass <= 0.0f) + { + m_mass = 1.0f; + } + + m_invMass = 1.0f / m_mass; + + if (massData->I > 0.0f && (m_flags & b2Body::e_fixedRotationFlag) == 0) + { + m_I = massData->I - m_mass * b2Dot(massData->center, massData->center); + b2Assert(m_I > 0.0f); + m_invI = 1.0f / m_I; + } + + // Move center of mass. + b2Vec2 oldCenter = m_sweep.c; + m_sweep.localCenter = massData->center; + m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + + // Update center of mass velocity. + m_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter); +} + +bool b2Body::ShouldCollide(const b2Body* other) const +{ + // At least one body should be dynamic. + if (m_type != b2_dynamicBody && other->m_type != b2_dynamicBody) + { + return false; + } + + // Does a joint prevent collision? + for (b2JointEdge* jn = m_jointList; jn; jn = jn->next) + { + if (jn->other == other) + { + if (jn->joint->m_collideConnected == false) + { + return false; + } + } + } + + return true; +} + +void b2Body::SetTransform(const b2Vec2& position, float32 angle) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return; + } + + m_xf.R.Set(angle); + m_xf.position = position; + + m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + m_sweep.a0 = m_sweep.a = angle; + + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + f->Synchronize(broadPhase, m_xf, m_xf); + } + + m_world->m_contactManager.FindNewContacts(); +} + +void b2Body::SynchronizeFixtures() +{ + b2Transform xf1; + xf1.R.Set(m_sweep.a0); + xf1.position = m_sweep.c0 - b2Mul(xf1.R, m_sweep.localCenter); + + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + f->Synchronize(broadPhase, xf1, m_xf); + } +} + +void b2Body::SetActive(bool flag) +{ + if (flag == IsActive()) + { + return; + } + + if (flag) + { + m_flags |= e_activeFlag; + + // Create all proxies. + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + f->CreateProxy(broadPhase, m_xf); + } + + // Contacts are created the next time step. + } + else + { + m_flags &= ~e_activeFlag; + + // Destroy all proxies. + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + f->DestroyProxy(broadPhase); + } + + // Destroy the attached contacts. + b2ContactEdge* ce = m_contactList; + while (ce) + { + b2ContactEdge* ce0 = ce; + ce = ce->next; + m_world->m_contactManager.Destroy(ce0->contact); + } + m_contactList = NULL; + } +} diff --git a/AndEngine/jni/Box2D/Dynamics/b2Body.h b/AndEngine/jni/Box2D/Dynamics/b2Body.h new file mode 100644 index 0000000..dce75a5 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2Body.h @@ -0,0 +1,802 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_BODY_H +#define B2_BODY_H + +#include "Box2D/Common/b2Math.h" +#include "Box2D/Collision/Shapes/b2Shape.h" +#include + +class b2Fixture; +class b2Joint; +class b2Contact; +class b2Controller; +class b2World; +struct b2FixtureDef; +struct b2JointEdge; +struct b2ContactEdge; + +/// The body type. +/// static: zero mass, zero velocity, may be manually moved +/// kinematic: zero mass, non-zero velocity set by user, moved by solver +/// dynamic: positive mass, non-zero velocity determined by forces, moved by solver +enum b2BodyType +{ + b2_staticBody = 0, + b2_kinematicBody, + b2_dynamicBody, +}; + +/// A body definition holds all the data needed to construct a rigid body. +/// You can safely re-use body definitions. Shapes are added to a body after construction. +struct b2BodyDef +{ + /// This constructor sets the body definition default values. + b2BodyDef() + { + userData = NULL; + position.Set(0.0f, 0.0f); + angle = 0.0f; + linearVelocity.Set(0.0f, 0.0f); + angularVelocity = 0.0f; + linearDamping = 0.0f; + angularDamping = 0.0f; + allowSleep = true; + awake = true; + fixedRotation = false; + bullet = false; + type = b2_staticBody; + active = true; + inertiaScale = 1.0f; + } + + /// The body type: static, kinematic, or dynamic. + /// Note: if a dynamic body would have zero mass, the mass is set to one. + b2BodyType type; + + /// The world position of the body. Avoid creating bodies at the origin + /// since this can lead to many overlapping shapes. + b2Vec2 position; + + /// The world angle of the body in radians. + float32 angle; + + /// The linear velocity of the body's origin in world co-ordinates. + b2Vec2 linearVelocity; + + /// The angular velocity of the body. + float32 angularVelocity; + + /// Linear damping is use to reduce the linear velocity. The damping parameter + /// can be larger than 1.0f but the damping effect becomes sensitive to the + /// time step when the damping parameter is large. + float32 linearDamping; + + /// Angular damping is use to reduce the angular velocity. The damping parameter + /// can be larger than 1.0f but the damping effect becomes sensitive to the + /// time step when the damping parameter is large. + float32 angularDamping; + + /// Set this flag to false if this body should never fall asleep. Note that + /// this increases CPU usage. + bool allowSleep; + + /// Is this body initially awake or sleeping? + bool awake; + + /// Should this body be prevented from rotating? Useful for characters. + bool fixedRotation; + + /// Is this a fast moving body that should be prevented from tunneling through + /// other moving bodies? Note that all bodies are prevented from tunneling through + /// kinematic and static bodies. This setting is only considered on dynamic bodies. + /// @warning You should use this flag sparingly since it increases processing time. + bool bullet; + + /// Does this body start out active? + bool active; + + /// Use this to store application specific body data. + void* userData; + + /// Experimental: scales the inertia tensor. + float32 inertiaScale; +}; + +/// A rigid body. These are created via b2World::CreateBody. +class b2Body +{ +public: + /// Creates a fixture and attach it to this body. Use this function if you need + /// to set some fixture parameters, like friction. Otherwise you can create the + /// fixture directly from a shape. + /// If the density is non-zero, this function automatically updates the mass of the body. + /// Contacts are not created until the next time step. + /// @param def the fixture definition. + /// @warning This function is locked during callbacks. + b2Fixture* CreateFixture(const b2FixtureDef* def); + + /// Creates a fixture from a shape and attach it to this body. + /// This is a convenience function. Use b2FixtureDef if you need to set parameters + /// like friction, restitution, user data, or filtering. + /// If the density is non-zero, this function automatically updates the mass of the body. + /// @param shape the shape to be cloned. + /// @param density the shape density (set to zero for static bodies). + /// @warning This function is locked during callbacks. + b2Fixture* CreateFixture(const b2Shape* shape, float32 density); + + /// Destroy a fixture. This removes the fixture from the broad-phase and + /// destroys all contacts associated with this fixture. This will + /// automatically adjust the mass of the body if the body is dynamic and the + /// fixture has positive density. + /// All fixtures attached to a body are implicitly destroyed when the body is destroyed. + /// @param fixture the fixture to be removed. + /// @warning This function is locked during callbacks. + void DestroyFixture(b2Fixture* fixture); + + /// Set the position of the body's origin and rotation. + /// This breaks any contacts and wakes the other bodies. + /// Manipulating a body's transform may cause non-physical behavior. + /// @param position the world position of the body's local origin. + /// @param angle the world rotation in radians. + void SetTransform(const b2Vec2& position, float32 angle); + + /// Get the body transform for the body's origin. + /// @return the world transform of the body's origin. + const b2Transform& GetTransform() const; + + /// Get the world body origin position. + /// @return the world position of the body's origin. + const b2Vec2& GetPosition() const; + + /// Get the angle in radians. + /// @return the current world rotation angle in radians. + float32 GetAngle() const; + + /// Get the world position of the center of mass. + const b2Vec2& GetWorldCenter() const; + + /// Get the local position of the center of mass. + const b2Vec2& GetLocalCenter() const; + + /// Set the linear velocity of the center of mass. + /// @param v the new linear velocity of the center of mass. + void SetLinearVelocity(const b2Vec2& v); + + /// Get the linear velocity of the center of mass. + /// @return the linear velocity of the center of mass. + b2Vec2 GetLinearVelocity() const; + + /// Set the angular velocity. + /// @param omega the new angular velocity in radians/second. + void SetAngularVelocity(float32 omega); + + /// Get the angular velocity. + /// @return the angular velocity in radians/second. + float32 GetAngularVelocity() const; + + /// Apply a force at a world point. If the force is not + /// applied at the center of mass, it will generate a torque and + /// affect the angular velocity. This wakes up the body. + /// @param force the world force vector, usually in Newtons (N). + /// @param point the world position of the point of application. + void ApplyForce(const b2Vec2& force, const b2Vec2& point); + + /// Apply a torque. This affects the angular velocity + /// without affecting the linear velocity of the center of mass. + /// This wakes up the body. + /// @param torque about the z-axis (out of the screen), usually in N-m. + void ApplyTorque(float32 torque); + + /// Apply an impulse at a point. This immediately modifies the velocity. + /// It also modifies the angular velocity if the point of application + /// is not at the center of mass. This wakes up the body. + /// @param impulse the world impulse vector, usually in N-seconds or kg-m/s. + /// @param point the world position of the point of application. + void ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point); + + /// Apply an angular impulse. + /// @param impulse the angular impulse in units of kg*m*m/s + void ApplyAngularImpulse(float32 impulse); + + /// Get the total mass of the body. + /// @return the mass, usually in kilograms (kg). + float32 GetMass() const; + + /// Get the rotational inertia of the body about the local origin. + /// @return the rotational inertia, usually in kg-m^2. + float32 GetInertia() const; + + /// Get the mass data of the body. + /// @return a struct containing the mass, inertia and center of the body. + void GetMassData(b2MassData* data) const; + + /// Set the mass properties to override the mass properties of the fixtures. + /// Note that this changes the center of mass position. + /// Note that creating or destroying fixtures can also alter the mass. + /// This function has no effect if the body isn't dynamic. + /// @param massData the mass properties. + void SetMassData(const b2MassData* data); + + /// This resets the mass properties to the sum of the mass properties of the fixtures. + /// This normally does not need to be called unless you called SetMassData to override + /// the mass and you later want to reset the mass. + void ResetMassData(); + + /// Get the world coordinates of a point given the local coordinates. + /// @param localPoint a point on the body measured relative the the body's origin. + /// @return the same point expressed in world coordinates. + b2Vec2 GetWorldPoint(const b2Vec2& localPoint) const; + + /// Get the world coordinates of a vector given the local coordinates. + /// @param localVector a vector fixed in the body. + /// @return the same vector expressed in world coordinates. + b2Vec2 GetWorldVector(const b2Vec2& localVector) const; + + /// Gets a local point relative to the body's origin given a world point. + /// @param a point in world coordinates. + /// @return the corresponding local point relative to the body's origin. + b2Vec2 GetLocalPoint(const b2Vec2& worldPoint) const; + + /// Gets a local vector given a world vector. + /// @param a vector in world coordinates. + /// @return the corresponding local vector. + b2Vec2 GetLocalVector(const b2Vec2& worldVector) const; + + /// Get the world linear velocity of a world point attached to this body. + /// @param a point in world coordinates. + /// @return the world velocity of a point. + b2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const; + + /// Get the world velocity of a local point. + /// @param a point in local coordinates. + /// @return the world velocity of a point. + b2Vec2 GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const; + + /// Get the linear damping of the body. + float32 GetLinearDamping() const; + + /// Set the linear damping of the body. + void SetLinearDamping(float32 linearDamping); + + /// Get the angular damping of the body. + float32 GetAngularDamping() const; + + /// Set the angular damping of the body. + void SetAngularDamping(float32 angularDamping); + + /// Set the type of this body. This may alter the mass and velocity. + void SetType(b2BodyType type); + + /// Get the type of this body. + b2BodyType GetType() const; + + /// Should this body be treated like a bullet for continuous collision detection? + void SetBullet(bool flag); + + /// Is this body treated like a bullet for continuous collision detection? + bool IsBullet() const; + + /// You can disable sleeping on this body. If you disable sleeping, the + /// body will be woken. + void SetSleepingAllowed(bool flag); + + /// Is this body allowed to sleep + bool IsSleepingAllowed() const; + + /// Set the sleep state of the body. A sleeping body has very + /// low CPU cost. + /// @param flag set to true to put body to sleep, false to wake it. + void SetAwake(bool flag); + + /// Get the sleeping state of this body. + /// @return true if the body is sleeping. + bool IsAwake() const; + + /// Set the active state of the body. An inactive body is not + /// simulated and cannot be collided with or woken up. + /// If you pass a flag of true, all fixtures will be added to the + /// broad-phase. + /// If you pass a flag of false, all fixtures will be removed from + /// the broad-phase and all contacts will be destroyed. + /// Fixtures and joints are otherwise unaffected. You may continue + /// to create/destroy fixtures and joints on inactive bodies. + /// Fixtures on an inactive body are implicitly inactive and will + /// not participate in collisions, ray-casts, or queries. + /// Joints connected to an inactive body are implicitly inactive. + /// An inactive body is still owned by a b2World object and remains + /// in the body list. + void SetActive(bool flag); + + /// Get the active state of the body. + bool IsActive() const; + + /// Set this body to have fixed rotation. This causes the mass + /// to be reset. + void SetFixedRotation(bool flag); + + /// Does this body have fixed rotation? + bool IsFixedRotation() const; + + /// Get the list of all fixtures attached to this body. + b2Fixture* GetFixtureList(); + const b2Fixture* GetFixtureList() const; + + /// Get the list of all joints attached to this body. + b2JointEdge* GetJointList(); + const b2JointEdge* GetJointList() const; + + /// Get the list of all contacts attached to this body. + /// @warning this list changes during the time step and you may + /// miss some collisions if you don't use b2ContactListener. + b2ContactEdge* GetContactList(); + const b2ContactEdge* GetContactList() const; + + /// Get the next body in the world's body list. + b2Body* GetNext(); + const b2Body* GetNext() const; + + /// Get the user data pointer that was provided in the body definition. + void* GetUserData() const; + + /// Set the user data. Use this to store your application specific data. + void SetUserData(void* data); + + /// Get the parent world of this body. + b2World* GetWorld(); + const b2World* GetWorld() const; + +private: + + friend class b2World; + friend class b2Island; + friend class b2ContactManager; + friend class b2ContactSolver; + friend class b2TOISolver; + + friend class b2DistanceJoint; + friend class b2GearJoint; + friend class b2LineJoint; + friend class b2MouseJoint; + friend class b2PrismaticJoint; + friend class b2PulleyJoint; + friend class b2RevoluteJoint; + friend class b2WeldJoint; + friend class b2FrictionJoint; + + // m_flags + enum + { + e_islandFlag = 0x0001, + e_awakeFlag = 0x0002, + e_autoSleepFlag = 0x0004, + e_bulletFlag = 0x0008, + e_fixedRotationFlag = 0x0010, + e_activeFlag = 0x0020, + e_toiFlag = 0x0040, + }; + + b2Body(const b2BodyDef* bd, b2World* world); + ~b2Body(); + + void SynchronizeFixtures(); + void SynchronizeTransform(); + + // This is used to prevent connected bodies from colliding. + // It may lie, depending on the collideConnected flag. + bool ShouldCollide(const b2Body* other) const; + + void Advance(float32 t); + + b2BodyType m_type; + + uint16 m_flags; + + int32 m_islandIndex; + + b2Transform m_xf; // the body origin transform + b2Sweep m_sweep; // the swept motion for CCD + + b2Vec2 m_linearVelocity; + float32 m_angularVelocity; + + b2Vec2 m_force; + float32 m_torque; + + b2World* m_world; + b2Body* m_prev; + b2Body* m_next; + + b2Fixture* m_fixtureList; + int32 m_fixtureCount; + + b2JointEdge* m_jointList; + b2ContactEdge* m_contactList; + + float32 m_mass, m_invMass; + + // Rotational inertia about the center of mass. + float32 m_I, m_invI; + + float32 m_linearDamping; + float32 m_angularDamping; + + float32 m_sleepTime; + + void* m_userData; +}; + +inline b2BodyType b2Body::GetType() const +{ + return m_type; +} + +inline const b2Transform& b2Body::GetTransform() const +{ + return m_xf; +} + +inline const b2Vec2& b2Body::GetPosition() const +{ + return m_xf.position; +} + +inline float32 b2Body::GetAngle() const +{ + return m_sweep.a; +} + +inline const b2Vec2& b2Body::GetWorldCenter() const +{ + return m_sweep.c; +} + +inline const b2Vec2& b2Body::GetLocalCenter() const +{ + return m_sweep.localCenter; +} + +inline void b2Body::SetLinearVelocity(const b2Vec2& v) +{ + if (m_type == b2_staticBody) + { + return; + } + + if (b2Dot(v,v) > 0.0f) + { + SetAwake(true); + } + + m_linearVelocity = v; +} + +inline b2Vec2 b2Body::GetLinearVelocity() const +{ + return m_linearVelocity; +} + +inline void b2Body::SetAngularVelocity(float32 w) +{ + if (m_type == b2_staticBody) + { + return; + } + + if (w * w > 0.0f) + { + SetAwake(true); + } + + m_angularVelocity = w; +} + +inline float32 b2Body::GetAngularVelocity() const +{ + return m_angularVelocity; +} + +inline float32 b2Body::GetMass() const +{ + return m_mass; +} + +inline float32 b2Body::GetInertia() const +{ + return m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter); +} + +inline void b2Body::GetMassData(b2MassData* data) const +{ + data->mass = m_mass; + data->I = m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter); + data->center = m_sweep.localCenter; +} + +inline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const +{ + return b2Mul(m_xf, localPoint); +} + +inline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const +{ + return b2Mul(m_xf.R, localVector); +} + +inline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const +{ + return b2MulT(m_xf, worldPoint); +} + +inline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const +{ + return b2MulT(m_xf.R, worldVector); +} + +inline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const +{ + return m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c); +} + +inline b2Vec2 b2Body::GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const +{ + return GetLinearVelocityFromWorldPoint(GetWorldPoint(localPoint)); +} + +inline float32 b2Body::GetLinearDamping() const +{ + return m_linearDamping; +} + +inline void b2Body::SetLinearDamping(float32 linearDamping) +{ + m_linearDamping = linearDamping; +} + +inline float32 b2Body::GetAngularDamping() const +{ + return m_angularDamping; +} + +inline void b2Body::SetAngularDamping(float32 angularDamping) +{ + m_angularDamping = angularDamping; +} + +inline void b2Body::SetBullet(bool flag) +{ + if (flag) + { + m_flags |= e_bulletFlag; + } + else + { + m_flags &= ~e_bulletFlag; + } +} + +inline bool b2Body::IsBullet() const +{ + return (m_flags & e_bulletFlag) == e_bulletFlag; +} + +inline void b2Body::SetAwake(bool flag) +{ + if (flag) + { + if ((m_flags & e_awakeFlag) == 0) + { + m_flags |= e_awakeFlag; + m_sleepTime = 0.0f; + } + } + else + { + m_flags &= ~e_awakeFlag; + m_sleepTime = 0.0f; + m_linearVelocity.SetZero(); + m_angularVelocity = 0.0f; + m_force.SetZero(); + m_torque = 0.0f; + } +} + +inline bool b2Body::IsAwake() const +{ + return (m_flags & e_awakeFlag) == e_awakeFlag; +} + +inline bool b2Body::IsActive() const +{ + return (m_flags & e_activeFlag) == e_activeFlag; +} + +inline void b2Body::SetFixedRotation(bool flag) +{ + if (flag) + { + m_flags |= e_fixedRotationFlag; + } + else + { + m_flags &= ~e_fixedRotationFlag; + } + + ResetMassData(); +} + +inline bool b2Body::IsFixedRotation() const +{ + return (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag; +} + +inline void b2Body::SetSleepingAllowed(bool flag) +{ + if (flag) + { + m_flags |= e_autoSleepFlag; + } + else + { + m_flags &= ~e_autoSleepFlag; + SetAwake(true); + } +} + +inline bool b2Body::IsSleepingAllowed() const +{ + return (m_flags & e_autoSleepFlag) == e_autoSleepFlag; +} + +inline b2Fixture* b2Body::GetFixtureList() +{ + return m_fixtureList; +} + +inline const b2Fixture* b2Body::GetFixtureList() const +{ + return m_fixtureList; +} + +inline b2JointEdge* b2Body::GetJointList() +{ + return m_jointList; +} + +inline const b2JointEdge* b2Body::GetJointList() const +{ + return m_jointList; +} + +inline b2ContactEdge* b2Body::GetContactList() +{ + return m_contactList; +} + +inline const b2ContactEdge* b2Body::GetContactList() const +{ + return m_contactList; +} + +inline b2Body* b2Body::GetNext() +{ + return m_next; +} + +inline const b2Body* b2Body::GetNext() const +{ + return m_next; +} + +inline void b2Body::SetUserData(void* data) +{ + m_userData = data; +} + +inline void* b2Body::GetUserData() const +{ + return m_userData; +} + +inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + + m_force += force; + m_torque += b2Cross(point - m_sweep.c, force); +} + +inline void b2Body::ApplyTorque(float32 torque) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + + m_torque += torque; +} + +inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + m_linearVelocity += m_invMass * impulse; + m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse); +} + +inline void b2Body::ApplyAngularImpulse(float32 impulse) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + m_angularVelocity += m_invI * impulse; +} + +inline void b2Body::SynchronizeTransform() +{ + m_xf.R.Set(m_sweep.a); + m_xf.position = m_sweep.c - b2Mul(m_xf.R, m_sweep.localCenter); +} + +inline void b2Body::Advance(float32 t) +{ + // Advance to the new safe time. + m_sweep.Advance(t); + m_sweep.c = m_sweep.c0; + m_sweep.a = m_sweep.a0; + SynchronizeTransform(); +} + +inline b2World* b2Body::GetWorld() +{ + return m_world; +} + +inline const b2World* b2Body::GetWorld() const +{ + return m_world; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/b2ContactManager.cpp b/AndEngine/jni/Box2D/Dynamics/b2ContactManager.cpp new file mode 100644 index 0000000..7ebe11e --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2ContactManager.cpp @@ -0,0 +1,266 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/b2ContactManager.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2WorldCallbacks.h" +#include "Box2D/Dynamics/Contacts/b2Contact.h" + +b2ContactFilter b2_defaultFilter; +b2ContactListener b2_defaultListener; + +b2ContactManager::b2ContactManager() +{ + m_contactList = NULL; + m_contactCount = 0; + m_contactFilter = &b2_defaultFilter; + m_contactListener = &b2_defaultListener; + m_allocator = NULL; +} + +void b2ContactManager::Destroy(b2Contact* c) +{ + b2Fixture* fixtureA = c->GetFixtureA(); + b2Fixture* fixtureB = c->GetFixtureB(); + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + + if (m_contactListener && c->IsTouching()) + { + m_contactListener->EndContact(c); + } + + // Remove from the world. + if (c->m_prev) + { + c->m_prev->m_next = c->m_next; + } + + if (c->m_next) + { + c->m_next->m_prev = c->m_prev; + } + + if (c == m_contactList) + { + m_contactList = c->m_next; + } + + // Remove from body 1 + if (c->m_nodeA.prev) + { + c->m_nodeA.prev->next = c->m_nodeA.next; + } + + if (c->m_nodeA.next) + { + c->m_nodeA.next->prev = c->m_nodeA.prev; + } + + if (&c->m_nodeA == bodyA->m_contactList) + { + bodyA->m_contactList = c->m_nodeA.next; + } + + // Remove from body 2 + if (c->m_nodeB.prev) + { + c->m_nodeB.prev->next = c->m_nodeB.next; + } + + if (c->m_nodeB.next) + { + c->m_nodeB.next->prev = c->m_nodeB.prev; + } + + if (&c->m_nodeB == bodyB->m_contactList) + { + bodyB->m_contactList = c->m_nodeB.next; + } + + // Call the factory. + b2Contact::Destroy(c, m_allocator); + --m_contactCount; +} + +// This is the top level collision call for the time step. Here +// all the narrow phase collision is processed for the world +// contact list. +void b2ContactManager::Collide() +{ + // Update awake contacts. + b2Contact* c = m_contactList; + while (c) + { + b2Fixture* fixtureA = c->GetFixtureA(); + b2Fixture* fixtureB = c->GetFixtureB(); + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + + if (bodyA->IsAwake() == false && bodyB->IsAwake() == false) + { + c = c->GetNext(); + continue; + } + + // Is this contact flagged for filtering? + if (c->m_flags & b2Contact::e_filterFlag) + { + // Should these bodies collide? + if (bodyB->ShouldCollide(bodyA) == false) + { + b2Contact* cNuke = c; + c = cNuke->GetNext(); + Destroy(cNuke); + continue; + } + + // Check user filtering. + if (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false) + { + b2Contact* cNuke = c; + c = cNuke->GetNext(); + Destroy(cNuke); + continue; + } + + // Clear the filtering flag. + c->m_flags &= ~b2Contact::e_filterFlag; + } + + int32 proxyIdA = fixtureA->m_proxyId; + int32 proxyIdB = fixtureB->m_proxyId; + bool overlap = m_broadPhase.TestOverlap(proxyIdA, proxyIdB); + + // Here we destroy contacts that cease to overlap in the broad-phase. + if (overlap == false) + { + b2Contact* cNuke = c; + c = cNuke->GetNext(); + Destroy(cNuke); + continue; + } + + // The contact persists. + c->Update(m_contactListener); + c = c->GetNext(); + } +} + +void b2ContactManager::FindNewContacts() +{ + m_broadPhase.UpdatePairs(this); +} + +void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB) +{ + b2Fixture* fixtureA = (b2Fixture*)proxyUserDataA; + b2Fixture* fixtureB = (b2Fixture*)proxyUserDataB; + + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + + // Are the fixtures on the same body? + if (bodyA == bodyB) + { + return; + } + + // Does a contact already exist? + b2ContactEdge* edge = bodyB->GetContactList(); + while (edge) + { + if (edge->other == bodyA) + { + b2Fixture* fA = edge->contact->GetFixtureA(); + b2Fixture* fB = edge->contact->GetFixtureB(); + if (fA == fixtureA && fB == fixtureB) + { + // A contact already exists. + return; + } + + if (fA == fixtureB && fB == fixtureA) + { + // A contact already exists. + return; + } + } + + edge = edge->next; + } + + // Does a joint override collision? Is at least one body dynamic? + if (bodyB->ShouldCollide(bodyA) == false) + { + return; + } + + // Check user filtering. + if (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false) + { + return; + } + + // Call the factory. + b2Contact* c = b2Contact::Create(fixtureA, fixtureB, m_allocator); + + // Contact creation may swap fixtures. + fixtureA = c->GetFixtureA(); + fixtureB = c->GetFixtureB(); + bodyA = fixtureA->GetBody(); + bodyB = fixtureB->GetBody(); + + // Insert into the world. + c->m_prev = NULL; + c->m_next = m_contactList; + if (m_contactList != NULL) + { + m_contactList->m_prev = c; + } + m_contactList = c; + + // Connect to island graph. + + // Connect to body A + c->m_nodeA.contact = c; + c->m_nodeA.other = bodyB; + + c->m_nodeA.prev = NULL; + c->m_nodeA.next = bodyA->m_contactList; + if (bodyA->m_contactList != NULL) + { + bodyA->m_contactList->prev = &c->m_nodeA; + } + bodyA->m_contactList = &c->m_nodeA; + + // Connect to body B + c->m_nodeB.contact = c; + c->m_nodeB.other = bodyA; + + c->m_nodeB.prev = NULL; + c->m_nodeB.next = bodyB->m_contactList; + if (bodyB->m_contactList != NULL) + { + bodyB->m_contactList->prev = &c->m_nodeB; + } + bodyB->m_contactList = &c->m_nodeB; + + ++m_contactCount; +} diff --git a/AndEngine/jni/Box2D/Dynamics/b2ContactManager.h b/AndEngine/jni/Box2D/Dynamics/b2ContactManager.h new file mode 100644 index 0000000..54ed85f --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2ContactManager.h @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_CONTACT_MANAGER_H +#define B2_CONTACT_MANAGER_H + +#include "Box2D/Collision/b2BroadPhase.h" + +class b2Contact; +class b2ContactFilter; +class b2ContactListener; +class b2BlockAllocator; + +// Delegate of b2World. +class b2ContactManager +{ +public: + b2ContactManager(); + + // Broad-phase callback. + void AddPair(void* proxyUserDataA, void* proxyUserDataB); + + void FindNewContacts(); + + void Destroy(b2Contact* c); + + void Collide(); + + b2BroadPhase m_broadPhase; + b2Contact* m_contactList; + int32 m_contactCount; + b2ContactFilter* m_contactFilter; + b2ContactListener* m_contactListener; + b2BlockAllocator* m_allocator; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/b2Fixture.cpp b/AndEngine/jni/Box2D/Dynamics/b2Fixture.cpp new file mode 100644 index 0000000..ec22469 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2Fixture.cpp @@ -0,0 +1,163 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/Contacts/b2Contact.h" +#include "Box2D/Collision/Shapes/b2CircleShape.h" +#include "Box2D/Collision/Shapes/b2PolygonShape.h" +#include "Box2D/Collision/b2BroadPhase.h" +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Common/b2BlockAllocator.h" + + +b2Fixture::b2Fixture() +{ + m_userData = NULL; + m_body = NULL; + m_next = NULL; + m_proxyId = b2BroadPhase::e_nullProxy; + m_shape = NULL; + m_density = 0.0f; +} + +b2Fixture::~b2Fixture() +{ + b2Assert(m_shape == NULL); + b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); +} + +void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def) +{ + m_userData = def->userData; + m_friction = def->friction; + m_restitution = def->restitution; + + m_body = body; + m_next = NULL; + + m_filter = def->filter; + + m_isSensor = def->isSensor; + + m_shape = def->shape->Clone(allocator); + + m_density = def->density; +} + +void b2Fixture::Destroy(b2BlockAllocator* allocator) +{ + // The proxy must be destroyed before calling this. + b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); + + // Free the child shape. + switch (m_shape->m_type) + { + case b2Shape::e_circle: + { + b2CircleShape* s = (b2CircleShape*)m_shape; + s->~b2CircleShape(); + allocator->Free(s, sizeof(b2CircleShape)); + } + break; + + case b2Shape::e_polygon: + { + b2PolygonShape* s = (b2PolygonShape*)m_shape; + s->~b2PolygonShape(); + allocator->Free(s, sizeof(b2PolygonShape)); + } + break; + + default: + b2Assert(false); + break; + } + + m_shape = NULL; +} + +void b2Fixture::CreateProxy(b2BroadPhase* broadPhase, const b2Transform& xf) +{ + b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); + + // Create proxy in the broad-phase. + m_shape->ComputeAABB(&m_aabb, xf); + m_proxyId = broadPhase->CreateProxy(m_aabb, this); +} + +void b2Fixture::DestroyProxy(b2BroadPhase* broadPhase) +{ + if (m_proxyId == b2BroadPhase::e_nullProxy) + { + return; + } + + // Destroy proxy in the broad-phase. + broadPhase->DestroyProxy(m_proxyId); + m_proxyId = b2BroadPhase::e_nullProxy; +} + +void b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2) +{ + if (m_proxyId == b2BroadPhase::e_nullProxy) + { + return; + } + + // Compute an AABB that covers the swept shape (may miss some rotation effect). + b2AABB aabb1, aabb2; + m_shape->ComputeAABB(&aabb1, transform1); + m_shape->ComputeAABB(&aabb2, transform2); + + m_aabb.Combine(aabb1, aabb2); + + b2Vec2 displacement = transform2.position - transform1.position; + + broadPhase->MoveProxy(m_proxyId, m_aabb, displacement); +} + +void b2Fixture::SetFilterData(const b2Filter& filter) +{ + m_filter = filter; + + if (m_body == NULL) + { + return; + } + + // Flag associated contacts for filtering. + b2ContactEdge* edge = m_body->GetContactList(); + while (edge) + { + b2Contact* contact = edge->contact; + b2Fixture* fixtureA = contact->GetFixtureA(); + b2Fixture* fixtureB = contact->GetFixtureB(); + if (fixtureA == this || fixtureB == this) + { + contact->FlagForFiltering(); + } + + edge = edge->next; + } +} + +void b2Fixture::SetSensor(bool sensor) +{ + m_isSensor = sensor; +} + diff --git a/AndEngine/jni/Box2D/Dynamics/b2Fixture.h b/AndEngine/jni/Box2D/Dynamics/b2Fixture.h new file mode 100644 index 0000000..dc8ac4e --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2Fixture.h @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_FIXTURE_H +#define B2_FIXTURE_H + +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/Shapes/b2Shape.h" + +class b2BlockAllocator; +class b2Body; +class b2BroadPhase; + +/// This holds contact filtering data. +struct b2Filter +{ + /// The collision category bits. Normally you would just set one bit. + uint16 categoryBits; + + /// The collision mask bits. This states the categories that this + /// shape would accept for collision. + uint16 maskBits; + + /// Collision groups allow a certain group of objects to never collide (negative) + /// or always collide (positive). Zero means no collision group. Non-zero group + /// filtering always wins against the mask bits. + int16 groupIndex; +}; + +/// A fixture definition is used to create a fixture. This class defines an +/// abstract fixture definition. You can reuse fixture definitions safely. +struct b2FixtureDef +{ + /// The constructor sets the default fixture definition values. + b2FixtureDef() + { + shape = NULL; + userData = NULL; + friction = 0.2f; + restitution = 0.0f; + density = 0.0f; + filter.categoryBits = 0x0001; + filter.maskBits = 0xFFFF; + filter.groupIndex = 0; + isSensor = false; + } + + virtual ~b2FixtureDef() {} + + /// The shape, this must be set. The shape will be cloned, so you + /// can create the shape on the stack. + const b2Shape* shape; + + /// Use this to store application specific fixture data. + void* userData; + + /// The friction coefficient, usually in the range [0,1]. + float32 friction; + + /// The restitution (elasticity) usually in the range [0,1]. + float32 restitution; + + /// The density, usually in kg/m^2. + float32 density; + + /// A sensor shape collects contact information but never generates a collision + /// response. + bool isSensor; + + /// Contact filtering data. + b2Filter filter; +}; + + +/// A fixture is used to attach a shape to a body for collision detection. A fixture +/// inherits its transform from its parent. Fixtures hold additional non-geometric data +/// such as friction, collision filters, etc. +/// Fixtures are created via b2Body::CreateFixture. +/// @warning you cannot reuse fixtures. +class b2Fixture +{ +public: + /// Get the type of the child shape. You can use this to down cast to the concrete shape. + /// @return the shape type. + b2Shape::Type GetType() const; + + /// Get the child shape. You can modify the child shape, however you should not change the + /// number of vertices because this will crash some collision caching mechanisms. + /// Manipulating the shape may lead to non-physical behavior. + b2Shape* GetShape(); + const b2Shape* GetShape() const; + + /// Set if this fixture is a sensor. + void SetSensor(bool sensor); + + /// Is this fixture a sensor (non-solid)? + /// @return the true if the shape is a sensor. + bool IsSensor() const; + + /// Set the contact filtering data. This will not update contacts until the next time + /// step when either parent body is active and awake. + void SetFilterData(const b2Filter& filter); + + /// Get the contact filtering data. + const b2Filter& GetFilterData() const; + + /// Get the parent body of this fixture. This is NULL if the fixture is not attached. + /// @return the parent body. + b2Body* GetBody(); + const b2Body* GetBody() const; + + /// Get the next fixture in the parent body's fixture list. + /// @return the next shape. + b2Fixture* GetNext(); + const b2Fixture* GetNext() const; + + /// Get the user data that was assigned in the fixture definition. Use this to + /// store your application specific data. + void* GetUserData() const; + + /// Set the user data. Use this to store your application specific data. + void SetUserData(void* data); + + /// Test a point for containment in this fixture. + /// @param xf the shape world transform. + /// @param p a point in world coordinates. + bool TestPoint(const b2Vec2& p) const; + + /// Cast a ray against this shape. + /// @param output the ray-cast results. + /// @param input the ray-cast input parameters. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const; + + /// Get the mass data for this fixture. The mass data is based on the density and + /// the shape. The rotational inertia is about the shape's origin. This operation + /// may be expensive. + void GetMassData(b2MassData* massData) const; + + /// Set the density of this fixture. This will _not_ automatically adjust the mass + /// of the body. You must call b2Body::ResetMassData to update the body's mass. + void SetDensity(float32 density); + + /// Get the density of this fixture. + float32 GetDensity() const; + + /// Get the coefficient of friction. + float32 GetFriction() const; + + /// Set the coefficient of friction. + void SetFriction(float32 friction); + + /// Get the coefficient of restitution. + float32 GetRestitution() const; + + /// Set the coefficient of restitution. + void SetRestitution(float32 restitution); + + /// Get the fixture's AABB. This AABB may be enlarge and/or stale. + /// If you need a more accurate AABB, compute it using the shape and + /// the body transform. + const b2AABB& GetAABB() const; + +protected: + + friend class b2Body; + friend class b2World; + friend class b2Contact; + friend class b2ContactManager; + + b2Fixture(); + ~b2Fixture(); + + // We need separation create/destroy functions from the constructor/destructor because + // the destructor cannot access the allocator (no destructor arguments allowed by C++). + void Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def); + void Destroy(b2BlockAllocator* allocator); + + // These support body activation/deactivation. + void CreateProxy(b2BroadPhase* broadPhase, const b2Transform& xf); + void DestroyProxy(b2BroadPhase* broadPhase); + + void Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2); + + b2AABB m_aabb; + + float32 m_density; + + b2Fixture* m_next; + b2Body* m_body; + + b2Shape* m_shape; + + float32 m_friction; + float32 m_restitution; + + int32 m_proxyId; + b2Filter m_filter; + + bool m_isSensor; + + void* m_userData; +}; + +inline b2Shape::Type b2Fixture::GetType() const +{ + return m_shape->GetType(); +} + +inline b2Shape* b2Fixture::GetShape() +{ + return m_shape; +} + +inline const b2Shape* b2Fixture::GetShape() const +{ + return m_shape; +} + +inline bool b2Fixture::IsSensor() const +{ + return m_isSensor; +} + +inline const b2Filter& b2Fixture::GetFilterData() const +{ + return m_filter; +} + +inline void* b2Fixture::GetUserData() const +{ + return m_userData; +} + +inline void b2Fixture::SetUserData(void* data) +{ + m_userData = data; +} + +inline b2Body* b2Fixture::GetBody() +{ + return m_body; +} + +inline const b2Body* b2Fixture::GetBody() const +{ + return m_body; +} + +inline b2Fixture* b2Fixture::GetNext() +{ + return m_next; +} + +inline const b2Fixture* b2Fixture::GetNext() const +{ + return m_next; +} + +inline void b2Fixture::SetDensity(float32 density) +{ + b2Assert(b2IsValid(density) && density >= 0.0f); + m_density = density; +} + +inline float32 b2Fixture::GetDensity() const +{ + return m_density; +} + +inline float32 b2Fixture::GetFriction() const +{ + return m_friction; +} + +inline void b2Fixture::SetFriction(float32 friction) +{ + m_friction = friction; +} + +inline float32 b2Fixture::GetRestitution() const +{ + return m_restitution; +} + +inline void b2Fixture::SetRestitution(float32 restitution) +{ + m_restitution = restitution; +} + +inline bool b2Fixture::TestPoint(const b2Vec2& p) const +{ + return m_shape->TestPoint(m_body->GetTransform(), p); +} + +inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const +{ + return m_shape->RayCast(output, input, m_body->GetTransform()); +} + +inline void b2Fixture::GetMassData(b2MassData* massData) const +{ + m_shape->ComputeMass(massData, m_density); +} + +inline const b2AABB& b2Fixture::GetAABB() const +{ + return m_aabb; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/b2Island.cpp b/AndEngine/jni/Box2D/Dynamics/b2Island.cpp new file mode 100644 index 0000000..2d36510 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2Island.cpp @@ -0,0 +1,374 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/b2Island.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2World.h" +#include "Box2D/Dynamics/Contacts/b2Contact.h" +#include "Box2D/Dynamics/Contacts/b2ContactSolver.h" +#include "Box2D/Dynamics/Joints/b2Joint.h" +#include "Box2D/Common/b2StackAllocator.h" + +/* +Position Correction Notes +========================= +I tried the several algorithms for position correction of the 2D revolute joint. +I looked at these systems: +- simple pendulum (1m diameter sphere on massless 5m stick) with initial angular velocity of 100 rad/s. +- suspension bridge with 30 1m long planks of length 1m. +- multi-link chain with 30 1m long links. + +Here are the algorithms: + +Baumgarte - A fraction of the position error is added to the velocity error. There is no +separate position solver. + +Pseudo Velocities - After the velocity solver and position integration, +the position error, Jacobian, and effective mass are recomputed. Then +the velocity constraints are solved with pseudo velocities and a fraction +of the position error is added to the pseudo velocity error. The pseudo +velocities are initialized to zero and there is no warm-starting. After +the position solver, the pseudo velocities are added to the positions. +This is also called the First Order World method or the Position LCP method. + +Modified Nonlinear Gauss-Seidel (NGS) - Like Pseudo Velocities except the +position error is re-computed for each constraint and the positions are updated +after the constraint is solved. The radius vectors (aka Jacobians) are +re-computed too (otherwise the algorithm has horrible instability). The pseudo +velocity states are not needed because they are effectively zero at the beginning +of each iteration. Since we have the current position error, we allow the +iterations to terminate early if the error becomes smaller than b2_linearSlop. + +Full NGS or just NGS - Like Modified NGS except the effective mass are re-computed +each time a constraint is solved. + +Here are the results: +Baumgarte - this is the cheapest algorithm but it has some stability problems, +especially with the bridge. The chain links separate easily close to the root +and they jitter as they struggle to pull together. This is one of the most common +methods in the field. The big drawback is that the position correction artificially +affects the momentum, thus leading to instabilities and false bounce. I used a +bias factor of 0.2. A larger bias factor makes the bridge less stable, a smaller +factor makes joints and contacts more spongy. + +Pseudo Velocities - the is more stable than the Baumgarte method. The bridge is +stable. However, joints still separate with large angular velocities. Drag the +simple pendulum in a circle quickly and the joint will separate. The chain separates +easily and does not recover. I used a bias factor of 0.2. A larger value lead to +the bridge collapsing when a heavy cube drops on it. + +Modified NGS - this algorithm is better in some ways than Baumgarte and Pseudo +Velocities, but in other ways it is worse. The bridge and chain are much more +stable, but the simple pendulum goes unstable at high angular velocities. + +Full NGS - stable in all tests. The joints display good stiffness. The bridge +still sags, but this is better than infinite forces. + +Recommendations +Pseudo Velocities are not really worthwhile because the bridge and chain cannot +recover from joint separation. In other cases the benefit over Baumgarte is small. + +Modified NGS is not a robust method for the revolute joint due to the violent +instability seen in the simple pendulum. Perhaps it is viable with other constraint +types, especially scalar constraints where the effective mass is a scalar. + +This leaves Baumgarte and Full NGS. Baumgarte has small, but manageable instabilities +and is very fast. I don't think we can escape Baumgarte, especially in highly +demanding cases where high constraint fidelity is not needed. + +Full NGS is robust and easy on the eyes. I recommend this as an option for +higher fidelity simulation and certainly for suspension bridges and long chains. +Full NGS might be a good choice for ragdolls, especially motorized ragdolls where +joint separation can be problematic. The number of NGS iterations can be reduced +for better performance without harming robustness much. + +Each joint in a can be handled differently in the position solver. So I recommend +a system where the user can select the algorithm on a per joint basis. I would +probably default to the slower Full NGS and let the user select the faster +Baumgarte method in performance critical scenarios. +*/ + +/* +Cache Performance + +The Box2D solvers are dominated by cache misses. Data structures are designed +to increase the number of cache hits. Much of misses are due to random access +to body data. The constraint structures are iterated over linearly, which leads +to few cache misses. + +The bodies are not accessed during iteration. Instead read only data, such as +the mass values are stored with the constraints. The mutable data are the constraint +impulses and the bodies velocities/positions. The impulses are held inside the +constraint structures. The body velocities/positions are held in compact, temporary +arrays to increase the number of cache hits. Linear and angular velocity are +stored in a single array since multiple arrays lead to multiple misses. +*/ + +/* +2D Rotation + +R = [cos(theta) -sin(theta)] + [sin(theta) cos(theta) ] + +thetaDot = omega + +Let q1 = cos(theta), q2 = sin(theta). +R = [q1 -q2] + [q2 q1] + +q1Dot = -thetaDot * q2 +q2Dot = thetaDot * q1 + +q1_new = q1_old - dt * w * q2 +q2_new = q2_old + dt * w * q1 +then normalize. + +This might be faster than computing sin+cos. +However, we can compute sin+cos of the same angle fast. +*/ + +b2Island::b2Island( + int32 bodyCapacity, + int32 contactCapacity, + int32 jointCapacity, + b2StackAllocator* allocator, + b2ContactListener* listener) +{ + m_bodyCapacity = bodyCapacity; + m_contactCapacity = contactCapacity; + m_jointCapacity = jointCapacity; + m_bodyCount = 0; + m_contactCount = 0; + m_jointCount = 0; + + m_allocator = allocator; + m_listener = listener; + + m_bodies = (b2Body**)m_allocator->Allocate(bodyCapacity * sizeof(b2Body*)); + m_contacts = (b2Contact**)m_allocator->Allocate(contactCapacity * sizeof(b2Contact*)); + m_joints = (b2Joint**)m_allocator->Allocate(jointCapacity * sizeof(b2Joint*)); + + m_velocities = (b2Velocity*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Velocity)); + m_positions = (b2Position*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Position)); +} + +b2Island::~b2Island() +{ + // Warning: the order should reverse the constructor order. + m_allocator->Free(m_positions); + m_allocator->Free(m_velocities); + m_allocator->Free(m_joints); + m_allocator->Free(m_contacts); + m_allocator->Free(m_bodies); +} + +void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep) +{ + // Integrate velocities and apply damping. + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* b = m_bodies[i]; + + if (b->GetType() != b2_dynamicBody) + { + continue; + } + + // Integrate velocities. + b->m_linearVelocity += step.dt * (gravity + b->m_invMass * b->m_force); + b->m_angularVelocity += step.dt * b->m_invI * b->m_torque; + + // Apply damping. + // ODE: dv/dt + c * v = 0 + // Solution: v(t) = v0 * exp(-c * t) + // Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt) + // v2 = exp(-c * dt) * v1 + // Taylor expansion: + // v2 = (1.0f - c * dt) * v1 + b->m_linearVelocity *= b2Clamp(1.0f - step.dt * b->m_linearDamping, 0.0f, 1.0f); + b->m_angularVelocity *= b2Clamp(1.0f - step.dt * b->m_angularDamping, 0.0f, 1.0f); + } + + // Partition contacts so that contacts with static bodies are solved last. + int32 i1 = -1; + for (int32 i2 = 0; i2 < m_contactCount; ++i2) + { + b2Fixture* fixtureA = m_contacts[i2]->GetFixtureA(); + b2Fixture* fixtureB = m_contacts[i2]->GetFixtureB(); + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + bool nonStatic = bodyA->GetType() != b2_staticBody && bodyB->GetType() != b2_staticBody; + if (nonStatic) + { + ++i1; + b2Swap(m_contacts[i1], m_contacts[i2]); + } + } + + // Initialize velocity constraints. + b2ContactSolver contactSolver(m_contacts, m_contactCount, m_allocator, step.dtRatio); + contactSolver.WarmStart(); + for (int32 i = 0; i < m_jointCount; ++i) + { + m_joints[i]->InitVelocityConstraints(step); + } + + // Solve velocity constraints. + for (int32 i = 0; i < step.velocityIterations; ++i) + { + for (int32 j = 0; j < m_jointCount; ++j) + { + m_joints[j]->SolveVelocityConstraints(step); + } + + contactSolver.SolveVelocityConstraints(); + } + + // Post-solve (store impulses for warm starting). + contactSolver.StoreImpulses(); + + // Integrate positions. + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* b = m_bodies[i]; + + if (b->GetType() == b2_staticBody) + { + continue; + } + + // Check for large velocities. + b2Vec2 translation = step.dt * b->m_linearVelocity; + if (b2Dot(translation, translation) > b2_maxTranslationSquared) + { + float32 ratio = b2_maxTranslation / translation.Length(); + b->m_linearVelocity *= ratio; + } + + float32 rotation = step.dt * b->m_angularVelocity; + if (rotation * rotation > b2_maxRotationSquared) + { + float32 ratio = b2_maxRotation / b2Abs(rotation); + b->m_angularVelocity *= ratio; + } + + // Store positions for continuous collision. + b->m_sweep.c0 = b->m_sweep.c; + b->m_sweep.a0 = b->m_sweep.a; + + // Integrate + b->m_sweep.c += step.dt * b->m_linearVelocity; + b->m_sweep.a += step.dt * b->m_angularVelocity; + + // Compute new transform + b->SynchronizeTransform(); + + // Note: shapes are synchronized later. + } + + // Iterate over constraints. + for (int32 i = 0; i < step.positionIterations; ++i) + { + bool contactsOkay = contactSolver.SolvePositionConstraints(b2_contactBaumgarte); + + bool jointsOkay = true; + for (int32 i = 0; i < m_jointCount; ++i) + { + bool jointOkay = m_joints[i]->SolvePositionConstraints(b2_contactBaumgarte); + jointsOkay = jointsOkay && jointOkay; + } + + if (contactsOkay && jointsOkay) + { + // Exit early if the position errors are small. + break; + } + } + + Report(contactSolver.m_constraints); + + if (allowSleep) + { + float32 minSleepTime = b2_maxFloat; + + const float32 linTolSqr = b2_linearSleepTolerance * b2_linearSleepTolerance; + const float32 angTolSqr = b2_angularSleepTolerance * b2_angularSleepTolerance; + + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* b = m_bodies[i]; + if (b->GetType() == b2_staticBody) + { + continue; + } + + if ((b->m_flags & b2Body::e_autoSleepFlag) == 0) + { + b->m_sleepTime = 0.0f; + minSleepTime = 0.0f; + } + + if ((b->m_flags & b2Body::e_autoSleepFlag) == 0 || + b->m_angularVelocity * b->m_angularVelocity > angTolSqr || + b2Dot(b->m_linearVelocity, b->m_linearVelocity) > linTolSqr) + { + b->m_sleepTime = 0.0f; + minSleepTime = 0.0f; + } + else + { + b->m_sleepTime += step.dt; + minSleepTime = b2Min(minSleepTime, b->m_sleepTime); + } + } + + if (minSleepTime >= b2_timeToSleep) + { + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* b = m_bodies[i]; + b->SetAwake(false); + } + } + } +} + +void b2Island::Report(const b2ContactConstraint* constraints) +{ + if (m_listener == NULL) + { + return; + } + + for (int32 i = 0; i < m_contactCount; ++i) + { + b2Contact* c = m_contacts[i]; + + const b2ContactConstraint* cc = constraints + i; + + b2ContactImpulse impulse; + for (int32 j = 0; j < cc->pointCount; ++j) + { + impulse.normalImpulses[j] = cc->points[j].normalImpulse; + impulse.tangentImpulses[j] = cc->points[j].tangentImpulse; + } + + m_listener->PostSolve(c, &impulse); + } +} diff --git a/AndEngine/jni/Box2D/Dynamics/b2Island.h b/AndEngine/jni/Box2D/Dynamics/b2Island.h new file mode 100644 index 0000000..6403af0 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2Island.h @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_ISLAND_H +#define B2_ISLAND_H + +#include "Box2D/Common/b2Math.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2TimeStep.h" + +class b2Contact; +class b2Joint; +class b2StackAllocator; +class b2ContactListener; +struct b2ContactConstraint; + +/// This is an internal structure. +struct b2Position +{ + b2Vec2 x; + float32 a; +}; + +/// This is an internal structure. +struct b2Velocity +{ + b2Vec2 v; + float32 w; +}; + +/// This is an internal class. +class b2Island +{ +public: + b2Island(int32 bodyCapacity, int32 contactCapacity, int32 jointCapacity, + b2StackAllocator* allocator, b2ContactListener* listener); + ~b2Island(); + + void Clear() + { + m_bodyCount = 0; + m_contactCount = 0; + m_jointCount = 0; + } + + void Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep); + + void Add(b2Body* body) + { + b2Assert(m_bodyCount < m_bodyCapacity); + body->m_islandIndex = m_bodyCount; + m_bodies[m_bodyCount++] = body; + } + + void Add(b2Contact* contact) + { + b2Assert(m_contactCount < m_contactCapacity); + m_contacts[m_contactCount++] = contact; + } + + void Add(b2Joint* joint) + { + b2Assert(m_jointCount < m_jointCapacity); + m_joints[m_jointCount++] = joint; + } + + void Report(const b2ContactConstraint* constraints); + + b2StackAllocator* m_allocator; + b2ContactListener* m_listener; + + b2Body** m_bodies; + b2Contact** m_contacts; + b2Joint** m_joints; + + b2Position* m_positions; + b2Velocity* m_velocities; + + int32 m_bodyCount; + int32 m_jointCount; + int32 m_contactCount; + + int32 m_bodyCapacity; + int32 m_contactCapacity; + int32 m_jointCapacity; + + int32 m_positionIterationCount; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/b2TimeStep.h b/AndEngine/jni/Box2D/Dynamics/b2TimeStep.h new file mode 100644 index 0000000..0002de9 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2TimeStep.h @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_TIME_STEP_H +#define B2_TIME_STEP_H + +#include "Box2D/Common/b2Settings.h" + +/// This is an internal structure. +struct b2TimeStep +{ + float32 dt; // time step + float32 inv_dt; // inverse time step (0 if dt == 0). + float32 dtRatio; // dt * inv_dt0 + int32 velocityIterations; + int32 positionIterations; + bool warmStarting; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/b2World.cpp b/AndEngine/jni/Box2D/Dynamics/b2World.cpp new file mode 100644 index 0000000..ca76877 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2World.cpp @@ -0,0 +1,1076 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/b2World.h" +#include "Box2D/Dynamics/b2Body.h" +#include "Box2D/Dynamics/b2Fixture.h" +#include "Box2D/Dynamics/b2Island.h" +#include "Box2D/Dynamics/Joints/b2PulleyJoint.h" +#include "Box2D/Dynamics/Contacts/b2Contact.h" +#include "Box2D/Dynamics/Contacts/b2ContactSolver.h" +#include "Box2D/Dynamics/Contacts/b2TOISolver.h" +#include "Box2D/Collision/b2Collision.h" +#include "Box2D/Collision/b2BroadPhase.h" +#include "Box2D/Collision/Shapes/b2CircleShape.h" +#include "Box2D/Collision/Shapes/b2PolygonShape.h" +#include "Box2D/Collision/b2TimeOfImpact.h" +#include + +b2World::b2World(const b2Vec2& gravity, bool doSleep) +{ + m_destructionListener = NULL; + m_debugDraw = NULL; + + m_bodyList = NULL; + m_jointList = NULL; + + m_bodyCount = 0; + m_jointCount = 0; + + m_warmStarting = true; + m_continuousPhysics = true; + + m_allowSleep = doSleep; + m_gravity = gravity; + + m_flags = e_clearForces; + + m_inv_dt0 = 0.0f; + + m_contactManager.m_allocator = &m_blockAllocator; +} + +b2World::~b2World() +{ +} + +void b2World::SetDestructionListener(b2DestructionListener* listener) +{ + m_destructionListener = listener; +} + +void b2World::SetContactFilter(b2ContactFilter* filter) +{ + m_contactManager.m_contactFilter = filter; +} + +void b2World::SetContactListener(b2ContactListener* listener) +{ + m_contactManager.m_contactListener = listener; +} + +void b2World::SetDebugDraw(b2DebugDraw* debugDraw) +{ + m_debugDraw = debugDraw; +} + +b2Body* b2World::CreateBody(const b2BodyDef* def) +{ + b2Assert(IsLocked() == false); + if (IsLocked()) + { + return NULL; + } + + void* mem = m_blockAllocator.Allocate(sizeof(b2Body)); + b2Body* b = new (mem) b2Body(def, this); + + // Add to world doubly linked list. + b->m_prev = NULL; + b->m_next = m_bodyList; + if (m_bodyList) + { + m_bodyList->m_prev = b; + } + m_bodyList = b; + ++m_bodyCount; + + return b; +} + +void b2World::DestroyBody(b2Body* b) +{ + b2Assert(m_bodyCount > 0); + b2Assert(IsLocked() == false); + if (IsLocked()) + { + return; + } + + // Delete the attached joints. + b2JointEdge* je = b->m_jointList; + while (je) + { + b2JointEdge* je0 = je; + je = je->next; + + if (m_destructionListener) + { + m_destructionListener->SayGoodbye(je0->joint); + } + + DestroyJoint(je0->joint); + } + b->m_jointList = NULL; + + // Delete the attached contacts. + b2ContactEdge* ce = b->m_contactList; + while (ce) + { + b2ContactEdge* ce0 = ce; + ce = ce->next; + m_contactManager.Destroy(ce0->contact); + } + b->m_contactList = NULL; + + // Delete the attached fixtures. This destroys broad-phase proxies. + b2Fixture* f = b->m_fixtureList; + while (f) + { + b2Fixture* f0 = f; + f = f->m_next; + + if (m_destructionListener) + { + m_destructionListener->SayGoodbye(f0); + } + + f0->DestroyProxy(&m_contactManager.m_broadPhase); + f0->Destroy(&m_blockAllocator); + f0->~b2Fixture(); + m_blockAllocator.Free(f0, sizeof(b2Fixture)); + } + b->m_fixtureList = NULL; + b->m_fixtureCount = 0; + + // Remove world body list. + if (b->m_prev) + { + b->m_prev->m_next = b->m_next; + } + + if (b->m_next) + { + b->m_next->m_prev = b->m_prev; + } + + if (b == m_bodyList) + { + m_bodyList = b->m_next; + } + + --m_bodyCount; + b->~b2Body(); + m_blockAllocator.Free(b, sizeof(b2Body)); +} + +b2Joint* b2World::CreateJoint(const b2JointDef* def) +{ + b2Assert(IsLocked() == false); + if (IsLocked()) + { + return NULL; + } + + b2Joint* j = b2Joint::Create(def, &m_blockAllocator); + + // Connect to the world list. + j->m_prev = NULL; + j->m_next = m_jointList; + if (m_jointList) + { + m_jointList->m_prev = j; + } + m_jointList = j; + ++m_jointCount; + + // Connect to the bodies' doubly linked lists. + j->m_edgeA.joint = j; + j->m_edgeA.other = j->m_bodyB; + j->m_edgeA.prev = NULL; + j->m_edgeA.next = j->m_bodyA->m_jointList; + if (j->m_bodyA->m_jointList) j->m_bodyA->m_jointList->prev = &j->m_edgeA; + j->m_bodyA->m_jointList = &j->m_edgeA; + + j->m_edgeB.joint = j; + j->m_edgeB.other = j->m_bodyA; + j->m_edgeB.prev = NULL; + j->m_edgeB.next = j->m_bodyB->m_jointList; + if (j->m_bodyB->m_jointList) j->m_bodyB->m_jointList->prev = &j->m_edgeB; + j->m_bodyB->m_jointList = &j->m_edgeB; + + b2Body* bodyA = def->bodyA; + b2Body* bodyB = def->bodyB; + + // If the joint prevents collisions, then flag any contacts for filtering. + if (def->collideConnected == false) + { + b2ContactEdge* edge = bodyB->GetContactList(); + while (edge) + { + if (edge->other == bodyA) + { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge->contact->FlagForFiltering(); + } + + edge = edge->next; + } + } + + // Note: creating a joint doesn't wake the bodies. + + return j; +} + +void b2World::DestroyJoint(b2Joint* j) +{ + b2Assert(IsLocked() == false); + if (IsLocked()) + { + return; + } + + bool collideConnected = j->m_collideConnected; + + // Remove from the doubly linked list. + if (j->m_prev) + { + j->m_prev->m_next = j->m_next; + } + + if (j->m_next) + { + j->m_next->m_prev = j->m_prev; + } + + if (j == m_jointList) + { + m_jointList = j->m_next; + } + + // Disconnect from island graph. + b2Body* bodyA = j->m_bodyA; + b2Body* bodyB = j->m_bodyB; + + // Wake up connected bodies. + bodyA->SetAwake(true); + bodyB->SetAwake(true); + + // Remove from body 1. + if (j->m_edgeA.prev) + { + j->m_edgeA.prev->next = j->m_edgeA.next; + } + + if (j->m_edgeA.next) + { + j->m_edgeA.next->prev = j->m_edgeA.prev; + } + + if (&j->m_edgeA == bodyA->m_jointList) + { + bodyA->m_jointList = j->m_edgeA.next; + } + + j->m_edgeA.prev = NULL; + j->m_edgeA.next = NULL; + + // Remove from body 2 + if (j->m_edgeB.prev) + { + j->m_edgeB.prev->next = j->m_edgeB.next; + } + + if (j->m_edgeB.next) + { + j->m_edgeB.next->prev = j->m_edgeB.prev; + } + + if (&j->m_edgeB == bodyB->m_jointList) + { + bodyB->m_jointList = j->m_edgeB.next; + } + + j->m_edgeB.prev = NULL; + j->m_edgeB.next = NULL; + + b2Joint::Destroy(j, &m_blockAllocator); + + b2Assert(m_jointCount > 0); + --m_jointCount; + + // If the joint prevents collisions, then flag any contacts for filtering. + if (collideConnected == false) + { + b2ContactEdge* edge = bodyB->GetContactList(); + while (edge) + { + if (edge->other == bodyA) + { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge->contact->FlagForFiltering(); + } + + edge = edge->next; + } + } +} + +// Find islands, integrate and solve constraints, solve position constraints +void b2World::Solve(const b2TimeStep& step) +{ + // Size the island for the worst case. + b2Island island(m_bodyCount, + m_contactManager.m_contactCount, + m_jointCount, + &m_stackAllocator, + m_contactManager.m_contactListener); + + // Clear all the island flags. + for (b2Body* b = m_bodyList; b; b = b->m_next) + { + b->m_flags &= ~b2Body::e_islandFlag; + } + for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) + { + c->m_flags &= ~b2Contact::e_islandFlag; + } + for (b2Joint* j = m_jointList; j; j = j->m_next) + { + j->m_islandFlag = false; + } + + // Build and simulate all awake islands. + int32 stackSize = m_bodyCount; + b2Body** stack = (b2Body**)m_stackAllocator.Allocate(stackSize * sizeof(b2Body*)); + for (b2Body* seed = m_bodyList; seed; seed = seed->m_next) + { + if (seed->m_flags & b2Body::e_islandFlag) + { + continue; + } + + if (seed->IsAwake() == false || seed->IsActive() == false) + { + continue; + } + + // The seed can be dynamic or kinematic. + if (seed->GetType() == b2_staticBody) + { + continue; + } + + // Reset island and stack. + island.Clear(); + int32 stackCount = 0; + stack[stackCount++] = seed; + seed->m_flags |= b2Body::e_islandFlag; + + // Perform a depth first search (DFS) on the constraint graph. + while (stackCount > 0) + { + // Grab the next body off the stack and add it to the island. + b2Body* b = stack[--stackCount]; + b2Assert(b->IsActive() == true); + island.Add(b); + + // Make sure the body is awake. + b->SetAwake(true); + + // To keep islands as small as possible, we don't + // propagate islands across static bodies. + if (b->GetType() == b2_staticBody) + { + continue; + } + + // Search all contacts connected to this body. + for (b2ContactEdge* ce = b->m_contactList; ce; ce = ce->next) + { + b2Contact* contact = ce->contact; + + // Has this contact already been added to an island? + if (contact->m_flags & b2Contact::e_islandFlag) + { + continue; + } + + // Is this contact solid and touching? + if (contact->IsEnabled() == false || + contact->IsTouching() == false) + { + continue; + } + + // Skip sensors. + bool sensorA = contact->m_fixtureA->m_isSensor; + bool sensorB = contact->m_fixtureB->m_isSensor; + if (sensorA || sensorB) + { + continue; + } + + island.Add(contact); + contact->m_flags |= b2Contact::e_islandFlag; + + b2Body* other = ce->other; + + // Was the other body already added to this island? + if (other->m_flags & b2Body::e_islandFlag) + { + continue; + } + + b2Assert(stackCount < stackSize); + stack[stackCount++] = other; + other->m_flags |= b2Body::e_islandFlag; + } + + // Search all joints connect to this body. + for (b2JointEdge* je = b->m_jointList; je; je = je->next) + { + if (je->joint->m_islandFlag == true) + { + continue; + } + + b2Body* other = je->other; + + // Don't simulate joints connected to inactive bodies. + if (other->IsActive() == false) + { + continue; + } + + island.Add(je->joint); + je->joint->m_islandFlag = true; + + if (other->m_flags & b2Body::e_islandFlag) + { + continue; + } + + b2Assert(stackCount < stackSize); + stack[stackCount++] = other; + other->m_flags |= b2Body::e_islandFlag; + } + } + + island.Solve(step, m_gravity, m_allowSleep); + + // Post solve cleanup. + for (int32 i = 0; i < island.m_bodyCount; ++i) + { + // Allow static bodies to participate in other islands. + b2Body* b = island.m_bodies[i]; + if (b->GetType() == b2_staticBody) + { + b->m_flags &= ~b2Body::e_islandFlag; + } + } + } + + m_stackAllocator.Free(stack); + + // Synchronize fixtures, check for out of range bodies. + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + // If a body was not in an island then it did not move. + if ((b->m_flags & b2Body::e_islandFlag) == 0) + { + continue; + } + + if (b->GetType() == b2_staticBody) + { + continue; + } + + // Update fixtures (for broad-phase). + b->SynchronizeFixtures(); + } + + // Look for new contacts. + m_contactManager.FindNewContacts(); +} + +// Advance a dynamic body to its first time of contact +// and adjust the position to ensure clearance. +void b2World::SolveTOI(b2Body* body) +{ + // Find the minimum contact. + b2Contact* toiContact = NULL; + float32 toi = 1.0f; + b2Body* toiOther = NULL; + bool found; + int32 count; + int32 iter = 0; + + bool bullet = body->IsBullet(); + + // Iterate until all contacts agree on the minimum TOI. We have + // to iterate because the TOI algorithm may skip some intermediate + // collisions when objects rotate through each other. + do + { + count = 0; + found = false; + for (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next) + { + if (ce->contact == toiContact) + { + continue; + } + + b2Body* other = ce->other; + b2BodyType type = other->GetType(); + + // Only bullets perform TOI with dynamic bodies. + if (bullet == true) + { + // Bullets only perform TOI with bodies that have their TOI resolved. + if ((other->m_flags & b2Body::e_toiFlag) == 0) + { + continue; + } + + // No repeated hits on non-static bodies + if (type != b2_staticBody && (ce->contact->m_flags & b2Contact::e_bulletHitFlag) != 0) + { + continue; + } + } + else if (type == b2_dynamicBody) + { + continue; + } + + // Check for a disabled contact. + b2Contact* contact = ce->contact; + if (contact->IsEnabled() == false) + { + continue; + } + + // Prevent infinite looping. + if (contact->m_toiCount > 10) + { + continue; + } + + b2Fixture* fixtureA = contact->m_fixtureA; + b2Fixture* fixtureB = contact->m_fixtureB; + + // Cull sensors. + if (fixtureA->IsSensor() || fixtureB->IsSensor()) + { + continue; + } + + b2Body* bodyA = fixtureA->m_body; + b2Body* bodyB = fixtureB->m_body; + + // Compute the time of impact in interval [0, minTOI] + b2TOIInput input; + input.proxyA.Set(fixtureA->GetShape()); + input.proxyB.Set(fixtureB->GetShape()); + input.sweepA = bodyA->m_sweep; + input.sweepB = bodyB->m_sweep; + input.tMax = toi; + + b2TOIOutput output; + b2TimeOfImpact(&output, &input); + + if (output.state == b2TOIOutput::e_touching && output.t < toi) + { + toiContact = contact; + toi = output.t; + toiOther = other; + found = true; + } + + ++count; + } + + ++iter; + } while (found && count > 1 && iter < 50); + + if (toiContact == NULL) + { + body->Advance(1.0f); + return; + } + + b2Sweep backup = body->m_sweep; + body->Advance(toi); + toiContact->Update(m_contactManager.m_contactListener); + if (toiContact->IsEnabled() == false) + { + // Contact disabled. Backup and recurse. + body->m_sweep = backup; + SolveTOI(body); + } + + ++toiContact->m_toiCount; + + // Update all the valid contacts on this body and build a contact island. + b2Contact* contacts[b2_maxTOIContacts]; + count = 0; + for (b2ContactEdge* ce = body->m_contactList; ce && count < b2_maxTOIContacts; ce = ce->next) + { + b2Body* other = ce->other; + b2BodyType type = other->GetType(); + + // Only perform correction with static bodies, so the + // body won't get pushed out of the world. + if (type == b2_dynamicBody) + { + continue; + } + + // Check for a disabled contact. + b2Contact* contact = ce->contact; + if (contact->IsEnabled() == false) + { + continue; + } + + b2Fixture* fixtureA = contact->m_fixtureA; + b2Fixture* fixtureB = contact->m_fixtureB; + + // Cull sensors. + if (fixtureA->IsSensor() || fixtureB->IsSensor()) + { + continue; + } + + // The contact likely has some new contact points. The listener + // gives the user a chance to disable the contact. + if (contact != toiContact) + { + contact->Update(m_contactManager.m_contactListener); + } + + // Did the user disable the contact? + if (contact->IsEnabled() == false) + { + // Skip this contact. + continue; + } + + if (contact->IsTouching() == false) + { + continue; + } + + contacts[count] = contact; + ++count; + } + + // Reduce the TOI body's overlap with the contact island. + b2TOISolver solver(&m_stackAllocator); + solver.Initialize(contacts, count, body); + + const float32 k_toiBaumgarte = 0.75f; + bool solved = false; + for (int32 i = 0; i < 20; ++i) + { + bool contactsOkay = solver.Solve(k_toiBaumgarte); + if (contactsOkay) + { + solved = true; + break; + } + } + + if (toiOther->GetType() != b2_staticBody) + { + toiContact->m_flags |= b2Contact::e_bulletHitFlag; + } +} + +// Sequentially solve TOIs for each body. We bring each +// body to the time of contact and perform some position correction. +// Time is not conserved. +void b2World::SolveTOI() +{ + // Prepare all contacts. + for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) + { + // Enable the contact + c->m_flags |= b2Contact::e_enabledFlag; + + // Set the number of TOI events for this contact to zero. + c->m_toiCount = 0; + } + + // Initialize the TOI flag. + for (b2Body* body = m_bodyList; body; body = body->m_next) + { + // Kinematic, and static bodies will not be affected by the TOI event. + // If a body was not in an island then it did not move. + if ((body->m_flags & b2Body::e_islandFlag) == 0 || body->GetType() == b2_kinematicBody || body->GetType() == b2_staticBody) + { + body->m_flags |= b2Body::e_toiFlag; + } + else + { + body->m_flags &= ~b2Body::e_toiFlag; + } + } + + // Collide non-bullets. + for (b2Body* body = m_bodyList; body; body = body->m_next) + { + if (body->m_flags & b2Body::e_toiFlag) + { + continue; + } + + if (body->IsBullet() == true) + { + continue; + } + + SolveTOI(body); + + body->m_flags |= b2Body::e_toiFlag; + } + + // Collide bullets. + for (b2Body* body = m_bodyList; body; body = body->m_next) + { + if (body->m_flags & b2Body::e_toiFlag) + { + continue; + } + + if (body->IsBullet() == false) + { + continue; + } + + SolveTOI(body); + + body->m_flags |= b2Body::e_toiFlag; + } +} + +void b2World::Step(float32 dt, int32 velocityIterations, int32 positionIterations) +{ + // If new fixtures were added, we need to find the new contacts. + if (m_flags & e_newFixture) + { + m_contactManager.FindNewContacts(); + m_flags &= ~e_newFixture; + } + + m_flags |= e_locked; + + b2TimeStep step; + step.dt = dt; + step.velocityIterations = velocityIterations; + step.positionIterations = positionIterations; + if (dt > 0.0f) + { + step.inv_dt = 1.0f / dt; + } + else + { + step.inv_dt = 0.0f; + } + + step.dtRatio = m_inv_dt0 * dt; + + step.warmStarting = m_warmStarting; + + // Update contacts. This is where some contacts are destroyed. + m_contactManager.Collide(); + + // Integrate velocities, solve velocity constraints, and integrate positions. + if (step.dt > 0.0f) + { + Solve(step); + } + + // Handle TOI events. + if (m_continuousPhysics && step.dt > 0.0f) + { + SolveTOI(); + } + + if (step.dt > 0.0f) + { + m_inv_dt0 = step.inv_dt; + } + + if (m_flags & e_clearForces) + { + ClearForces(); + } + + m_flags &= ~e_locked; +} + +void b2World::ClearForces() +{ + for (b2Body* body = m_bodyList; body; body = body->GetNext()) + { + body->m_force.SetZero(); + body->m_torque = 0.0f; + } +} + +struct b2WorldQueryWrapper +{ + bool QueryCallback(int32 proxyId) + { + b2Fixture* fixture = (b2Fixture*)broadPhase->GetUserData(proxyId); + return callback->ReportFixture(fixture); + } + + const b2BroadPhase* broadPhase; + b2QueryCallback* callback; +}; + +void b2World::QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const +{ + b2WorldQueryWrapper wrapper; + wrapper.broadPhase = &m_contactManager.m_broadPhase; + wrapper.callback = callback; + m_contactManager.m_broadPhase.Query(&wrapper, aabb); +} + +struct b2WorldRayCastWrapper +{ + float32 RayCastCallback(const b2RayCastInput& input, int32 proxyId) + { + void* userData = broadPhase->GetUserData(proxyId); + b2Fixture* fixture = (b2Fixture*)userData; + b2RayCastOutput output; + bool hit = fixture->RayCast(&output, input); + + if (hit) + { + float32 fraction = output.fraction; + b2Vec2 point = (1.0f - fraction) * input.p1 + fraction * input.p2; + return callback->ReportFixture(fixture, point, output.normal, fraction); + } + + return input.maxFraction; + } + + const b2BroadPhase* broadPhase; + b2RayCastCallback* callback; +}; + +void b2World::RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const +{ + b2WorldRayCastWrapper wrapper; + wrapper.broadPhase = &m_contactManager.m_broadPhase; + wrapper.callback = callback; + b2RayCastInput input; + input.maxFraction = 1.0f; + input.p1 = point1; + input.p2 = point2; + m_contactManager.m_broadPhase.RayCast(&wrapper, input); +} + +void b2World::DrawShape(b2Fixture* fixture, const b2Transform& xf, const b2Color& color) +{ + switch (fixture->GetType()) + { + case b2Shape::e_circle: + { + b2CircleShape* circle = (b2CircleShape*)fixture->GetShape(); + + b2Vec2 center = b2Mul(xf, circle->m_p); + float32 radius = circle->m_radius; + b2Vec2 axis = xf.R.col1; + + m_debugDraw->DrawSolidCircle(center, radius, axis, color); + } + break; + + case b2Shape::e_polygon: + { + b2PolygonShape* poly = (b2PolygonShape*)fixture->GetShape(); + int32 vertexCount = poly->m_vertexCount; + b2Assert(vertexCount <= b2_maxPolygonVertices); + b2Vec2 vertices[b2_maxPolygonVertices]; + + for (int32 i = 0; i < vertexCount; ++i) + { + vertices[i] = b2Mul(xf, poly->m_vertices[i]); + } + + m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color); + } + break; + } +} + +void b2World::DrawJoint(b2Joint* joint) +{ + b2Body* bodyA = joint->GetBodyA(); + b2Body* bodyB = joint->GetBodyB(); + const b2Transform& xf1 = bodyA->GetTransform(); + const b2Transform& xf2 = bodyB->GetTransform(); + b2Vec2 x1 = xf1.position; + b2Vec2 x2 = xf2.position; + b2Vec2 p1 = joint->GetAnchorA(); + b2Vec2 p2 = joint->GetAnchorB(); + + b2Color color(0.5f, 0.8f, 0.8f); + + switch (joint->GetType()) + { + case e_distanceJoint: + m_debugDraw->DrawSegment(p1, p2, color); + break; + + case e_pulleyJoint: + { + b2PulleyJoint* pulley = (b2PulleyJoint*)joint; + b2Vec2 s1 = pulley->GetGroundAnchorA(); + b2Vec2 s2 = pulley->GetGroundAnchorB(); + m_debugDraw->DrawSegment(s1, p1, color); + m_debugDraw->DrawSegment(s2, p2, color); + m_debugDraw->DrawSegment(s1, s2, color); + } + break; + + case e_mouseJoint: + // don't draw this + break; + + default: + m_debugDraw->DrawSegment(x1, p1, color); + m_debugDraw->DrawSegment(p1, p2, color); + m_debugDraw->DrawSegment(x2, p2, color); + } +} + +void b2World::DrawDebugData() +{ + if (m_debugDraw == NULL) + { + return; + } + + uint32 flags = m_debugDraw->GetFlags(); + + if (flags & b2DebugDraw::e_shapeBit) + { + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + const b2Transform& xf = b->GetTransform(); + for (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext()) + { + if (b->IsActive() == false) + { + DrawShape(f, xf, b2Color(0.5f, 0.5f, 0.3f)); + } + else if (b->GetType() == b2_staticBody) + { + DrawShape(f, xf, b2Color(0.5f, 0.9f, 0.5f)); + } + else if (b->GetType() == b2_kinematicBody) + { + DrawShape(f, xf, b2Color(0.5f, 0.5f, 0.9f)); + } + else if (b->IsAwake() == false) + { + DrawShape(f, xf, b2Color(0.6f, 0.6f, 0.6f)); + } + else + { + DrawShape(f, xf, b2Color(0.9f, 0.7f, 0.7f)); + } + } + } + } + + if (flags & b2DebugDraw::e_jointBit) + { + for (b2Joint* j = m_jointList; j; j = j->GetNext()) + { + DrawJoint(j); + } + } + + if (flags & b2DebugDraw::e_pairBit) + { + b2Color color(0.3f, 0.9f, 0.9f); + for (b2Contact* c = m_contactManager.m_contactList; c; c = c->GetNext()) + { + b2Fixture* fixtureA = c->GetFixtureA(); + b2Fixture* fixtureB = c->GetFixtureB(); + + b2Vec2 cA = fixtureA->GetAABB().GetCenter(); + b2Vec2 cB = fixtureB->GetAABB().GetCenter(); + + m_debugDraw->DrawSegment(cA, cB, color); + } + } + + if (flags & b2DebugDraw::e_aabbBit) + { + b2Color color(0.9f, 0.3f, 0.9f); + b2BroadPhase* bp = &m_contactManager.m_broadPhase; + + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + if (b->IsActive() == false) + { + continue; + } + + for (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext()) + { + b2AABB aabb = bp->GetFatAABB(f->m_proxyId); + b2Vec2 vs[4]; + vs[0].Set(aabb.lowerBound.x, aabb.lowerBound.y); + vs[1].Set(aabb.upperBound.x, aabb.lowerBound.y); + vs[2].Set(aabb.upperBound.x, aabb.upperBound.y); + vs[3].Set(aabb.lowerBound.x, aabb.upperBound.y); + + m_debugDraw->DrawPolygon(vs, 4, color); + } + } + } + + if (flags & b2DebugDraw::e_centerOfMassBit) + { + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + b2Transform xf = b->GetTransform(); + xf.position = b->GetWorldCenter(); + m_debugDraw->DrawTransform(xf); + } + } +} + +int32 b2World::GetProxyCount() const +{ + return m_contactManager.m_broadPhase.GetProxyCount(); +} diff --git a/AndEngine/jni/Box2D/Dynamics/b2World.h b/AndEngine/jni/Box2D/Dynamics/b2World.h new file mode 100644 index 0000000..1cadff7 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2World.h @@ -0,0 +1,285 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_WORLD_H +#define B2_WORLD_H + +#include "Box2D/Common/b2Math.h" +#include "Box2D/Common/b2BlockAllocator.h" +#include "Box2D/Common/b2StackAllocator.h" +#include "Box2D/Dynamics/b2ContactManager.h" +#include "Box2D/Dynamics/b2WorldCallbacks.h" + +struct b2AABB; +struct b2BodyDef; +struct b2JointDef; +struct b2TimeStep; +class b2Body; +class b2Fixture; +class b2Joint; + +/// The world class manages all physics entities, dynamic simulation, +/// and asynchronous queries. The world also contains efficient memory +/// management facilities. +class b2World +{ +public: + /// Construct a world object. + /// @param gravity the world gravity vector. + /// @param doSleep improve performance by not simulating inactive bodies. + b2World(const b2Vec2& gravity, bool doSleep); + + /// Destruct the world. All physics entities are destroyed and all heap memory is released. + ~b2World(); + + /// Register a destruction listener. The listener is owned by you and must + /// remain in scope. + void SetDestructionListener(b2DestructionListener* listener); + + /// Register a contact filter to provide specific control over collision. + /// Otherwise the default filter is used (b2_defaultFilter). The listener is + /// owned by you and must remain in scope. + void SetContactFilter(b2ContactFilter* filter); + + /// Register a contact event listener. The listener is owned by you and must + /// remain in scope. + void SetContactListener(b2ContactListener* listener); + + /// Register a routine for debug drawing. The debug draw functions are called + /// inside with b2World::DrawDebugData method. The debug draw object is owned + /// by you and must remain in scope. + void SetDebugDraw(b2DebugDraw* debugDraw); + + /// Create a rigid body given a definition. No reference to the definition + /// is retained. + /// @warning This function is locked during callbacks. + b2Body* CreateBody(const b2BodyDef* def); + + /// Destroy a rigid body given a definition. No reference to the definition + /// is retained. This function is locked during callbacks. + /// @warning This automatically deletes all associated shapes and joints. + /// @warning This function is locked during callbacks. + void DestroyBody(b2Body* body); + + /// Create a joint to constrain bodies together. No reference to the definition + /// is retained. This may cause the connected bodies to cease colliding. + /// @warning This function is locked during callbacks. + b2Joint* CreateJoint(const b2JointDef* def); + + /// Destroy a joint. This may cause the connected bodies to begin colliding. + /// @warning This function is locked during callbacks. + void DestroyJoint(b2Joint* joint); + + /// Take a time step. This performs collision detection, integration, + /// and constraint solution. + /// @param timeStep the amount of time to simulate, this should not vary. + /// @param velocityIterations for the velocity constraint solver. + /// @param positionIterations for the position constraint solver. + void Step( float32 timeStep, + int32 velocityIterations, + int32 positionIterations); + + /// Call this after you are done with time steps to clear the forces. You normally + /// call this after each call to Step, unless you are performing sub-steps. By default, + /// forces will be automatically cleared, so you don't need to call this function. + /// @see SetAutoClearForces + void ClearForces(); + + /// Call this to draw shapes and other debug draw data. + void DrawDebugData(); + + /// Query the world for all fixtures that potentially overlap the + /// provided AABB. + /// @param callback a user implemented callback class. + /// @param aabb the query box. + void QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const; + + /// Ray-cast the world for all fixtures in the path of the ray. Your callback + /// controls whether you get the closest point, any point, or n-points. + /// The ray-cast ignores shapes that contain the starting point. + /// @param callback a user implemented callback class. + /// @param point1 the ray starting point + /// @param point2 the ray ending point + void RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const; + + /// Get the world body list. With the returned body, use b2Body::GetNext to get + /// the next body in the world list. A NULL body indicates the end of the list. + /// @return the head of the world body list. + b2Body* GetBodyList(); + + /// Get the world joint list. With the returned joint, use b2Joint::GetNext to get + /// the next joint in the world list. A NULL joint indicates the end of the list. + /// @return the head of the world joint list. + b2Joint* GetJointList(); + + /// Get the world contact list. With the returned contact, use b2Contact::GetNext to get + /// the next contact in the world list. A NULL contact indicates the end of the list. + /// @return the head of the world contact list. + /// @warning contacts are + b2Contact* GetContactList(); + + /// Enable/disable warm starting. For testing. + void SetWarmStarting(bool flag) { m_warmStarting = flag; } + + /// Enable/disable continuous physics. For testing. + void SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; } + + /// Get the number of broad-phase proxies. + int32 GetProxyCount() const; + + /// Get the number of bodies. + int32 GetBodyCount() const; + + /// Get the number of joints. + int32 GetJointCount() const; + + /// Get the number of contacts (each may have 0 or more contact points). + int32 GetContactCount() const; + + /// Change the global gravity vector. + void SetGravity(const b2Vec2& gravity); + + /// Get the global gravity vector. + b2Vec2 GetGravity() const; + + /// Is the world locked (in the middle of a time step). + bool IsLocked() const; + + /// Set flag to control automatic clearing of forces after each time step. + void SetAutoClearForces(bool flag); + + /// Get the flag that controls automatic clearing of forces after each time step. + bool GetAutoClearForces() const; + +private: + + // m_flags + enum + { + e_newFixture = 0x0001, + e_locked = 0x0002, + e_clearForces = 0x0004, + }; + + friend class b2Body; + friend class b2ContactManager; + friend class b2Controller; + + void Solve(const b2TimeStep& step); + void SolveTOI(); + void SolveTOI(b2Body* body); + + void DrawJoint(b2Joint* joint); + void DrawShape(b2Fixture* shape, const b2Transform& xf, const b2Color& color); + + b2BlockAllocator m_blockAllocator; + b2StackAllocator m_stackAllocator; + + int32 m_flags; + + b2ContactManager m_contactManager; + + b2Body* m_bodyList; + b2Joint* m_jointList; + + int32 m_bodyCount; + int32 m_jointCount; + + b2Vec2 m_gravity; + bool m_allowSleep; + + b2Body* m_groundBody; + + b2DestructionListener* m_destructionListener; + b2DebugDraw* m_debugDraw; + + // This is used to compute the time step ratio to + // support a variable time step. + float32 m_inv_dt0; + + // This is for debugging the solver. + bool m_warmStarting; + + // This is for debugging the solver. + bool m_continuousPhysics; +}; + +inline b2Body* b2World::GetBodyList() +{ + return m_bodyList; +} + +inline b2Joint* b2World::GetJointList() +{ + return m_jointList; +} + +inline b2Contact* b2World::GetContactList() +{ + return m_contactManager.m_contactList; +} + +inline int32 b2World::GetBodyCount() const +{ + return m_bodyCount; +} + +inline int32 b2World::GetJointCount() const +{ + return m_jointCount; +} + +inline int32 b2World::GetContactCount() const +{ + return m_contactManager.m_contactCount; +} + +inline void b2World::SetGravity(const b2Vec2& gravity) +{ + m_gravity = gravity; +} + +inline b2Vec2 b2World::GetGravity() const +{ + return m_gravity; +} + +inline bool b2World::IsLocked() const +{ + return (m_flags & e_locked) == e_locked; +} + +inline void b2World::SetAutoClearForces(bool flag) +{ + if (flag) + { + m_flags |= e_clearForces; + } + else + { + m_flags &= ~e_clearForces; + } +} + +/// Get the flag that controls automatic clearing of forces after each time step. +inline bool b2World::GetAutoClearForces() const +{ + return (m_flags & e_clearForces) == e_clearForces; +} + +#endif diff --git a/AndEngine/jni/Box2D/Dynamics/b2WorldCallbacks.cpp b/AndEngine/jni/Box2D/Dynamics/b2WorldCallbacks.cpp new file mode 100644 index 0000000..a1a1749 --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2WorldCallbacks.cpp @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "Box2D/Dynamics/b2WorldCallbacks.h" +#include "Box2D/Dynamics/b2Fixture.h" + +// Return true if contact calculations should be performed between these two shapes. +// If you implement your own collision filter you may want to build from this implementation. +bool b2ContactFilter::ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB) +{ + const b2Filter& filterA = fixtureA->GetFilterData(); + const b2Filter& filterB = fixtureB->GetFilterData(); + + if (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0) + { + return filterA.groupIndex > 0; + } + + bool collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0; + return collide; +} + +b2DebugDraw::b2DebugDraw() +{ + m_drawFlags = 0; +} + +void b2DebugDraw::SetFlags(uint32 flags) +{ + m_drawFlags = flags; +} + +uint32 b2DebugDraw::GetFlags() const +{ + return m_drawFlags; +} + +void b2DebugDraw::AppendFlags(uint32 flags) +{ + m_drawFlags |= flags; +} + +void b2DebugDraw::ClearFlags(uint32 flags) +{ + m_drawFlags &= ~flags; +} diff --git a/AndEngine/jni/Box2D/Dynamics/b2WorldCallbacks.h b/AndEngine/jni/Box2D/Dynamics/b2WorldCallbacks.h new file mode 100644 index 0000000..75b8b2a --- /dev/null +++ b/AndEngine/jni/Box2D/Dynamics/b2WorldCallbacks.h @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2_WORLD_CALLBACKS_H +#define B2_WORLD_CALLBACKS_H + +#include "Box2D/Common/b2Settings.h" + +struct b2Vec2; +struct b2Transform; +class b2Fixture; +class b2Body; +class b2Joint; +class b2Contact; +struct b2ContactPoint; +struct b2ContactResult; +struct b2Manifold; + +/// Joints and fixtures are destroyed when their associated +/// body is destroyed. Implement this listener so that you +/// may nullify references to these joints and shapes. +class b2DestructionListener +{ +public: + virtual ~b2DestructionListener() {} + + /// Called when any joint is about to be destroyed due + /// to the destruction of one of its attached bodies. + virtual void SayGoodbye(b2Joint* joint) = 0; + + /// Called when any fixture is about to be destroyed due + /// to the destruction of its parent body. + virtual void SayGoodbye(b2Fixture* fixture) = 0; +}; + +/// Implement this class to provide collision filtering. In other words, you can implement +/// this class if you want finer control over contact creation. +class b2ContactFilter +{ +public: + virtual ~b2ContactFilter() {} + + /// Return true if contact calculations should be performed between these two shapes. + /// @warning for performance reasons this is only called when the AABBs begin to overlap. + virtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB); +}; + +/// Contact impulses for reporting. Impulses are used instead of forces because +/// sub-step forces may approach infinity for rigid body collisions. These +/// match up one-to-one with the contact points in b2Manifold. +struct b2ContactImpulse +{ + float32 normalImpulses[b2_maxManifoldPoints]; + float32 tangentImpulses[b2_maxManifoldPoints]; +}; + +/// Implement this class to get contact information. You can use these results for +/// things like sounds and game logic. You can also get contact results by +/// traversing the contact lists after the time step. However, you might miss +/// some contacts because continuous physics leads to sub-stepping. +/// Additionally you may receive multiple callbacks for the same contact in a +/// single time step. +/// You should strive to make your callbacks efficient because there may be +/// many callbacks per time step. +/// @warning You cannot create/destroy Box2D entities inside these callbacks. +class b2ContactListener +{ +public: + virtual ~b2ContactListener() {} + + /// Called when two fixtures begin to touch. + virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } + + /// Called when two fixtures cease to touch. + virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } + + /// This is called after a contact is updated. This allows you to inspect a + /// contact before it goes to the solver. If you are careful, you can modify the + /// contact manifold (e.g. disable contact). + /// A copy of the old manifold is provided so that you can detect changes. + /// Note: this is called only for awake bodies. + /// Note: this is called even when the number of contact points is zero. + /// Note: this is not called for sensors. + /// Note: if you set the number of contact points to zero, you will not + /// get an EndContact callback. However, you may get a BeginContact callback + /// the next step. + virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) + { + B2_NOT_USED(contact); + B2_NOT_USED(oldManifold); + } + + /// This lets you inspect a contact after the solver is finished. This is useful + /// for inspecting impulses. + /// Note: the contact manifold does not include time of impact impulses, which can be + /// arbitrarily large if the sub-step is small. Hence the impulse is provided explicitly + /// in a separate data structure. + /// Note: this is only called for contacts that are touching, solid, and awake. + virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) + { + B2_NOT_USED(contact); + B2_NOT_USED(impulse); + } +}; + +/// Callback class for AABB queries. +/// See b2World::Query +class b2QueryCallback +{ +public: + virtual ~b2QueryCallback() {} + + /// Called for each fixture found in the query AABB. + /// @return false to terminate the query. + virtual bool ReportFixture(b2Fixture* fixture) = 0; +}; + +/// Callback class for ray casts. +/// See b2World::RayCast +class b2RayCastCallback +{ +public: + virtual ~b2RayCastCallback() {} + + /// Called for each fixture found in the query. You control how the ray cast + /// proceeds by returning a float: + /// return -1: ignore this fixture and continue + /// return 0: terminate the ray cast + /// return fraction: clip the ray to this point + /// return 1: don't clip the ray and continue + /// @param fixture the fixture hit by the ray + /// @param point the point of initial intersection + /// @param normal the normal vector at the point of intersection + /// @return -1 to filter, 0 to terminate, fraction to clip the ray for + /// closest hit, 1 to continue + virtual float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, + const b2Vec2& normal, float32 fraction) = 0; +}; + +/// Color for debug drawing. Each value has the range [0,1]. +struct b2Color +{ + b2Color() {} + b2Color(float32 r, float32 g, float32 b) : r(r), g(g), b(b) {} + void Set(float32 ri, float32 gi, float32 bi) { r = ri; g = gi; b = bi; } + float32 r, g, b; +}; + +/// Implement and register this class with a b2World to provide debug drawing of physics +/// entities in your game. +class b2DebugDraw +{ +public: + b2DebugDraw(); + + virtual ~b2DebugDraw() {} + + enum + { + e_shapeBit = 0x0001, ///< draw shapes + e_jointBit = 0x0002, ///< draw joint connections + e_aabbBit = 0x0004, ///< draw axis aligned bounding boxes + e_pairBit = 0x0008, ///< draw broad-phase pairs + e_centerOfMassBit = 0x0010, ///< draw center of mass frame + }; + + /// Set the drawing flags. + void SetFlags(uint32 flags); + + /// Get the drawing flags. + uint32 GetFlags() const; + + /// Append flags to the current flags. + void AppendFlags(uint32 flags); + + /// Clear flags from the current flags. + void ClearFlags(uint32 flags); + + /// Draw a closed polygon provided in CCW order. + virtual void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0; + + /// Draw a solid closed polygon provided in CCW order. + virtual void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0; + + /// Draw a circle. + virtual void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) = 0; + + /// Draw a solid circle. + virtual void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) = 0; + + /// Draw a line segment. + virtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) = 0; + + /// Draw a transform. Choose your own length scale. + /// @param xf a transform. + virtual void DrawTransform(const b2Transform& xf) = 0; + +protected: + uint32 m_drawFlags; +}; + +#endif diff --git a/AndEngine/jni/Box2D/Fixture.cpp b/AndEngine/jni/Box2D/Fixture.cpp new file mode 100644 index 0000000..56a2706 --- /dev/null +++ b/AndEngine/jni/Box2D/Fixture.cpp @@ -0,0 +1,185 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "Box2D.h" +#include "Fixture.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetType + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetType +(JNIEnv *, jobject, jlong addr) +{ + b2Fixture* fixture = (b2Fixture*)addr; + b2Shape::Type type = fixture->GetType(); + switch( type ) + { + case b2Shape::e_circle: return 0; + case b2Shape::e_polygon: return 1; + default: + return b2Shape::e_unknown; + } +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetSensor + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetSensor +(JNIEnv *, jobject, jlong addr, jboolean sensor) +{ + b2Fixture* fixture = (b2Fixture*)addr; + fixture->SetSensor(sensor); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniIsSensor + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniIsSensor + (JNIEnv *, jobject, jlong addr) +{ + b2Fixture* fixture = (b2Fixture*)addr; + return fixture->IsSensor(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetFilterData + * Signature: (JSSS)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetFilterData + (JNIEnv *, jobject, jlong addr, jshort categoryBits, jshort maskBits, jshort groupIndex) +{ + b2Fixture* fixture = (b2Fixture*)addr; + b2Filter filter; + filter.categoryBits = categoryBits; + filter.maskBits = maskBits; + filter.groupIndex = groupIndex; + fixture->SetFilterData(filter); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetFilterData + * Signature: (J[S)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetFilterData + (JNIEnv *env, jobject, jlong addr, jshortArray filter) +{ + b2Fixture* fixture = (b2Fixture*)addr; + unsigned short* filterOut = (unsigned short*)env->GetPrimitiveArrayCritical(filter, 0); + b2Filter f = fixture->GetFilterData(); + filterOut[0] = f.maskBits; + filterOut[1] = f.categoryBits; + filterOut[2] = f.groupIndex; + env->ReleasePrimitiveArrayCritical(filter, filterOut, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetDensity + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetDensity + (JNIEnv *, jobject, jlong addr, jfloat density) +{ + b2Fixture* fixture = (b2Fixture*)addr; + fixture->SetDensity(density); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetDensity + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetDensity + (JNIEnv *, jobject, jlong addr) +{ + b2Fixture* fixture = (b2Fixture*)addr; + return fixture->GetDensity(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetFriction + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetFriction + (JNIEnv *, jobject, jlong addr) +{ + b2Fixture* fixture = (b2Fixture*)addr; + return fixture->GetFriction(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetFriction + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetFriction + (JNIEnv *, jobject, jlong addr, jfloat friction) +{ + b2Fixture* fixture = (b2Fixture*)addr; + fixture->SetFriction(friction); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetRestitution + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetRestitution + (JNIEnv *, jobject, jlong addr) +{ + b2Fixture* fixture = (b2Fixture*)addr; + return fixture->GetRestitution(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetRestitution + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetRestitution + (JNIEnv *, jobject, jlong addr, jfloat restitution) +{ + b2Fixture* fixture = (b2Fixture*)addr; + fixture->SetRestitution(restitution); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniTestPoint + * Signature: (JFF)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniTestPoint + (JNIEnv *, jobject, jlong addr, jfloat x, jfloat y) +{ + b2Fixture* fixture = (b2Fixture*)addr; + return fixture->TestPoint( b2Vec2( x, y ) ); +} + +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetShape + (JNIEnv *, jobject, jlong addr) +{ + b2Fixture* fixture = (b2Fixture*)addr; + return (jlong)fixture->GetShape(); +} diff --git a/AndEngine/jni/Box2D/Fixture.h b/AndEngine/jni/Box2D/Fixture.h new file mode 100644 index 0000000..5767f43 --- /dev/null +++ b/AndEngine/jni/Box2D/Fixture.h @@ -0,0 +1,117 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_Fixture */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_Fixture +#define _Included_com_badlogic_gdx_physics_box2d_Fixture +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetType + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetType + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetShape + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetShape + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetSensor + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetSensor + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniIsSensor + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniIsSensor + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetFilterData + * Signature: (JSSS)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetFilterData + (JNIEnv *, jobject, jlong, jshort, jshort, jshort); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetFilterData + * Signature: (J[S)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetFilterData + (JNIEnv *, jobject, jlong, jshortArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniTestPoint + * Signature: (JFF)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniTestPoint + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetDensity + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetDensity + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetDensity + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetDensity + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetFriction + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetFriction + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetFriction + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetFriction + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniGetRestitution + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniGetRestitution + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Fixture + * Method: jniSetRestitution + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Fixture_jniSetRestitution + (JNIEnv *, jobject, jlong, jfloat); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/FrictionJoint.cpp b/AndEngine/jni/Box2D/FrictionJoint.cpp new file mode 100644 index 0000000..31b5375 --- /dev/null +++ b/AndEngine/jni/Box2D/FrictionJoint.cpp @@ -0,0 +1,65 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "FrictionJoint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_FrictionJoint + * Method: jniSetMaxForce + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_FrictionJoint_jniSetMaxForce + (JNIEnv *, jobject, jlong addr, jfloat maxForce) +{ + b2FrictionJoint* joint = (b2FrictionJoint*)addr; + joint->SetMaxForce( maxForce ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_FrictionJoint + * Method: jniGetMaxForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_FrictionJoint_jniGetMaxForce + (JNIEnv *, jobject, jlong addr) +{ + b2FrictionJoint* joint = (b2FrictionJoint*)addr; + return joint->GetMaxForce(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_FrictionJoint + * Method: jniSetMaxTorque + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_FrictionJoint_jniSetMaxTorque + (JNIEnv *, jobject, jlong addr, jfloat torque) +{ + b2FrictionJoint* joint = (b2FrictionJoint*)addr; + joint->SetMaxTorque( torque ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_FrictionJoint + * Method: jniGetMaxTorque + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_FrictionJoint_jniGetMaxTorque + (JNIEnv *, jobject, jlong addr) +{ + b2FrictionJoint* joint = (b2FrictionJoint*)addr; + return joint->GetMaxTorque(); +} diff --git a/AndEngine/jni/Box2D/FrictionJoint.h b/AndEngine/jni/Box2D/FrictionJoint.h new file mode 100644 index 0000000..69ccf69 --- /dev/null +++ b/AndEngine/jni/Box2D/FrictionJoint.h @@ -0,0 +1,60 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_joints_FrictionJoint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_joints_FrictionJoint +#define _Included_com_badlogic_gdx_physics_box2d_joints_FrictionJoint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_joints_FrictionJoint + * Method: jniSetMaxForce + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_FrictionJoint_jniSetMaxForce + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_FrictionJoint + * Method: jniGetMaxForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_FrictionJoint_jniGetMaxForce + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_FrictionJoint + * Method: jniSetMaxTorque + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_FrictionJoint_jniSetMaxTorque + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_FrictionJoint + * Method: jniGetMaxTorque + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_FrictionJoint_jniGetMaxTorque + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/GearJoint.cpp b/AndEngine/jni/Box2D/GearJoint.cpp new file mode 100644 index 0000000..d46ce08 --- /dev/null +++ b/AndEngine/jni/Box2D/GearJoint.cpp @@ -0,0 +1,41 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "GearJoint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_GearJoint + * Method: jniSetRatio + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_GearJoint_jniSetRatio + (JNIEnv *, jobject, jlong addr, jfloat ratio) +{ + b2GearJoint* joint = (b2GearJoint*)addr; + joint->SetRatio( ratio ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_GearJoint + * Method: jniGetRatio + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_GearJoint_jniGetRatio + (JNIEnv *, jobject, jlong addr) +{ + b2GearJoint* joint = (b2GearJoint*)addr; + return joint->GetRatio(); +} diff --git a/AndEngine/jni/Box2D/GearJoint.h b/AndEngine/jni/Box2D/GearJoint.h new file mode 100644 index 0000000..f5e9c7a --- /dev/null +++ b/AndEngine/jni/Box2D/GearJoint.h @@ -0,0 +1,44 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_joints_GearJoint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_joints_GearJoint +#define _Included_com_badlogic_gdx_physics_box2d_joints_GearJoint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_joints_GearJoint + * Method: jniSetRatio + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_GearJoint_jniSetRatio + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_GearJoint + * Method: jniGetRatio + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_GearJoint_jniGetRatio + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/Joint.cpp b/AndEngine/jni/Box2D/Joint.cpp new file mode 100644 index 0000000..67b15ff --- /dev/null +++ b/AndEngine/jni/Box2D/Joint.cpp @@ -0,0 +1,127 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "Joint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetType + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetType + (JNIEnv *, jobject, jlong addr) +{ + b2Joint* joint = (b2Joint*)addr; + return joint->GetType(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetBodyA + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetBodyA + (JNIEnv *, jobject, jlong addr) +{ + b2Joint* joint = (b2Joint*)addr; + return (jlong)joint->GetBodyA(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetBodyB + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetBodyB + (JNIEnv *, jobject, jlong addr) +{ + b2Joint* joint = (b2Joint*)addr; + return (jlong)joint->GetBodyB(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetAnchorA + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetAnchorA + (JNIEnv *env, jobject, jlong addr, jfloatArray anchorA) +{ + b2Joint* joint = (b2Joint*)addr; + float* anchorAOut = (float*)env->GetPrimitiveArrayCritical(anchorA, 0); + b2Vec2 a = joint->GetAnchorA(); + anchorAOut[0] = a.x; + anchorAOut[1] = a.y; + env->ReleasePrimitiveArrayCritical(anchorA, anchorAOut, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetAnchorB + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetAnchorB + (JNIEnv *env, jobject, jlong addr, jfloatArray anchorB) +{ + b2Joint* joint = (b2Joint*)addr; + float* anchorBOut = (float*)env->GetPrimitiveArrayCritical(anchorB, 0); + b2Vec2 a = joint->GetAnchorB(); + anchorBOut[0] = a.x; + anchorBOut[1] = a.y; + env->ReleasePrimitiveArrayCritical(anchorB, anchorBOut, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetReactionForce + * Signature: (JF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetReactionForce + (JNIEnv *env, jobject, jlong addr, jfloat inv_dt, jfloatArray reactionForce) +{ + b2Joint* joint = (b2Joint*)addr; + float* reactionForceOut = (float*)env->GetPrimitiveArrayCritical(reactionForce, 0); + + b2Vec2 f = joint->GetReactionForce(inv_dt); + reactionForceOut[0] = f.x; + reactionForceOut[1] = f.y; + + env->ReleasePrimitiveArrayCritical(reactionForce, reactionForceOut, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetReactionTorque + * Signature: (JF)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetReactionTorque + (JNIEnv *, jobject, jlong addr, jfloat inv_dt) +{ + b2Joint* joint = (b2Joint*)addr; + return joint->GetReactionTorque(inv_dt); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniIsActive + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniIsActive + (JNIEnv *, jobject, jlong addr) +{ + b2Joint* joint = (b2Joint*)addr; + return joint->IsActive(); +} diff --git a/AndEngine/jni/Box2D/Joint.h b/AndEngine/jni/Box2D/Joint.h new file mode 100644 index 0000000..0792325 --- /dev/null +++ b/AndEngine/jni/Box2D/Joint.h @@ -0,0 +1,92 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_Joint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_Joint +#define _Included_com_badlogic_gdx_physics_box2d_Joint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetType + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetType + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetBodyA + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetBodyA + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetBodyB + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetBodyB + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetAnchorA + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetAnchorA + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetAnchorB + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetAnchorB + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetReactionForce + * Signature: (JF[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetReactionForce + (JNIEnv *, jobject, jlong, jfloat, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniGetReactionTorque + * Signature: (JF)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniGetReactionTorque + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Joint + * Method: jniIsActive + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_Joint_jniIsActive + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/LineJoint.cpp b/AndEngine/jni/Box2D/LineJoint.cpp new file mode 100644 index 0000000..2a63696 --- /dev/null +++ b/AndEngine/jni/Box2D/LineJoint.cpp @@ -0,0 +1,185 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "LineJoint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetJointTranslation + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetJointTranslation + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return joint->GetJointTranslation(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetJointSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetJointSpeed + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return joint->GetJointSpeed(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniIsLimitEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniIsLimitEnabled + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return joint->IsLimitEnabled(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniEnableLimit + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniEnableLimit + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + joint->EnableLimit( flag ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetLowerLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetLowerLimit + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return joint->GetLowerLimit(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetUpperLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetUpperLimit + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return joint->GetUpperLimit(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniSetLimits + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniSetLimits + (JNIEnv *, jobject, jlong addr, jfloat lowerLimit, jfloat upperLimit) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + joint->SetLimits( lowerLimit, upperLimit ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniIsMotorEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniIsMotorEnabled + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return joint->IsMotorEnabled(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniEnableMotor + * Signature: (JZ)Z + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniEnableMotor + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + joint->EnableMotor(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniSetMotorEnabled + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniSetMotorSpeed + (JNIEnv *, jobject, jlong addr, jfloat speed) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + joint->SetMotorSpeed( speed ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetMotorSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetMotorSpeed + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return joint->GetMotorSpeed(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniSetMaxMotorForce + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniSetMaxMotorForce + (JNIEnv *, jobject, jlong addr, jfloat force) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + joint->SetMaxMotorForce( force ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetMaxMotorForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetMaxMotorForce + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return 0; // FIXME this is not a bug, the method just isn't defined in b2LineJoint. strange shit +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetMotorForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetMotorForce + (JNIEnv *, jobject, jlong addr) +{ + b2LineJoint* joint = (b2LineJoint*)addr; + return joint->GetMotorForce(); +} diff --git a/AndEngine/jni/Box2D/LineJoint.h b/AndEngine/jni/Box2D/LineJoint.h new file mode 100644 index 0000000..1224242 --- /dev/null +++ b/AndEngine/jni/Box2D/LineJoint.h @@ -0,0 +1,125 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_joints_LineJoint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_joints_LineJoint +#define _Included_com_badlogic_gdx_physics_box2d_joints_LineJoint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetJointTranslation + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetJointTranslation + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetJointSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetJointSpeed + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniIsLimitEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniIsLimitEnabled + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniEnableLimit + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniEnableLimit + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetLowerLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetLowerLimit + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetUpperLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetUpperLimit + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniSetLimits + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniSetLimits + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniIsMotorEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniIsMotorEnabled + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniEnableMotor + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniEnableMotor + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniSetMotorSpeed + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniSetMotorSpeed + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetMotorSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetMotorSpeed + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniSetMaxMotorForce + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniSetMaxMotorForce + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetMaxMotorForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetMaxMotorForce + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_LineJoint + * Method: jniGetMotorForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_LineJoint_jniGetMotorForce + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/MouseJoint.cpp b/AndEngine/jni/Box2D/MouseJoint.cpp new file mode 100644 index 0000000..aa8e6ca --- /dev/null +++ b/AndEngine/jni/Box2D/MouseJoint.cpp @@ -0,0 +1,116 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "MouseJoint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniSetTarget + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniSetTarget + (JNIEnv *, jobject, jlong addr, jfloat x, jfloat y) +{ + b2MouseJoint* joint = (b2MouseJoint*)addr; + joint->SetTarget( b2Vec2(x, y ) ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniGetTarget + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniGetTarget + (JNIEnv *env, jobject, jlong addr, jfloatArray target) +{ + b2MouseJoint* joint = (b2MouseJoint*)addr; + float* tmp = (float*)env->GetPrimitiveArrayCritical(target, 0); + tmp[0] = joint->GetTarget().x; + tmp[1] = joint->GetTarget().y; + env->ReleasePrimitiveArrayCritical( target, tmp, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniSetMaxForce + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniSetMaxForce + (JNIEnv *, jobject, jlong addr, jfloat force ) +{ + b2MouseJoint* joint = (b2MouseJoint*)addr; + joint->SetMaxForce( force ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniGetMaxForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniGetMaxForce + (JNIEnv *, jobject, jlong addr) +{ + b2MouseJoint* joint = (b2MouseJoint*)addr; + return joint->GetMaxForce(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniSetFrequency + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniSetFrequency + (JNIEnv *, jobject, jlong addr, jfloat hz) +{ + b2MouseJoint* joint = (b2MouseJoint*)addr; + joint->SetFrequency(hz); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniGetFrequency + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniGetFrequency + (JNIEnv *, jobject, jlong addr) +{ + b2MouseJoint* joint = (b2MouseJoint*)addr; + return joint->GetFrequency(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniSetDampingRatio + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniSetDampingRatio + (JNIEnv *, jobject, jlong addr, jfloat ratio) +{ + b2MouseJoint* joint = (b2MouseJoint*)addr; + joint->SetDampingRatio( ratio ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniGetDampingRatio + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniGetDampingRatio + (JNIEnv *, jobject, jlong addr) +{ + b2MouseJoint* joint = (b2MouseJoint*)addr; + return joint->GetDampingRatio(); +} diff --git a/AndEngine/jni/Box2D/MouseJoint.h b/AndEngine/jni/Box2D/MouseJoint.h new file mode 100644 index 0000000..c9eeecd --- /dev/null +++ b/AndEngine/jni/Box2D/MouseJoint.h @@ -0,0 +1,92 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_joints_MouseJoint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_joints_MouseJoint +#define _Included_com_badlogic_gdx_physics_box2d_joints_MouseJoint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniSetTarget + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniSetTarget + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniGetTarget + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniGetTarget + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniSetMaxForce + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniSetMaxForce + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniGetMaxForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniGetMaxForce + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniSetFrequency + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniSetFrequency + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniGetFrequency + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniGetFrequency + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniSetDampingRatio + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniSetDampingRatio + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_MouseJoint + * Method: jniGetDampingRatio + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_MouseJoint_jniGetDampingRatio + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/PolygonShape.cpp b/AndEngine/jni/Box2D/PolygonShape.cpp new file mode 100644 index 0000000..9a82c0c --- /dev/null +++ b/AndEngine/jni/Box2D/PolygonShape.cpp @@ -0,0 +1,113 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "PolygonShape.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: newPolygonShape + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_newPolygonShape +(JNIEnv *, jobject) +{ + b2PolygonShape* poly = new b2PolygonShape(); + return (jlong)poly; +} + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniSet + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniSet +(JNIEnv *env, jobject, jlong addr, jfloatArray verticesIn) +{ + b2PolygonShape* poly = (b2PolygonShape*)addr; + int numVertices = env->GetArrayLength(verticesIn) / 2; + float* vertices = (float*)env->GetPrimitiveArrayCritical(verticesIn, 0); + b2Vec2* verticesOut = new b2Vec2[numVertices]; + for( int i = 0; i < numVertices; i++ ) + verticesOut[i] = b2Vec2(vertices[i<<1], vertices[(i<<1)+1]); + poly->Set( verticesOut, numVertices ); + delete verticesOut; + env->ReleasePrimitiveArrayCritical(verticesIn, vertices, 0 ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniSetAsBox + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniSetAsBox__JFF +(JNIEnv *, jobject, jlong addr, jfloat hx, jfloat hy) +{ + b2PolygonShape* poly = (b2PolygonShape*)addr; + poly->SetAsBox(hx, hy); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniSetAsBox + * Signature: (JFFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniSetAsBox__JFFFFF +(JNIEnv *, jobject, jlong addr, jfloat hx, jfloat hy, jfloat centerX, jfloat centerY, jfloat angle) +{ + b2PolygonShape* poly = (b2PolygonShape*)addr; + poly->SetAsBox( hx, hy, b2Vec2( centerX, centerY ), angle ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniSetAsEdge + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniSetAsEdge +(JNIEnv *, jobject, jlong addr, jfloat v1x, jfloat v1y, jfloat v2x, jfloat v2y) +{ + b2PolygonShape* poly = (b2PolygonShape*)addr; + poly->SetAsEdge(b2Vec2(v1x, v1y), b2Vec2(v2x,v2y)); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniGetVertexCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniGetVertexCount + (JNIEnv *, jobject, jlong addr) +{ + b2PolygonShape* poly = (b2PolygonShape*)addr; + return poly->GetVertexCount(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniGetVertex + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniGetVertex + (JNIEnv *env, jobject, jlong addr, jint index, jfloatArray verts) +{ + b2PolygonShape* poly = (b2PolygonShape*)addr; + const b2Vec2 v = poly->GetVertex( index ); + float* vertices = (float*)env->GetPrimitiveArrayCritical(verts, 0); + vertices[0] = v.x; + vertices[1] = v.y; + env->ReleasePrimitiveArrayCritical(verts, vertices, 0 ); +} + diff --git a/AndEngine/jni/Box2D/PolygonShape.h b/AndEngine/jni/Box2D/PolygonShape.h new file mode 100644 index 0000000..2d0f525 --- /dev/null +++ b/AndEngine/jni/Box2D/PolygonShape.h @@ -0,0 +1,69 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_PolygonShape */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_PolygonShape +#define _Included_com_badlogic_gdx_physics_box2d_PolygonShape +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: newPolygonShape + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_newPolygonShape + (JNIEnv *, jobject); + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniSet + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniSet + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniSetAsBox + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniSetAsBox__JFF + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniSetAsBox + * Signature: (JFFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniSetAsBox__JFFFFF + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniSetAsEdge + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniSetAsEdge + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniGetVertexCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniGetVertexCount + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_PolygonShape + * Method: jniGetVertex + * Signature: (JI[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_PolygonShape_jniGetVertex + (JNIEnv *, jobject, jlong, jint, jfloatArray); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/PrismaticJoint.cpp b/AndEngine/jni/Box2D/PrismaticJoint.cpp new file mode 100644 index 0000000..414a801 --- /dev/null +++ b/AndEngine/jni/Box2D/PrismaticJoint.cpp @@ -0,0 +1,173 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "PrismaticJoint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetJointTranslation + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetJointTranslation + (JNIEnv *, jobject, jlong addr) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + return joint->GetJointTranslation(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetJointSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetJointSpeed + (JNIEnv *, jobject, jlong addr) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + return joint->GetJointSpeed(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniIsLimitEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniIsLimitEnabled + (JNIEnv *, jobject, jlong addr) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + return joint->IsLimitEnabled(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniEnableLimit + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniEnableLimit + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + joint->EnableLimit(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetLowerLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetLowerLimit + (JNIEnv *, jobject, jlong addr) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + return joint->GetLowerLimit(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetUpperLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetUpperLimit + (JNIEnv *, jobject, jlong addr) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + return joint->GetUpperLimit(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniSetLimits + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniSetLimits + (JNIEnv *, jobject, jlong addr, jfloat lower, jfloat upper ) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + joint->SetLimits(lower, upper ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniIsMotorEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniIsMotorEnabled + (JNIEnv *, jobject, jlong addr) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + return joint->IsMotorEnabled(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniEnableMotor + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniEnableMotor + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + joint->EnableMotor(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniSetMotorSpeed + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniSetMotorSpeed + (JNIEnv *, jobject, jlong addr, jfloat speed) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + joint->SetMotorSpeed(speed); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetMotorSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetMotorSpeed + (JNIEnv *, jobject, jlong addr) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + return joint->GetMotorSpeed(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniSetMaxMotorForce + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniSetMaxMotorForce + (JNIEnv *, jobject, jlong addr, jfloat force) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + joint->SetMaxMotorForce(force); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetMotorForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetMotorForce + (JNIEnv *, jobject, jlong addr) +{ + b2PrismaticJoint* joint = (b2PrismaticJoint*)addr; + return joint->GetMotorForce(); +} diff --git a/AndEngine/jni/Box2D/PrismaticJoint.h b/AndEngine/jni/Box2D/PrismaticJoint.h new file mode 100644 index 0000000..5ef75ef --- /dev/null +++ b/AndEngine/jni/Box2D/PrismaticJoint.h @@ -0,0 +1,132 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_joints_PrismaticJoint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint +#define _Included_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetJointTranslation + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetJointTranslation + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetJointSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetJointSpeed + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniIsLimitEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniIsLimitEnabled + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniEnableLimit + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniEnableLimit + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetLowerLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetLowerLimit + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetUpperLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetUpperLimit + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniSetLimits + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniSetLimits + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniIsMotorEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniIsMotorEnabled + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniEnableMotor + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniEnableMotor + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniSetMotorSpeed + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniSetMotorSpeed + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetMotorSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetMotorSpeed + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniSetMaxMotorForce + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniSetMaxMotorForce + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PrismaticJoint + * Method: jniGetMotorForce + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PrismaticJoint_jniGetMotorForce + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/PulleyJoint.cpp b/AndEngine/jni/Box2D/PulleyJoint.cpp new file mode 100644 index 0000000..790d6a2 --- /dev/null +++ b/AndEngine/jni/Box2D/PulleyJoint.cpp @@ -0,0 +1,83 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "PulleyJoint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetGroundAnchorA + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetGroundAnchorA + (JNIEnv *env, jobject, jlong addr, jfloatArray anchor) +{ + b2PulleyJoint* joint = (b2PulleyJoint*)addr; + float* tmp = (float*)env->GetPrimitiveArrayCritical(anchor, 0); + tmp[0] = joint->GetGroundAnchorA().x; + tmp[1] = joint->GetGroundAnchorA().y; + env->ReleasePrimitiveArrayCritical( anchor, tmp, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetGroundAnchorB + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetGroundAnchorB + (JNIEnv *env, jobject, jlong addr, jfloatArray anchor) +{ + b2PulleyJoint* joint = (b2PulleyJoint*)addr; + float* tmp = (float*)env->GetPrimitiveArrayCritical(anchor, 0); + tmp[0] = joint->GetGroundAnchorB().x; + tmp[1] = joint->GetGroundAnchorB().y; + env->ReleasePrimitiveArrayCritical( anchor, tmp, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetLength1 + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetLength1 + (JNIEnv *, jobject, jlong addr) +{ + b2PulleyJoint* joint = (b2PulleyJoint*)addr; + return joint->GetLength1(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetLength2 + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetLength2 + (JNIEnv *, jobject, jlong addr) +{ + b2PulleyJoint* joint = (b2PulleyJoint*)addr; + return joint->GetLength2(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetRatio + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetRatio + (JNIEnv *, jobject, jlong addr) +{ + b2PulleyJoint* joint = (b2PulleyJoint*)addr; + return joint->GetRatio(); +} diff --git a/AndEngine/jni/Box2D/PulleyJoint.h b/AndEngine/jni/Box2D/PulleyJoint.h new file mode 100644 index 0000000..44db0a6 --- /dev/null +++ b/AndEngine/jni/Box2D/PulleyJoint.h @@ -0,0 +1,68 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_joints_PulleyJoint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_joints_PulleyJoint +#define _Included_com_badlogic_gdx_physics_box2d_joints_PulleyJoint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetGroundAnchorA + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetGroundAnchorA + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetGroundAnchorB + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetGroundAnchorB + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetLength1 + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetLength1 + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetLength2 + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetLength2 + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_PulleyJoint + * Method: jniGetRatio + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_PulleyJoint_jniGetRatio + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/RevoluteJoint.cpp b/AndEngine/jni/Box2D/RevoluteJoint.cpp new file mode 100644 index 0000000..5942374 --- /dev/null +++ b/AndEngine/jni/Box2D/RevoluteJoint.cpp @@ -0,0 +1,173 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "RevoluteJoint.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetJointAngle + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetJointAngle + (JNIEnv *, jobject, jlong addr) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + return joint->GetJointAngle(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetJointSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetJointSpeed + (JNIEnv *, jobject, jlong addr) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + return joint->GetJointSpeed(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniIsLimitEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniIsLimitEnabled + (JNIEnv *, jobject, jlong addr) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + return joint->IsLimitEnabled(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniEnableLimit + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniEnableLimit + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + joint->EnableLimit(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetLowerLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetLowerLimit + (JNIEnv *, jobject, jlong addr) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + return joint->GetLowerLimit(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetUpperLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetUpperLimit + (JNIEnv *, jobject, jlong addr) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + return joint->GetUpperLimit(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniSetLimits + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniSetLimits + (JNIEnv *, jobject, jlong addr, jfloat lower, jfloat upper) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + joint->SetLimits(lower, upper ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniIsMotorEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniIsMotorEnabled + (JNIEnv *, jobject, jlong addr) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + return joint->IsMotorEnabled(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniEnableMotor + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniEnableMotor + (JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + joint->EnableMotor(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniSetMotorSpeed + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniSetMotorSpeed + (JNIEnv *, jobject, jlong addr, jfloat speed) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + joint->SetMotorSpeed(speed); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetMotorSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetMotorSpeed + (JNIEnv *, jobject, jlong addr) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + return joint->GetMotorSpeed(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniSetMaxMotorTorque + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniSetMaxMotorTorque + (JNIEnv *, jobject, jlong addr, jfloat torque) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + joint->SetMaxMotorTorque(torque); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetMotorTorque + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetMotorTorque + (JNIEnv *, jobject, jlong addr) +{ + b2RevoluteJoint* joint = (b2RevoluteJoint*)addr; + return joint->GetMotorTorque(); +} diff --git a/AndEngine/jni/Box2D/RevoluteJoint.h b/AndEngine/jni/Box2D/RevoluteJoint.h new file mode 100644 index 0000000..5f92dd0 --- /dev/null +++ b/AndEngine/jni/Box2D/RevoluteJoint.h @@ -0,0 +1,132 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_joints_RevoluteJoint */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint +#define _Included_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetJointAngle + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetJointAngle + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetJointSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetJointSpeed + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniIsLimitEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniIsLimitEnabled + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniEnableLimit + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniEnableLimit + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetLowerLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetLowerLimit + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetUpperLimit + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetUpperLimit + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniSetLimits + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniSetLimits + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniIsMotorEnabled + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniIsMotorEnabled + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniEnableMotor + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniEnableMotor + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniSetMotorSpeed + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniSetMotorSpeed + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetMotorSpeed + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetMotorSpeed + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniSetMaxMotorTorque + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniSetMaxMotorTorque + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_joints_RevoluteJoint + * Method: jniGetMotorTorque + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_joints_RevoluteJoint_jniGetMotorTorque + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/Shape.cpp b/AndEngine/jni/Box2D/Shape.cpp new file mode 100644 index 0000000..91b9d58 --- /dev/null +++ b/AndEngine/jni/Box2D/Shape.cpp @@ -0,0 +1,63 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "Shape.h" + +/* + * Class: com_badlogic_gdx_physics_box2d_Shape + * Method: jniGetRadius + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Shape_jniGetRadius + (JNIEnv *, jobject, jlong addr) +{ + b2Shape* shape = (b2Shape*)addr; + return shape->m_radius; +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Shape + * Method: jniSetRadius + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Shape_jniSetRadius + (JNIEnv *, jobject, jlong addr, jfloat radius) +{ + b2Shape* shape = (b2Shape*)addr; + shape->m_radius = radius; +} + +/* + * Class: com_badlogic_gdx_physics_box2d_Shape + * Method: jniDispose + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Shape_jniDispose + (JNIEnv *, jobject, jlong addr) +{ + b2Shape* shape = (b2Shape*)addr; + delete shape; +} + +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Shape_jniGetType + (JNIEnv *, jclass, jlong addr) +{ + b2Shape* shape = (b2Shape*)addr; + if( shape->m_type == b2Shape::e_circle ) + return 0; + else + return 1; +} diff --git a/AndEngine/jni/Box2D/Shape.h b/AndEngine/jni/Box2D/Shape.h new file mode 100644 index 0000000..dae94be --- /dev/null +++ b/AndEngine/jni/Box2D/Shape.h @@ -0,0 +1,56 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_Shape */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_Shape +#define _Included_com_badlogic_gdx_physics_box2d_Shape +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_Shape + * Method: jniGetRadius + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Shape_jniGetRadius + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Shape + * Method: jniSetRadius + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Shape_jniSetRadius + (JNIEnv *, jobject, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_Shape + * Method: jniDispose + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Shape_jniDispose + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_Shape + * Method: jniGetType + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_Shape_jniGetType + (JNIEnv *, jclass, jlong); + +#ifdef __cplusplus +} +#endif +#endif +/* Header for class com_badlogic_gdx_physics_box2d_Shape_Type */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_Shape_Type +#define _Included_com_badlogic_gdx_physics_box2d_Shape_Type +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/Box2D/World.cpp b/AndEngine/jni/Box2D/World.cpp new file mode 100644 index 0000000..7e566b4 --- /dev/null +++ b/AndEngine/jni/Box2D/World.cpp @@ -0,0 +1,659 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "Box2D.h" +#include "World.h" +#ifdef ANDROID +#include +#endif + +static jclass worldClass = 0; +static jmethodID shouldCollideID = 0; +static jmethodID beginContactID = 0; +static jmethodID endContactID = 0; +static jmethodID reportFixtureID = 0; + +class CustomContactFilter: public b2ContactFilter +{ +private: + JNIEnv* env; + jobject obj; + +public: + CustomContactFilter( JNIEnv* env, jobject obj ) + { + this->env = env; + this->obj = obj; + } + + virtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB) + { + if( shouldCollideID != 0 ) + return env->CallBooleanMethod( obj, shouldCollideID, (jlong)fixtureA, (jlong)fixtureB ); + else + return true; + } +}; + +class CustomContactListener: public b2ContactListener +{ +private: + JNIEnv* env; + jobject obj; + +public: + CustomContactListener( JNIEnv* env, jobject obj ) + { + this->env = env; + this->obj = obj; + } + + /// Called when two fixtures begin to touch. + virtual void BeginContact(b2Contact* contact) + { + if( beginContactID != 0 ) + env->CallVoidMethod(obj, beginContactID, (jlong)contact ); + } + + /// Called when two fixtures cease to touch. + virtual void EndContact(b2Contact* contact) + { + if( endContactID != 0 ) + env->CallVoidMethod(obj, endContactID, (jlong)contact); + } +}; + +class CustomQueryCallback: public b2QueryCallback +{ +private: + JNIEnv* env; + jobject obj; + +public: + CustomQueryCallback( JNIEnv* env, jobject obj ) + { + this->env = env; + this->obj = obj; + } + + virtual bool ReportFixture( b2Fixture* fixture ) + { + return env->CallBooleanMethod(obj, reportFixtureID, (jlong)fixture ); + } +}; + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: newWorld + * Signature: (FFZ)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_newWorld +(JNIEnv * env, jobject obj, jfloat gravityX, jfloat gravityY, jboolean doSleep) +{ + worldClass = env->GetObjectClass(obj); + beginContactID = env->GetMethodID(worldClass, "beginContact", "(J)V" ); + endContactID = env->GetMethodID( worldClass, "endContact", "(J)V" ); + reportFixtureID = env->GetMethodID(worldClass, "reportFixture", "(J)Z" ); + shouldCollideID = env->GetMethodID( worldClass, "contactFilter", "(JJ)Z"); + + b2World* world = new b2World( b2Vec2( gravityX, gravityY ), doSleep ); + return (jlong)world; +} + +inline b2BodyType getBodyType( int type ) +{ + switch( type ) + { + case 0: return b2_staticBody; + case 1: return b2_kinematicBody; + case 2: return b2_dynamicBody; + default: + return b2_staticBody; + } +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateBody + * Signature: (JIFFFFFFFFZZZZZF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateBody +(JNIEnv *, jobject, jlong addr, jint type, jfloat positionX, jfloat positionY, jfloat angle, jfloat linearVelocityX, jfloat linearVelocityY, jfloat angularVelocity, jfloat linearDamping, jfloat angularDamping, jboolean allowSleep, jboolean awake, jboolean fixedRotation, jboolean bullet, jboolean active, jfloat inertiaScale) +{ + b2BodyDef bodyDef; + bodyDef.type = getBodyType(type); + bodyDef.position.Set( positionX, positionY ); + bodyDef.angle = angle; + bodyDef.linearVelocity.Set( linearVelocityX, linearVelocityY ); + bodyDef.angularVelocity = angularVelocity; + bodyDef.linearDamping = linearDamping; + bodyDef.angularDamping = angularDamping; + bodyDef.allowSleep = allowSleep; + bodyDef.awake = awake; + bodyDef.fixedRotation = fixedRotation; + bodyDef.bullet = bullet; + bodyDef.active = active; + bodyDef.inertiaScale = inertiaScale; + + b2World* world = (b2World*)addr; + b2Body* body = world->CreateBody( &bodyDef ); +//#ifdef ANDROID +// __android_log_write(ANDROID_LOG_ERROR,"Tag","HIIII"); +//#endif + return (jlong)body; +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniDestroyBody + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniDestroyBody +(JNIEnv *, jobject, jlong addr, jlong bodyAddr) +{ + b2World* world = (b2World*)addr; + b2Body* body = (b2Body*)bodyAddr; + world->DestroyBody(body); +} + +inline b2JointType getJointType( int type ) +{ + switch( type ) + { + case 0: return e_revoluteJoint; + case 1: return e_prismaticJoint; + case 2: return e_distanceJoint; + case 3: return e_pulleyJoint; + case 4: return e_mouseJoint; + case 5: return e_gearJoint; + case 6: return e_lineJoint; + case 7: return e_weldJoint; + case 8: return e_frictionJoint; + default: + return e_unknownJoint; + } +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateJoint + * Signature: (JIJJZ)J + */ +/*JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateJoint +(JNIEnv *, jobject, jlong addr, jint type, jlong bodyAAddr, jlong bodyBAddr, jboolean collideConnected ) +{ + b2World* world = (b2World*)addr; + b2Body* bodyA = (b2Body*)bodyAAddr; + b2Body* bodyB = (b2Body*)bodyBAddr; + + b2JointDef jointDef; + jointDef.bodyA = bodyA; + jointDef.bodyB = bodyB; + jointDef.collideConnected = collideConnected; + jointDef.type = getJointType( type ); + + b2Joint* joint = world->CreateJoint( &jointDef ); + return (jlong)joint; +}*/ + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateDistanceJoint + * Signature: (JJJZFFFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateDistanceJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jfloat localAnchorAX, jfloat localAnchorAY, jfloat localAnchorBX, jfloat localAnchorBY, + jfloat length, jfloat frequencyHz, jfloat dampingRatio) +{ + b2World* world = (b2World*)addr; + b2DistanceJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.localAnchorA = b2Vec2(localAnchorAX, localAnchorAY); + def.localAnchorB = b2Vec2(localAnchorBX, localAnchorBY); + def.length = length; + def.frequencyHz = frequencyHz; + def.dampingRatio = dampingRatio; + + return (jlong)world->CreateJoint(&def); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateFrictionJoint + * Signature: (JJJZFFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateFrictionJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jfloat localAnchorAX, jfloat localAnchorAY, jfloat localAnchorBX, jfloat localAnchorBY, + jfloat maxForce, jfloat maxTorque) +{ + b2World* world = (b2World*)addr; + b2FrictionJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.localAnchorA = b2Vec2(localAnchorAX, localAnchorAY); + def.localAnchorB = b2Vec2(localAnchorBX, localAnchorBY); + def.maxForce = maxForce; + def.maxTorque = maxTorque; + return (jlong)world->CreateJoint(&def); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateGearJoint + * Signature: (JJJZJJF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateGearJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jlong joint1, jlong joint2, jfloat ratio) +{ + b2World* world = (b2World*)addr; + b2GearJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.joint1 = (b2Joint*)joint1; + def.joint2 = (b2Joint*)joint2; + def.ratio = ratio; + + return (jlong)world->CreateJoint(&def); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateLineJoint + * Signature: (JJJZFFFFFFZFFZFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateLineJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jfloat localAnchorAX, jfloat localAnchorAY, jfloat localAnchorBX, jfloat localAnchorBY, + jfloat localAxisAX, jfloat localAxisAY, jboolean enableLimit, jfloat lowerTranslation, jfloat upperTranslation, + jboolean enableMotor, jfloat maxMotorForce, jfloat motorSpeed) +{ + b2World* world = (b2World*)addr; + b2LineJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.localAnchorA = b2Vec2(localAnchorAX, localAnchorAY); + def.localAnchorB = b2Vec2(localAnchorBX, localAnchorBY); + def.localAxisA = b2Vec2(localAxisAX, localAxisAY); + def.enableLimit = enableLimit; + def.lowerTranslation = lowerTranslation; + def.upperTranslation = upperTranslation; + def.enableMotor = enableMotor; + def.maxMotorForce = maxMotorForce; + def.motorSpeed = motorSpeed; + + return (jlong)world->CreateJoint(&def); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateMouseJoint + * Signature: (JJJZFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateMouseJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jfloat targetX, jfloat targetY, jfloat maxForce, jfloat frequencyHz, jfloat dampingRatio) +{ + b2World* world = (b2World*)addr; + b2MouseJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.target = b2Vec2( targetX, targetY ); + def.maxForce = maxForce; + def.frequencyHz = frequencyHz; + def.dampingRatio = dampingRatio; + + return (jlong)world->CreateJoint(&def); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreatePrismaticJoint + * Signature: (JJJZFFFFFFFZFFZFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreatePrismaticJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jfloat localAnchorAX, jfloat localAnchorAY, jfloat localAnchorBX, jfloat localAnchorBY, + jfloat localAxisAX, jfloat localAxisAY, jfloat referenceAngle, jboolean enableLimit, jfloat lowerTranslation, jfloat upperTranslation, + jboolean enableMotor, jfloat maxMotorForce, jfloat motorSpeed) +{ + b2World* world = (b2World*)addr; + b2PrismaticJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.localAnchorA = b2Vec2(localAnchorAX, localAnchorAY); + def.localAnchorB = b2Vec2(localAnchorBX, localAnchorBY); + def.localAxis1 = b2Vec2( localAxisAX, localAxisAY ); + def.referenceAngle = referenceAngle; + def.enableLimit = enableLimit; + def.lowerTranslation = lowerTranslation; + def.upperTranslation = upperTranslation; + def.enableMotor = enableMotor; + def.maxMotorForce = maxMotorForce; + def.motorSpeed = motorSpeed; + + return (jlong)world->CreateJoint(&def); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreatePulleyJoint + * Signature: (JJJZFFFFFFFFFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreatePulleyJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jfloat groundAnchorAX, jfloat groundAnchorAY, jfloat groundAnchorBX, jfloat groundAnchorBY, + jfloat localAnchorAX, jfloat localAnchorAY, jfloat localAnchorBX, jfloat localAnchorBY, jfloat lengthA, jfloat maxLengthA, + jfloat lengthB, jfloat maxLengthB, jfloat ratio) +{ + b2World* world = (b2World*)addr; + b2PulleyJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.groundAnchorA = b2Vec2( groundAnchorAX, groundAnchorAY ); + def.groundAnchorB = b2Vec2( groundAnchorBX, groundAnchorBY ); + def.localAnchorA = b2Vec2(localAnchorAX, localAnchorAY); + def.localAnchorB = b2Vec2(localAnchorBX, localAnchorBY); + def.lengthA = lengthA; + def.maxLengthA = maxLengthA; + def.lengthB = lengthB; + def.maxLengthB = maxLengthB; + def.ratio = ratio; + + return (jlong)world->CreateJoint(&def); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateRevoluteJoint + * Signature: (JJJZFFFFFZFFZFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateRevoluteJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jfloat localAnchorAX, jfloat localAnchorAY, jfloat localAnchorBX, jfloat localAnchorBY, + jfloat referenceAngle, jboolean enableLimit, jfloat lowerAngle, jfloat upperAngle, jboolean enableMotor, jfloat motorSpeed, jfloat maxMotorTorque) +{ + b2World* world = (b2World*)addr; + b2RevoluteJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.localAnchorA = b2Vec2(localAnchorAX, localAnchorAY); + def.localAnchorB = b2Vec2(localAnchorBX, localAnchorBY); + def.referenceAngle = referenceAngle; + def.enableLimit = enableLimit; + def.lowerAngle = lowerAngle; + def.upperAngle = upperAngle; + def.enableMotor = enableMotor; + def.motorSpeed = motorSpeed; + def.maxMotorTorque = maxMotorTorque; + + return (jlong)world->CreateJoint(&def); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateWeldJoint + * Signature: (JJJZFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateWeldJoint + (JNIEnv *, jobject, jlong addr, jlong bodyA, jlong bodyB, jboolean collideConnected, jfloat localAnchorAX, jfloat localAnchorAY, jfloat localAnchorBX, jfloat localAnchorBY, + jfloat referenceAngle) +{ + b2World* world = (b2World*)addr; + b2WeldJointDef def; + def.bodyA = (b2Body*)bodyA; + def.bodyB = (b2Body*)bodyB; + def.collideConnected = collideConnected; + def.localAnchorA = b2Vec2(localAnchorAX, localAnchorAY); + def.localAnchorB = b2Vec2(localAnchorBX, localAnchorBY); + def.referenceAngle = referenceAngle; + + return (jlong)world->CreateJoint(&def); +} + + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniDestroyJoint + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniDestroyJoint +(JNIEnv *, jobject, jlong addr, jlong jointAddr) +{ + b2World* world = (b2World*)addr; + b2Joint* joint = (b2Joint*)jointAddr; + + world->DestroyJoint( joint ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniStep + * Signature: (JFII)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniStep + (JNIEnv *env, jobject obj, jlong addr, jfloat timeStep, jint velocityIterations, jint positionIterations) +{ + b2World* world = (b2World*)addr; + CustomContactFilter contactFilter(env, obj); + CustomContactListener contactListener(env,obj); + world->SetContactFilter(&contactFilter); + world->SetContactListener(&contactListener); + world->Step( timeStep, velocityIterations, positionIterations ); + world->SetContactFilter(0); + world->SetContactListener(0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniQueryAABB + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniQueryAABB + (JNIEnv *env, jobject obj, jlong addr, jfloat lowX, jfloat lowY, jfloat upX, jfloat upY) +{ + b2World* world = (b2World*)addr; + b2AABB aabb; + aabb.lowerBound = b2Vec2( lowX, lowY ); + aabb.upperBound = b2Vec2( upX, upY ); + + CustomQueryCallback callback( env, obj ); + world->QueryAABB( &callback, aabb ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniClearForces + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniClearForces +(JNIEnv *, jobject, jlong addr) +{ + b2World* world = (b2World*)addr; + world->ClearForces(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniSetWarmStarting + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniSetWarmStarting +(JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2World* world = (b2World*)addr; + world->SetWarmStarting(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniSetContiousPhysics + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniSetContiousPhysics +(JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2World* world = (b2World*)addr; + world->SetContinuousPhysics(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetProxyCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetProxyCount +(JNIEnv *, jobject, jlong addr) +{ + b2World* world = (b2World*)addr; + return world->GetProxyCount(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetBodyCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetBodyCount +(JNIEnv *, jobject, jlong addr) +{ + b2World* world = (b2World*)addr; + return world->GetBodyCount(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetJointcount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetJointcount +(JNIEnv *, jobject, jlong addr) +{ + b2World* world = (b2World*)addr; + return world->GetJointCount(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetContactCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetContactCount +(JNIEnv *, jobject, jlong addr) +{ + b2World* world = (b2World*)addr; + return world->GetContactCount(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniSetGravity + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniSetGravity +(JNIEnv *, jobject, jlong addr, jfloat gravityX, jfloat gravityY) +{ + b2World* world = (b2World*)addr; + world->SetGravity( b2Vec2( gravityX, gravityY ) ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetGravity + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetGravity +(JNIEnv *env, jobject, jlong addr, jfloatArray gravity) +{ + b2World* world = (b2World*)addr; + float* tmp = (float*)env->GetPrimitiveArrayCritical(gravity, 0); + b2Vec2 g = world->GetGravity(); + tmp[0] = g.x; + tmp[1] = g.y; + env->ReleasePrimitiveArrayCritical( gravity, tmp, 0); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniIsLocked + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniIsLocked +(JNIEnv *, jobject, jlong addr) +{ + b2World* world = (b2World*)addr; + return world->IsLocked(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniSetAutoClearForces + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniSetAutoClearForces +(JNIEnv *, jobject, jlong addr, jboolean flag) +{ + b2World* world = (b2World*)addr; + world->SetAutoClearForces(flag); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetAutoClearForces + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetAutoClearForces +(JNIEnv *, jobject, jlong addr) +{ + b2World* world = (b2World*)addr; + return world->GetAutoClearForces(); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetContactList + * Signature: (J[J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetContactList + (JNIEnv *env, jobject, jlong addr, jlongArray contacts) +{ + b2World* world = (b2World*)addr; + jlong* tmp = (jlong*)env->GetPrimitiveArrayCritical( contacts, 0 ); + + b2Contact* contact = world->GetContactList(); + int i = 0; + while( contact != 0 ) + { + tmp[i++] = (jlong)contact; + contact = contact->GetNext(); + } + + env->ReleasePrimitiveArrayCritical( contacts, tmp, 0 ); +} + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniDispose + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniDispose +(JNIEnv *, jobject, jlong addr) +{ + b2World* world = (b2World*)(addr); + delete world; +} diff --git a/AndEngine/jni/Box2D/World.h b/AndEngine/jni/Box2D/World.h new file mode 100644 index 0000000..d64af0e --- /dev/null +++ b/AndEngine/jni/Box2D/World.h @@ -0,0 +1,260 @@ +/** +* Copyright 2010 Mario Zechner (contact@badlogicgames.com) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_badlogic_gdx_physics_box2d_World */ + +#ifndef _Included_com_badlogic_gdx_physics_box2d_World +#define _Included_com_badlogic_gdx_physics_box2d_World +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: newWorld + * Signature: (FFZ)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_newWorld + (JNIEnv *, jobject, jfloat, jfloat, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateBody + * Signature: (JIFFFFFFFFZZZZZF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateBody + (JNIEnv *, jobject, jlong, jint, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jboolean, jboolean, jboolean, jboolean, jboolean, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniDestroyBody + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniDestroyBody + (JNIEnv *, jobject, jlong, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateDistanceJoint + * Signature: (JJJZFFFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateDistanceJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateFrictionJoint + * Signature: (JJJZFFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateFrictionJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateGearJoint + * Signature: (JJJZJJF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateGearJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jlong, jlong, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateLineJoint + * Signature: (JJJZFFFFFFZFFZFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateLineJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jboolean, jfloat, jfloat, jboolean, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateMouseJoint + * Signature: (JJJZFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateMouseJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jfloat, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreatePrismaticJoint + * Signature: (JJJZFFFFFFFZFFZFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreatePrismaticJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jboolean, jfloat, jfloat, jboolean, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreatePulleyJoint + * Signature: (JJJZFFFFFFFFFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreatePulleyJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateRevoluteJoint + * Signature: (JJJZFFFFFZFFZFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateRevoluteJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jfloat, jfloat, jfloat, jfloat, jfloat, jboolean, jfloat, jfloat, jboolean, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniCreateWeldJoint + * Signature: (JJJZFFFFF)J + */ +JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniCreateWeldJoint + (JNIEnv *, jobject, jlong, jlong, jlong, jboolean, jfloat, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniDestroyJoint + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniDestroyJoint + (JNIEnv *, jobject, jlong, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniStep + * Signature: (JFII)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniStep + (JNIEnv *, jobject, jlong, jfloat, jint, jint); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniClearForces + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniClearForces + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniSetWarmStarting + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniSetWarmStarting + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniSetContiousPhysics + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniSetContiousPhysics + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetProxyCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetProxyCount + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetBodyCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetBodyCount + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetJointcount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetJointcount + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetContactCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetContactCount + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniSetGravity + * Signature: (JFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniSetGravity + (JNIEnv *, jobject, jlong, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetGravity + * Signature: (J[F)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetGravity + (JNIEnv *, jobject, jlong, jfloatArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniIsLocked + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniIsLocked + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniSetAutoClearForces + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniSetAutoClearForces + (JNIEnv *, jobject, jlong, jboolean); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetAutoClearForces + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetAutoClearForces + (JNIEnv *, jobject, jlong); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniQueryAABB + * Signature: (JFFFF)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniQueryAABB + (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniGetContactList + * Signature: (J[J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniGetContactList + (JNIEnv *, jobject, jlong, jlongArray); + +/* + * Class: com_badlogic_gdx_physics_box2d_World + * Method: jniDispose + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_World_jniDispose + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AndEngine/jni/build.bat b/AndEngine/jni/build.bat new file mode 100644 index 0000000..bd73fdd --- /dev/null +++ b/AndEngine/jni/build.bat @@ -0,0 +1,6 @@ +set shdir=%~dp0 +set "shdir=%shdir:\=/%" +c: +cd C:\cygwin\bin +bash --login -i -c '%shdir%build.sh' +pause \ No newline at end of file diff --git a/AndEngine/jni/build.sh b/AndEngine/jni/build.sh new file mode 100644 index 0000000..ac85d0b --- /dev/null +++ b/AndEngine/jni/build.sh @@ -0,0 +1,2 @@ +cd /cygdrive/e/android/AndEnginePhysicsBox2DExtension/ +/cygdrive/e/sdk/android-ndk-r4/ndk-build \ No newline at end of file diff --git a/AndEngine/libs/armeabi/libandenginephysicsbox2dextension.so b/AndEngine/libs/armeabi/libandenginephysicsbox2dextension.so new file mode 100644 index 0000000000000000000000000000000000000000..e4d062369f83388e4ee9586009b94effa0e81647 GIT binary patch literal 260857 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 S|0m7zIoh5_oGtM4>ihrNhq6Wh literal 0 HcmV?d00001 diff --git a/AndEngine/push_google_code.bat b/AndEngine/push_google_code.bat new file mode 100644 index 0000000..0c437d6 --- /dev/null +++ b/AndEngine/push_google_code.bat @@ -0,0 +1,2 @@ +hg push https://andengine.googlecode.com/hg/ +pause \ No newline at end of file diff --git a/AndEngine/src/com/badlogic/gdx/math/Vector2.java b/AndEngine/src/com/badlogic/gdx/math/Vector2.java new file mode 100644 index 0000000..0eccab8 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/math/Vector2.java @@ -0,0 +1,233 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.math; + +/** + * Encapsulates a 2D vector. Allows chaining methods by returning a reference to itself + * @author badlogicgames@gmail.com + * + */ +public final class Vector2 { + /** static temporary vector **/ + private final static Vector2 tmp = new Vector2(); + + /** the x-component of this vector **/ + public float x; + /** the y-component of this vector **/ + public float y; + + /** + * Constructs a new vector at (0,0) + */ + public Vector2 () { + + } + + /** + * Constructs a vector with the given components + * @param x The x-component + * @param y The y-component + */ + public Vector2 (float x, float y) { + this.x = x; + this.y = y; + } + + /** + * Constructs a vector from the given vector + * @param v The vector + */ + public Vector2 (Vector2 v) { + set(v); + } + + /** + * @return a copy of this vector + */ + public Vector2 cpy () { + return new Vector2(this); + } + + /** + * @return The euclidian length + */ + public float len () { + return (float)Math.sqrt(x * x + y * y); + } + + /** + * @return The squared euclidian length + */ + public float len2 () { + return x * x + y * y; + } + + /** + * Sets this vector from the given vector + * @param v The vector + * @return This vector for chaining + */ + public Vector2 set (Vector2 v) { + x = v.x; + y = v.y; + return this; + } + + /** + * Sets the components of this vector + * @param x The x-component + * @param y The y-component + * @return This vector for chaining + */ + public Vector2 set (float x, float y) { + this.x = x; + this.y = y; + return this; + } + + /** + * Substracts the given vector from this vector. + * @param v The vector + * @return This vector for chaining + */ + public Vector2 sub (Vector2 v) { + x -= v.x; + y -= v.y; + return this; + } + + /** + * Normalizes this vector + * @return This vector for chaining + */ + public Vector2 nor () { + float len = len(); + if (len != 0) { + x /= len; + y /= len; + } + return this; + } + + /** + * Adds the given vector to this vector + * @param v The vector + * @return This vector for chaining + */ + public Vector2 add (Vector2 v) { + x += v.x; + y += v.y; + return this; + } + + /** + * Adds the given components to this vector + * @param x The x-component + * @param y The y-component + * @return This vector for chaining + */ + public Vector2 add (float x, float y) { + this.x += x; + this.y += y; + return this; + } + + /** + * @param v The other vector + * @return The dot product between this and the other vector + */ + public float dot (Vector2 v) { + return x * v.x + y * v.y; + } + + /** + * Multiplies this vector by a scalar + * @param scalar The scalar + * @return This vector for chaining + */ + public Vector2 mul (float scalar) { + x *= scalar; + y *= scalar; + return this; + } + + /** + * @param v The other vector + * @return the distance between this and the other vector + */ + public float dst (Vector2 v) { + float x_d = v.x - x; + float y_d = v.y - y; + return (float)Math.sqrt(x_d * x_d + y_d * y_d); + } + + /** + * @param x The x-component of the other vector + * @param y The y-component of the other vector + * @return the distance between this and the other vector + */ + public float dst (float x, float y) { + float x_d = x - this.x; + float y_d = y - this.y; + return (float)Math.sqrt(x_d * x_d + y_d * y_d); + } + + /** + * @param v The other vector + * @return the squared distance between this and the other vector + */ + public float dst2 (Vector2 v) { + float x_d = v.x - x; + float y_d = v.y - y; + return x_d * x_d + y_d * y_d; + } + + public String toString () { + return "[" + x + ":" + y + "]"; + } + + /** + * Substracts the other vector from this vector. + * @param x The x-component of the other vector + * @param y The y-component of the other vector + * @return This vector for chaining + */ + public Vector2 sub (float x, float y) { + this.x -= x; + this.y -= y; + return this; + } + + /** + * @return a temporary copy of this vector. Use with care as this is backed by a single static Vector2 instance. v1.tmp().add( + * v2.tmp() ) will not work! + */ + public Vector2 tmp () { + return tmp.set(this); + } + + /** + * @param v the other vector + * @return The cross product between this and the other vector + */ + public float cross(final Vector2 v) { + return this.x * v.y - v.x * this.y; + } + /** + * @return The manhattan length + */ + public float lenManhattan() { + return Math.abs(this.x) + Math.abs(this.y); + } +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/Body.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/Body.java new file mode 100644 index 0000000..bb95c31 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/Body.java @@ -0,0 +1,613 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import java.util.ArrayList; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; + +/** + * A rigid body. These are created via World.CreateBody. + * @author mzechner + * + */ +public class Body { + /** the address of the body **/ + protected final long addr; + + /** temporary float array **/ + private final float[] tmp = new float[4]; + + /** World **/ + private final World world; + + /** Fixtures of this body **/ + private ArrayList fixtures = new ArrayList(2); + + /** Joints of this body **/ + protected ArrayList joints = new ArrayList(2); + + /** user data **/ + private Object userData; + + /** + * Constructs a new body with the given address + * @param world the world + * @param addr the address + */ + protected Body (World world, long addr) { + this.world = world; + this.addr = addr; + } + + /** + * Creates a fixture and attach it to this body. Use this function if you need to set some fixture parameters, like friction. + * Otherwise you can create the fixture directly from a shape. If the density is non-zero, this function automatically updates + * the mass of the body. Contacts are not created until the next time step. + * @param def the fixture definition. + * @warning This function is locked during callbacks. + */ + public Fixture createFixture (FixtureDef def) { + Fixture fixture = new Fixture(this, jniCreateFixture(addr, def.shape.addr, def.friction, def.restitution, def.density, + def.isSensor, def.filter.categoryBits, def.filter.maskBits, def.filter.groupIndex)); + this.world.fixtures.put(fixture.addr, fixture); + this.fixtures.add(fixture); + return fixture; + } + + private native long jniCreateFixture (long addr, long shapeAddr, float friction, float restitution, float density, + boolean isSensor, short filterCategoryBits, short filterMaskBits, short filterGroupIndex); + + /** + * Creates a fixture from a shape and attach it to this body. This is a convenience function. Use b2FixtureDef if you need to + * set parameters like friction, restitution, user data, or filtering. If the density is non-zero, this function automatically + * updates the mass of the body. + * @param shape the shape to be cloned. + * @param density the shape density (set to zero for static bodies). + * @warning This function is locked during callbacks. + */ + public Fixture createFixture (Shape shape, float density) { + Fixture fixture = new Fixture(this, jniCreateFixture(addr, shape.addr, density)); + this.world.fixtures.put(fixture.addr, fixture); + this.fixtures.add(fixture); + return fixture; + } + + private native long jniCreateFixture (long addr, long shapeAddr, float density); + + /** + * Destroy a fixture. This removes the fixture from the broad-phase and destroys all contacts associated with this fixture. + * This will automatically adjust the mass of the body if the body is dynamic and the fixture has positive density. All + * fixtures attached to a body are implicitly destroyed when the body is destroyed. + * @param fixture the fixture to be removed. + * @warning This function is locked during callbacks. + */ + public void destroyFixture (Fixture fixture) { + jniDestroyFixture(addr, fixture.addr); + this.world.fixtures.remove(fixture.addr); + this.fixtures.remove(fixture); + } + + private native void jniDestroyFixture (long addr, long fixtureAddr); + + /** + * Set the position of the body's origin and rotation. This breaks any contacts and wakes the other bodies. Manipulating a + * body's transform may cause non-physical behavior. + * @param position the world position of the body's local origin. + * @param angle the world rotation in radians. + */ + public void setTransform (Vector2 position, float angle) { + jniSetTransform(addr, position.x, position.y, angle); + } + + private native void jniSetTransform (long addr, float positionX, float positionY, float angle); + + /** + * Get the body transform for the body's origin. FIXME + */ + private final Transform transform = new Transform(); + + public Transform getTransform () { + jniGetTransform(addr, transform.vals); + return transform; + } + + private native void jniGetTransform (long addr, float[] vals); + + private final Vector2 position = new Vector2(); + /** + * Get the world body origin position. + * @return the world position of the body's origin. + */ + public Vector2 getPosition () { + jniGetPosition(addr, tmp); + position.x = tmp[0]; + position.y = tmp[1]; + return position; + } + + private native void jniGetPosition (long addr, float[] position); + + /** + * Get the angle in radians. + * @return the current world rotation angle in radians. + */ + public float getAngle () { + return jniGetAngle(addr); + } + + private native float jniGetAngle (long addr); + + /** + * Get the world position of the center of mass. + */ + private final Vector2 worldCenter = new Vector2(); + + public Vector2 getWorldCenter () { + jniGetWorldCenter(addr, tmp); + worldCenter.x = tmp[0]; + worldCenter.y = tmp[1]; + return worldCenter; + } + + private native void jniGetWorldCenter (long addr, float[] worldCenter); + + /** + * Get the local position of the center of mass. + */ + private final Vector2 localCenter = new Vector2(); + + public Vector2 getLocalCenter () { + jniGetLocalCenter(addr, tmp); + localCenter.x = tmp[0]; + localCenter.y = tmp[1]; + return localCenter; + } + + private native void jniGetLocalCenter (long addr, float[] localCenter); + + /** + * Set the linear velocity of the center of mass. + */ + public void setLinearVelocity (Vector2 v) { + jniSetLinearVelocity(addr, v.x, v.y); + } + + private native void jniSetLinearVelocity (long addr, float x, float y); + + /** + * Get the linear velocity of the center of mass. + */ + private final Vector2 linearVelocity = new Vector2(); + + public Vector2 getLinearVelocity () { + jniGetLinearVelocity(addr, tmp); + linearVelocity.x = tmp[0]; + linearVelocity.y = tmp[1]; + return linearVelocity; + } + + private native void jniGetLinearVelocity (long addr, float[] tmpLinearVelocity); + + /** + * Set the angular velocity. + */ + public void setAngularVelocity (float omega) { + jniSetAngularVelocity(addr, omega); + } + + private native void jniSetAngularVelocity (long addr, float omega); + + /** + * Get the angular velocity. + */ + public float getAngularVelocity () { + return jniGetAngularVelocity(addr); + } + + private native float jniGetAngularVelocity (long addr); + + /** + * Apply a force at a world point. If the force is not applied at the center of mass, it will generate a torque and affect the + * angular velocity. This wakes up the body. + * @param force the world force vector, usually in Newtons (N). + * @param point the world position of the point of application. + */ + public void applyForce (Vector2 force, Vector2 point) { + jniApplyForce(addr, force.x, force.y, point.x, point.y); + } + + private native void jniApplyForce (long addr, float forceX, float forceY, float pointX, float pointY); + + /** + * Apply a torque. This affects the angular velocity without affecting the linear velocity of the center of mass. This wakes up + * the body. + * @param torque about the z-axis (out of the screen), usually in N-m. + */ + public void applyTorque (float torque) { + jniApplyTorque(addr, torque); + } + + private native void jniApplyTorque (long addr, float torque); + + /** + * Apply an impulse at a point. This immediately modifies the velocity. It also modifies the angular velocity if the point of + * application is not at the center of mass. This wakes up the body. + * @param impulse the world impulse vector, usually in N-seconds or kg-m/s. + * @param point the world position of the point of application. + */ + public void applyLinearImpulse (Vector2 impulse, Vector2 point) { + jniApplyLinearImpulse(addr, impulse.x, impulse.y, point.x, point.y); + } + + private native void jniApplyLinearImpulse (long addr, float impulseX, float impulseY, float pointX, float pointY); + + /** + * Apply an angular impulse. + * @param impulse the angular impulse in units of kg*m*m/s + */ + public void applyAngularImpulse (float impulse) { + jniApplyAngularImpulse(addr, impulse); + } + + private native void jniApplyAngularImpulse (long addr, float impulse); + + /** + * Get the total mass of the body. + * @return the mass, usually in kilograms (kg). + */ + public float getMass () { + return jniGetMass(addr); + } + + private native float jniGetMass (long addr); + + /** + * Get the rotational inertia of the body about the local origin. + * @return the rotational inertia, usually in kg-m^2. + */ + public float getInertia () { + return jniGetInertia(addr); + } + + private native float jniGetInertia (long addr); + + private final MassData massData = new MassData(); + /** + * Get the mass data of the body. + * @return a struct containing the mass, inertia and center of the body. + */ + public MassData getMassData () { + jniGetMassData(addr, tmp); + massData.mass = tmp[0]; + massData.center.x = tmp[1]; + massData.center.y = tmp[2]; + massData.I = tmp[3]; + return massData; + } + + private native void jniGetMassData (long addr, float[] massData); + + /** + * Set the mass properties to override the mass properties of the fixtures. Note that this changes the center of mass position. + * Note that creating or destroying fixtures can also alter the mass. This function has no effect if the body isn't dynamic. + * @param data the mass properties. + */ + public void setMassData (MassData data) { + jniSetMassData(addr, data.mass, data.center.x, data.center.y, data.I); + } + + private native void jniSetMassData (long addr, float mass, float centerX, float centerY, float I); + + /** + * This resets the mass properties to the sum of the mass properties of the fixtures. This normally does not need to be called + * unless you called SetMassData to override the mass and you later want to reset the mass. + */ + public void resetMassData () { + jniResetMassData(addr); + } + + private native void jniResetMassData (long addr); + + private final Vector2 localPoint = new Vector2(); + /** + * Get the world coordinates of a point given the local coordinates. + * @param localPoint a point on the body measured relative the the body's origin. + * @return the same point expressed in world coordinates. + */ + public Vector2 getWorldPoint (Vector2 localPoint) { + jniGetWorldPoint(addr, localPoint.x, localPoint.y, tmp); + this.localPoint.x = tmp[0]; + this.localPoint.y = tmp[1]; + return this.localPoint; + } + + private native void jniGetWorldPoint (long addr, float localPointX, float localPointY, float[] worldPoint); + + private final Vector2 worldVector = new Vector2(); + /** + * Get the world coordinates of a vector given the local coordinates. + * @param localVector a vector fixed in the body. + * @return the same vector expressed in world coordinates. + */ + public Vector2 getWorldVector (Vector2 localVector) { + jniGetWorldVector(addr, localVector.x, localVector.y, tmp); + worldVector.x = tmp[0]; + worldVector.y = tmp[1]; + return worldVector; + } + + private native void jniGetWorldVector (long addr, float localVectorX, float localVectorY, float[] worldVector); + + public final Vector2 localPoint2 = new Vector2(); + /** + * Gets a local point relative to the body's origin given a world point. + * @param worldPoint a point in world coordinates. + * @return the corresponding local point relative to the body's origin. + */ + public Vector2 getLocalPoint (Vector2 worldPoint) { + jniGetLocalPoint(addr, worldPoint.x, worldPoint.y, tmp); + localPoint2.x = tmp[0]; + localPoint2.y = tmp[1]; + return localPoint2; + } + + private native void jniGetLocalPoint (long addr, float worldPointX, float worldPointY, float[] localPoint); + + public final Vector2 localVector = new Vector2(); + /** + * Gets a local vector given a world vector. + * @param worldVector a vector in world coordinates. + * @return the corresponding local vector. + */ + public Vector2 getLocalVector (Vector2 worldVector) { + jniGetLocalVector(addr, worldVector.x, worldVector.y, tmp); + localVector.x = tmp[0]; + localVector.y = tmp[1]; + return localVector; + } + + private native void jniGetLocalVector (long addr, float worldVectorX, float worldVectorY, float[] worldVector); + + public final Vector2 linVelWorld = new Vector2(); + /** + * Get the world linear velocity of a world point attached to this body. + * @param worldPoint a point in world coordinates. + * @return the world velocity of a point. + */ + public Vector2 getLinearVelocityFromWorldPoint (Vector2 worldPoint) { + jniGetLinearVelocityFromWorldPoint(addr, worldPoint.x, worldPoint.y, tmp); + linVelWorld.x = tmp[0]; + linVelWorld.y = tmp[1]; + return linVelWorld; + } + + private native void jniGetLinearVelocityFromWorldPoint (long addr, float worldPointX, float worldPointY, float[] linVelWorld); + + public final Vector2 linVelLoc = new Vector2(); + /** + * Get the world velocity of a local point. + * @param localPoint a point in local coordinates. + * @return the world velocity of a point. + */ + public Vector2 getLinearVelocityFromLocalPoint (Vector2 localPoint) { + jniGetLinearVelocityFromLocalPoint(addr, localPoint.x, localPoint.y, tmp); + linVelLoc.x = tmp[0]; + linVelLoc.y = tmp[1]; + return linVelLoc; + } + + private native void jniGetLinearVelocityFromLocalPoint (long addr, float localPointX, float localPointY, float[] linVelLoc); + + /** + * Get the linear damping of the body. + */ + public float getLinearDamping () { + return jniGetLinearDamping(addr); + } + + private native float jniGetLinearDamping (long add); + + /** + * Set the linear damping of the body. + */ + public void setLinearDamping (float linearDamping) { + jniSetLinearDamping(addr, linearDamping); + } + + private native void jniSetLinearDamping (long addr, float linearDamping); + + /** + * Get the angular damping of the body. + */ + public float getAngularDamping () { + return jniGetAngularDamping(addr); + } + + private native float jniGetAngularDamping (long addr); + + /** + * Set the angular damping of the body. + */ + public void setAngularDamping (float angularDamping) { + jniSetAngularDamping(addr, angularDamping); + } + + private native void jniSetAngularDamping (long addr, float angularDamping); + + /** + * Set the type of this body. This may alter the mass and velocity. + */ + public void setType (BodyType type) { + jniSetType(addr, type.getValue()); + } + + private native void jniSetType (long addr, int type); + + /** + * Get the type of this body. + */ + public BodyType getType () { + int type = jniGetType(addr); + if (type == 0) return BodyType.StaticBody; + if (type == 1) return BodyType.KinematicBody; + if (type == 2) return BodyType.DynamicBody; + return BodyType.StaticBody; + } + + private native int jniGetType (long addr); + + /** + * Should this body be treated like a bullet for continuous collision detection? + */ + public void setBullet (boolean flag) { + jniSetBullet(addr, flag); + } + + private native void jniSetBullet (long addr, boolean flag); + + /** + * Is this body treated like a bullet for continuous collision detection? + */ + public boolean isBullet () { + return jniIsBullet(addr); + } + + private native boolean jniIsBullet (long addr); + + /** + * You can disable sleeping on this body. If you disable sleeping, the + */ + public void setSleepingAllowed (boolean flag) { + jniSetSleepingAllowed(addr, flag); + } + + private native void jniSetSleepingAllowed (long addr, boolean flag); + + /** + * Is this body allowed to sleep + */ + public boolean isSleepingAllowed () { + return jniIsSleepingAllowed(addr); + } + + private native boolean jniIsSleepingAllowed (long addr); + + /** + * Set the sleep state of the body. A sleeping body has very low CPU cost. + * @param flag set to true to put body to sleep, false to wake it. + */ + public void setAwake (boolean flag) { + jniSetAwake(addr, flag); + } + + private native void jniSetAwake (long addr, boolean flag); + + /** + * Get the sleeping state of this body. + * @return true if the body is sleeping. + */ + public boolean isAwake () { + return jniIsAwake(addr); + } + + private native boolean jniIsAwake (long addr); + + /** + * Set the active state of the body. An inactive body is not simulated and cannot be collided with or woken up. If you pass a + * flag of true, all fixtures will be added to the broad-phase. If you pass a flag of false, all fixtures will be removed from + * the broad-phase and all contacts will be destroyed. Fixtures and joints are otherwise unaffected. You may continue to + * create/destroy fixtures and joints on inactive bodies. Fixtures on an inactive body are implicitly inactive and will not + * participate in collisions, ray-casts, or queries. Joints connected to an inactive body are implicitly inactive. An inactive + * body is still owned by a b2World object and remains in the body list. + */ + public void setActive (boolean flag) { + jniSetActive(addr, flag); + } + + private native void jniSetActive (long addr, boolean flag); + + /** + * Get the active state of the body. + */ + public boolean isActive () { + return jniIsActive(addr); + } + + private native boolean jniIsActive (long addr); + + /** + * Set this body to have fixed rotation. This causes the mass to be reset. + */ + public void setFixedRotation (boolean flag) { + jniSetFixedRotation(addr, flag); + } + + private native void jniSetFixedRotation (long addr, boolean flag); + + /** + * Does this body have fixed rotation? + */ + public boolean isFixedRotation () { + return jniIsFixedRotation(addr); + } + + private native boolean jniIsFixedRotation (long addr); + + /** + * Get the list of all fixtures attached to this body. Do not modify the list! + */ + public ArrayList getFixtureList () { + return fixtures; + } + + /** + * Get the list of all joints attached to this body. Do not modify the list! + */ + public ArrayList getJointList () { + return joints; + } + + /** + * Get the list of all contacts attached to this body. + * @warning this list changes during the time step and you may miss some collisions if you don't use b2ContactListener. Do not + * modify the returned list! + */ +// ArrayList getContactList() +// { +// return contacts; +// } + + /** + * Get the parent world of this body. + */ + public World getWorld () { + return world; + } + + /** + * Get the user data + */ + public Object getUserData () { + return userData; + } + + /** + * Set the user data + */ + public void setUserData (Object userData) { + this.userData = userData; + } +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/BodyDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/BodyDef.java new file mode 100644 index 0000000..431c2b3 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/BodyDef.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; + +/** + * A body definition holds all the data needed to construct a rigid body. You can safely re-use body definitions. Shapes are added + * to a body after construction. + * + * @author mzechner + * + */ +public class BodyDef { + /** + * The body type. static: zero mass, zero velocity, may be manually moved kinematic: zero mass, non-zero velocity set by user, + * moved by solver dynamic: positive mass, non-zero velocity determined by forces, moved by solver + */ + public enum BodyType { + StaticBody(0), KinematicBody(1), DynamicBody(2); + + private int value; + + private BodyType (int value) { + this.value = value; + } + + public int getValue () { + return value; + } + }; + + /** + * The body type: static, kinematic, or dynamic. Note: if a dynamic body would have zero mass, the mass is set to one. + **/ + public BodyType type = BodyType.StaticBody; + + /** + * The world position of the body. Avoid creating bodies at the origin since this can lead to many overlapping shapes. + **/ + public final Vector2 position = new Vector2(); + + /** The world angle of the body in radians. **/ + public float angle = 0; + + /** The linear velocity of the body's origin in world co-ordinates. **/ + public final Vector2 linearVelocity = new Vector2(); + + /** The angular velocity of the body. **/ + public float angularVelocity = 0; + + /** + * Linear damping is use to reduce the linear velocity. The damping parameter can be larger than 1.0f but the damping effect + * becomes sensitive to the time step when the damping parameter is large. + **/ + public float linearDamping = 0; + + /** + * Angular damping is use to reduce the angular velocity. The damping parameter can be larger than 1.0f but the damping effect + * becomes sensitive to the time step when the damping parameter is large. + **/ + public float angularDamping = 0; + + /** + * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage. + **/ + public boolean allowSleep = true; + + /** Is this body initially awake or sleeping? **/ + public boolean awake = true; + + /** Should this body be prevented from rotating? Useful for characters. **/ + public boolean fixedRotation = false; + + /** + * Is this a fast moving body that should be prevented from tunneling through other moving bodies? Note that all bodies are + * prevented from tunneling through kinematic and static bodies. This setting is only considered on dynamic bodies. + * @warning You should use this flag sparingly since it increases processing time. + **/ + public boolean bullet = false; + + /** Does this body start out active? **/ + public boolean active = true; + + /** Experimental: scales the inertia tensor. **/ + public float inertiaScale = 1; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/CircleShape.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/CircleShape.java new file mode 100644 index 0000000..0384c90 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/CircleShape.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; + +/** + * A circle shape. + * @author mzechner + * + */ +public class CircleShape extends Shape { + public CircleShape () { + addr = newCircleShape(); + } + + private native long newCircleShape (); + + protected CircleShape (long addr) { + this.addr = addr; + } + + /** + * {@inheritDoc} + */ + @Override public Type getType () { + return Type.Circle; + } + + /** + * Returns the position of the shape + */ + private final float[] tmp = new float[2]; + private final Vector2 position = new Vector2(); + + public Vector2 getPosition () { + jniGetPosition(addr, tmp); + position.x = tmp[0]; + position.y = tmp[1]; + return position; + } + + private native void jniGetPosition (long addr, float[] position); + + /** + * Sets the position of the shape + */ + public void setPosition (Vector2 position) { + jniSetPosition(addr, position.x, position.y); + } + + private native void jniSetPosition (long addr, float positionX, float positionY); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/Contact.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/Contact.java new file mode 100644 index 0000000..a0d8892 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/Contact.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; + +/** + * The class manages contact between two shapes. A contact exists for each overlapping AABB in the broad-phase (except if + * filtered). Therefore a contact object may exist that has no contact points. + * @author mzechner + * + */ +public class Contact { + /** the address **/ + protected long addr; + + /** the world **/ + protected World world; + + /** the world manifold **/ + protected final WorldManifold worldManifold = new WorldManifold(); + + protected Contact (World world, long addr) { + this.addr = addr; + this.world = world; + } + + /** + * Get the world manifold. + */ + private final float[] tmp = new float[6]; + + public WorldManifold GetWorldManifold () { + int numContactPoints = jniGetWorldManifold(addr, tmp); + + worldManifold.numContactPoints = numContactPoints; + worldManifold.normal.set(tmp[0], tmp[1]); + for (int i = 0; i < numContactPoints; i++) { + Vector2 point = worldManifold.points[i]; + point.x = tmp[2 + i * 2]; + point.y = tmp[2 + i * 2 + 1]; + } + + return worldManifold; + } + + private native int jniGetWorldManifold (long addr, float[] manifold); + + public boolean isTouching () { + return jniIsTouching(addr); + } + + private native boolean jniIsTouching (long addr); + + /** + * Enable/disable this contact. This can be used inside the pre-solve contact listener. The contact is only disabled for the + * current time step (or sub-step in continuous collisions). + */ + public void setEnabled (boolean flag) { + jniSetEnabled(addr, flag); + } + + private native void jniSetEnabled (long addr, boolean flag); + + /** + * Has this contact been disabled? + */ + public boolean isEnabled () { + return jniIsEnabled(addr); + } + + private native boolean jniIsEnabled (long addr); + + /** + * Get the first fixture in this contact. + */ + public Fixture getFixtureA () { + return world.fixtures.get(jniGetFixtureA(addr)); + } + + private native long jniGetFixtureA (long addr); + + /** + * Get the second fixture in this contact. + */ + public Fixture getFixtureB () { + return world.fixtures.get(jniGetFixtureB(addr)); + } + + private native long jniGetFixtureB (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/ContactFilter.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/ContactFilter.java new file mode 100644 index 0000000..78b6dd7 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/ContactFilter.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +/** + * Implement this class to provide collision filtering. In other words, you can implement this class if you want finer control + * over contact creation. + * @author mzechner + * + */ +public interface ContactFilter { + boolean shouldCollide (Fixture fixtureA, Fixture fixtureB); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/ContactListener.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/ContactListener.java new file mode 100644 index 0000000..47c271f --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/ContactListener.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +public interface ContactListener { + /** + * Called when two fixtures begin to touch. + */ + public void beginContact (Contact contact); + + /** + * Called when two fixtures cease to touch. + */ + public void endContact (Contact contact); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/DestructionListener.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/DestructionListener.java new file mode 100644 index 0000000..1e42480 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/DestructionListener.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +public interface DestructionListener { + +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/Filter.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/Filter.java new file mode 100644 index 0000000..59e6221 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/Filter.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +/** + * This holds contact filtering data. + * @author mzechner + * + */ +public class Filter { + /** + * The collision category bits. Normally you would just set one bit. + */ + public short categoryBits = 0x0001; + + /** + * The collision mask bits. This states the categories that this shape would accept for collision. + */ + public short maskBits = -1; + + /** + * Collision groups allow a certain group of objects to never collide (negative) or always collide (positive). Zero means no + * collision group. Non-zero group filtering always wins against the mask bits. + */ + public short groupIndex = 0; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/Fixture.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/Fixture.java new file mode 100644 index 0000000..abeb656 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/Fixture.java @@ -0,0 +1,216 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Shape.Type; + +public class Fixture { + /** body **/ + private final Body body; + + /** the address of the fixture **/ + protected final long addr; + + /** the shape, initialized lazy **/ + protected Shape shape; + + /** + * Constructs a new fixture + * @param addr the address of the fixture + */ + protected Fixture (Body body, long addr) { + this.body = body; + this.addr = addr; + } + + /** + * Get the type of the child shape. You can use this to down cast to the concrete shape. + * @return the shape type. + */ + public Type getType () { + int type = jniGetType(addr); + if (type == 0) + return Type.Circle; + else + return Type.Polygon; + } + + private native int jniGetType (long addr); + + /** + * Returns the shape of this fixture + */ + public Shape getShape () { + if (shape == null) { + long shapeAddr = jniGetShape(addr); + int type = Shape.jniGetType(shapeAddr); + + if (type == 0) + shape = new CircleShape(shapeAddr); + else + shape = new PolygonShape(shapeAddr); + } + + return shape; + } + + private native long jniGetShape (long addr); + + /** + * Set if this fixture is a sensor. + */ + public void setSensor (boolean sensor) { + jniSetSensor(addr, sensor); + } + + private native void jniSetSensor (long addr, boolean sensor); + + /** + * Is this fixture a sensor (non-solid)? + * @return the true if the shape is a sensor. + */ + public boolean isSensor () { + return jniIsSensor(addr); + } + + private native boolean jniIsSensor (long addr); + + /** + * Set the contact filtering data. This will not update contacts until the next time step when either parent body is active and + * awake. + */ + public void setFilterData (Filter filter) { + jniSetFilterData(addr, filter.categoryBits, filter.maskBits, filter.groupIndex); + } + + private native void jniSetFilterData (long addr, short categoryBits, short maskBits, short groupIndex); + + /** + * Get the contact filtering data. + */ + private final short[] tmp = new short[3]; + private final Filter filter = new Filter(); + + public Filter getFilterData () { + jniGetFilterData(addr, tmp); + filter.maskBits = tmp[0]; + filter.categoryBits = tmp[1]; + filter.groupIndex = tmp[2]; + return filter; + } + + private native void jniGetFilterData (long addr, short[] filter); + + /** + * Get the parent body of this fixture. This is NULL if the fixture is not attached. + */ + public Body getBody () { + return body; + } + + /** + * Test a point for containment in this fixture. + * @param p a point in world coordinates. + */ + public boolean testPoint (Vector2 p) { + return jniTestPoint(addr, p.x, p.y); + } + + private native boolean jniTestPoint (long addr, float x, float y); + +// const b2Body* GetBody() const; +// +// /// Get the next fixture in the parent body's fixture list. +// /// @return the next shape. +// b2Fixture* GetNext(); +// const b2Fixture* GetNext() const; +// +// /// Get the user data that was assigned in the fixture definition. Use this to +// /// store your application specific data. +// void* GetUserData() const; +// +// /// Set the user data. Use this to store your application specific data. +// void SetUserData(void* data); +// +// /// Cast a ray against this shape. +// /// @param output the ray-cast results. +// /// @param input the ray-cast input parameters. +// bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const; +// +// /// Get the mass data for this fixture. The mass data is based on the density and +// /// the shape. The rotational inertia is about the shape's origin. This operation +// /// may be expensive. +// void GetMassData(b2MassData* massData) const; + + /** + * Set the density of this fixture. This will _not_ automatically adjust the mass of the body. You must call + * b2Body::ResetMassData to update the body's mass. + */ + public void setDensity (float density) { + jniSetDensity(addr, density); + } + + private native void jniSetDensity (long addr, float density); + + /** + * Get the density of this fixture. + */ + public float getDensity () { + return jniGetDensity(addr); + } + + private native float jniGetDensity (long addr); + + /** + * Get the coefficient of friction. + */ + public float getFriction () { + return jniGetFriction(addr); + } + + private native float jniGetFriction (long addr); + + /** + * Set the coefficient of friction. + */ + public void setFriction (float friction) { + jniSetFriction(addr, friction); + } + + private native void jniSetFriction (long addr, float friction); + + /** + * Get the coefficient of restitution. + */ + public float getRestitution () { + return jniGetRestitution(addr); + } + + private native float jniGetRestitution (long addr); + + /** + * Set the coefficient of restitution. + */ + public void setRestitution (float restitution) { + jniSetRestitution(addr, restitution); + } + + private native void jniSetRestitution (long addr, float restitution); + +// /// Get the fixture's AABB. This AABB may be enlarge and/or stale. +// /// If you need a more accurate AABB, compute it using the shape and +// /// the body transform. +// const b2AABB& GetAABB() const; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/FixtureDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/FixtureDef.java new file mode 100644 index 0000000..17f3e6a --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/FixtureDef.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +/** + * A fixture definition is used to create a fixture. This class defines an abstract fixture definition. You can reuse fixture + * definitions safely. + * @author mzechner + * + */ +public class FixtureDef { + /** + * The shape, this must be set. The shape will be cloned, so you can create the shape on the stack. + */ + public Shape shape; + + /** The friction coefficient, usually in the range [0,1]. **/ + public float friction = 0.2f; + + /** The restitution (elasticity) usually in the range [0,1]. **/ + public float restitution = 0; + + /** The density, usually in kg/m^2. **/ + public float density = 0; + + /** + * A sensor shape collects contact information but never generates a collision response. + */ + public boolean isSensor = false; + + /** Contact filtering data. **/ + public final Filter filter = new Filter(); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/Joint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/Joint.java new file mode 100644 index 0000000..3f1ee2b --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/Joint.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.JointDef.JointType; + +public abstract class Joint { + /** the address of the joint **/ + protected long addr; + + /** world **/ + private final World world; + + /** temporary float array **/ + private final float[] tmp = new float[2]; + + /** joint edge a **/ + protected JointEdge jointEdgeA; + + /** joint edge b **/ + protected JointEdge jointEdgeB; + + /** + * Constructs a new joint + * @param addr the address of the joint + */ + protected Joint (World world, long addr) { + this.world = world; + this.addr = addr; + } + + /** + * Get the type of the concrete joint. + */ + public JointType getType () { + int type = jniGetType(addr); + if (type > 0 && type < JointType.valueTypes.length) + return JointType.valueTypes[type]; + else + return JointType.Unknown; + } + + private native int jniGetType (long addr); + + /** + * Get the first body attached to this joint. + */ + public Body getBodyA () { + return world.bodies.get(jniGetBodyA(addr)); + } + + private native long jniGetBodyA (long addr); + + /** + * Get the second body attached to this joint. + */ + public Body getBodyB () { + return world.bodies.get(jniGetBodyB(addr)); + } + + private native long jniGetBodyB (long addr); + + /** + * Get the anchor point on bodyA in world coordinates. + */ + private final Vector2 anchorA = new Vector2(); + + public Vector2 getAnchorA () { + jniGetAnchorA(addr, tmp); + anchorA.x = tmp[0]; + anchorA.y = tmp[1]; + return anchorA; + } + + private native void jniGetAnchorA (long addr, float[] anchorA); + + /** + * Get the anchor point on bodyB in world coordinates. + */ + private final Vector2 anchorB = new Vector2(); + + public Vector2 getAnchorB () { + jniGetAnchorB(addr, tmp); + anchorB.x = tmp[0]; + anchorB.y = tmp[1]; + return anchorB; + } + + private native void jniGetAnchorB (long addr, float[] anchorB); + + /** + * Get the reaction force on body2 at the joint anchor in Newtons. + */ + private final Vector2 reactionForce = new Vector2(); + + public Vector2 getReactionForce (float inv_dt) { + jniGetReactionForce(addr, inv_dt, tmp); + reactionForce.x = tmp[0]; + reactionForce.y = tmp[1]; + return reactionForce; + } + + private native void jniGetReactionForce (long addr, float inv_dt, float[] reactionForce); + + /** + * Get the reaction torque on body2 in N*m. + */ + public float getReactionTorque (float inv_dt) { + return jniGetReactionTorque(addr, inv_dt); + } + + private native float jniGetReactionTorque (long addr, float inv_dt); + +// /// Get the next joint the world joint list. +// b2Joint* GetNext(); +// +// /// Get the user data pointer. +// void* GetUserData() const; +// +// /// Set the user data pointer. +// void SetUserData(void* data); + + /** + * Short-cut function to determine if either body is inactive. + */ + public boolean isActive () { + return jniIsActive(addr); + } + + private native boolean jniIsActive (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/JointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/JointDef.java new file mode 100644 index 0000000..7321a03 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/JointDef.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +public class JointDef { + public enum JointType { + Unknown(0), RevoluteJoint(1), PrismaticJoint(2), DistanceJoint(3), PulleyJoint(4), MouseJoint(5), GearJoint(6), LineJoint(7), WeldJoint( + 8), FrictionJoint(9); + + public static JointType[] valueTypes = new JointType[] {Unknown, RevoluteJoint, PrismaticJoint, DistanceJoint, PulleyJoint, + MouseJoint, GearJoint, LineJoint, WeldJoint, FrictionJoint}; + private int value; + + JointType (int value) { + this.value = value; + } + + public int getValue () { + return value; + } + } + + /** The joint type is set automatically for concrete joint types. **/ + public JointType type = JointType.Unknown; + + /** The first attached body. **/ + public Body bodyA = null; + + /** The second attached body **/ + public Body bodyB = null; + + /** Set this flag to true if the attached bodies should collide. **/ + public boolean collideConnected = false; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/JointEdge.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/JointEdge.java new file mode 100644 index 0000000..b370aac --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/JointEdge.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +/** + * A joint edge is used to connect bodies and joints together in a joint graph where each body is a node and each joint is an + * edge. A joint edge belongs to a doubly linked list maintained in each attached body. Each joint has two joint nodes, one for + * each attached body. + */ +public class JointEdge { + public final Body other; + public final Joint joint; + + protected JointEdge (Body other, Joint joint) { + this.other = other; + this.joint = joint; + } +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/MassData.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/MassData.java new file mode 100644 index 0000000..5bcdf5d --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/MassData.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; + +/** + * This holds the mass data computed for a shape. + * @author mzechner + * + */ +public class MassData { + /** The mass of the shape, usually in kilograms. **/ + public float mass; + + /** The position of the shape's centroid relative to the shape's origin. **/ + public final Vector2 center = new Vector2(); + + /** The rotational inertia of the shape about the local origin. **/ + public float I; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/PolygonShape.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/PolygonShape.java new file mode 100644 index 0000000..4846dfe --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/PolygonShape.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; + +public class PolygonShape extends Shape { + /** + * Constructs a new polygon + */ + public PolygonShape () { + addr = newPolygonShape(); + } + + protected PolygonShape (long addr) { + this.addr = addr; + } + + private native long newPolygonShape (); + + /** + * {@inheritDoc} + */ + @Override public Type getType () { + return Type.Polygon; + } + + /** + * Copy vertices. This assumes the vertices define a convex polygon. It is assumed that the exterior is the the right of each + * edge. + */ + public void set (Vector2[] vertices) { + float[] verts = new float[vertices.length * 2]; + for (int i = 0, j = 0; i < vertices.length * 2; i += 2, j++) { + verts[i] = vertices[j].x; + verts[i + 1] = vertices[j].y; + } + jniSet(addr, verts); + } + + private native void jniSet (long addr, float[] verts); + + /** + * Build vertices to represent an axis-aligned box. + * @param hx the half-width. + * @param hy the half-height. + */ + public void setAsBox (float hx, float hy) { + jniSetAsBox(addr, hx, hy); + } + + private native void jniSetAsBox (long addr, float hx, float hy); + + /** + * Build vertices to represent an oriented box. + * @param hx the half-width. + * @param hy the half-height. + * @param center the center of the box in local coordinates. + * @param angle the rotation of the box in local coordinates. + */ + public void setAsBox (float hx, float hy, Vector2 center, float angle) { + jniSetAsBox(addr, hx, hy, center.x, center.y, angle); + } + + private native void jniSetAsBox (long addr, float hx, float hy, float centerX, float centerY, float angle); + + /** + * Set this as a single edge. + */ + public void setAsEdge (Vector2 v1, Vector2 v2) { + jniSetAsEdge(addr, v1.x, v1.y, v2.x, v2.y); + } + + private native void jniSetAsEdge (long addr, float v1x, float v1y, float v2x, float v2y); + + /** + * @return the number of vertices + */ + public int getVertexCount () { + return jniGetVertexCount(addr); + } + + private native int jniGetVertexCount (long addr); + + private static float[] verts = new float[2]; + /** + * Returns the vertex at the given position. + * @param index the index of the vertex 0 <= index < getVertexCount( ) + * @param vertex vertex + */ + public void getVertex (int index, Vector2 vertex) { + jniGetVertex(addr, index, verts); + vertex.x = verts[0]; + vertex.y = verts[1]; + } + + private native void jniGetVertex (long addr, int index, float[] verts); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/QueryCallback.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/QueryCallback.java new file mode 100644 index 0000000..efe3490 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/QueryCallback.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +/** + * Callback class for AABB queries. + */ +public interface QueryCallback { + /** + * Called for each fixture found in the query AABB. + * @return false to terminate the query. + */ + public boolean reportFixture (Fixture fixture); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/Shape.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/Shape.java new file mode 100644 index 0000000..a234f46 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/Shape.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +/** + * A shape is used for collision detection. You can create a shape however you like. Shapes used for simulation in b2World are + * created automatically when a b2Fixture is created. + * + * NOTE: YOU NEED TO DISPOSE SHAPES AFTER YOU NO LONGER USE THEM! E.g. after calling body.createFixture(); + * @author mzechner + * + */ +public abstract class Shape { + /** + * Enum describing the type of a shape + * @author mzechner + * + */ + public enum Type { + Circle, Polygon, + }; + + /** the address of the shape **/ + protected long addr; + + /** + * Get the type of this shape. You can use this to down cast to the concrete shape. + * @return the shape type. + */ + public abstract Type getType (); + + /** + * Returns the radius of this shape + */ + public float getRadius () { + return jniGetRadius(addr); + } + + private native float jniGetRadius (long addr); + + /** + * Sets the radius of this shape + */ + public void setRadius (float radius) { + jniSetRadius(addr, radius); + } + + private native void jniSetRadius (long addr, float radius); + + /** + * Needs to be called when the shape is no longer used, e.g. after a fixture was created based on the shape. + */ + public void dispose () { + jniDispose(addr); + } + + private native void jniDispose (long addr); + + protected static native int jniGetType (long addr); + +// /// Test a point for containment in this shape. This only works for convex shapes. +// /// @param xf the shape world transform. +// /// @param p a point in world coordinates. +// virtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0; +// +// /// Cast a ray against this shape. +// /// @param output the ray-cast results. +// /// @param input the ray-cast input parameters. +// /// @param transform the transform to be applied to the shape. +// virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const = 0; +// +// /// Given a transform, compute the associated axis aligned bounding box for this shape. +// /// @param aabb returns the axis aligned box. +// /// @param xf the world transform of the shape. +// virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf) const = 0; +// +// /// Compute the mass properties of this shape using its dimensions and density. +// /// The inertia tensor is computed about the local origin. +// /// @param massData returns the mass data for this shape. +// /// @param density the density in kilograms per meter squared. +// virtual void ComputeMass(b2MassData* massData, float32 density) const = 0; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/Transform.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/Transform.java new file mode 100644 index 0000000..53d2549 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/Transform.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; + +/** + * Encodes a Box2D transform. We are lazy so we only store a 6 float wide array. First two floats are the position of the + * b2Transform struct. Next two floats are the b2Transform.R.col1 x and y coordinates. Final 2 floats are the b2Transform.R.col2 x + * and y coordinates; + * @author mzechner + * + */ +public class Transform { + public static final int POS_X = 0; + public static final int POS_Y = 1; + public static final int COL1_X = 2; + public static final int COL1_Y = 3; + public static final int COL2_X = 4; + public static final int COL2_Y = 5; + + public float[] vals = new float[6]; + + private Vector2 position = new Vector2(); + + public Transform () { + + } + + /** + * Constructs a new Transform instance with the given position and angle + * @param position the position + * @param angle the angle in radians + */ + public Transform (Vector2 position, float angle) { + setPosition(position); + setRotation(angle); + } + + /** + * Transforms the given vector by this transform + * @param v the vector + */ + public Vector2 mul (Vector2 v) { + float x = vals[POS_X] + vals[COL1_X] * v.x + vals[COL2_X] * v.y; + float y = vals[POS_Y] + vals[COL1_Y] * v.x + vals[COL2_Y] * v.y; + + v.x = x; + v.y = y; + return v; + } + + /** + * @return the position, modification of the vector has no effect on the Transform + */ + public Vector2 getPosition () { + return position.set(vals[0], vals[1]); + } + + /** + * Sets the rotation of this transform + * @param angle angle in radians + */ + public void setRotation (float angle) { + float c = (float)Math.cos(angle), s = (float)Math.sin(angle); + vals[COL1_X] = c; + vals[COL2_X] = -s; + vals[COL1_Y] = s; + vals[COL2_Y] = c; + } + + /** + * Sets the position of this transform + * @param pos the position + */ + public void setPosition (Vector2 pos) { + this.vals[POS_X] = pos.x; + this.vals[POS_Y] = pos.y; + } +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/World.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/World.java new file mode 100644 index 0000000..cc1fa2d --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/World.java @@ -0,0 +1,508 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import java.util.ArrayList; +import java.util.List; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.JointDef.JointType; +import com.badlogic.gdx.physics.box2d.joints.DistanceJoint; +import com.badlogic.gdx.physics.box2d.joints.DistanceJointDef; +import com.badlogic.gdx.physics.box2d.joints.FrictionJoint; +import com.badlogic.gdx.physics.box2d.joints.FrictionJointDef; +import com.badlogic.gdx.physics.box2d.joints.GearJoint; +import com.badlogic.gdx.physics.box2d.joints.GearJointDef; +import com.badlogic.gdx.physics.box2d.joints.LineJoint; +import com.badlogic.gdx.physics.box2d.joints.LineJointDef; +import com.badlogic.gdx.physics.box2d.joints.MouseJoint; +import com.badlogic.gdx.physics.box2d.joints.MouseJointDef; +import com.badlogic.gdx.physics.box2d.joints.PrismaticJoint; +import com.badlogic.gdx.physics.box2d.joints.PrismaticJointDef; +import com.badlogic.gdx.physics.box2d.joints.PulleyJoint; +import com.badlogic.gdx.physics.box2d.joints.PulleyJointDef; +import com.badlogic.gdx.physics.box2d.joints.RevoluteJoint; +import com.badlogic.gdx.physics.box2d.joints.RevoluteJointDef; +import com.badlogic.gdx.physics.box2d.joints.WeldJoint; +import com.badlogic.gdx.physics.box2d.joints.WeldJointDef; +import com.badlogic.gdx.utils.LongHashMap; + +/** + * The world class manages all physics entities, dynamic simulation, and asynchronous queries. The world also contains efficient + * memory management facilities. + * @author mzechner + */ +public class World { + /** the address of the world instance **/ + private final long addr; + + /** all known bodies **/ + protected final LongHashMap bodies = new LongHashMap(100); + + /** all known fixtures **/ + protected final LongHashMap fixtures = new LongHashMap(100); + + /** all known joints **/ + protected final LongHashMap joints = new LongHashMap(100); + + /** Contact filter **/ + protected ContactFilter contactFilter = null; + + /** Contact listener **/ + protected ContactListener contactListener = null; + + /** + * Construct a world object. + * @param gravity the world gravity vector. + * @param doSleep improve performance by not simulating inactive bodies. + */ + public World (Vector2 gravity, boolean doSleep) { + addr = newWorld(gravity.x, gravity.y, doSleep); + + for (int i = 0; i < 200; i++) + freeContacts.add(new Contact(this, 0)); + } + + private native long newWorld (float gravityX, float gravityY, boolean doSleep); + + /** + * Register a destruction listener. The listener is owned by you and must remain in scope. + */ + public void setDestructionListener (DestructionListener listener) { + + } + + /** + * Register a contact filter to provide specific control over collision. Otherwise the default filter is used + * (b2_defaultFilter). The listener is owned by you and must remain in scope. + */ + public void setContactFilter (ContactFilter filter) { + this.contactFilter = filter; + } + + /** + * Register a contact event listener. The listener is owned by you and must remain in scope. + */ + public void setContactListener (ContactListener listener) { + this.contactListener = listener; + } + + /** + * Create a rigid body given a definition. No reference to the definition is retained. + * @warning This function is locked during callbacks. + */ + public Body createBody (BodyDef def) { + Body body = new Body(this, jniCreateBody(addr, def.type.getValue(), def.position.x, def.position.y, def.angle, + def.linearVelocity.x, def.linearVelocity.y, def.angularVelocity, def.linearDamping, def.angularDamping, def.allowSleep, + def.awake, def.fixedRotation, def.bullet, def.active, def.inertiaScale)); + this.bodies.put(body.addr, body); + return body; + } + + private native long jniCreateBody (long addr, int type, float positionX, float positionY, float angle, float linearVelocityX, + float linearVelocityY, float angularVelocity, float linearDamping, float angularDamping, boolean allowSleep, boolean awake, + boolean fixedRotation, boolean bullet, boolean active, float intertiaScale); + + /** + * Destroy a rigid body given a definition. No reference to the definition is retained. This function is locked during + * callbacks. + * @warning This automatically deletes all associated shapes and joints. + * @warning This function is locked during callbacks. + */ + public void destroyBody (Body body) { + this.bodies.remove(body.addr); + for (int i = 0; i < body.getFixtureList().size(); i++) + this.fixtures.remove(body.getFixtureList().get(i).addr); + for (int i = 0; i < body.getJointList().size(); i++) + this.joints.remove(body.getJointList().get(i).joint.addr); + jniDestroyBody(addr, body.addr); + } + + private native void jniDestroyBody (long addr, long bodyAddr); + + /** + * Create a joint to constrain bodies together. No reference to the definition is retained. This may cause the connected bodies + * to cease colliding. + * @warning This function is locked during callbacks. + */ + public Joint createJoint (JointDef def) { + long jointAddr = createProperJoint(def); + Joint joint = null; + if (def.type == JointType.DistanceJoint) joint = new DistanceJoint(this, jointAddr); + if (def.type == JointType.FrictionJoint) joint = new FrictionJoint(this, jointAddr); + if (def.type == JointType.GearJoint) joint = new GearJoint(this, jointAddr); + if (def.type == JointType.LineJoint) joint = new LineJoint(this, jointAddr); + if (def.type == JointType.MouseJoint) joint = new MouseJoint(this, jointAddr); + if (def.type == JointType.PrismaticJoint) joint = new PrismaticJoint(this, jointAddr); + if (def.type == JointType.PulleyJoint) joint = new PulleyJoint(this, jointAddr); + if (def.type == JointType.RevoluteJoint) joint = new RevoluteJoint(this, jointAddr); + if (def.type == JointType.WeldJoint) joint = new WeldJoint(this, jointAddr); + if (joint != null) joints.put(joint.addr, joint); + JointEdge jointEdgeA = new JointEdge(def.bodyB, joint); + JointEdge jointEdgeB = new JointEdge(def.bodyA, joint); + joint.jointEdgeA = jointEdgeA; + joint.jointEdgeB = jointEdgeB; + def.bodyA.joints.add(jointEdgeA); + def.bodyB.joints.add(jointEdgeB); + return joint; + } + + private long createProperJoint (JointDef def) { + if (def.type == JointType.DistanceJoint) { + DistanceJointDef d = (DistanceJointDef)def; + return jniCreateDistanceJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.localAnchorA.x, d.localAnchorA.y, + d.localAnchorB.x, d.localAnchorB.y, d.length, d.frequencyHz, d.dampingRatio); + } + if (def.type == JointType.FrictionJoint) { + FrictionJointDef d = (FrictionJointDef)def; + return jniCreateFrictionJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.localAnchorA.x, d.localAnchorA.y, + d.localAnchorB.x, d.localAnchorB.y, d.maxForce, d.maxTorque); + } + if (def.type == JointType.GearJoint) { + GearJointDef d = (GearJointDef)def; + return jniCreateGearJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.joint1.addr, d.joint2.addr, d.ratio); + } + if (def.type == JointType.LineJoint) { + LineJointDef d = (LineJointDef)def; + return jniCreateLineJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.localAnchorA.x, d.localAnchorA.y, + d.localAnchorB.x, d.localAnchorB.y, d.localAxisA.x, d.localAxisA.y, d.enableLimit, d.lowerTranslation, + d.upperTranslation, d.enableMotor, d.maxMotorForce, d.motorSpeed); + + } + if (def.type == JointType.MouseJoint) { + MouseJointDef d = (MouseJointDef)def; + return jniCreateMouseJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.target.x, d.target.y, d.maxForce, + d.frequencyHz, d.dampingRatio); + } + if (def.type == JointType.PrismaticJoint) { + PrismaticJointDef d = (PrismaticJointDef)def; + return jniCreatePrismaticJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.localAnchorA.x, d.localAnchorA.y, + d.localAnchorB.x, d.localAnchorB.y, d.localAxis1.x, d.localAxis1.y, d.referenceAngle, d.enableLimit, + d.lowerTranslation, d.upperTranslation, d.enableMotor, d.maxMotorForce, d.motorSpeed); + } + if (def.type == JointType.PulleyJoint) { + PulleyJointDef d = (PulleyJointDef)def; + return jniCreatePulleyJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.groundAnchorA.x, d.groundAnchorA.y, + d.groundAnchorB.x, d.groundAnchorB.y, d.localAnchorA.x, d.localAnchorA.y, d.localAnchorB.x, d.localAnchorB.y, + d.lengthA, d.maxLengthA, d.lengthB, d.maxLengthB, d.ratio); + + } + if (def.type == JointType.RevoluteJoint) { + RevoluteJointDef d = (RevoluteJointDef)def; + return jniCreateRevoluteJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.localAnchorA.x, d.localAnchorA.y, + d.localAnchorB.x, d.localAnchorB.y, d.referenceAngle, d.enableLimit, d.lowerAngle, d.upperAngle, d.enableMotor, + d.motorSpeed, d.maxMotorTorque); + } + if (def.type == JointType.WeldJoint) { + WeldJointDef d = (WeldJointDef)def; + return jniCreateWeldJoint(addr, d.bodyA.addr, d.bodyB.addr, d.collideConnected, d.localAnchorA.x, d.localAnchorA.y, + d.localAnchorB.x, d.localAnchorB.y, d.referenceAngle); + } + + return 0; + } + + private native long jniCreateDistanceJoint (long addr, long bodyA, long bodyB, boolean collideConnected, float localAnchorAX, + float localAnchorAY, float localAnchorBX, float localAnchorBY, float length, float frequencyHz, float dampingRatio); + + private native long jniCreateFrictionJoint (long addr, long bodyA, long bodyB, boolean collideConnected, float localAnchorAX, + float localAnchorAY, float localAnchorBX, float localAnchorBY, float maxForce, float maxTorque); + + private native long jniCreateGearJoint (long addr, long bodyA, long bodyB, boolean collideConnected, long joint1, long joint2, + float ratio); + + private native long jniCreateLineJoint (long addr, long bodyA, long bodyB, boolean collideConnected, float localAnchorAX, + float localAnchorAY, float localAnchorBX, float localAnchorBY, float localAxisAX, float localAxisAY, boolean enableLimit, + float lowerTranslation, float upperTranslation, boolean enableMotor, float maxMotorForce, float motorSpeed); + + private native long jniCreateMouseJoint (long addr, long bodyA, long bodyB, boolean collideConnected, float targetX, + float targetY, float maxForce, float frequencyHz, float dampingRatio); + + private native long jniCreatePrismaticJoint (long addr, long bodyA, long bodyB, boolean collideConnected, float localAnchorAX, + float localAnchorAY, float localAnchorBX, float localAnchorBY, float localAxisAX, float localAxisAY, float referenceAngle, + boolean enableLimit, float lowerTranslation, float upperTranslation, boolean enableMotor, float maxMotorForce, + float motorSpeed); + + private native long jniCreatePulleyJoint (long addr, long bodyA, long bodyB, boolean collideConnected, float groundAnchorAX, + float groundAnchorAY, float groundAnchorBX, float groundAnchorBY, float localAnchorAX, float localAnchorAY, + float localAnchorBX, float localAnchorBY, float lengthA, float maxLengthA, float lengthB, float maxLengthB, float ratio); + + private native long jniCreateRevoluteJoint (long addr, long bodyA, long bodyB, boolean collideConnected, float localAnchorAX, + float localAnchorAY, float localAnchorBX, float localAnchorBY, float referenceAngle, boolean enableLimit, float lowerAngle, + float upperAngle, boolean enableMotor, float motorSpeed, float maxMotorTorque); + + private native long jniCreateWeldJoint (long addr, long bodyA, long bodyB, boolean collideConnected, float localAnchorAX, + float localAnchorAY, float localAnchorBX, float localAnchorBY, float referenceAngle); + + /** + * Destroy a joint. This may cause the connected bodies to begin colliding. + * @warning This function is locked during callbacks. + */ + public void destroyJoint (Joint joint) { + joints.remove(joint.addr); + joint.jointEdgeA.other.joints.remove(joint.jointEdgeB); + joint.jointEdgeB.other.joints.remove(joint.jointEdgeA); + jniDestroyJoint(addr, joint.addr); + } + + private native void jniDestroyJoint (long addr, long jointAddr); + + /** + * Take a time step. This performs collision detection, integration, and constraint solution. + * @param timeStep the amount of time to simulate, this should not vary. + * @param velocityIterations for the velocity constraint solver. + * @param positionIterations for the position constraint solver. + */ + public void step (float timeStep, int velocityIterations, int positionIterations) { + jniStep(addr, timeStep, velocityIterations, positionIterations); + } + + private native void jniStep (long addr, float timeStep, int velocityIterations, int positionIterations); + + /** + * Call this after you are done with time steps to clear the forces. You normally call this after each call to Step, unless you + * are performing sub-steps. By default, forces will be automatically cleared, so you don't need to call this function. + * See {@link #setAutoClearForces(boolean)} + */ + public void clearForces () { + jniClearForces(addr); + } + + private native void jniClearForces (long addr); + + /** + * Enable/disable warm starting. For testing. + */ + public void setWarmStarting (boolean flag) { + jniSetWarmStarting(addr, flag); + } + + private native void jniSetWarmStarting (long addr, boolean flag); + + /** + * Enable/disable continuous physics. For testing. + */ + public void setContinuousPhysics (boolean flag) { + jniSetContiousPhysics(addr, flag); + } + + private native void jniSetContiousPhysics (long addr, boolean flag); + + /** + * Get the number of broad-phase proxies. + */ + public int getProxyCount () { + return jniGetProxyCount(addr); + } + + private native int jniGetProxyCount (long addr); + + /** + * Get the number of bodies. + */ + public int getBodyCount () { + return jniGetBodyCount(addr); + } + + private native int jniGetBodyCount (long addr); + + /** + * Get the number of joints. + */ + public int getJointCount () { + return jniGetJointcount(addr); + } + + private native int jniGetJointcount (long addr); + + /** + * Get the number of contacts (each may have 0 or more contact points). + */ + public int getContactCount () { + return jniGetContactCount(addr); + } + + private native int jniGetContactCount (long addr); + + /** + * Change the global gravity vector. + */ + public void setGravity (Vector2 gravity) { + jniSetGravity(addr, gravity.x, gravity.y); + } + + private native void jniSetGravity (long addr, float gravityX, float gravityY); + + /** + * Get the global gravity vector. + */ + final float[] tmpGravity = new float[2]; + final Vector2 gravity = new Vector2(); + + public Vector2 getGravity () { + jniGetGravity(addr, tmpGravity); + gravity.x = tmpGravity[0]; + gravity.y = tmpGravity[1]; + return gravity; + } + + private native void jniGetGravity (long addr, float[] gravity); + + /** + * Is the world locked (in the middle of a time step). + */ + public boolean isLocked () { + return jniIsLocked(addr); + } + + private native boolean jniIsLocked (long addr); + + /** + * Set flag to control automatic clearing of forces after each time step. + */ + public void setAutoClearForces (boolean flag) { + jniSetAutoClearForces(addr, flag); + } + + private native void jniSetAutoClearForces (long addr, boolean flag); + + /** + * Get the flag that controls automatic clearing of forces after each time step. + */ + public boolean getAutoClearForces () { + return jniGetAutoClearForces(addr); + } + + private native boolean jniGetAutoClearForces (long addr); + + /** + * Query the world for all fixtures that potentially overlap the provided AABB. + * @param callback a user implemented callback class. + * @param lowerX the x coordinate of the lower left corner + * @param lowerY the y coordinate of the lower left corner + * @param upperX the x coordinate of the upper right corner + * @param upperY the y coordinate of the upper right corner + */ + public void QueryAABB (QueryCallback callback, float lowerX, float lowerY, float upperX, float upperY) { + queryCallback = callback; + jniQueryAABB(addr, lowerX, lowerY, upperX, upperY); + } + + private QueryCallback queryCallback = null;; + + private native void jniQueryAABB (long addr, float lowX, float lowY, float upX, float upY); + +// +// /// Ray-cast the world for all fixtures in the path of the ray. Your callback +// /// controls whether you get the closest point, any point, or n-points. +// /// The ray-cast ignores shapes that contain the starting point. +// /// @param callback a user implemented callback class. +// /// @param point1 the ray starting point +// /// @param point2 the ray ending point +// void RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const; +// +// /// Get the world contact list. With the returned contact, use b2Contact::GetNext to get +// /// the next contact in the world list. A NULL contact indicates the end of the list. +// /// @return the head of the world contact list. +// /// @warning contacts are +// b2Contact* GetContactList(); + + private long[] contactAddrs = new long[200]; + private final ArrayList contacts = new ArrayList(); + private final ArrayList freeContacts = new ArrayList(); + + public List getContactList () { + int numContacts = getContactCount(); + if (numContacts > contactAddrs.length) contactAddrs = new long[numContacts]; + if (numContacts > freeContacts.size()) { + int freeConts = freeContacts.size(); + for (int i = 0; i < numContacts - freeConts; i++) + freeContacts.add(new Contact(this, 0)); + } + jniGetContactList(addr, contactAddrs); + + contacts.clear(); + for (int i = 0; i < numContacts; i++) { + Contact contact = freeContacts.get(i); + contact.addr = contactAddrs[i]; + contacts.add(contact); + } + + return contacts; + } + + /** + * @return all bodies currently in the simulation + */ + public Iterable getBodies () { + return bodies.values(); + } + + /** + * @return all joints currently in the simulation + */ + public Iterable getJoints () { + return joints.values(); + } + + private native void jniGetContactList (long addr, long[] contacts); + + public void dispose () { + jniDispose(addr); + } + + private native void jniDispose (long addr); + + /** + * Internal method called from JNI in case a contact happens + * @param fixtureA + * @param fixtureB + * @return whether the things collided + */ + private boolean contactFilter (long fixtureA, long fixtureB) { + if (contactFilter != null) + return contactFilter.shouldCollide(fixtures.get(fixtureA), fixtures.get(fixtureB)); + else { + Filter filterA = fixtures.get(fixtureA).getFilterData(); + Filter filterB = fixtures.get(fixtureB).getFilterData(); + + if (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0) { + return filterA.groupIndex > 0; + } + + boolean collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0; + return collide; + } + } + + private final Contact contact = new Contact(this, 0); + + private void beginContact (long contactAddr) { + contact.addr = contactAddr; + if (contactListener != null) contactListener.beginContact(contact); + } + + private void endContact (long contactAddr) { + contact.addr = contactAddr; + contact.GetWorldManifold(); + if (contactListener != null) contactListener.endContact(contact); + } + + private boolean reportFixture (long addr) { + if (queryCallback != null) + return queryCallback.reportFixture(fixtures.get(addr)); + else + return false; + } +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/WorldManifold.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/WorldManifold.java new file mode 100644 index 0000000..f63b4cb --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/WorldManifold.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d; + +import com.badlogic.gdx.math.Vector2; + +/** + * This is used to compute the current state of a contact manifold. + */ +public class WorldManifold { + protected final Vector2 normal = new Vector2(); + protected final Vector2[] points = {new Vector2(), new Vector2()}; + protected int numContactPoints; + + protected WorldManifold () { + } + + /** + * Returns the normal of this manifold + */ + public Vector2 getNormal () { + return normal; + } + + /** + * Returns the contact points of this manifold. Use getNumberOfContactPoints to determine how many contact points there are + * (0,1 or 2) + */ + public Vector2[] getPoints () { + return points; + } + + /** + * @return the number of contact points + */ + public int getNumberOfContactPoints () { + return numContactPoints; + } +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/DistanceJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/DistanceJoint.java new file mode 100644 index 0000000..1ab4951 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/DistanceJoint.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * A distance joint constrains two points on two bodies to remain at a fixed distance from each other. You can view this as a + * massless, rigid rod. + */ +public class DistanceJoint extends Joint { + public DistanceJoint (World world, long addr) { + super(world, addr); + } + + /** + * Set/get the natural length. Manipulating the length can lead to non-physical behavior when the frequency is zero. + */ + public void setLength (float length) { + jniSetLength(addr, length); + } + + private native void jniSetLength (long addr, float length); + + /** + * Set/get the natural length. Manipulating the length can lead to non-physical behavior when the frequency is zero. + */ + public float getLength () { + return jniGetLength(addr); + } + + private native float jniGetLength (long addr); + + /** + * Set/get frequency in Hz. + */ + public void setFrequency (float hz) { + jniSetFrequency(addr, hz); + } + + private native void jniSetFrequency (long addr, float hz); + + /** + * Set/get frequency in Hz. + */ + public float getFrequency () { + return jniGetFrequency(addr); + } + + private native float jniGetFrequency (long addr); + + /** + * Set/get damping ratio. + */ + public void setDampingRatio (float ratio) { + jniSetDampingRatio(addr, ratio); + } + + private native void jniSetDampingRatio (long addr, float ratio); + + /** + * Set/get damping ratio. + */ + public float getDampingRatio () { + return jniGetDampingRatio(addr); + } + + private native float jniGetDampingRatio (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/DistanceJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/DistanceJointDef.java new file mode 100644 index 0000000..274e5cb --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/DistanceJointDef.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.JointDef; + +/** + * Distance joint definition. This requires defining an anchor point on both bodies and the non-zero length of the distance joint. + * The definition uses local anchor points so that the initial configuration can violate the constraint slightly. This helps when + * saving and loading a game. + * @warning Do not use a zero or short length. + */ +public class DistanceJointDef extends JointDef { + public DistanceJointDef () { + type = JointType.DistanceJoint; + } + + /** + * Initialize the bodies, anchors, and length using the world anchors. + */ + public void initialize (Body bodyA, Body bodyB, Vector2 anchorA, Vector2 anchorB) { + this.bodyA = bodyA; + this.bodyB = bodyB; + this.localAnchorA.set(bodyA.getLocalPoint(anchorA)); + this.localAnchorB.set(bodyB.getLocalPoint(anchorB)); + this.length = anchorA.dst(anchorB); + } + + /** + * The local anchor point relative to body1's origin. + */ + public final Vector2 localAnchorA = new Vector2(); + + /** + * The local anchor point relative to body2's origin. + */ + public final Vector2 localAnchorB = new Vector2(); + + /** + * The natural length between the anchor points. + */ + public float length = 1; + + /** + * The mass-spring-damper frequency in Hertz. + */ + public float frequencyHz = 0; + + /** + * The damping ratio. 0 = no damping, 1 = critical damping. + */ + public float dampingRatio = 0; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/FrictionJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/FrictionJoint.java new file mode 100644 index 0000000..caa96a6 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/FrictionJoint.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * Friction joint. This is used for top-down friction. It provides 2D translational friction and angular friction. + */ +public class FrictionJoint extends Joint { + public FrictionJoint (World world, long addr) { + super(world, addr); + } + + /** + * Set the maximum friction force in N. + */ + public void setMaxForce (float force) { + jniSetMaxForce(addr, force); + } + + private native void jniSetMaxForce (long ddr, float force); + + /** + * Get the maximum friction force in N. + */ + public float getMaxForce () { + return jniGetMaxForce(addr); + } + + private native float jniGetMaxForce (long addr); + + /** + * Set the maximum friction torque in N*m. + */ + public void setMaxTorque (float torque) { + jniSetMaxTorque(addr, torque); + } + + private native void jniSetMaxTorque (long addr, float torque); + + /** + * Get the maximum friction torque in N*m. + */ + public float getMaxTorque () { + return jniGetMaxTorque(addr); + } + + private native float jniGetMaxTorque (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/FrictionJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/FrictionJointDef.java new file mode 100644 index 0000000..6a26e04 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/FrictionJointDef.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.JointDef; + +/** + * Friction joint definition. + */ +public class FrictionJointDef extends JointDef { + + public FrictionJointDef () { + type = JointType.FrictionJoint; + } + + /** + * Initialize the bodies, anchors, axis, and reference angle using the world anchor and world axis. + */ + public void initialize (Body bodyA, Body bodyB, Vector2 anchor) { + this.bodyA = bodyA; + this.bodyB = bodyB; + localAnchorA.set(bodyA.getLocalPoint(anchor)); + localAnchorB.set(bodyB.getLocalPoint(anchor)); + } + + /** + * The local anchor point relative to bodyA's origin. + */ + public final Vector2 localAnchorA = new Vector2(); + + /** + * The local anchor point relative to bodyB's origin. + */ + public final Vector2 localAnchorB = new Vector2(); + + /** + * The maximum friction force in N. + */ + public float maxForce = 0; + + /** + * The maximum friction torque in N-m. + */ + public float maxTorque = 0; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/GearJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/GearJoint.java new file mode 100644 index 0000000..f25fd2b --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/GearJoint.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * A gear joint is used to connect two joints together. Either joint can be a revolute or prismatic joint. You specify a gear + * ratio to bind the motions together: coordinate1 + ratio * coordinate2 = constant The ratio can be negative or positive. If one + * joint is a revolute joint and the other joint is a prismatic joint, then the ratio will have units of length or units of + * 1/length. + * @warning The revolute and prismatic joints must be attached to fixed bodies (which must be body1 on those joints). + */ +public class GearJoint extends Joint { + public GearJoint (World world, long addr) { + super(world, addr); + } + + /** + * Set/Get the gear ratio. + */ + public void setRatio (float ratio) { + jniSetRatio(addr, ratio); + } + + private native void jniSetRatio (long addr, float ratio); + + /** + * Set/Get the gear ratio. + */ + public float getRatio () { + return jniGetRatio(addr); + } + + private native float jniGetRatio (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/GearJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/GearJointDef.java new file mode 100644 index 0000000..1138693 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/GearJointDef.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.JointDef; + +/** + * Gear joint definition. This definition requires two existing revolute or prismatic joints (any combination will work). The + * provided joints must attach a dynamic body to a static body. + */ +public class GearJointDef extends JointDef { + public GearJointDef () { + type = JointType.GearJoint; + } + + /** + * The first revolute/prismatic joint attached to the gear joint. + */ + public Joint joint1 = null; + + /** + * The second revolute/prismatic joint attached to the gear joint. + */ + public Joint joint2 = null; + + /** + * The gear ratio. + * @see GearJoint for explanation. + */ + public float ratio = 1; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/LineJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/LineJoint.java new file mode 100644 index 0000000..e54bc72 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/LineJoint.java @@ -0,0 +1,153 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * A line joint. This joint provides two degrees of freedom: translation along an axis fixed in body1 and rotation in the plane. + * You can use a joint limit to restrict the range of motion and a joint motor to drive the motion or to model joint friction. + */ +public class LineJoint extends Joint { + public LineJoint (World world, long addr) { + super(world, addr); + } + + /** + * Get the current joint translation, usually in meters. + */ + public float getJointTranslation () { + return jniGetJointTranslation(addr); + } + + private native float jniGetJointTranslation (long addr); + + /** + * Get the current joint translation speed, usually in meters per second. + */ + public float getJointSpeed () { + return jniGetJointSpeed(addr); + } + + private native float jniGetJointSpeed (long addr); + + /** + * Is the joint limit enabled? + */ + public boolean isLimitEnabled () { + return jniIsLimitEnabled(addr); + } + + private native boolean jniIsLimitEnabled (long addr); + + /** + * Enable/disable the joint limit. + */ + public void enableLimit (boolean flag) { + jniEnableLimit(addr, flag); + } + + private native void jniEnableLimit (long addr, boolean flag); + + /** + * Get the lower joint limit, usually in meters. + */ + public float getLowerLimit () { + return jniGetLowerLimit(addr); + } + + private native float jniGetLowerLimit (long addr); + + /** + * Get the upper joint limit, usually in meters. + */ + public float getUpperLimit () { + return jniGetUpperLimit(addr); + } + + private native float jniGetUpperLimit (long addr); + + /** + * Set the joint limits, usually in meters. + */ + public void setLimits (float lower, float upper) { + jniSetLimits(addr, lower, upper); + } + + private native void jniSetLimits (long addr, float lower, float upper); + + /** + * Is the joint motor enabled? + */ + public boolean isMotorEnabled () { + return jniIsMotorEnabled(addr); + } + + private native boolean jniIsMotorEnabled (long addr); + + /** + * Enable/disable the joint motor. + */ + public void enableMotor (boolean flag) { + jniEnableMotor(addr, flag); + } + + private native void jniEnableMotor (long addr, boolean flag); + + /** + * Set the motor speed, usually in meters per second. + */ + public void setMotorSpeed (float speed) { + jniSetMotorSpeed(addr, speed); + } + + private native void jniSetMotorSpeed (long addr, float speed); + + /** + * Get the motor speed, usually in meters per second. + */ + public float getMotorSpeed () { + return jniGetMotorSpeed(addr); + } + + private native float jniGetMotorSpeed (long addr); + + /** + * Set/Get the maximum motor force, usually in N. + */ + public void setMaxMotorForce (float force) { + jniSetMaxMotorForce(addr, force); + } + + private native void jniSetMaxMotorForce (long addr, float force); + + /** + * Set/Get the maximum motor force, usually in N. FIXME returns 0 at the moment due to a linking problem. + */ + public float getMaxMotorForce () { + return jniGetMaxMotorForce(addr); + } + + private native float jniGetMaxMotorForce (long addr); + + /** + * Get the current motor force, usually in N. + */ + public float getMotorForce () { + return jniGetMotorForce(addr); + } + + private native float jniGetMotorForce (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/LineJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/LineJointDef.java new file mode 100644 index 0000000..15cd8cf --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/LineJointDef.java @@ -0,0 +1,86 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.JointDef; + +/** + * Line joint definition. This requires defining a line of motion using an axis and an anchor point. The definition uses local + * anchor points and a local axis so that the initial configuration can violate the constraint slightly. The joint translation is + * zero when the local anchor points coincide in world space. Using local anchors and a local axis helps when saving and loading a + * game. + */ +public class LineJointDef extends JointDef { + public LineJointDef () { + type = JointType.LineJoint; + } + + /** + * Initialize the bodies, anchors, axis, and reference angle using the world anchor and world axis. + */ + public void initialize (Body bodyA, Body bodyB, Vector2 anchor, Vector2 axis) { + this.bodyA = bodyA; + this.bodyB = bodyB; + localAnchorA.set(bodyA.getLocalPoint(anchor)); + localAnchorB.set(bodyB.getLocalPoint(anchor)); + localAxisA.set(bodyA.getLocalVector(axis)); + } + + /** + * The local anchor point relative to body1's origin. + */ + public final Vector2 localAnchorA = new Vector2(); + + /** + * The local anchor point relative to body2's origin. + */ + public final Vector2 localAnchorB = new Vector2(); + + /** + * The local translation axis in body1. + */ + public final Vector2 localAxisA = new Vector2(1.0f, 0); + + /** + * Enable/disable the joint limit. + */ + public boolean enableLimit = false; + + /** + * The lower translation limit, usually in meters. + */ + public float lowerTranslation = 0; + + /** + * The upper translation limit, usually in meters. + */ + public float upperTranslation = 0; + + /** + * Enable/disable the joint motor. + */ + public boolean enableMotor = false; + + /** + * The maximum motor torque, usually in N-m. + */ + public float maxMotorForce = 0; + + /** + * The desired motor speed in radians per second. + */ + public float motorSpeed = 0; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/MouseJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/MouseJoint.java new file mode 100644 index 0000000..956e5ca --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/MouseJoint.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * A mouse joint is used to make a point on a body track a specified world point. This a soft constraint with a maximum force. + * This allows the constraint to stretch and without applying huge forces. NOTE: this joint is not documented in the manual + * because it was developed to be used in the testbed. If you want to learn how to use the mouse joint, look at the testbed. + */ +public class MouseJoint extends Joint { + public MouseJoint (World world, long addr) { + super(world, addr); + // TODO Auto-generated constructor stub + } + + /** + * Use this to update the target point. + */ + public void setTarget (Vector2 target) { + jniSetTarget(addr, target.x, target.y); + } + + private native void jniSetTarget (long addr, float x, float y); + + /** + * Use this to update the target point. + */ + final float[] tmp = new float[2]; + private final Vector2 target = new Vector2(); + + public Vector2 getTarget () { + jniGetTarget(addr, tmp); + target.x = tmp[0]; + target.y = tmp[1]; + return target; + } + + private native void jniGetTarget (long addr, float[] target); + + /** + * Set/get the maximum force in Newtons. + */ + public void setMaxForce (float force) { + jniSetMaxForce(addr, force); + } + + private native void jniSetMaxForce (long addr, float force); + + /** + * Set/get the maximum force in Newtons. + */ + public float getMaxForce () { + return jniGetMaxForce(addr); + } + + private native float jniGetMaxForce (long addr); + + /** + * Set/get the frequency in Hertz. + */ + public void setFrequency (float hz) { + jniSetFrequency(addr, hz); + } + + private native void jniSetFrequency (long addr, float hz); + + /** + * Set/get the frequency in Hertz. + */ + public float getFrequency () { + return jniGetFrequency(addr); + } + + private native float jniGetFrequency (long addr); + + /** + * Set/get the damping ratio (dimensionless). + */ + public void setDampingRatio (float ratio) { + jniSetDampingRatio(addr, ratio); + } + + private native void jniSetDampingRatio (long addr, float ratio); + + /** + * Set/get the damping ratio (dimensionless). + */ + public float getDampingRatio () { + return jniGetDampingRatio(addr); + } + + private native float jniGetDampingRatio (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/MouseJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/MouseJointDef.java new file mode 100644 index 0000000..e3398e9 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/MouseJointDef.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.JointDef; + +/** + * Mouse joint definition. This requires a world target point, tuning parameters, and the time step. + */ +public class MouseJointDef extends JointDef { + public MouseJointDef () { + type = JointType.MouseJoint; + } + + /** + * The initial world target point. This is assumed to coincide with the body anchor initially. + */ + public final Vector2 target = new Vector2(); + + /** + * The maximum constraint force that can be exerted to move the candidate body. Usually you will express as some multiple of + * the weight (multiplier * mass * gravity). + */ + public float maxForce = 0; + + /** + * The response speed. + */ + public float frequencyHz = 5.0f; + + /** + * The damping ratio. 0 = no damping, 1 = critical damping. + */ + public float dampingRatio = 0.7f; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PrismaticJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PrismaticJoint.java new file mode 100644 index 0000000..e30c9a9 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PrismaticJoint.java @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * A prismatic joint. This joint provides one degree of freedom: translation along an axis fixed in body1. Relative rotation is + * prevented. You can use a joint limit to restrict the range of motion and a joint motor to drive the motion or to model joint + * friction. + */ +public class PrismaticJoint extends Joint { + public PrismaticJoint (World world, long addr) { + super(world, addr); + } + + /** + * Get the current joint translation, usually in meters. + */ + public float getJointTranslation () { + return jniGetJointTranslation(addr); + } + + private native float jniGetJointTranslation (long addr); + + /** + * Get the current joint translation speed, usually in meters per second. + */ + public float getJointSpeed () { + return jniGetJointSpeed(addr); + } + + private native float jniGetJointSpeed (long addr); + + /** + * Is the joint limit enabled? + */ + public boolean isLimitEnabled () { + return jniIsLimitEnabled(addr); + } + + private native boolean jniIsLimitEnabled (long addr); + + /** + * Enable/disable the joint limit. + */ + public void enableLimit (boolean flag) { + jniEnableLimit(addr, flag); + } + + private native void jniEnableLimit (long addr, boolean flag); + + /** + * Get the lower joint limit, usually in meters. + */ + public float getLowerLimit () { + return jniGetLowerLimit(addr); + } + + private native float jniGetLowerLimit (long addr); + + /** + * Get the upper joint limit, usually in meters. + */ + public float getUpperLimit () { + return jniGetUpperLimit(addr); + } + + private native float jniGetUpperLimit (long addr); + + /** + * Set the joint limits, usually in meters. + */ + public void setLimits (float lower, float upper) { + jniSetLimits(addr, lower, upper); + } + + private native void jniSetLimits (long addr, float lower, float upper); + + /** + * Is the joint motor enabled? + */ + public boolean isMotorEnabled () { + return jniIsMotorEnabled(addr); + } + + private native boolean jniIsMotorEnabled (long addr); + + /** + * Enable/disable the joint motor. + */ + public void enableMotor (boolean flag) { + jniEnableMotor(addr, flag); + } + + private native void jniEnableMotor (long addr, boolean flag); + + /** + * Set the motor speed, usually in meters per second. + */ + public void setMotorSpeed (float speed) { + jniSetMotorSpeed(addr, speed); + } + + private native void jniSetMotorSpeed (long addr, float speed); + + /** + * Get the motor speed, usually in meters per second. + */ + public float getMotorSpeed () { + return jniGetMotorSpeed(addr); + } + + private native float jniGetMotorSpeed (long addr); + + /** + * Set the maximum motor force, usually in N. + */ + public void setMaxMotorForce (float force) { + jniSetMaxMotorForce(addr, force); + } + + private native void jniSetMaxMotorForce (long addr, float force); + + /** + * Get the current motor force, usually in N. + */ + public float getMotorForce () { + return jniGetMotorForce(addr); + } + + private native float jniGetMotorForce (long addr); + +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PrismaticJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PrismaticJointDef.java new file mode 100644 index 0000000..b56fa6b --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PrismaticJointDef.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.JointDef; + +/** + * Prismatic joint definition. This requires defining a line of motion using an axis and an anchor point. The definition uses + * local anchor points and a local axis so that the initial configuration can violate the constraint slightly. The joint + * translation is zero when the local anchor points coincide in world space. Using local anchors and a local axis helps when + * saving and loading a game. + * @warning at least one body should by dynamic with a non-fixed rotation. + */ +public class PrismaticJointDef extends JointDef { + public PrismaticJointDef () { + type = JointType.PrismaticJoint; + } + + /** + * Initialize the bodies, anchors, axis, and reference angle using the world anchor and world axis. + */ + public void initialize (Body bodyA, Body bodyB, Vector2 anchor, Vector2 axis) { + this.bodyA = bodyA; + this.bodyB = bodyB; + localAnchorA.set(bodyA.getLocalPoint(anchor)); + localAnchorB.set(bodyB.getLocalPoint(anchor)); + localAxis1.set(bodyA.getLocalVector(axis)); + referenceAngle = bodyB.getAngle() - bodyA.getAngle(); + + } + + /** + * The local anchor point relative to body1's origin. + */ + public final Vector2 localAnchorA = new Vector2(); + + /** + * The local anchor point relative to body2's origin. + */ + public final Vector2 localAnchorB = new Vector2(); + + /** + * The local translation axis in body1. + */ + public final Vector2 localAxis1 = new Vector2(1, 0); + + /** + * The constrained angle between the bodies: body2_angle - body1_angle. + */ + public float referenceAngle = 0; + + /** + * Enable/disable the joint limit. + */ + public boolean enableLimit = false; + + /** + * The lower translation limit, usually in meters. + */ + public float lowerTranslation = 0; + + /** + * The upper translation limit, usually in meters. + */ + public float upperTranslation = 0; + + /** + * Enable/disable the joint motor. + */ + public boolean enableMotor = false; + + /** + * The maximum motor torque, usually in N-m. + */ + public float maxMotorForce = 0; + + /** + * The desired motor speed in radians per second. + */ + public float motorSpeed = 0; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PulleyJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PulleyJoint.java new file mode 100644 index 0000000..e2b6b36 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PulleyJoint.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * The pulley joint is connected to two bodies and two fixed ground points. The pulley supports a ratio such that: length1 + ratio + * * length2 <= constant Yes, the force transmitted is scaled by the ratio. The pulley also enforces a maximum length limit on + * both sides. This is useful to prevent one side of the pulley hitting the top. + */ +public class PulleyJoint extends Joint { + public PulleyJoint (World world, long addr) { + super(world, addr); + } + + /** + * Get the first ground anchor. + */ + private final float[] tmp = new float[2]; + private final Vector2 groundAnchorA = new Vector2(); + + public Vector2 getGroundAnchorA () { + jniGetGroundAnchorA(addr, tmp); + groundAnchorA.set(tmp[0], tmp[1]); + return groundAnchorA; + } + + private native void jniGetGroundAnchorA (long addr, float[] anchor); + + /** + * Get the second ground anchor. + */ + private final Vector2 groundAnchorB = new Vector2(); + + public Vector2 getGroundAnchorB () { + jniGetGroundAnchorB(addr, tmp); + groundAnchorB.set(tmp[0], tmp[1]); + return groundAnchorB; + } + + private native void jniGetGroundAnchorB (long addr, float[] anchor); + + /** + * Get the current length of the segment attached to body1. + */ + public float getLength1 () { + return jniGetLength1(addr); + } + + private native float jniGetLength1 (long addr); + + /** + * Get the current length of the segment attached to body2. + */ + public float getLength2 () { + return jniGetLength2(addr); + } + + private native float jniGetLength2 (long addr); + + /** + * Get the pulley ratio. + */ + public float getRatio () { + return jniGetRatio(addr); + } + + private native float jniGetRatio (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PulleyJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PulleyJointDef.java new file mode 100644 index 0000000..b1315d8 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/PulleyJointDef.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.JointDef; + +/** + * Pulley joint definition. This requires two ground anchors, two dynamic body anchor points, max lengths for each side, and a + * pulley ratio. + */ +public class PulleyJointDef extends JointDef { + private final static float minPulleyLength = 2.0f; + + public PulleyJointDef () { + type = JointType.PulleyJoint; + collideConnected = true; + } + + /** + * Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors. + */ + public void initialize (Body bodyA, Body bodyB, Vector2 groundAnchorA, Vector2 groundAnchorB, Vector2 anchorA, + Vector2 anchorB, float ratio) { + this.bodyA = bodyA; + this.bodyB = bodyB; + this.groundAnchorA.set(groundAnchorA); + this.groundAnchorB.set(groundAnchorB); + this.localAnchorA.set(bodyA.getLocalPoint(anchorA)); + this.localAnchorB.set(bodyB.getLocalPoint(anchorB)); + lengthA = anchorA.dst(groundAnchorA); + lengthB = anchorB.dst(groundAnchorB); + this.ratio = ratio; + float C = lengthA + ratio * lengthB; + maxLengthA = C - ratio * minPulleyLength; + maxLengthB = (C - minPulleyLength) / ratio; + + } + + /** + * The first ground anchor in world coordinates. This point never moves. + */ + public final Vector2 groundAnchorA = new Vector2(-1, 1); + + /** + * The second ground anchor in world coordinates. This point never moves. + */ + public final Vector2 groundAnchorB = new Vector2(1, 1); + + /** + * The local anchor point relative to bodyA's origin. + */ + public final Vector2 localAnchorA = new Vector2(-1, 0); + + /** + * The local anchor point relative to bodyB's origin. + */ + public final Vector2 localAnchorB = new Vector2(1, 0); + + /** + * The a reference length for the segment attached to bodyA. + */ + public float lengthA = 0; + + /** + * The maximum length of the segment attached to bodyA. + */ + public float maxLengthA = 0; + + /** + * The a reference length for the segment attached to bodyB. + */ + public float lengthB = 0; + + /** + * The maximum length of the segment attached to bodyB. + */ + public float maxLengthB = 0; + + /** + * The pulley ratio, used to simulate a block-and-tackle. + */ + public float ratio = 1; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/RevoluteJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/RevoluteJoint.java new file mode 100644 index 0000000..3d6fa7f --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/RevoluteJoint.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * A revolute joint constrains two bodies to share a common point while they are free to rotate about the point. The relative + * rotation about the shared point is the joint angle. You can limit the relative rotation with a joint limit that specifies a + * lower and upper angle. You can use a motor to drive the relative rotation about the shared point. A maximum motor torque is + * provided so that infinite forces are not generated. + */ +public class RevoluteJoint extends Joint { + public RevoluteJoint (World world, long addr) { + super(world, addr); + } + + /** + * Get the current joint angle in radians. + */ + public float getJointAngle () { + return jniGetJointAngle(addr); + } + + private native float jniGetJointAngle (long addr); + + /** + * Get the current joint angle speed in radians per second. + */ + public float getJointSpeed () { + return jniGetJointSpeed(addr); + } + + private native float jniGetJointSpeed (long addr); + + /** + * Is the joint limit enabled? + */ + public boolean isLimitEnabled () { + return jniIsLimitEnabled(addr); + } + + private native boolean jniIsLimitEnabled (long addr); + + /** + * Enable/disable the joint limit. + */ + public void enableLimit (boolean flag) { + jniEnableLimit(addr, flag); + } + + private native void jniEnableLimit (long addr, boolean flag); + + /** + * Get the lower joint limit in radians. + */ + public float getLowerLimit () { + return jniGetLowerLimit(addr); + } + + private native float jniGetLowerLimit (long addr); + + /** + * Get the upper joint limit in radians. + */ + public float getUpperLimit () { + return jniGetUpperLimit(addr); + } + + private native float jniGetUpperLimit (long addr); + + /** + * Set the joint limits in radians. + * @param upper + */ + public void setLimits (float lower, float upper) { + jniSetLimits(addr, lower, upper); + } + + private native void jniSetLimits (long addr, float lower, float upper); + + /** + * Is the joint motor enabled? + */ + public boolean isMotorEnabled () { + return jniIsMotorEnabled(addr); + } + + private native boolean jniIsMotorEnabled (long addr); + + /** + * Enable/disable the joint motor. + */ + public void enableMotor (boolean flag) { + jniEnableMotor(addr, flag); + } + + private native void jniEnableMotor (long addr, boolean flag); + + /** + * Set the motor speed in radians per second. + */ + public void setMotorSpeed (float speed) { + jniSetMotorSpeed(addr, speed); + } + + private native void jniSetMotorSpeed (long addr, float speed); + + /** + * Get the motor speed in radians per second. + */ + public float getMotorSpeed () { + return jniGetMotorSpeed(addr); + } + + private native float jniGetMotorSpeed (long addr); + + /** + * Set the maximum motor torque, usually in N-m. + */ + public void setMaxMotorTorque (float torque) { + jniSetMaxMotorTorque(addr, torque); + } + + private native void jniSetMaxMotorTorque (long addr, float torque); + + /** + * Get the current motor torque, usually in N-m. + */ + public float getMotorTorque () { + return jniGetMotorTorque(addr); + } + + private native float jniGetMotorTorque (long addr); +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/RevoluteJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/RevoluteJointDef.java new file mode 100644 index 0000000..1526b91 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/RevoluteJointDef.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.JointDef; + +/** + * Revolute joint definition. This requires defining an anchor point where the bodies are joined. The definition uses local anchor + * points so that the initial configuration can violate the constraint slightly. You also need to specify the initial relative + * angle for joint limits. This helps when saving and loading a game. The local anchor points are measured from the body's origin + * rather than the center of mass because: 1. you might not know where the center of mass will be. 2. if you add/remove shapes + * from a body and recompute the mass, the joints will be broken. + */ +public class RevoluteJointDef extends JointDef { + public RevoluteJointDef () { + type = JointType.RevoluteJoint; + } + + /** + * Initialize the bodies, anchors, and reference angle using a world anchor point. + */ + public void initialize (Body bodyA, Body bodyB, Vector2 anchor) { + this.bodyA = bodyA; + this.bodyB = bodyB; + localAnchorA.set(bodyA.getLocalPoint(anchor)); + localAnchorB.set(bodyB.getLocalPoint(anchor)); + referenceAngle = bodyB.getAngle() - bodyA.getAngle(); + } + + /** + * The local anchor point relative to body1's origin. + */ + public final Vector2 localAnchorA = new Vector2(); + + /** + * The local anchor point relative to body2's origin. + */ + public final Vector2 localAnchorB = new Vector2();; + + /** + * The body2 angle minus body1 angle in the reference state (radians). + */ + public float referenceAngle = 0; + + /** + * A flag to enable joint limits. + */ + public boolean enableLimit = false; + + /** + * The lower angle for the joint limit (radians). + */ + public float lowerAngle = 0; + + /** + * The upper angle for the joint limit (radians). + */ + public float upperAngle = 0; + + /** + * A flag to enable the joint motor. + */ + public boolean enableMotor = false; + + /** + * The desired motor speed. Usually in radians per second. + */ + public float motorSpeed = 0; + + /** + * The maximum motor torque used to achieve the desired motor speed. Usually in N-m. + */ + public float maxMotorTorque = 0; +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/WeldJoint.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/WeldJoint.java new file mode 100644 index 0000000..03745e3 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/WeldJoint.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.World; + +/** + * A weld joint essentially glues two bodies together. A weld joint may distort somewhat because the island constraint solver is + * approximate. + */ +public class WeldJoint extends Joint { + public WeldJoint (World world, long addr) { + super(world, addr); + } +} diff --git a/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/WeldJointDef.java b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/WeldJointDef.java new file mode 100644 index 0000000..f5a90b3 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/physics/box2d/joints/WeldJointDef.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.physics.box2d.joints; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.JointDef; + +public class WeldJointDef extends JointDef { + public WeldJointDef () { + type = JointType.WeldJoint; + } + + // / Initialize the bodies, anchors, and reference angle using a world + // / anchor point. + public void initialize (Body body1, Body body2, Vector2 anchor) { + this.bodyA = body1; + this.bodyB = body2; + this.localAnchorA.set(body1.getLocalPoint(anchor)); + this.localAnchorB.set(body2.getLocalPoint(anchor)); + referenceAngle = body2.getAngle() - body1.getAngle(); + } + + // / The local anchor point relative to body1's origin. + public final Vector2 localAnchorA = new Vector2(); + + // / The local anchor point relative to body2's origin. + public final Vector2 localAnchorB = new Vector2(); + + // / The body2 angle minus body1 angle in the reference state (radians). + public float referenceAngle = 0; +} diff --git a/AndEngine/src/com/badlogic/gdx/utils/LongHashMap.java b/AndEngine/src/com/badlogic/gdx/utils/LongHashMap.java new file mode 100644 index 0000000..54d65d5 --- /dev/null +++ b/AndEngine/src/com/badlogic/gdx/utils/LongHashMap.java @@ -0,0 +1,216 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + ******************************************************************************/ + +package com.badlogic.gdx.utils; + +import java.util.Iterator; + +/** + * An long to object hashmap, taken from Amarena2D (thanks Christoph :p). + * + * @author christop widulle + * + * @param + */ +public class LongHashMap { + + private Entry[] table; + private float loadFactor; + private int size, mask, capacity, threshold; + + public LongHashMap () { + this(16, 0.75f); + } + + public LongHashMap (int initialCapacity) { + this(initialCapacity, 0.75f); + } + + public LongHashMap (int initialCapacity, float loadFactor) { + if (initialCapacity > 1 << 30) throw new IllegalArgumentException("initialCapacity is too large."); + if (initialCapacity < 0) throw new IllegalArgumentException("initialCapacity must be greater than zero."); + if (loadFactor <= 0) throw new IllegalArgumentException("initialCapacity must be greater than zero."); + capacity = 1; + while (capacity < initialCapacity) { + capacity <<= 1; + } + this.loadFactor = loadFactor; + this.threshold = (int)(capacity * loadFactor); + this.table = new Entry[capacity]; + this.mask = capacity - 1; + } + + public boolean containsValue (Object value) { + Entry[] table = this.table; + for (int i = table.length; i-- > 0;) + for (Entry e = table[i]; e != null; e = e.next) + if (e.value.equals(value)) return true; + return false; + } + + public boolean containsKey (long key) { + int index = ((int)key) & mask; + for (Entry e = table[index]; e != null; e = e.next) + if (e.key == key) return true; + return false; + } + + @SuppressWarnings("unchecked") public T get (long key) { + int index = (int)(key & mask); + for (Entry e = table[index]; e != null; e = e.next) + if (e.key == key) return (T)e.value; + return null; + } + + @SuppressWarnings("unchecked") public T put (long key, T value) { + int index = (int)(key & mask); + // Check if key already exists. + for (Entry e = table[index]; e != null; e = e.next) { + if (e.key != key) continue; + Object oldValue = e.value; + e.value = value; + return (T)oldValue; + } + table[index] = new Entry(key, value, table[index]); + if (size++ >= threshold) { + // Rehash. + int newCapacity = 2 * capacity; + Entry[] newTable = new Entry[newCapacity]; + Entry[] src = table; + int bucketmask = newCapacity - 1; + for (int j = 0; j < src.length; j++) { + Entry e = src[j]; + if (e != null) { + src[j] = null; + do { + Entry next = e.next; + index = (int)(e.key & bucketmask); + e.next = newTable[index]; + newTable[index] = e; + e = next; + } while (e != null); + } + } + table = newTable; + capacity = newCapacity; + threshold = (int)(newCapacity * loadFactor); + mask = capacity - 1; + } + return null; + } + + @SuppressWarnings("unchecked") public T remove (long key) { + int index = (int)(key & mask); + Entry prev = table[index]; + Entry e = prev; + while (e != null) { + Entry next = e.next; + if (e.key == key) { + size--; + if (prev == e) { + table[index] = next; + } else { + prev.next = next; + } + return (T)e.value; + } + prev = e; + e = next; + } + return null; + } + + public int size () { + return size; + } + + public void clear () { + Entry[] table = this.table; + for (int index = table.length; --index >= 0;) + table[index] = null; + size = 0; + } + + static class Entry { + final long key; + Object value; + Entry next; + + Entry (long k, Object v, Entry n) { + key = k; + value = v; + next = n; + } + } + + EntryIterable iterable = new EntryIterable(); + + public Iterable values () { + iterable.reset(); + return iterable; + } + + class EntryIterable implements Iterable { + int currIndex = -1; + Entry currEntry = null; + + Iterator iter = new Iterator() { + @Override public boolean hasNext () { + if (currEntry == null) { + if (!loadNextEntry()) return false; + } else { + if (currEntry.next == null) { + if (loadNextEntry() == false) return false; + } else + currEntry = currEntry.next; + } + + return true; + } + + @SuppressWarnings("synthetic-access") + private boolean loadNextEntry () { + while (true) { + currIndex++; + if (currIndex >= table.length) return false; + + if (table[currIndex] == null) + continue; + else { + currEntry = table[currIndex]; + return true; + } + } + } + + @SuppressWarnings("unchecked") @Override public T next () { + return (T)currEntry.value; + } + + @Override public void remove () { + throw new UnsupportedOperationException("not implemented"); + } + + }; + + public void reset () { + currIndex = -1; + currEntry = null; + } + + @Override public Iterator iterator () { + return iter; + } + + } +} diff --git a/AndEngine/src/org/anddev/andengine/audio/BaseAudioEntity.java b/AndEngine/src/org/anddev/andengine/audio/BaseAudioEntity.java new file mode 100644 index 0000000..ea990c5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/BaseAudioEntity.java @@ -0,0 +1,86 @@ +package org.anddev.andengine.audio; + +/** + * @author Nicolas Gramlich + * @since 16:35:37 - 13.06.2010 + */ +public abstract class BaseAudioEntity implements IAudioEntity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final IAudioManager mAudioManager; + + protected float mLeftVolume = 1.0f; + protected float mRightVolume = 1.0f; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseAudioEntity(final IAudioManager pAudioManager) { + this.mAudioManager = pAudioManager; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + protected IAudioManager getAudioManager() { + return this.mAudioManager; + } + + public float getActualLeftVolume() { + return this.mLeftVolume * this.getMasterVolume(); + } + + public float getActualRightVolume() { + return this.mRightVolume * this.getMasterVolume(); + } + + protected float getMasterVolume() { + return this.mAudioManager.getMasterVolume(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getVolume() { + return (this.mLeftVolume + this.mRightVolume) * 0.5f; + } + + @Override + public float getLeftVolume() { + return this.mLeftVolume; + } + + @Override + public float getRightVolume() { + return this.mRightVolume; + } + + @Override + public final void setVolume(final float pVolume) { + this.setVolume(pVolume, pVolume); + } + + @Override + public void setVolume(final float pLeftVolume, final float pRightVolume) { + this.mLeftVolume = pLeftVolume; + this.mRightVolume = pRightVolume; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/audio/BaseAudioManager.java b/AndEngine/src/org/anddev/andengine/audio/BaseAudioManager.java new file mode 100644 index 0000000..dce2447 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/BaseAudioManager.java @@ -0,0 +1,74 @@ +package org.anddev.andengine.audio; + +import java.util.ArrayList; + +/** + * @author Nicolas Gramlich + * @since 18:07:02 - 13.06.2010 + */ +public abstract class BaseAudioManager implements IAudioManager { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final ArrayList mAudioEntities = new ArrayList(); + + protected float mMasterVolume = 1.0f; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getMasterVolume() { + return this.mMasterVolume; + } + + @Override + public void setMasterVolume(final float pMasterVolume) { + this.mMasterVolume = pMasterVolume; + + final ArrayList audioEntities = this.mAudioEntities; + for(int i = audioEntities.size() - 1; i >= 0; i--) { + final T audioEntity = audioEntities.get(i); + + audioEntity.onMasterVolumeChanged(pMasterVolume); + } + } + + @Override + public void add(final T pAudioEntity) { + this.mAudioEntities.add(pAudioEntity); + } + + @Override + public void releaseAll() { + final ArrayList audioEntities = this.mAudioEntities; + for(int i = audioEntities.size() - 1; i >= 0; i--) { + final T audioEntity = audioEntities.get(i); + + audioEntity.stop(); + audioEntity.release(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/audio/IAudioEntity.java b/AndEngine/src/org/anddev/andengine/audio/IAudioEntity.java new file mode 100644 index 0000000..8fb9923 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/IAudioEntity.java @@ -0,0 +1,33 @@ +package org.anddev.andengine.audio; + +/** + * @author Nicolas Gramlich + * @since 14:53:29 - 13.06.2010 + */ +public interface IAudioEntity { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void play(); + public void pause(); + public void resume(); + public void stop(); + + public float getVolume(); + public void setVolume(final float pVolume); + + public float getLeftVolume(); + public float getRightVolume(); + public void setVolume(final float pLeftVolume, final float pRightVolume); + + public void onMasterVolumeChanged(final float pMasterVolume); + + public void setLooping(final boolean pLooping); + + public void release(); +} diff --git a/AndEngine/src/org/anddev/andengine/audio/IAudioManager.java b/AndEngine/src/org/anddev/andengine/audio/IAudioManager.java new file mode 100644 index 0000000..750395a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/IAudioManager.java @@ -0,0 +1,22 @@ +package org.anddev.andengine.audio; + +/** + * @author Nicolas Gramlich + * @since 15:02:06 - 13.06.2010 + */ +public interface IAudioManager { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public float getMasterVolume(); + public void setMasterVolume(final float pMasterVolume); + + public void add(final T pAudioEntity); + + public void releaseAll(); +} diff --git a/AndEngine/src/org/anddev/andengine/audio/music/Music.java b/AndEngine/src/org/anddev/andengine/audio/music/Music.java new file mode 100644 index 0000000..813292f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/music/Music.java @@ -0,0 +1,114 @@ +package org.anddev.andengine.audio.music; + +import org.anddev.andengine.audio.BaseAudioEntity; + +import android.media.MediaPlayer; +import android.media.MediaPlayer.OnCompletionListener; + +/** + * @author Nicolas Gramlich + * @since 14:53:12 - 13.06.2010 + */ +public class Music extends BaseAudioEntity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final MediaPlayer mMediaPlayer; + + // =========================================================== + // Constructors + // =========================================================== + + Music(final MusicManager pMusicManager, final MediaPlayer pMediaPlayer) { + super(pMusicManager); + this.mMediaPlayer = pMediaPlayer; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isPlaying() { + return this.mMediaPlayer.isPlaying(); + } + + public MediaPlayer getMediaPlayer() { + return this.mMediaPlayer; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected MusicManager getAudioManager() { + return (MusicManager)super.getAudioManager(); + } + + @Override + public void play() { + this.mMediaPlayer.start(); + } + + @Override + public void stop() { + this.mMediaPlayer.stop(); + } + + @Override + public void resume() { + this.mMediaPlayer.start(); + } + + @Override + public void pause() { + this.mMediaPlayer.pause(); + } + + @Override + public void release() { + this.mMediaPlayer.release(); + } + + @Override + public void setLooping(final boolean pLooping) { + this.mMediaPlayer.setLooping(pLooping); + } + + @Override + public void setVolume(final float pLeftVolume, final float pRightVolume) { + super.setVolume(pLeftVolume, pRightVolume); + + final float masterVolume = this.getAudioManager().getMasterVolume(); + final float actualLeftVolume = pLeftVolume * masterVolume; + final float actualRightVolume = pRightVolume * masterVolume; + + this.mMediaPlayer.setVolume(actualLeftVolume, actualRightVolume); + } + + @Override + public void onMasterVolumeChanged(final float pMasterVolume) { + this.setVolume(this.mLeftVolume, this.mRightVolume); + } + + // =========================================================== + // Methods + // =========================================================== + + public void seekTo(final int pMilliseconds) { + this.mMediaPlayer.seekTo(pMilliseconds); + } + + public void setOnCompletionListener(final OnCompletionListener pOnCompletionListener) { + this.mMediaPlayer.setOnCompletionListener(pOnCompletionListener); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/audio/music/MusicFactory.java b/AndEngine/src/org/anddev/andengine/audio/music/MusicFactory.java new file mode 100644 index 0000000..4fd3d52 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/music/MusicFactory.java @@ -0,0 +1,91 @@ +package org.anddev.andengine.audio.music; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +import android.content.Context; +import android.content.res.AssetFileDescriptor; +import android.media.MediaPlayer; + +/** + * @author Nicolas Gramlich + * @since 15:05:49 - 13.06.2010 + */ +public class MusicFactory { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static String sAssetBasePath = ""; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + /** + * @param pAssetBasePath must end with '/' or have .length() == 0. + */ + public static void setAssetBasePath(final String pAssetBasePath) { + if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + MusicFactory.sAssetBasePath = pAssetBasePath; + } else { + throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static Music createMusicFromFile(final MusicManager pMusicManager, final Context pContext, final File pFile) throws IOException { + final MediaPlayer mediaPlayer = new MediaPlayer(); + + mediaPlayer.setDataSource(new FileInputStream(pFile).getFD()); + mediaPlayer.prepare(); + + final Music music = new Music(pMusicManager, mediaPlayer); + pMusicManager.add(music); + + return music; + } + + public static Music createMusicFromAsset(final MusicManager pMusicManager, final Context pContext, final String pAssetPath) throws IOException { + final MediaPlayer mediaPlayer = new MediaPlayer(); + + final AssetFileDescriptor assetFileDescritor = pContext.getAssets().openFd(MusicFactory.sAssetBasePath + pAssetPath); + mediaPlayer.setDataSource(assetFileDescritor.getFileDescriptor(), assetFileDescritor.getStartOffset(), assetFileDescritor.getLength()); + mediaPlayer.prepare(); + + final Music music = new Music(pMusicManager, mediaPlayer); + pMusicManager.add(music); + + return music; + } + + public static Music createMusicFromResource(final MusicManager pMusicManager, final Context pContext, final int pMusicResID) throws IOException { + final MediaPlayer mediaPlayer = MediaPlayer.create(pContext, pMusicResID); + mediaPlayer.prepare(); + + final Music music = new Music(pMusicManager, mediaPlayer); + pMusicManager.add(music); + + return music; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/audio/music/MusicManager.java b/AndEngine/src/org/anddev/andengine/audio/music/MusicManager.java new file mode 100644 index 0000000..4465777 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/music/MusicManager.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.audio.music; + +import org.anddev.andengine.audio.BaseAudioManager; + +/** + * @author Nicolas Gramlich + * @since 15:01:23 - 13.06.2010 + */ +public class MusicManager extends BaseAudioManager { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public MusicManager() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/audio/sound/Sound.java b/AndEngine/src/org/anddev/andengine/audio/sound/Sound.java new file mode 100644 index 0000000..fe4c621 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/sound/Sound.java @@ -0,0 +1,123 @@ +package org.anddev.andengine.audio.sound; + +import org.anddev.andengine.audio.BaseAudioEntity; + +/** + * @author Nicolas Gramlich + * @since 13:22:15 - 11.03.2010 + */ +public class Sound extends BaseAudioEntity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mSoundID; + private int mStreamID = 0; + + private int mLoopCount = 0; + private float mRate = 1.0f; + + // =========================================================== + // Constructors + // =========================================================== + + Sound(final SoundManager pSoundManager, final int pSoundID) { + super(pSoundManager); + this.mSoundID = pSoundID; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public void setLoopCount(final int pLoopCount) { + this.mLoopCount = pLoopCount; + if(this.mStreamID != 0) { + this.getAudioManager().getSoundPool().setLoop(this.mStreamID, pLoopCount); + } + } + + public void setRate(final float pRate) { + this.mRate = pRate; + if(this.mStreamID != 0) { + this.getAudioManager().getSoundPool().setRate(this.mStreamID, pRate); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @Override + protected SoundManager getAudioManager() { + return (SoundManager)super.getAudioManager(); + } + + @Override + public void play() { + final float masterVolume = this.getMasterVolume(); + final float leftVolume = this.mLeftVolume * masterVolume; + final float rightVolume = this.mRightVolume * masterVolume; + this.mStreamID = this.getAudioManager().getSoundPool().play(this.mSoundID, leftVolume, rightVolume, 1, this.mLoopCount, this.mRate); + } + + @Override + public void stop() { + if(this.mStreamID != 0) { + this.getAudioManager().getSoundPool().stop(this.mStreamID); + } + } + + @Override + public void resume() { + if(this.mStreamID != 0) { + this.getAudioManager().getSoundPool().resume(this.mStreamID); + } + } + + @Override + public void pause() { + if(this.mStreamID != 0) { + this.getAudioManager().getSoundPool().pause(this.mStreamID); + } + } + + @Override + public void release() { + + } + + @Override + public void setLooping(final boolean pLooping) { + this.setLoopCount((pLooping) ? -1 : 0); + } + + @Override + public void setVolume(final float pLeftVolume, final float pRightVolume) { + super.setVolume(pLeftVolume, pRightVolume); + if(this.mStreamID != 0){ + final float masterVolume = this.getMasterVolume(); + final float leftVolume = this.mLeftVolume * masterVolume; + final float rightVolume = this.mRightVolume * masterVolume; + + this.getAudioManager().getSoundPool().setVolume(this.mStreamID, leftVolume, rightVolume); + } + } + + @Override + public void onMasterVolumeChanged(final float pMasterVolume) { + this.setVolume(this.mLeftVolume, this.mRightVolume); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/audio/sound/SoundFactory.java b/AndEngine/src/org/anddev/andengine/audio/sound/SoundFactory.java new file mode 100644 index 0000000..bb64781 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/sound/SoundFactory.java @@ -0,0 +1,81 @@ +package org.anddev.andengine.audio.sound; + +import java.io.FileDescriptor; +import java.io.IOException; + +import android.content.Context; + +/** + * @author Nicolas Gramlich + * @since 14:23:03 - 11.03.2010 + */ +public class SoundFactory { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static String sAssetBasePath = ""; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + /** + * @param pAssetBasePath must end with '/' or have .length() == 0. + */ + public static void setAssetBasePath(final String pAssetBasePath) { + if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + SoundFactory.sAssetBasePath = pAssetBasePath; + } else { + throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static Sound createSoundFromPath(final SoundManager pSoundManager, final Context pContext, final String pPath) throws IOException { + final int soundID = pSoundManager.getSoundPool().load(pPath, 1); + final Sound sound = new Sound(pSoundManager, soundID); + pSoundManager.add(sound); + return sound; + } + + public static Sound createSoundFromAsset(final SoundManager pSoundManager, final Context pContext, final String pAssetPath) throws IOException { + final int soundID = pSoundManager.getSoundPool().load(pContext.getAssets().openFd(SoundFactory.sAssetBasePath + pAssetPath), 1); + final Sound sound = new Sound(pSoundManager, soundID); + pSoundManager.add(sound); + return sound; + } + + public static Sound createSoundFromResource(final SoundManager pSoundManager, final Context pContext, final int pSoundResID) { + final int soundID = pSoundManager.getSoundPool().load(pContext, pSoundResID, 1); + final Sound sound = new Sound(pSoundManager, soundID); + pSoundManager.add(sound); + return sound; + } + + public static Sound createSoundFromFileDescriptor(final SoundManager pSoundManager, final FileDescriptor pFileDescriptor, final long pOffset, final long pLength) throws IOException { + final int soundID = pSoundManager.getSoundPool().load(pFileDescriptor, pOffset, pLength, 1); + final Sound sound = new Sound(pSoundManager, soundID); + pSoundManager.add(sound); + return sound; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/audio/sound/SoundLibrary.java b/AndEngine/src/org/anddev/andengine/audio/sound/SoundLibrary.java new file mode 100644 index 0000000..b830172 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/sound/SoundLibrary.java @@ -0,0 +1,37 @@ +package org.anddev.andengine.audio.sound; + +import org.anddev.andengine.util.Library; + +/** + * @author Nicolas Gramlich + * @since 20:41:56 - 20.08.2010 + */ +public class SoundLibrary extends Library { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/audio/sound/SoundManager.java b/AndEngine/src/org/anddev/andengine/audio/sound/SoundManager.java new file mode 100644 index 0000000..2dbf26b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/audio/sound/SoundManager.java @@ -0,0 +1,63 @@ +package org.anddev.andengine.audio.sound; + +import org.anddev.andengine.audio.BaseAudioManager; + +import android.media.AudioManager; +import android.media.SoundPool; + +/** + * @author Nicolas Gramlich + * @since 13:22:59 - 11.03.2010 + */ +public class SoundManager extends BaseAudioManager { + // =========================================================== + // Constants + // =========================================================== + + private static final int MAX_SIMULTANEOUS_STREAMS_DEFAULT = 5; + + // =========================================================== + // Fields + // =========================================================== + + private final SoundPool mSoundPool; + + // =========================================================== + // Constructors + // =========================================================== + + public SoundManager() { + this(MAX_SIMULTANEOUS_STREAMS_DEFAULT); + } + + public SoundManager(final int pMaxSimultaneousStreams) { + this.mSoundPool = new SoundPool(pMaxSimultaneousStreams, AudioManager.STREAM_MUSIC, 0); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + SoundPool getSoundPool() { + return this.mSoundPool; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @Override + public void releaseAll() { + super.releaseAll(); + + this.mSoundPool.release(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/collision/BaseCollisionChecker.java b/AndEngine/src/org/anddev/andengine/collision/BaseCollisionChecker.java new file mode 100644 index 0000000..14582a7 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/collision/BaseCollisionChecker.java @@ -0,0 +1,112 @@ +package org.anddev.andengine.collision; + +/** + * @author Nicolas Gramlich + * @since 11:50:19 - 11.03.2010 + */ +public class BaseCollisionChecker { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean checkAxisAlignedRectangleCollision(final float pLeftA, final float pTopA, final float pRightA, final float pBottomA, final float pLeftB, final float pTopB, final float pRightB, final float pBottomB) { + return (pLeftA < pRightB && + pLeftB < pRightA && + pTopA < pBottomB && + pTopB < pBottomA); + } + + /** + * Returns an indicator of where the specified point (PX, PY) lies with + * respect to the line segment from (X1, Y1) to (X2, Y2). The + * return value can be either 1, -1, or 0 and indicates in which direction + * the specified line must pivot around its first endpoint, (X1, Y1), + * in order to point at the specified point (PX, PY). + *

    + * A return value of 1 indicates that the line segment must turn in the + * direction that takes the positive X axis towards the negative Y axis. In + * the default coordinate system used by Java 2D, this direction is + * counterclockwise. + *

    + * A return value of -1 indicates that the line segment must turn in the + * direction that takes the positive X axis towards the positive Y axis. In + * the default coordinate system, this direction is clockwise. + *

    + * A return value of 0 indicates that the point lies exactly on the line + * segment. Note that an indicator value of 0 is rare and not useful for + * determining colinearity because of floating point rounding issues. + *

    + * If the point is colinear with the line segment, but not between the + * endpoints, then the value will be -1 if the point lies + * "beyond (X1, Y1)" or 1 if the point lies "beyond (X2, Y2)". + * + * @param pX1 + * , Y1 the coordinates of the beginning of the specified + * line segment + * @param pX2 + * , Y2 the coordinates of the end of the specified line + * segment + * @param pPX + * , PY the coordinates of the specified point to be + * compared with the specified line segment + * @return an integer that indicates the position of the third specified + * coordinates with respect to the line segment formed by the first + * two specified coordinates. + */ + public static int relativeCCW(final float pX1, final float pY1, float pX2, float pY2, float pPX, float pPY) { + pX2 -= pX1; + pY2 -= pY1; + pPX -= pX1; + pPY -= pY1; + float ccw = pPX * pY2 - pPY * pX2; + if (ccw == 0.0f) { + // The point is colinear, classify based on which side of + // the segment the point falls on. We can calculate a + // relative value using the projection of PX,PY onto the + // segment - a negative value indicates the point projects + // outside of the segment in the direction of the particular + // endpoint used as the origin for the projection. + ccw = pPX * pX2 + pPY * pY2; + if (ccw > 0.0f) { + // Reverse the projection to be relative to the original X2,Y2 + // X2 and Y2 are simply negated. + // PX and PY need to have (X2 - X1) or (Y2 - Y1) subtracted + // from them (based on the original values) + // Since we really want to get a positive answer when the + // point is "beyond (X2,Y2)", then we want to calculate + // the inverse anyway - thus we leave X2 & Y2 negated. + pPX -= pX2; + pPY -= pY2; + ccw = pPX * pX2 + pPY * pY2; + if (ccw < 0.0f) { + ccw = 0.0f; + } + } + } + return (ccw < 0.0f) ? -1 : ((ccw > 0.0f) ? 1 : 0); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/collision/LineCollisionChecker.java b/AndEngine/src/org/anddev/andengine/collision/LineCollisionChecker.java new file mode 100644 index 0000000..2170e1d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/collision/LineCollisionChecker.java @@ -0,0 +1,40 @@ +package org.anddev.andengine.collision; + +/** + * @author Nicolas Gramlich + * @since 19:27:22 - 17.07.2010 + */ +public class LineCollisionChecker extends ShapeCollisionChecker { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean checkLineCollision(final float pX1, final float pY1, final float pX2, final float pY2, final float pX3, final float pY3, final float pX4, final float pY4) { + return ((BaseCollisionChecker.relativeCCW(pX1, pY1, pX2, pY2, pX3, pY3) * BaseCollisionChecker.relativeCCW(pX1, pY1, pX2, pY2, pX4, pY4) <= 0) + && (BaseCollisionChecker.relativeCCW(pX3, pY3, pX4, pY4, pX1, pY1) * BaseCollisionChecker.relativeCCW(pX3, pY3, pX4, pY4, pX2, pY2) <= 0)); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/collision/RectangularShapeCollisionChecker.java b/AndEngine/src/org/anddev/andengine/collision/RectangularShapeCollisionChecker.java new file mode 100644 index 0000000..9ff4b74 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/collision/RectangularShapeCollisionChecker.java @@ -0,0 +1,79 @@ +package org.anddev.andengine.collision; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import org.anddev.andengine.entity.shape.RectangularShape; + +/** + * @author Nicolas Gramlich + * @since 11:50:19 - 11.03.2010 + */ +public class RectangularShapeCollisionChecker extends ShapeCollisionChecker { + // =========================================================== + // Constants + // =========================================================== + + private static final int RECTANGULARSHAPE_VERTEX_COUNT = 4; + + private static final float[] VERTICES_CONTAINS_TMP = new float[2 * RECTANGULARSHAPE_VERTEX_COUNT]; + private static final float[] VERTICES_COLLISION_TMP_A = new float[2 * RECTANGULARSHAPE_VERTEX_COUNT]; + private static final float[] VERTICES_COLLISION_TMP_B = new float[2 * RECTANGULARSHAPE_VERTEX_COUNT]; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean checkContains(final RectangularShape pRectangularShape, final float pX, final float pY) { + RectangularShapeCollisionChecker.fillVertices(pRectangularShape, VERTICES_CONTAINS_TMP); + return ShapeCollisionChecker.checkContains(VERTICES_CONTAINS_TMP, 2 * RECTANGULARSHAPE_VERTEX_COUNT, pX, pY); + } + + public static boolean checkCollision(final RectangularShape pRectangularShapeA, final RectangularShape pRectangularShapeB) { + RectangularShapeCollisionChecker.fillVertices(pRectangularShapeA, VERTICES_COLLISION_TMP_A); + RectangularShapeCollisionChecker.fillVertices(pRectangularShapeB, VERTICES_COLLISION_TMP_B); + + return ShapeCollisionChecker.checkCollision(2 * RECTANGULARSHAPE_VERTEX_COUNT, 2 * RECTANGULARSHAPE_VERTEX_COUNT, VERTICES_COLLISION_TMP_A, VERTICES_COLLISION_TMP_B); + } + + public static void fillVertices(final RectangularShape pRectangularShape, final float[] pVertices) { + final float left = 0; + final float top = 0; + final float right = pRectangularShape.getWidth(); + final float bottom = pRectangularShape.getHeight(); + + pVertices[0 + VERTEX_INDEX_X] = left; + pVertices[0 + VERTEX_INDEX_Y] = top; + + pVertices[2 + VERTEX_INDEX_X] = right; + pVertices[2 + VERTEX_INDEX_Y] = top; + + pVertices[4 + VERTEX_INDEX_X] = right; + pVertices[4 + VERTEX_INDEX_Y] = bottom; + + pVertices[6 + VERTEX_INDEX_X] = left; + pVertices[6 + VERTEX_INDEX_Y] = bottom; + + pRectangularShape.getLocalToSceneTransformation().transform(pVertices); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/collision/ShapeCollisionChecker.java b/AndEngine/src/org/anddev/andengine/collision/ShapeCollisionChecker.java new file mode 100644 index 0000000..e111f1d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/collision/ShapeCollisionChecker.java @@ -0,0 +1,108 @@ +package org.anddev.andengine.collision; + +import org.anddev.andengine.util.constants.Constants; + + +/** + * @author Nicolas Gramlich + * @since 11:50:19 - 11.03.2010 + */ +public class ShapeCollisionChecker extends BaseCollisionChecker { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean checkCollision(final int pVerticesALength, final int pVerticesBLength, final float[] pVerticesA, final float[] pVerticesB) { + /* Check all the lines of A ... */ + for(int a = pVerticesALength - 4; a >= 0; a -= 2) { + /* ... against all lines in B. */ + if(ShapeCollisionChecker.checkCollisionSub(a, a + 2, pVerticesA, pVerticesB, pVerticesBLength)){ + return true; + } + } + /* Also check the 'around the corner of the array' line of A against all lines in B. */ + if(ShapeCollisionChecker.checkCollisionSub(pVerticesALength - 2, 0, pVerticesA, pVerticesB, pVerticesBLength)){ + return true; + } else { + /* At last check if one polygon 'contains' the other one by checking + * if one vertex of the one vertices is contained by all of the other vertices. */ + if(ShapeCollisionChecker.checkContains(pVerticesA, pVerticesALength, pVerticesB[Constants.VERTEX_INDEX_X], pVerticesB[Constants.VERTEX_INDEX_Y])) { + return true; + } else if(ShapeCollisionChecker.checkContains(pVerticesB, pVerticesBLength, pVerticesA[Constants.VERTEX_INDEX_X], pVerticesA[Constants.VERTEX_INDEX_Y])) { + return true; + } else { + return false; + } + } + } + + /** + * Checks line specified by pVerticesA[pVertexIndexA1] and pVerticesA[pVertexIndexA2] against all lines in pVerticesB. + */ + private static boolean checkCollisionSub(final int pVertexIndexA1, final int pVertexIndexA2, final float[] pVerticesA, final float[] pVerticesB, final int pVerticesBLength) { + /* Check against all the lines of B. */ + final float vertexA1X = pVerticesA[pVertexIndexA1 + Constants.VERTEX_INDEX_X]; + final float vertexA1Y = pVerticesA[pVertexIndexA1 + Constants.VERTEX_INDEX_Y]; + final float vertexA2X = pVerticesA[pVertexIndexA2 + Constants.VERTEX_INDEX_X]; + final float vertexA2Y = pVerticesA[pVertexIndexA2 + Constants.VERTEX_INDEX_Y]; + + for(int b = pVerticesBLength - 4; b >= 0; b -= 2) { + if(LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, pVerticesB[b + Constants.VERTEX_INDEX_X], pVerticesB[b + Constants.VERTEX_INDEX_Y], pVerticesB[b + 2 + Constants.VERTEX_INDEX_X], pVerticesB[b + 2 + Constants.VERTEX_INDEX_Y])){ + return true; + } + } + /* Also check the 'around the corner of the array' line of B. */ + if(LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, pVerticesB[pVerticesBLength - 2], pVerticesB[pVerticesBLength - 1], pVerticesB[Constants.VERTEX_INDEX_X], pVerticesB[Constants.VERTEX_INDEX_Y])){ + return true; + } + return false; + } + + public static boolean checkContains(final float[] pVertices, final int pVerticesLength, final float pX, final float pY) { + int edgeResultSum = 0; + + for(int i = pVerticesLength - 4; i >= 0; i -= 2) { + final int edgeResult = BaseCollisionChecker.relativeCCW(pVertices[i], pVertices[i + 1], pVertices[i + 2], pVertices[i + 3], pX, pY); + if(edgeResult == 0) { + return true; + } else { + edgeResultSum += edgeResult; + } + } + /* Also check the 'around the corner of the array' line. */ + final int edgeResult = BaseCollisionChecker.relativeCCW(pVertices[pVerticesLength - 2], pVertices[pVerticesLength - 1], pVertices[Constants.VERTEX_INDEX_X], pVertices[Constants.VERTEX_INDEX_Y], pX, pY); + if(edgeResult == 0){ + return true; + } else { + edgeResultSum += edgeResult; + } + + final int vertexCount = pVerticesLength / 2; + /* Point is not on the edge, so check if the edge is on the same side(left or right) of all edges. */ + return edgeResultSum == vertexCount || edgeResultSum == -vertexCount ; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/DoubleSceneSplitScreenEngine.java b/AndEngine/src/org/anddev/andengine/engine/DoubleSceneSplitScreenEngine.java new file mode 100644 index 0000000..dfb5345 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/DoubleSceneSplitScreenEngine.java @@ -0,0 +1,170 @@ +package org.anddev.andengine.engine; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.options.EngineOptions; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.opengl.util.GLHelper; + +/** + * @author Nicolas Gramlich + * @since 22:28:34 - 27.03.2010 + */ +public class DoubleSceneSplitScreenEngine extends Engine { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private Scene mSecondScene; + private final Camera mSecondCamera; + + // =========================================================== + // Constructors + // =========================================================== + + public DoubleSceneSplitScreenEngine(final EngineOptions pEngineOptions, final Camera pSecondCamera) { + super(pEngineOptions); + this.mSecondCamera = pSecondCamera; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Deprecated + @Override + public Camera getCamera() { + return super.mCamera; + } + + public Camera getFirstCamera() { + return super.mCamera; + } + + public Camera getSecondCamera() { + return this.mSecondCamera; + } + + @Deprecated + @Override + public Scene getScene() { + return super.getScene(); + } + + public Scene getFirstScene() { + return super.getScene(); + } + + public Scene getSecondScene() { + return this.mSecondScene; + } + + @Deprecated + @Override + public void setScene(final Scene pScene) { + super.setScene(pScene); + } + + public void setFirstScene(final Scene pScene) { + super.setScene(pScene); + } + + public void setSecondScene(final Scene pScene) { + this.mSecondScene = pScene; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onDrawScene(final GL10 pGL) { + final Camera firstCamera = this.getFirstCamera(); + final Camera secondCamera = this.getSecondCamera(); + + final int surfaceWidth = this.mSurfaceWidth; + final int surfaceWidthHalf = surfaceWidth >> 1; + + final int surfaceHeight = this.mSurfaceHeight; + + GLHelper.enableScissorTest(pGL); + + /* First Screen. With first camera, on the left half of the screens width. */ + { + pGL.glScissor(0, 0, surfaceWidthHalf, surfaceHeight); + pGL.glViewport(0, 0, surfaceWidthHalf, surfaceHeight); + + super.mScene.onDraw(pGL, firstCamera); + firstCamera.onDrawHUD(pGL); + } + + /* Second Screen. With second camera, on the right half of the screens width. */ + { + pGL.glScissor(surfaceWidthHalf, 0, surfaceWidthHalf, surfaceHeight); + pGL.glViewport(surfaceWidthHalf, 0, surfaceWidthHalf, surfaceHeight); + + this.mSecondScene.onDraw(pGL, secondCamera); + secondCamera.onDrawHUD(pGL); + } + + GLHelper.disableScissorTest(pGL); + } + + @Override + protected Camera getCameraFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { + if(pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { + return this.getFirstCamera(); + } else { + return this.getSecondCamera(); + } + } + + @Override + protected Scene getSceneFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { + if(pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { + return this.getFirstScene(); + } else { + return this.getSecondScene(); + } + } + + @Override + protected void onUpdateScene(final float pSecondsElapsed) { + super.onUpdateScene(pSecondsElapsed); + if(this.mSecondScene != null) { + this.mSecondScene.onUpdate(pSecondsElapsed); + } + } + + @Override + protected void convertSurfaceToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { + final int surfaceWidthHalf = this.mSurfaceWidth >> 1; + + if(pCamera == this.getFirstCamera()) { + pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); + } else { + pSurfaceTouchEvent.offset(-surfaceWidthHalf, 0); + pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); + } + } + + @Override + protected void updateUpdateHandlers(final float pSecondsElapsed) { + super.updateUpdateHandlers(pSecondsElapsed); + this.getSecondCamera().onUpdate(pSecondsElapsed); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/Engine.java b/AndEngine/src/org/anddev/andengine/engine/Engine.java new file mode 100644 index 0000000..eec8b20 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/Engine.java @@ -0,0 +1,715 @@ +package org.anddev.andengine.engine; + +import javax.microedition.khronos.opengles.GL10; +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.audio.music.MusicFactory; +import org.anddev.andengine.audio.music.MusicManager; +import org.anddev.andengine.audio.sound.SoundFactory; +import org.anddev.andengine.audio.sound.SoundManager; +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.engine.handler.UpdateHandlerList; +import org.anddev.andengine.engine.handler.runnable.RunnableHandler; +import org.anddev.andengine.engine.options.EngineOptions; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.input.touch.controller.ITouchController; +import org.anddev.andengine.input.touch.controller.ITouchController.ITouchEventCallback; +import org.anddev.andengine.input.touch.controller.SingleTouchControler; +import org.anddev.andengine.opengl.buffer.BufferObjectManager; +import org.anddev.andengine.opengl.font.FontFactory; +import org.anddev.andengine.opengl.font.FontManager; +import org.anddev.andengine.opengl.texture.TextureManager; +import org.anddev.andengine.opengl.texture.region.TextureRegionFactory; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.sensor.SensorDelay; +import org.anddev.andengine.sensor.accelerometer.AccelerometerData; +import org.anddev.andengine.sensor.accelerometer.AccelerometerSensorOptions; +import org.anddev.andengine.sensor.accelerometer.IAccelerometerListener; +import org.anddev.andengine.sensor.location.ILocationListener; +import org.anddev.andengine.sensor.location.LocationProviderStatus; +import org.anddev.andengine.sensor.location.LocationSensorOptions; +import org.anddev.andengine.sensor.orientation.IOrientationListener; +import org.anddev.andengine.sensor.orientation.OrientationData; +import org.anddev.andengine.sensor.orientation.OrientationSensorOptions; +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.constants.TimeConstants; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.location.LocationProvider; +import android.os.Bundle; +import android.os.Vibrator; +import android.view.Display; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import android.view.WindowManager; + +/** + * @author Nicolas Gramlich + * @since 12:21:31 - 08.03.2010 + */ +public class Engine implements SensorEventListener, OnTouchListener, ITouchEventCallback, TimeConstants, LocationListener { + // =========================================================== + // Constants + // =========================================================== + + private static final SensorDelay SENSORDELAY_DEFAULT = SensorDelay.GAME; + + // =========================================================== + // Fields + // =========================================================== + + private boolean mRunning = false; + + private long mLastTick = -1; + private float mSecondsElapsedTotal = 0; + + private final State mThreadLocker = new State(); + + private final UpdateThread mUpdateThread = new UpdateThread(); + + private final RunnableHandler mUpdateThreadRunnableHandler = new RunnableHandler(); + + private final EngineOptions mEngineOptions; + protected final Camera mCamera; + + private ITouchController mTouchController; + + private SoundManager mSoundManager; + private MusicManager mMusicManager; + private final TextureManager mTextureManager = new TextureManager(); + private final BufferObjectManager mBufferObjectManager = new BufferObjectManager(); + private final FontManager mFontManager = new FontManager(); + + protected Scene mScene; + + private Vibrator mVibrator; + + private ILocationListener mLocationListener; + private Location mLocation; + + private IAccelerometerListener mAccelerometerListener; + private AccelerometerData mAccelerometerData; + + private IOrientationListener mOrientationListener; + private OrientationData mOrientationData; + + private final UpdateHandlerList mUpdateHandlers = new UpdateHandlerList(); + + protected int mSurfaceWidth = 1; // 1 to prevent accidental DIV/0 + protected int mSurfaceHeight = 1; // 1 to prevent accidental DIV/0 + + private boolean mIsMethodTracing; + + // =========================================================== + // Constructors + // =========================================================== + + public Engine(final EngineOptions pEngineOptions) { + TextureRegionFactory.setAssetBasePath(""); + SoundFactory.setAssetBasePath(""); + MusicFactory.setAssetBasePath(""); + FontFactory.setAssetBasePath(""); + + BufferObjectManager.setActiveInstance(this.mBufferObjectManager); + + this.mEngineOptions = pEngineOptions; + this.setTouchController(new SingleTouchControler()); + this.mCamera = pEngineOptions.getCamera(); + + if(this.mEngineOptions.needsSound()) { + this.mSoundManager = new SoundManager(); + } + + if(this.mEngineOptions.needsMusic()) { + this.mMusicManager = new MusicManager(); + } + + this.mUpdateThread.start(); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isRunning() { + return this.mRunning; + } + + public synchronized void start() { + if(!this.mRunning) { + this.mLastTick = System.nanoTime(); + this.mRunning = true; + } + } + + public synchronized void stop() { + if(this.mRunning) { + this.mRunning = false; + } + } + + public Scene getScene() { + return this.mScene; + } + + public void setScene(final Scene pScene) { + this.mScene = pScene; + } + + public EngineOptions getEngineOptions() { + return this.mEngineOptions; + } + + public Camera getCamera() { + return this.mCamera; + } + + public float getSecondsElapsedTotal() { + return this.mSecondsElapsedTotal; + } + + public void setSurfaceSize(final int pSurfaceWidth, final int pSurfaceHeight) { + // Debug.w("SurfaceView size changed to (width x height): " + pSurfaceWidth + " x " + pSurfaceHeight, new Exception()); + this.mSurfaceWidth = pSurfaceWidth; + this.mSurfaceHeight = pSurfaceHeight; + } + + public int getSurfaceWidth() { + return this.mSurfaceWidth; + } + + public int getSurfaceHeight() { + return this.mSurfaceHeight; + } + + public ITouchController getTouchController() { + return this.mTouchController; + } + + public void setTouchController(final ITouchController pTouchController) { + this.mTouchController = pTouchController; + this.mTouchController.applyTouchOptions(this.mEngineOptions.getTouchOptions()); + this.mTouchController.setTouchEventCallback(this); + } + + public AccelerometerData getAccelerometerData() { + return this.mAccelerometerData; + } + + public OrientationData getOrientationData() { + return this.mOrientationData; + } + + public SoundManager getSoundManager() throws IllegalStateException { + if(this.mSoundManager != null) { + return this.mSoundManager; + } else { + throw new IllegalStateException("To enable the SoundManager, check the EngineOptions!"); + } + } + + public MusicManager getMusicManager() throws IllegalStateException { + if(this.mMusicManager != null) { + return this.mMusicManager; + } else { + throw new IllegalStateException("To enable the MusicManager, check the EngineOptions!"); + } + } + + public TextureManager getTextureManager() { + return this.mTextureManager; + } + + public FontManager getFontManager() { + return this.mFontManager; + } + + public void clearUpdateHandlers() { + this.mUpdateHandlers.clear(); + } + + public void registerUpdateHandler(final IUpdateHandler pUpdateHandler) { + this.mUpdateHandlers.add(pUpdateHandler); + } + + public void unregisterUpdateHandler(final IUpdateHandler pUpdateHandler) { + this.mUpdateHandlers.remove(pUpdateHandler); + } + + public boolean isMethodTracing() { + return this.mIsMethodTracing; + } + + public void startMethodTracing(final String pTraceFileName) { + if(!this.mIsMethodTracing) { + this.mIsMethodTracing = true; + android.os.Debug.startMethodTracing(pTraceFileName); + } + } + + public void stopMethodTracing() { + if(this.mIsMethodTracing) { + android.os.Debug.stopMethodTracing(); + this.mIsMethodTracing = false; + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onAccuracyChanged(final Sensor pSensor, final int pAccuracy) { + if(this.mRunning) { + switch(pSensor.getType()) { + case Sensor.TYPE_ACCELEROMETER: + if(this.mAccelerometerData != null) { + this.mAccelerometerData.setAccuracy(pAccuracy); + this.mAccelerometerListener.onAccelerometerChanged(this.mAccelerometerData); + } else if(this.mOrientationData != null) { + this.mOrientationData.setAccelerometerAccuracy(pAccuracy); + this.mOrientationListener.onOrientationChanged(this.mOrientationData); + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + this.mOrientationData.setMagneticFieldAccuracy(pAccuracy); + this.mOrientationListener.onOrientationChanged(this.mOrientationData); + break; + } + } + } + + @Override + public void onSensorChanged(final SensorEvent pEvent) { + if(this.mRunning) { + switch(pEvent.sensor.getType()) { + case Sensor.TYPE_ACCELEROMETER: + if(this.mAccelerometerData != null) { + this.mAccelerometerData.setValues(pEvent.values); + this.mAccelerometerListener.onAccelerometerChanged(this.mAccelerometerData); + } else if(this.mOrientationData != null) { + this.mOrientationData.setAccelerometerValues(pEvent.values); + this.mOrientationListener.onOrientationChanged(this.mOrientationData); + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + this.mOrientationData.setMagneticFieldValues(pEvent.values); + this.mOrientationListener.onOrientationChanged(this.mOrientationData); + break; + } + } + } + + @Override + public void onLocationChanged(final Location pLocation) { + if(this.mLocation == null) { + this.mLocation = pLocation; + } else { + if(pLocation == null) { + this.mLocationListener.onLocationLost(); + } else { + this.mLocation = pLocation; + this.mLocationListener.onLocationChanged(pLocation); + } + } + } + + @Override + public void onProviderDisabled(final String pProvider) { + this.mLocationListener.onLocationProviderDisabled(); + } + + @Override + public void onProviderEnabled(final String pProvider) { + this.mLocationListener.onLocationProviderEnabled(); + } + + @Override + public void onStatusChanged(final String pProvider, final int pStatus, final Bundle pExtras) { + switch(pStatus) { + case LocationProvider.AVAILABLE: + this.mLocationListener.onLocationProviderStatusChanged(LocationProviderStatus.AVAILABLE, pExtras); + break; + case LocationProvider.OUT_OF_SERVICE: + this.mLocationListener.onLocationProviderStatusChanged(LocationProviderStatus.OUT_OF_SERVICE, pExtras); + break; + case LocationProvider.TEMPORARILY_UNAVAILABLE: + this.mLocationListener.onLocationProviderStatusChanged(LocationProviderStatus.TEMPORARILY_UNAVAILABLE, pExtras); + break; + } + } + + @Override + public boolean onTouch(final View pView, final MotionEvent pSurfaceMotionEvent) { + if(this.mRunning) { + final boolean handled = this.mTouchController.onHandleMotionEvent(pSurfaceMotionEvent); + try { + /* + * As a human cannot interact 1000x per second, we pause the + * UI-Thread for a little. + */ + Thread.sleep(20); // TODO Maybe this can be removed, when TouchEvents are handled on the UpdateThread! + } catch (final InterruptedException e) { + Debug.e(e); + } + return handled; + } else { + return false; + } + } + + @Override + public boolean onTouchEvent(final TouchEvent pSurfaceTouchEvent) { + /* + * Let the engine determine which scene and camera this event should be + * handled by. + */ + final Scene scene = this.getSceneFromSurfaceTouchEvent(pSurfaceTouchEvent); + final Camera camera = this.getCameraFromSurfaceTouchEvent(pSurfaceTouchEvent); + + this.convertSurfaceToSceneTouchEvent(camera, pSurfaceTouchEvent); + + if(this.onTouchHUD(camera, pSurfaceTouchEvent)) { + return true; + } else { + /* If HUD didn't handle it, Scene may handle it. */ + return this.onTouchScene(scene, pSurfaceTouchEvent); + } + } + + protected boolean onTouchHUD(final Camera pCamera, final TouchEvent pSceneTouchEvent) { + if(pCamera.hasHUD()) { + return pCamera.getHUD().onSceneTouchEvent(pSceneTouchEvent); + } else { + return false; + } + } + + protected boolean onTouchScene(final Scene pScene, final TouchEvent pSceneTouchEvent) { + if(pScene != null) { + return pScene.onSceneTouchEvent(pSceneTouchEvent); + } else { + return false; + } + } + + // =========================================================== + // Methods + // =========================================================== + + public void runOnUpdateThread(final Runnable pRunnable) { + this.mUpdateThreadRunnableHandler.postRunnable(pRunnable); + } + + public void interruptUpdateThread(){ + this.mUpdateThread.interrupt(); + } + + public void onResume() { + this.mTextureManager.reloadTextures(); + this.mFontManager.reloadFonts(); + BufferObjectManager.setActiveInstance(this.mBufferObjectManager); + this.mBufferObjectManager.reloadBufferObjects(); + } + + public void onPause() { + + } + + protected Camera getCameraFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { + return this.getCamera(); + } + + protected Scene getSceneFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { + return this.mScene; + } + + protected void convertSurfaceToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { + pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, this.mSurfaceWidth, this.mSurfaceHeight); + } + + public void onLoadComplete(final Scene pScene) { + this.setScene(pScene); + } + + void onTickUpdate() throws InterruptedException { + if(this.mRunning) { + final long secondsElapsed = this.getNanosecondsElapsed(); + + this.onUpdate(secondsElapsed); + + this.yieldDraw(); + } else { + this.yieldDraw(); + + Thread.sleep(16); + } + } + + private void yieldDraw() throws InterruptedException { + final State threadLocker = this.mThreadLocker; + threadLocker.notifyCanDraw(); + threadLocker.waitUntilCanUpdate(); + } + + protected void onUpdate(final long pNanosecondsElapsed) throws InterruptedException { + final float pSecondsElapsed = (float)pNanosecondsElapsed / TimeConstants.NANOSECONDSPERSECOND; + + this.mSecondsElapsedTotal += pSecondsElapsed; + this.mLastTick += pNanosecondsElapsed; + + this.mTouchController.onUpdate(pSecondsElapsed); + this.updateUpdateHandlers(pSecondsElapsed); + this.onUpdateScene(pSecondsElapsed); + } + + protected void onUpdateScene(final float pSecondsElapsed) { + if(this.mScene != null) { + this.mScene.onUpdate(pSecondsElapsed); + } + } + + protected void updateUpdateHandlers(final float pSecondsElapsed) { + this.mUpdateThreadRunnableHandler.onUpdate(pSecondsElapsed); + this.mUpdateHandlers.onUpdate(pSecondsElapsed); + this.getCamera().onUpdate(pSecondsElapsed); + } + + public void onDrawFrame(final GL10 pGL) throws InterruptedException { + final State threadLocker = this.mThreadLocker; + + threadLocker.waitUntilCanDraw(); + + this.mTextureManager.updateTextures(pGL); + this.mFontManager.updateFonts(pGL); + if(GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS) { + this.mBufferObjectManager.updateBufferObjects((GL11) pGL); + } + + this.onDrawScene(pGL); + + threadLocker.notifyCanUpdate(); + } + + protected void onDrawScene(final GL10 pGL) { + final Camera camera = this.getCamera(); + + this.mScene.onDraw(pGL, camera); + + camera.onDrawHUD(pGL); + } + + private long getNanosecondsElapsed() { + final long now = System.nanoTime(); + + return this.calculateNanosecondsElapsed(now, this.mLastTick); + } + + protected long calculateNanosecondsElapsed(final long pNow, final long pLastTick) { + return pNow - pLastTick; + } + + public boolean enableVibrator(final Context pContext) { + this.mVibrator = (Vibrator) pContext.getSystemService(Context.VIBRATOR_SERVICE); + return this.mVibrator != null; + } + + public void vibrate(final long pMilliseconds) throws IllegalStateException { + if(this.mVibrator != null) { + this.mVibrator.vibrate(pMilliseconds); + } else { + throw new IllegalStateException("You need to enable the Vibrator before you can use it!"); + } + } + + public void vibrate(final long[] pPattern, final int pRepeat) throws IllegalStateException { + if(this.mVibrator != null) { + this.mVibrator.vibrate(pPattern, pRepeat); + } else { + throw new IllegalStateException("You need to enable the Vibrator before you can use it!"); + } + } + + public void enableLocationSensor(final Context pContext, final ILocationListener pLocationListener, final LocationSensorOptions pLocationSensorOptions) { + this.mLocationListener = pLocationListener; + + final LocationManager locationManager = (LocationManager) pContext.getSystemService(Context.LOCATION_SERVICE); + final String locationProvider = locationManager.getBestProvider(pLocationSensorOptions, pLocationSensorOptions.isEnabledOnly()); + // TODO locationProvider can be null, in that case return false. Successful case should return true. + locationManager.requestLocationUpdates(locationProvider, pLocationSensorOptions.getMinimumTriggerTime(), pLocationSensorOptions.getMinimumTriggerDistance(), this); + + this.onLocationChanged(locationManager.getLastKnownLocation(locationProvider)); + } + + public void disableLocationSensor(final Context pContext) { + final LocationManager locationManager = (LocationManager) pContext.getSystemService(Context.LOCATION_SERVICE); + locationManager.removeUpdates(this); + } + + /** + * @see {@link Engine#enableAccelerometerSensor(Context, IAccelerometerListener, AccelerometerSensorOptions)} + */ + public boolean enableAccelerometerSensor(final Context pContext, final IAccelerometerListener pAccelerometerListener) { + return this.enableAccelerometerSensor(pContext, pAccelerometerListener, new AccelerometerSensorOptions(SENSORDELAY_DEFAULT)); + } + + /** + * @return true when the sensor was successfully enabled, false otherwise. + */ + public boolean enableAccelerometerSensor(final Context pContext, final IAccelerometerListener pAccelerometerListener, final AccelerometerSensorOptions pAccelerometerSensorOptions) { + final SensorManager sensorManager = (SensorManager) pContext.getSystemService(Context.SENSOR_SERVICE); + if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER)) { + this.mAccelerometerListener = pAccelerometerListener; + + if(this.mAccelerometerData == null) { + this.mAccelerometerData = new AccelerometerData(); + } + + this.registerSelfAsSensorListener(sensorManager, Sensor.TYPE_ACCELEROMETER, pAccelerometerSensorOptions.getSensorDelay()); + + return true; + } else { + return false; + } + } + + + /** + * @return true when the sensor was successfully disabled, false otherwise. + */ + public boolean disableAccelerometerSensor(final Context pContext) { + final SensorManager sensorManager = (SensorManager) pContext.getSystemService(Context.SENSOR_SERVICE); + if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER)) { + this.unregisterSelfAsSensorListener(sensorManager, Sensor.TYPE_ACCELEROMETER); + return true; + } else { + return false; + } + } + + /** + * @see {@link Engine#enableOrientationSensor(Context, IOrientationListener, OrientationSensorOptions)} + */ + public boolean enableOrientationSensor(final Context pContext, final IOrientationListener pOrientationListener) { + return this.enableOrientationSensor(pContext, pOrientationListener, new OrientationSensorOptions(SENSORDELAY_DEFAULT)); + } + + /** + * @return true when the sensor was successfully enabled, false otherwise. + */ + public boolean enableOrientationSensor(final Context pContext, final IOrientationListener pOrientationListener, final OrientationSensorOptions pOrientationSensorOptions) { + final SensorManager sensorManager = (SensorManager) pContext.getSystemService(Context.SENSOR_SERVICE); + if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER) && this.isSensorSupported(sensorManager, Sensor.TYPE_MAGNETIC_FIELD)) { + this.mOrientationListener = pOrientationListener; + + if(this.mOrientationData == null) { + final Display display = ((WindowManager) pContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + final int displayRotation = display.getOrientation(); + this.mOrientationData = new OrientationData(displayRotation); + } + + this.registerSelfAsSensorListener(sensorManager, Sensor.TYPE_ACCELEROMETER, pOrientationSensorOptions.getSensorDelay()); + this.registerSelfAsSensorListener(sensorManager, Sensor.TYPE_MAGNETIC_FIELD, pOrientationSensorOptions.getSensorDelay()); + + return true; + } else { + return false; + } + } + + + /** + * @return true when the sensor was successfully disabled, false otherwise. + */ + public boolean disableOrientationSensor(final Context pContext) { + final SensorManager sensorManager = (SensorManager) pContext.getSystemService(Context.SENSOR_SERVICE); + if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER) && this.isSensorSupported(sensorManager, Sensor.TYPE_MAGNETIC_FIELD)) { + this.unregisterSelfAsSensorListener(sensorManager, Sensor.TYPE_ACCELEROMETER); + this.unregisterSelfAsSensorListener(sensorManager, Sensor.TYPE_MAGNETIC_FIELD); + return true; + } else { + return false; + } + } + + private boolean isSensorSupported(final SensorManager pSensorManager, final int pType) { + return pSensorManager.getSensorList(pType).size() > 0; + } + + private void registerSelfAsSensorListener(final SensorManager pSensorManager, final int pType, final SensorDelay pSensorDelay) { + final Sensor sensor = pSensorManager.getSensorList(pType).get(0); + pSensorManager.registerListener(this, sensor, pSensorDelay.getDelay()); + } + + private void unregisterSelfAsSensorListener(final SensorManager pSensorManager, final int pType) { + final Sensor sensor = pSensorManager.getSensorList(pType).get(0); + pSensorManager.unregisterListener(this, sensor); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + private class UpdateThread extends Thread { + public UpdateThread() { + super("UpdateThread"); + } + + @Override + public void run() { + android.os.Process.setThreadPriority(Engine.this.mEngineOptions.getUpdateThreadPriority()); + try { + while(true) { + Engine.this.onTickUpdate(); + } + } catch (final InterruptedException e) { + Debug.d("UpdateThread interrupted. Don't worry - this Exception is most likely expected!", e); + this.interrupt(); + } + } + } + + private static class State { + boolean mDrawing = false; + + public synchronized void notifyCanDraw() { + // Debug.d(">>> notifyCanDraw"); + this.mDrawing = true; + this.notifyAll(); + // Debug.d("<<< notifyCanDraw"); + } + + public synchronized void notifyCanUpdate() { + // Debug.d(">>> notifyCanUpdate"); + this.mDrawing = false; + this.notifyAll(); + // Debug.d("<<< notifyCanUpdate"); + } + + public synchronized void waitUntilCanDraw() throws InterruptedException { + // Debug.d(">>> waitUntilCanDraw"); + while(this.mDrawing == false) { + this.wait(); + } + // Debug.d("<<< waitUntilCanDraw"); + } + + public synchronized void waitUntilCanUpdate() throws InterruptedException { + // Debug.d(">>> waitUntilCanUpdate"); + while(this.mDrawing == true) { + this.wait(); + } + // Debug.d("<<< waitUntilCanUpdate"); + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/engine/FixedStepEngine.java b/AndEngine/src/org/anddev/andengine/engine/FixedStepEngine.java new file mode 100644 index 0000000..3dce1d9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/FixedStepEngine.java @@ -0,0 +1,60 @@ +package org.anddev.andengine.engine; + +import org.anddev.andengine.engine.options.EngineOptions; + + +/** + * A subclass of {@link Engine} that tries to achieve a specific amount of updates per second. + * When the time since the last update is bigger long the steplength, additional updates are executed. + * + * @author Nicolas Gramlich + * @since 10:17:47 - 02.08.2010 + */ +public class FixedStepEngine extends Engine { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final long mStepLength; + private long mSecondsElapsedAccumulator; + + // =========================================================== + // Constructors + // =========================================================== + + public FixedStepEngine(final EngineOptions pEngineOptions, final int pStepsPerSecond) { + super(pEngineOptions); + this.mStepLength = NANOSECONDSPERSECOND / pStepsPerSecond; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final long pNanosecondsElapsed) throws InterruptedException { + this.mSecondsElapsedAccumulator += pNanosecondsElapsed; + + final long stepLength = this.mStepLength; + while(this.mSecondsElapsedAccumulator >= stepLength) { + super.onUpdate(stepLength); + this.mSecondsElapsedAccumulator -= stepLength; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/LimitedFPSEngine.java b/AndEngine/src/org/anddev/andengine/engine/LimitedFPSEngine.java new file mode 100644 index 0000000..7062c9f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/LimitedFPSEngine.java @@ -0,0 +1,63 @@ +package org.anddev.andengine.engine; + +import org.anddev.andengine.engine.options.EngineOptions; + +/** + * A subclass of {@link Engine} that tries to achieve a specific amount of + * updates per second. When the time since the last update is bigger long the + * steplength, additional updates are executed. + * + * @author Nicolas Gramlich + * @since 10:17:47 - 02.08.2010 + */ +public class LimitedFPSEngine extends Engine { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final long mPreferredFrameLengthNanoseconds; + + // =========================================================== + // Constructors + // =========================================================== + + public LimitedFPSEngine(final EngineOptions pEngineOptions, final int pFramesPerSecond) { + super(pEngineOptions); + this.mPreferredFrameLengthNanoseconds = NANOSECONDSPERSECOND / pFramesPerSecond; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final long pNanosecondsElapsed) throws InterruptedException { + final long preferredFrameLengthNanoseconds = this.mPreferredFrameLengthNanoseconds; + final long deltaFrameLengthNanoseconds = preferredFrameLengthNanoseconds - pNanosecondsElapsed; + + if(deltaFrameLengthNanoseconds <= 0) { + super.onUpdate(pNanosecondsElapsed); + } else { + final int sleepTimeMilliseconds = (int) (deltaFrameLengthNanoseconds / NANOSECONDSPERMILLISECOND); + + Thread.sleep(sleepTimeMilliseconds); + super.onUpdate(pNanosecondsElapsed + deltaFrameLengthNanoseconds); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/SingleSceneSplitScreenEngine.java b/AndEngine/src/org/anddev/andengine/engine/SingleSceneSplitScreenEngine.java new file mode 100644 index 0000000..6429c7f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/SingleSceneSplitScreenEngine.java @@ -0,0 +1,123 @@ +package org.anddev.andengine.engine; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.options.EngineOptions; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.opengl.util.GLHelper; + +/** + * @author Nicolas Gramlich + * @since 22:28:34 - 27.03.2010 + */ +public class SingleSceneSplitScreenEngine extends Engine { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Camera mSecondCamera; + + // =========================================================== + // Constructors + // =========================================================== + + public SingleSceneSplitScreenEngine(final EngineOptions pEngineOptions, final Camera pSecondCamera) { + super(pEngineOptions); + this.mSecondCamera = pSecondCamera; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Deprecated + @Override + public Camera getCamera() { + return super.mCamera; + } + + public Camera getFirstCamera() { + return super.mCamera; + } + + public Camera getSecondCamera() { + return this.mSecondCamera; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onDrawScene(final GL10 pGL) { + final Camera firstCamera = this.getFirstCamera(); + final Camera secondCamera = this.getSecondCamera(); + + final int surfaceWidth = this.mSurfaceWidth; + final int surfaceWidthHalf = surfaceWidth >> 1; + + final int surfaceHeight = this.mSurfaceHeight; + + GLHelper.enableScissorTest(pGL); + + /* First Screen. With first camera, on the left half of the screens width. */ + { + pGL.glScissor(0, 0, surfaceWidthHalf, surfaceHeight); + pGL.glViewport(0, 0, surfaceWidthHalf, surfaceHeight); + + super.mScene.onDraw(pGL, firstCamera); + firstCamera.onDrawHUD(pGL); + } + + /* Second Screen. With second camera, on the right half of the screens width. */ + { + pGL.glScissor(surfaceWidthHalf, 0, surfaceWidthHalf, surfaceHeight); + pGL.glViewport(surfaceWidthHalf, 0, surfaceWidthHalf, surfaceHeight); + + super.mScene.onDraw(pGL, secondCamera); + secondCamera.onDrawHUD(pGL); + } + + GLHelper.disableScissorTest(pGL); + } + + @Override + protected Camera getCameraFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { + if(pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { + return this.getFirstCamera(); + } else { + return this.getSecondCamera(); + } + } + + @Override + protected void convertSurfaceToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { + final int surfaceWidthHalf = this.mSurfaceWidth >> 1; + + if(pCamera == this.getFirstCamera()) { + pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); + } else { + pSurfaceTouchEvent.offset(-surfaceWidthHalf, 0); + pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); + } + } + + @Override + protected void updateUpdateHandlers(final float pSecondsElapsed) { + super.updateUpdateHandlers(pSecondsElapsed); + this.getSecondCamera().onUpdate(pSecondsElapsed); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/BoundCamera.java b/AndEngine/src/org/anddev/andengine/engine/camera/BoundCamera.java new file mode 100644 index 0000000..789bc8e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/BoundCamera.java @@ -0,0 +1,164 @@ +package org.anddev.andengine.engine.camera; + +/** + * @author Nicolas Gramlich + * @since 15:55:54 - 27.07.2010 + */ +public class BoundCamera extends Camera { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected boolean mBoundsEnabled; + + private float mBoundsMinX; + private float mBoundsMaxX; + private float mBoundsMinY; + private float mBoundsMaxY; + + private float mBoundsCenterX; + private float mBoundsCenterY; + + private float mBoundsWidth; + private float mBoundsHeight; + + // =========================================================== + // Constructors + // =========================================================== + + public BoundCamera(final float pX, final float pY, final float pWidth, final float pHeight) { + super(pX, pY, pWidth, pHeight); + } + + public BoundCamera(final float pX, final float pY, final float pWidth, final float pHeight, final float pBoundMinX, final float pBoundMaxX, final float pBoundMinY, final float pBoundMaxY) { + super(pX, pY, pWidth, pHeight); + this.setBounds(pBoundMinX, pBoundMaxX, pBoundMinY, pBoundMaxY); + this.mBoundsEnabled = true; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isBoundsEnabled() { + return this.mBoundsEnabled; + } + + public void setBoundsEnabled(final boolean pBoundsEnabled) { + this.mBoundsEnabled = pBoundsEnabled; + } + + public void setBounds(final float pBoundMinX, final float pBoundMaxX, final float pBoundMinY, final float pBoundMaxY) { + this.mBoundsMinX = pBoundMinX; + this.mBoundsMaxX = pBoundMaxX; + this.mBoundsMinY = pBoundMinY; + this.mBoundsMaxY = pBoundMaxY; + + this.mBoundsWidth = this.mBoundsMaxX - this.mBoundsMinX; + this.mBoundsHeight = this.mBoundsMaxY - this.mBoundsMinY; + + this.mBoundsCenterX = this.mBoundsMinX + this.mBoundsWidth * 0.5f; + this.mBoundsCenterY = this.mBoundsMinY + this.mBoundsHeight * 0.5f; + } + + public float getBoundsWidth() { + return this.mBoundsWidth; + } + + public float getBoundsHeight() { + return this.mBoundsHeight; + } + + @Override + public void setCenter(final float pCenterX, final float pCenterY) { + super.setCenter(pCenterX, pCenterY); + + if(this.mBoundsEnabled) { + this.ensureInBounds(); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + protected void ensureInBounds() { + super.setCenter(this.determineBoundedX(), this.determineBoundedY()); + } + + private float determineBoundedX() { + if(this.mBoundsWidth < this.getWidth()) { + return this.mBoundsCenterX; + } else { + final float currentCenterX = this.getCenterX(); + + final float minXBoundExceededAmount = this.mBoundsMinX - this.getMinX(); + final boolean minXBoundExceeded = minXBoundExceededAmount > 0; + + final float maxXBoundExceededAmount = this.getMaxX() - this.mBoundsMaxX; + final boolean maxXBoundExceeded = maxXBoundExceededAmount > 0; + + if(minXBoundExceeded) { + if(maxXBoundExceeded) { + /* Min and max X exceeded. */ + return currentCenterX - maxXBoundExceededAmount + minXBoundExceededAmount; + } else { + /* Only min X exceeded. */ + return currentCenterX + minXBoundExceededAmount; + } + } else { + if(maxXBoundExceeded) { + /* Only max X exceeded. */ + return currentCenterX - maxXBoundExceededAmount; + } else { + /* Nothing exceeded. */ + return currentCenterX; + } + } + } + } + + private float determineBoundedY() { + if(this.mBoundsHeight < this.getHeight()) { + return this.mBoundsCenterY; + } else { + final float currentCenterY = this.getCenterY(); + + final float minYBoundExceededAmount = this.mBoundsMinY - this.getMinY(); + final boolean minYBoundExceeded = minYBoundExceededAmount > 0; + + final float maxYBoundExceededAmount = this.getMaxY() - this.mBoundsMaxY; + final boolean maxYBoundExceeded = maxYBoundExceededAmount > 0; + + if(minYBoundExceeded) { + if(maxYBoundExceeded) { + /* Min and max Y exceeded. */ + return currentCenterY - maxYBoundExceededAmount + minYBoundExceededAmount; + } else { + /* Only min Y exceeded. */ + return currentCenterY + minYBoundExceededAmount; + } + } else { + if(maxYBoundExceeded) { + /* Only max Y exceeded. */ + return currentCenterY - maxYBoundExceededAmount; + } else { + /* Nothing exceeded. */ + return currentCenterY; + } + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/Camera.java b/AndEngine/src/org/anddev/andengine/engine/camera/Camera.java new file mode 100644 index 0000000..d733a98 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/Camera.java @@ -0,0 +1,364 @@ +package org.anddev.andengine.engine.camera; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.collision.BaseCollisionChecker; +import org.anddev.andengine.engine.camera.hud.HUD; +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.entity.shape.RectangularShape; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.util.MathUtils; + +/** + * @author Nicolas Gramlich + * @since 10:24:18 - 25.03.2010 + */ +public class Camera implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + protected static final float[] VERTICES_TOUCH_TMP = new float[2]; + + // =========================================================== + // Fields + // =========================================================== + + private float mMinX; + private float mMaxX; + private float mMinY; + private float mMaxY; + + private float mNearZ = -1.0f; + private float mFarZ = 1.0f; + + private HUD mHUD; + + private IEntity mChaseEntity; + + protected float mRotation = 0; + protected float mCameraSceneRotation = 0; + + // =========================================================== + // Constructors + // =========================================================== + + public Camera(final float pX, final float pY, final float pWidth, final float pHeight) { + this.mMinX = pX; + this.mMaxX = pX + pWidth; + this.mMinY = pY; + this.mMaxY = pY + pHeight; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getMinX() { + return this.mMinX; + } + + public float getMaxX() { + return this.mMaxX; + } + + public float getMinY() { + return this.mMinY; + } + + public float getMaxY() { + return this.mMaxY; + } + + public float getNearZClippingPlane() { + return this.mNearZ; + } + + public float getFarZClippingPlane() { + return this.mFarZ; + } + + public void setNearZClippingPlane(final float pNearZClippingPlane) { + this.mNearZ = pNearZClippingPlane; + } + + public void setFarZClippingPlane(final float pFarZClippingPlane) { + this.mFarZ = pFarZClippingPlane; + } + + public void setZClippingPlanes(final float pNearZClippingPlane, final float pFarZClippingPlane) { + this.mNearZ = pNearZClippingPlane; + this.mFarZ = pFarZClippingPlane; + } + + public float getWidth() { + return this.mMaxX - this.mMinX; + } + + public float getHeight() { + return this.mMaxY - this.mMinY; + } + + public float getCenterX() { + final float minX = this.mMinX; + return minX + (this.mMaxX - minX) * 0.5f; + } + + public float getCenterY() { + final float minY = this.mMinY; + return minY + (this.mMaxY - minY) * 0.5f; + } + + public void setCenter(final float pCenterX, final float pCenterY) { + final float dX = pCenterX - this.getCenterX(); + final float dY = pCenterY - this.getCenterY(); + + this.mMinX += dX; + this.mMaxX += dX; + this.mMinY += dY; + this.mMaxY += dY; + } + + public void offsetCenter(final float pX, final float pY) { + this.setCenter(this.getCenterX() + pX, this.getCenterY() + pY); + } + + public HUD getHUD() { + return this.mHUD; + } + + public void setHUD(final HUD pHUD) { + this.mHUD = pHUD; + pHUD.setCamera(this); + } + + public boolean hasHUD() { + return this.mHUD != null; + } + + public void setChaseEntity(final IEntity pChaseEntity) { + this.mChaseEntity = pChaseEntity; + } + + public float getRotation() { + return this.mRotation; + } + + public void setRotation(final float pRotation) { + this.mRotation = pRotation; + } + + public float getCameraSceneRotation() { + return this.mCameraSceneRotation; + } + + public void setCameraSceneRotation(final float pCameraSceneRotation) { + this.mCameraSceneRotation = pCameraSceneRotation; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + if(this.mHUD != null) { + this.mHUD.onUpdate(pSecondsElapsed); + } + + if(this.mChaseEntity != null) { + final float[] centerCoordinates = this.mChaseEntity.getSceneCenterCoordinates(); + this.setCenter(centerCoordinates[VERTEX_INDEX_X], centerCoordinates[VERTEX_INDEX_Y]); + } + } + + @Override + public void reset() { + + } + + // =========================================================== + // Methods + // =========================================================== + + public void onDrawHUD(final GL10 pGL) { + if(this.mHUD != null) { + this.mHUD.onDraw(pGL, this); + } + } + + public boolean isRectangularShapeVisible(final RectangularShape pRectangularShape) { + final float otherLeft = pRectangularShape.getX(); + final float otherTop = pRectangularShape.getY(); + final float otherRight = pRectangularShape.getWidthScaled() + otherLeft; + final float otherBottom = pRectangularShape.getHeightScaled() + otherTop; + + // TODO Should also use RectangularShapeCollisionChecker + return BaseCollisionChecker.checkAxisAlignedRectangleCollision(this.getMinX(), this.getMinY(), this.getMaxX(), this.getMaxY(), otherLeft, otherTop, otherRight, otherBottom); + } + + public void onApplyMatrix(final GL10 pGL) { + GLHelper.setProjectionIdentityMatrix(pGL); + + pGL.glOrthof(this.getMinX(), this.getMaxX(), this.getMaxY(), this.getMinY(), this.mNearZ, this.mFarZ); + + final float rotation = this.mRotation; + if(rotation != 0) { + this.applyRotation(pGL, this.getCenterX(), this.getCenterY(), rotation); + } + } + + public void onApplyPositionIndependentMatrix(final GL10 pGL) { + GLHelper.setProjectionIdentityMatrix(pGL); + + final float width = this.mMaxX - this.mMinX; + final float height = this.mMaxY - this.mMinY; + + pGL.glOrthof(0, width, height, 0, this.mNearZ, this.mFarZ); + + final float rotation = this.mRotation; + if(rotation != 0) { + this.applyRotation(pGL, width * 0.5f, height * 0.5f, rotation); + } + } + + public void onApplyCameraSceneMatrix(final GL10 pGL) { + GLHelper.setProjectionIdentityMatrix(pGL); + + final float width = this.mMaxX - this.mMinX; + final float height = this.mMaxY - this.mMinY; + + pGL.glOrthof(0, width, height, 0, this.mNearZ, this.mFarZ); + + final float cameraSceneRotation = this.mCameraSceneRotation; + if(cameraSceneRotation != 0) { + this.applyRotation(pGL, width * 0.5f, height * 0.5f, cameraSceneRotation); + } + } + + private void applyRotation(final GL10 pGL, final float pRotationCenterX, final float pRotationCenterY, final float pAngle) { + pGL.glTranslatef(pRotationCenterX, pRotationCenterY, 0); + pGL.glRotatef(pAngle, 0, 0, 1); + pGL.glTranslatef(-pRotationCenterX, -pRotationCenterY, 0); + } + + public void convertSceneToCameraSceneTouchEvent(final TouchEvent pSceneTouchEvent) { + this.unapplySceneRotation(pSceneTouchEvent); + + this.applySceneToCameraSceneOffset(pSceneTouchEvent); + + this.applyCameraSceneRotation(pSceneTouchEvent); + } + + public void convertCameraSceneToSceneTouchEvent(final TouchEvent pCameraSceneTouchEvent) { + this.unapplyCameraSceneRotation(pCameraSceneTouchEvent); + + this.unapplySceneToCameraSceneOffset(pCameraSceneTouchEvent); + + this.applySceneRotation(pCameraSceneTouchEvent); + } + + protected void applySceneToCameraSceneOffset(final TouchEvent pSceneTouchEvent) { + pSceneTouchEvent.offset(-this.mMinX, -this.mMinY); + } + + protected void unapplySceneToCameraSceneOffset(final TouchEvent pCameraSceneTouchEvent) { + pCameraSceneTouchEvent.offset(this.mMinX, this.mMinY); + } + + private void applySceneRotation(final TouchEvent pCameraSceneTouchEvent) { + final float rotation = -this.mRotation; + if(rotation != 0) { + VERTICES_TOUCH_TMP[VERTEX_INDEX_X] = pCameraSceneTouchEvent.getX(); + VERTICES_TOUCH_TMP[VERTEX_INDEX_Y] = pCameraSceneTouchEvent.getY(); + + MathUtils.rotateAroundCenter(VERTICES_TOUCH_TMP, rotation, this.getCenterX(), this.getCenterY()); + + pCameraSceneTouchEvent.set(VERTICES_TOUCH_TMP[VERTEX_INDEX_X], VERTICES_TOUCH_TMP[VERTEX_INDEX_Y]); + } + } + + private void unapplySceneRotation(final TouchEvent pSceneTouchEvent) { + final float rotation = this.mRotation; + + if(rotation != 0) { + VERTICES_TOUCH_TMP[VERTEX_INDEX_X] = pSceneTouchEvent.getX(); + VERTICES_TOUCH_TMP[VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); + + MathUtils.revertRotateAroundCenter(VERTICES_TOUCH_TMP, rotation, this.getCenterX(), this.getCenterY()); + + pSceneTouchEvent.set(VERTICES_TOUCH_TMP[VERTEX_INDEX_X], VERTICES_TOUCH_TMP[VERTEX_INDEX_Y]); + } + } + + private void applyCameraSceneRotation(final TouchEvent pSceneTouchEvent) { + final float cameraSceneRotation = -this.mCameraSceneRotation; + + if(cameraSceneRotation != 0) { + VERTICES_TOUCH_TMP[VERTEX_INDEX_X] = pSceneTouchEvent.getX(); + VERTICES_TOUCH_TMP[VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); + + MathUtils.rotateAroundCenter(VERTICES_TOUCH_TMP, cameraSceneRotation, (this.mMaxX - this.mMinX) * 0.5f, (this.mMaxY - this.mMinY) * 0.5f); + + pSceneTouchEvent.set(VERTICES_TOUCH_TMP[VERTEX_INDEX_X], VERTICES_TOUCH_TMP[VERTEX_INDEX_Y]); + } + } + + private void unapplyCameraSceneRotation(final TouchEvent pCameraSceneTouchEvent) { + final float cameraSceneRotation = -this.mCameraSceneRotation; + + if(cameraSceneRotation != 0) { + VERTICES_TOUCH_TMP[VERTEX_INDEX_X] = pCameraSceneTouchEvent.getX(); + VERTICES_TOUCH_TMP[VERTEX_INDEX_Y] = pCameraSceneTouchEvent.getY(); + + MathUtils.revertRotateAroundCenter(VERTICES_TOUCH_TMP, cameraSceneRotation, (this.mMaxX - this.mMinX) * 0.5f, (this.mMaxY - this.mMinY) * 0.5f); + + pCameraSceneTouchEvent.set(VERTICES_TOUCH_TMP[VERTEX_INDEX_X], VERTICES_TOUCH_TMP[VERTEX_INDEX_Y]); + } + } + + public void convertSurfaceToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent, final int pSurfaceWidth, final int pSurfaceHeight) { + final float relativeX; + final float relativeY; + + final float rotation = this.mRotation; + if(rotation == 0) { + relativeX = pSurfaceTouchEvent.getX() / pSurfaceWidth; + relativeY = pSurfaceTouchEvent.getY() / pSurfaceHeight; + } else if(rotation == 180) { + relativeX = 1 - (pSurfaceTouchEvent.getX() / pSurfaceWidth); + relativeY = 1 - (pSurfaceTouchEvent.getY() / pSurfaceHeight); + } else { + VERTICES_TOUCH_TMP[VERTEX_INDEX_X] = pSurfaceTouchEvent.getX(); + VERTICES_TOUCH_TMP[VERTEX_INDEX_Y] = pSurfaceTouchEvent.getY(); + + MathUtils.rotateAroundCenter(VERTICES_TOUCH_TMP, rotation, pSurfaceWidth / 2, pSurfaceHeight / 2); + + relativeX = VERTICES_TOUCH_TMP[VERTEX_INDEX_X] / pSurfaceWidth; + relativeY = VERTICES_TOUCH_TMP[VERTEX_INDEX_Y] / pSurfaceHeight; + } + + this.convertAxisAlignedSurfaceToSceneTouchEvent(pSurfaceTouchEvent, relativeX, relativeY); + } + + private void convertAxisAlignedSurfaceToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent, final float pRelativeX, final float pRelativeY) { + final float minX = this.getMinX(); + final float maxX = this.getMaxX(); + final float minY = this.getMinY(); + final float maxY = this.getMaxY(); + + final float x = minX + pRelativeX * (maxX - minX); + final float y = minY + pRelativeY * (maxY - minY); + + pSurfaceTouchEvent.set(x, y); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/CameraFactory.java b/AndEngine/src/org/anddev/andengine/engine/camera/CameraFactory.java new file mode 100644 index 0000000..5989e8c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/CameraFactory.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.engine.camera; + +import android.app.Activity; +import android.util.DisplayMetrics; + +/** + * @author Nicolas Gramlich + * @since 13:50:42 - 03.07.2010 + */ +public class CameraFactory { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static Camera createPixelPerfectCamera(final Activity pActivity, final float pCenterX, final float pCenterY) { + final DisplayMetrics displayMetrics = CameraFactory.getDisplayMetrics(pActivity); + + final float width = displayMetrics.widthPixels; + final float height = displayMetrics.heightPixels; + return new Camera(pCenterX - width * 0.5f, pCenterY - height * 0.5f, width, height); + } + + private static DisplayMetrics getDisplayMetrics(final Activity pActivity) { + final DisplayMetrics displayMetrics = new DisplayMetrics(); + pActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/SmoothCamera.java b/AndEngine/src/org/anddev/andengine/engine/camera/SmoothCamera.java new file mode 100644 index 0000000..f264c59 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/SmoothCamera.java @@ -0,0 +1,147 @@ +package org.anddev.andengine.engine.camera; + + +/** + * @author Nicolas Gramlich + * @since 22:11:17 - 25.03.2010 + */ +public class SmoothCamera extends ZoomCamera { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mMaxVelocityX; + private float mMaxVelocityY; + private float mMaxZoomFactorChange; + + private float mTargetCenterX; + private float mTargetCenterY; + + private float mTargetZoomFactor; + + // =========================================================== + // Constructors + // =========================================================== + + public SmoothCamera(final float pX, final float pY, final float pWidth, final float pHeight, final float pMaxVelocityX, final float pMaxVelocityY, final float pMaxZoomFactorChange) { + super(pX, pY, pWidth, pHeight); + this.mMaxVelocityX = pMaxVelocityX; + this.mMaxVelocityY = pMaxVelocityY; + this.mMaxZoomFactorChange = pMaxZoomFactorChange; + + this.mTargetCenterX = this.getCenterX(); + this.mTargetCenterY = this.getCenterY(); + + this.mTargetZoomFactor = 1.0f; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public void setCenter(final float pCenterX, final float pCenterY) { + this.mTargetCenterX = pCenterX; + this.mTargetCenterY = pCenterY; + } + + public void setCenterDirect(final float pCenterX, final float pCenterY) { + super.setCenter(pCenterX, pCenterY); + this.mTargetCenterX = pCenterX; + this.mTargetCenterY = pCenterY; + } + + @Override + public void setZoomFactor(final float pZoomFactor) { + this.mTargetZoomFactor = pZoomFactor; + } + + public void setMaxVelocityX(final float pMaxVelocityX) { + this.mMaxVelocityX = pMaxVelocityX; + } + + public void setMaxVelocityY(final float pMaxVelocityY) { + this.mMaxVelocityY = pMaxVelocityY; + } + + public void setMaxVelocityX(final float pMaxVelocityX, final float pMaxVelocityY) { + this.mMaxVelocityX = pMaxVelocityX; + this.mMaxVelocityY = pMaxVelocityY; + } + + public void setMaxZoomFactorChange(final float pMaxZoomFactorChange) { + this.mMaxZoomFactorChange = pMaxZoomFactorChange; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + super.onUpdate(pSecondsElapsed); + /* Update center. */ + final float currentCenterX = this.getCenterX(); + final float currentCenterY = this.getCenterY(); + + final float targetCenterX = this.mTargetCenterX; + final float targetCenterY = this.mTargetCenterY; + + if(currentCenterX != targetCenterX || currentCenterY != targetCenterY) { + final float diffX = targetCenterX - currentCenterX; + final float dX = this.cutToMaxVelocityX(diffX, pSecondsElapsed); + + final float diffY = targetCenterY - currentCenterY; + final float dY = this.cutToMaxVelocityY(diffY, pSecondsElapsed); + + super.setCenter(currentCenterX + dX, currentCenterY + dY); + } + + /* Update zoom. */ + final float currentZoom = this.getZoomFactor(); + + final float targetZoomFactor = this.mTargetZoomFactor; + + if(currentZoom != targetZoomFactor) { + final float diffZoom = targetZoomFactor - currentZoom; + final float dZoom = this.cutToMaxZoomFactorChange(diffZoom, pSecondsElapsed); + super.setZoomFactor(currentZoom + dZoom); + } + } + + private float cutToMaxVelocityX(final float pValue, final float pSecondsElapsed) { + if(pValue > 0) { + return Math.min(pValue, this.mMaxVelocityX * pSecondsElapsed); + } else { + return Math.max(pValue, -this.mMaxVelocityX * pSecondsElapsed); + } + } + + private float cutToMaxVelocityY(final float pValue, final float pSecondsElapsed) { + if(pValue > 0) { + return Math.min(pValue, this.mMaxVelocityY * pSecondsElapsed); + } else { + return Math.max(pValue, -this.mMaxVelocityY * pSecondsElapsed); + } + } + + private float cutToMaxZoomFactorChange(final float pValue, final float pSecondsElapsed) { + if(pValue > 0) { + return Math.min(pValue, this.mMaxZoomFactorChange * pSecondsElapsed); + } else { + return Math.max(pValue, -this.mMaxZoomFactorChange * pSecondsElapsed); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/ZoomCamera.java b/AndEngine/src/org/anddev/andengine/engine/camera/ZoomCamera.java new file mode 100644 index 0000000..98a59a4 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/ZoomCamera.java @@ -0,0 +1,147 @@ +package org.anddev.andengine.engine.camera; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.util.MathUtils; + + + +/** + * @author Nicolas Gramlich + * @since 15:48:11 - 24.06.2010 + * TODO min/max(X/Y) values could be cached and only updated once the zoomfactor/center changed. + */ +public class ZoomCamera extends BoundCamera { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mZoomFactor = 1.0f; + + // =========================================================== + // Constructors + // =========================================================== + + public ZoomCamera(final float pX, final float pY, final float pWidth, final float pHeight) { + super(pX, pY, pWidth, pHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getZoomFactor() { + return this.mZoomFactor; + } + + public void setZoomFactor(final float pZoomFactor) { + this.mZoomFactor = pZoomFactor; + + if(this.mBoundsEnabled) { + this.ensureInBounds(); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getMinX() { + if(this.mZoomFactor == 1.0f) { + return super.getMinX(); + } else { + final float centerX = this.getCenterX(); + return centerX - (centerX - super.getMinX()) / this.mZoomFactor; + } + } + + @Override + public float getMaxX() { + if(this.mZoomFactor == 1.0f) { + return super.getMaxX(); + } else { + final float centerX = this.getCenterX(); + return centerX + (super.getMaxX() - centerX) / this.mZoomFactor; + } + } + + @Override + public float getMinY() { + if(this.mZoomFactor == 1.0f) { + return super.getMinY(); + } else { + final float centerY = this.getCenterY(); + return centerY - (centerY - super.getMinY()) / this.mZoomFactor; + } + } + + @Override + public float getMaxY() { + if(this.mZoomFactor == 1.0f) { + return super.getMaxY(); + } else { + final float centerY = this.getCenterY(); + return centerY + (super.getMaxY() - centerY) / this.mZoomFactor; + } + } + + @Override + public float getWidth() { + return super.getWidth() / this.mZoomFactor; + } + + @Override + public float getHeight() { + return super.getHeight() / this.mZoomFactor; + } + + @Override + protected void applySceneToCameraSceneOffset(final TouchEvent pSceneTouchEvent) { + final float zoomFactor = this.mZoomFactor; + if(zoomFactor != 1) { + final float scaleCenterX = this.getCenterX(); + final float scaleCenterY = this.getCenterY(); + + VERTICES_TOUCH_TMP[VERTEX_INDEX_X] = pSceneTouchEvent.getX(); + VERTICES_TOUCH_TMP[VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); + + MathUtils.scaleAroundCenter(VERTICES_TOUCH_TMP, zoomFactor, zoomFactor, scaleCenterX, scaleCenterY); + + pSceneTouchEvent.set(VERTICES_TOUCH_TMP[VERTEX_INDEX_X], VERTICES_TOUCH_TMP[VERTEX_INDEX_Y]); + } + super.applySceneToCameraSceneOffset(pSceneTouchEvent); + } + + @Override + protected void unapplySceneToCameraSceneOffset(final TouchEvent pCameraSceneTouchEvent) { + super.unapplySceneToCameraSceneOffset(pCameraSceneTouchEvent); + + final float zoomFactor = this.mZoomFactor; + if(zoomFactor != 1) { + final float scaleCenterX = this.getCenterX(); + final float scaleCenterY = this.getCenterY(); + + VERTICES_TOUCH_TMP[VERTEX_INDEX_X] = pCameraSceneTouchEvent.getX(); + VERTICES_TOUCH_TMP[VERTEX_INDEX_Y] = pCameraSceneTouchEvent.getY(); + + MathUtils.revertScaleAroundCenter(VERTICES_TOUCH_TMP, zoomFactor, zoomFactor, scaleCenterX, scaleCenterY); + + pCameraSceneTouchEvent.set(VERTICES_TOUCH_TMP[VERTEX_INDEX_X], VERTICES_TOUCH_TMP[VERTEX_INDEX_Y]); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/hud/HUD.java b/AndEngine/src/org/anddev/andengine/engine/camera/hud/HUD.java new file mode 100644 index 0000000..e230779 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/hud/HUD.java @@ -0,0 +1,54 @@ +package org.anddev.andengine.engine.camera.hud; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.scene.CameraScene; +import org.anddev.andengine.entity.scene.Scene; + +/** + * While you can add a {@link HUD} to {@link Scene}, you should not do so. + * {@link HUD}s are meant to be added to {@link Camera}s via {@link Camera#setHUD(HUD)}. + * + * @author Nicolas Gramlich + * @since 14:13:13 - 01.04.2010 + */ +public class HUD extends CameraScene { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public HUD() { + this(1); + + this.setBackgroundEnabled(false); + } + + public HUD(final int pLayerCount) { + super(pLayerCount); + + this.setBackgroundEnabled(false); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java b/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java new file mode 100644 index 0000000..e972d21 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java @@ -0,0 +1,103 @@ +package org.anddev.andengine.engine.camera.hud.controls; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.input.touch.detector.ClickDetector; +import org.anddev.andengine.input.touch.detector.ClickDetector.IClickDetectorListener; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.util.MathUtils; +import org.anddev.andengine.util.constants.TimeConstants; + +import android.util.FloatMath; + +/** + * @author Nicolas Gramlich + * @since 00:21:55 - 11.07.2010 + */ +public class AnalogOnScreenControl extends BaseOnScreenControl implements TimeConstants, IClickDetectorListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ClickDetector mClickDetector = new ClickDetector(this); + + // =========================================================== + // Constructors + // =========================================================== + + public AnalogOnScreenControl(final float pX, final float pY, final Camera pCamera, final TextureRegion pControlBaseTextureRegion, final TextureRegion pControlKnobTextureRegion, final float pTimeBetweenUpdates, final IAnalogOnScreenControlListener pAnalogOnScreenControlListener) { + super(pX, pY, pCamera, pControlBaseTextureRegion, pControlKnobTextureRegion, pTimeBetweenUpdates, pAnalogOnScreenControlListener); + this.mClickDetector.setEnabled(false); + } + + public AnalogOnScreenControl(final float pX, final float pY, final Camera pCamera, final TextureRegion pControlBaseTextureRegion, final TextureRegion pControlKnobTextureRegion, final float pTimeBetweenUpdates, final long pOnControlClickMaximumMilliseconds, final IAnalogOnScreenControlListener pAnalogOnScreenControlListener) { + super(pX, pY, pCamera, pControlBaseTextureRegion, pControlKnobTextureRegion, pTimeBetweenUpdates, pAnalogOnScreenControlListener); + this.mClickDetector.setTriggerClickMaximumMilliseconds(pOnControlClickMaximumMilliseconds); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public IAnalogOnScreenControlListener getOnScreenControlListener() { + return (IAnalogOnScreenControlListener)super.getOnScreenControlListener(); + } + + public void setOnControlClickEnabled(final boolean pOnControlClickEnabled) { + this.mClickDetector.setEnabled(pOnControlClickEnabled); + } + + public void setOnControlClickMaximumMilliseconds(final long pOnControlClickMaximumMilliseconds) { + this.mClickDetector.setTriggerClickMaximumMilliseconds(pOnControlClickMaximumMilliseconds); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onClick(final ClickDetector pClickDetector, final TouchEvent pTouchEvent) { + this.getOnScreenControlListener().onControlClick(this); + } + + @Override + protected boolean onHandleControlBaseTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { + this.mClickDetector.onSceneTouchEvent(null, pSceneTouchEvent); + return super.onHandleControlBaseTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY); + } + + @Override + protected void onUpdateControlKnob(final float pRelativeX, final float pRelativeY) { + if(pRelativeX * pRelativeX + pRelativeY * pRelativeY <= 0.25f) { + super.onUpdateControlKnob(pRelativeX, pRelativeY); + } else { + final float angleRad = MathUtils.atan2(pRelativeY, pRelativeX); + super.onUpdateControlKnob(FloatMath.cos(angleRad) * 0.5f, FloatMath.sin(angleRad) * 0.5f); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface IAnalogOnScreenControlListener extends IOnScreenControlListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onControlClick(final AnalogOnScreenControl pAnalogOnScreenControl); + } +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/BaseOnScreenControl.java b/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/BaseOnScreenControl.java new file mode 100644 index 0000000..1c264a4 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/BaseOnScreenControl.java @@ -0,0 +1,215 @@ +package org.anddev.andengine.engine.camera.hud.controls; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.camera.hud.HUD; +import org.anddev.andengine.engine.handler.timer.ITimerCallback; +import org.anddev.andengine.engine.handler.timer.TimerHandler; +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener; +import org.anddev.andengine.entity.sprite.Sprite; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.util.MathUtils; + +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 10:43:09 - 11.07.2010 + */ +public abstract class BaseOnScreenControl extends HUD implements IOnSceneTouchListener { + // =========================================================== + // Constants + // =========================================================== + + private static final int INVALID_POINTER_ID = -1; + + // =========================================================== + // Fields + // =========================================================== + + private final Sprite mControlBase; + private final Sprite mControlKnob; + + private float mControlValueX; + private float mControlValueY; + + private final IOnScreenControlListener mOnScreenControlListener; + + private int mActivePointerID = INVALID_POINTER_ID; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseOnScreenControl(final float pX, final float pY, final Camera pCamera, final TextureRegion pControlBaseTextureRegion, final TextureRegion pControlKnobTextureRegion, final float pTimeBetweenUpdates, final IOnScreenControlListener pOnScreenControlListener) { + this.setCamera(pCamera); + + this.mOnScreenControlListener = pOnScreenControlListener; + /* Create the control base. */ + this.mControlBase = new Sprite(pX, pY, pControlBaseTextureRegion) { + @Override + public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { + return BaseOnScreenControl.this.onHandleControlBaseTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY); + } + }; + + /* Create the control knob. */ + this.mControlKnob = new Sprite(0, 0, pControlKnobTextureRegion); + this.onHandleControlKnobReleased(); + + /* Register listeners and add objects to this HUD. */ + this.setOnSceneTouchListener(this); + this.registerTouchArea(this.mControlBase); + this.registerUpdateHandler(new TimerHandler(pTimeBetweenUpdates, true, new ITimerCallback() { + @Override + public void onTimePassed(final TimerHandler pTimerHandler) { + BaseOnScreenControl.this.mOnScreenControlListener.onControlChange(BaseOnScreenControl.this, BaseOnScreenControl.this.mControlValueX, BaseOnScreenControl.this.mControlValueY); + } + })); + + final IEntity firstChild = this.getFirstChild(); + firstChild.attachChild(this.mControlBase); + firstChild.attachChild(this.mControlKnob); + + this.setTouchAreaBindingEnabled(true); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Sprite getControlBase() { + return this.mControlBase; + } + + public Sprite getControlKnob() { + return this.mControlKnob; + } + + public IOnScreenControlListener getOnScreenControlListener() { + return this.mOnScreenControlListener; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { + final int pointerID = pSceneTouchEvent.getPointerID(); + if(pointerID == this.mActivePointerID) { + this.onHandleControlBaseLeft(); + + switch(pSceneTouchEvent.getAction()) { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + this.mActivePointerID = INVALID_POINTER_ID; + } + } + return false; + } + + // =========================================================== + // Methods + // =========================================================== + + public void refreshControlKnobPosition() { + this.onUpdateControlKnob(this.mControlValueX * 0.5f, this.mControlValueY * 0.5f); + } + + /** + * When the touch happened outside of the bounds of this OnScreenControl. + * */ + protected void onHandleControlBaseLeft() { + this.onUpdateControlKnob(0, 0); + } + + /** + * When the OnScreenControl was released. + */ + protected void onHandleControlKnobReleased() { + this.onUpdateControlKnob(0, 0); + } + + protected boolean onHandleControlBaseTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { + final int pointerID = pSceneTouchEvent.getPointerID(); + + switch(pSceneTouchEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + if(this.mActivePointerID == INVALID_POINTER_ID) { + this.mActivePointerID = pointerID; + this.updateControlKnob(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY); + return true; + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + if(this.mActivePointerID == pointerID) { + this.mActivePointerID = INVALID_POINTER_ID; + this.onHandleControlKnobReleased(); + return true; + } + break; + default: + if(this.mActivePointerID == pointerID) { + this.updateControlKnob(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY); + return true; + } + break; + } + return true; + } + + private void updateControlKnob(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { + final Sprite controlBase = this.mControlBase; + + final float relativeX = MathUtils.bringToBounds(0, controlBase.getWidth(), pTouchAreaLocalX) / controlBase.getWidth() - 0.5f; + final float relativeY = MathUtils.bringToBounds(0, controlBase.getHeight(), pTouchAreaLocalY) / controlBase.getHeight() - 0.5f; + + this.onUpdateControlKnob(relativeX, relativeY); + } + + /** + * @param pRelativeX from -0.5 (left) to 0.5 (right). + * @param pRelativeY from -0.5 (top) to 0.5 (bottom). + */ + protected void onUpdateControlKnob(final float pRelativeX, final float pRelativeY) { + final Sprite controlBase = this.mControlBase; + final Sprite controlKnob = this.mControlKnob; + + this.mControlValueX = 2 * pRelativeX; + this.mControlValueY = 2 * pRelativeY; + + final float[] controlBaseSceneCenterCoordinates = controlBase.getSceneCenterCoordinates(); + final float x = controlBaseSceneCenterCoordinates[VERTEX_INDEX_X] - controlKnob.getWidth() * 0.5f + pRelativeX * controlBase.getWidthScaled(); + final float y = controlBaseSceneCenterCoordinates[VERTEX_INDEX_Y] - controlKnob.getHeight() * 0.5f + pRelativeY * controlBase.getHeightScaled(); + + controlKnob.setPosition(x, y); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IOnScreenControlListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * @param pBaseOnScreenControl + * @param pValueX between -1 (left) to 1 (right). + * @param pValueY between -1 (up) to 1 (down). + */ + public void onControlChange(final BaseOnScreenControl pBaseOnScreenControl, final float pValueX, final float pValueY); + } +} diff --git a/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java b/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java new file mode 100644 index 0000000..103297c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java @@ -0,0 +1,67 @@ +package org.anddev.andengine.engine.camera.hud.controls; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.opengl.texture.region.TextureRegion; + +/** + * @author Nicolas Gramlich + * @since 00:21:55 - 11.07.2010 + */ +public class DigitalOnScreenControl extends BaseOnScreenControl { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public DigitalOnScreenControl(final float pX, final float pY, final Camera pCamera, final TextureRegion pControlBaseTextureRegion, final TextureRegion pControlKnobTextureRegion, final float pTimeBetweenUpdates, final IOnScreenControlListener pOnScreenControlListener) { + super(pX, pY, pCamera, pControlBaseTextureRegion, pControlKnobTextureRegion, pTimeBetweenUpdates, pOnScreenControlListener); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onUpdateControlKnob(final float pRelativeX, final float pRelativeY) { + if(pRelativeX == 0 && pRelativeY == 0) { + super.onUpdateControlKnob(0, 0); + } + + if(Math.abs(pRelativeX) > Math.abs(pRelativeY)) { + if(pRelativeX > 0) { + super.onUpdateControlKnob(0.5f, 0); + } else if(pRelativeX < 0) { + super.onUpdateControlKnob(-0.5f, 0); + } else if(pRelativeX == 0) { + super.onUpdateControlKnob(0, 0); + } + } else { + if(pRelativeY > 0) { + super.onUpdateControlKnob(0, 0.5f); + } else if(pRelativeY < 0) { + super.onUpdateControlKnob(0, -0.5f); + } else if(pRelativeY == 0) { + super.onUpdateControlKnob(0, 0); + } + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/BaseEntityUpdateHandler.java b/AndEngine/src/org/anddev/andengine/engine/handler/BaseEntityUpdateHandler.java new file mode 100644 index 0000000..40c3d05 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/BaseEntityUpdateHandler.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.engine.handler; + +import org.anddev.andengine.entity.IEntity; + +/** + * @author Nicolas Gramlich + * @since 14:00:25 - 24.12.2010 + */ +public abstract class BaseEntityUpdateHandler implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final IEntity mEntity; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseEntityUpdateHandler(final IEntity pEntity) { + this.mEntity = pEntity; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onUpdate(final float pSecondsElapsed, final IEntity pEntity); + + @Override + public final void onUpdate(final float pSecondsElapsed) { + this.onUpdate(pSecondsElapsed, this.mEntity); + } + + @Override + public void reset() { + + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/IUpdateHandler.java b/AndEngine/src/org/anddev/andengine/engine/handler/IUpdateHandler.java new file mode 100644 index 0000000..add606a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/IUpdateHandler.java @@ -0,0 +1,36 @@ +package org.anddev.andengine.engine.handler; + +import org.anddev.andengine.util.IMatcher; + +/** + * @author Nicolas Gramlich + * @since 12:24:09 - 11.03.2010 + */ +public interface IUpdateHandler { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onUpdate(final float pSecondsElapsed); + public void reset(); + + // TODO Maybe add onRegister and onUnregister. (Maybe add SimpleUpdateHandler that implements all methods, but onUpdate) + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface IUpdateHandlerMatcher extends IMatcher { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/UpdateHandlerList.java b/AndEngine/src/org/anddev/andengine/engine/handler/UpdateHandlerList.java new file mode 100644 index 0000000..4323b1d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/UpdateHandlerList.java @@ -0,0 +1,63 @@ +package org.anddev.andengine.engine.handler; + +import org.anddev.andengine.util.SmartList; + +/** + * @author Nicolas Gramlich + * @since 09:45:22 - 31.03.2010 + */ +public class UpdateHandlerList extends SmartList implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = -8842562717687229277L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public UpdateHandlerList() { + + } + + public UpdateHandlerList(final int pCapacity) { + super(pCapacity); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + final int handlerCount = this.size(); + for(int i = handlerCount - 1; i >= 0; i--) { + this.get(i).onUpdate(pSecondsElapsed); + } + } + + @Override + public void reset() { + final int handlerCount = this.size(); + for(int i = handlerCount - 1; i >= 0; i--) { + this.get(i).reset(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/collision/CollisionHandler.java b/AndEngine/src/org/anddev/andengine/engine/handler/collision/CollisionHandler.java new file mode 100644 index 0000000..6eb05ae --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/collision/CollisionHandler.java @@ -0,0 +1,86 @@ +package org.anddev.andengine.engine.handler.collision; + +import java.util.ArrayList; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.entity.shape.IShape; +import org.anddev.andengine.util.ListUtils; + +/** + * @author Nicolas Gramlich + * @since 12:19:35 - 11.03.2010 + */ +public class CollisionHandler implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ICollisionCallback mCollisionCallback; + private final IShape mCheckShape; + private final ArrayList mTargetStaticEntities; + + // =========================================================== + // Constructors + // =========================================================== + + public CollisionHandler(final ICollisionCallback pCollisionCallback, final IShape pCheckShape, final IShape pTargetShape) throws IllegalArgumentException { + this(pCollisionCallback, pCheckShape, ListUtils.toList(pTargetShape)); + } + + public CollisionHandler(final ICollisionCallback pCollisionCallback, final IShape pCheckShape, final ArrayList pTargetStaticEntities) throws IllegalArgumentException { + if (pCollisionCallback == null) { + throw new IllegalArgumentException( "pCollisionCallback must not be null!"); + } + if (pCheckShape == null) { + throw new IllegalArgumentException( "pCheckShape must not be null!"); + } + if (pTargetStaticEntities == null) { + throw new IllegalArgumentException( "pTargetStaticEntities must not be null!"); + } + + this.mCollisionCallback = pCollisionCallback; + this.mCheckShape = pCheckShape; + this.mTargetStaticEntities = pTargetStaticEntities; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + final IShape checkShape = this.mCheckShape; + final ArrayList staticEntities = this.mTargetStaticEntities; + final int staticEntityCount = staticEntities.size(); + + for(int i = 0; i < staticEntityCount; i++){ + if(checkShape.collidesWith(staticEntities.get(i))){ + final boolean proceed = this.mCollisionCallback.onCollision(checkShape, staticEntities.get(i)); + if(!proceed) { + return; + } + } + } + } + + @Override + public void reset() { + + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/collision/ICollisionCallback.java b/AndEngine/src/org/anddev/andengine/engine/handler/collision/ICollisionCallback.java new file mode 100644 index 0000000..86d999e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/collision/ICollisionCallback.java @@ -0,0 +1,24 @@ +package org.anddev.andengine.engine.handler.collision; + +import org.anddev.andengine.entity.shape.IShape; + +/** + * @author Nicolas Gramlich + * @since 12:05:39 - 11.03.2010 + */ +public interface ICollisionCallback { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * @param pCheckShape + * @param pTargetShape + * @return true to proceed, false to stop further collosion-checks. + */ + public boolean onCollision(final IShape pCheckShape, final IShape pTargetShape); +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/physics/PhysicsHandler.java b/AndEngine/src/org/anddev/andengine/engine/handler/physics/PhysicsHandler.java new file mode 100644 index 0000000..7abbd3e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/physics/PhysicsHandler.java @@ -0,0 +1,160 @@ +package org.anddev.andengine.engine.handler.physics; + +import org.anddev.andengine.engine.handler.BaseEntityUpdateHandler; +import org.anddev.andengine.entity.IEntity; + +/** + * @author Nicolas Gramlich + * @since 13:53:07 - 24.12.2010 + */ +public class PhysicsHandler extends BaseEntityUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private boolean mEnabled = true; + + protected float mAccelerationX = 0; + protected float mAccelerationY = 0; + + protected float mVelocityX = 0; + protected float mVelocityY = 0; + + protected float mAngularVelocity = 0; + + // =========================================================== + // Constructors + // =========================================================== + + public PhysicsHandler(final IEntity pEntity) { + super(pEntity); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isEnabled() { + return this.mEnabled; + } + + public void setEnabled(final boolean pEnabled) { + this.mEnabled = pEnabled; + } + + public float getVelocityX() { + return this.mVelocityX; + } + + public float getVelocityY() { + return this.mVelocityY; + } + + public void setVelocityX(final float pVelocityX) { + this.mVelocityX = pVelocityX; + } + + public void setVelocityY(final float pVelocityY) { + this.mVelocityY = pVelocityY; + } + + public void setVelocity(final float pVelocity) { + this.mVelocityX = pVelocity; + this.mVelocityY = pVelocity; + } + + public void setVelocity(final float pVelocityX, final float pVelocityY) { + this.mVelocityX = pVelocityX; + this.mVelocityY = pVelocityY; + } + + public float getAccelerationX() { + return this.mAccelerationX; + } + + public float getAccelerationY() { + return this.mAccelerationY; + } + + public void setAccelerationX(final float pAccelerationX) { + this.mAccelerationX = pAccelerationX; + } + + public void setAccelerationY(final float pAccelerationY) { + this.mAccelerationY = pAccelerationY; + } + + public void setAcceleration(final float pAccelerationX, final float pAccelerationY) { + this.mAccelerationX = pAccelerationX; + this.mAccelerationY = pAccelerationY; + } + + public void setAcceleration(final float pAcceleration) { + this.mAccelerationX = pAcceleration; + this.mAccelerationY = pAcceleration; + } + + public void accelerate(final float pAccelerationX, final float pAccelerationY) { + this.mAccelerationX += pAccelerationX; + this.mAccelerationY += pAccelerationY; + } + + public float getAngularVelocity() { + return this.mAngularVelocity; + } + + public void setAngularVelocity(final float pAngularVelocity) { + this.mAngularVelocity = pAngularVelocity; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onUpdate(final float pSecondsElapsed, final IEntity pEntity) { + if(this.mEnabled) { + /* Apply linear acceleration. */ + final float accelerationX = this.mAccelerationX; + final float accelerationY = this.mAccelerationY; + if(accelerationX != 0 || accelerationY != 0) { + this.mVelocityX += accelerationX * pSecondsElapsed; + this.mVelocityY += accelerationY * pSecondsElapsed; + } + + /* Apply angular velocity. */ + final float angularVelocity = this.mAngularVelocity; + if(angularVelocity != 0) { + pEntity.setRotation(pEntity.getRotation() + angularVelocity * pSecondsElapsed); + } + + /* Apply linear velocity. */ + final float velocityX = this.mVelocityX; + final float velocityY = this.mVelocityY; + if(velocityX != 0 || velocityY != 0) { + pEntity.setPosition(pEntity.getX() + velocityX * pSecondsElapsed, pEntity.getY() + velocityY * pSecondsElapsed); + } + } + } + + @Override + public void reset() { + this.mAccelerationX = 0; + this.mAccelerationY = 0; + this.mVelocityX = 0; + this.mVelocityY = 0; + this.mAngularVelocity = 0; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/runnable/RunnableHandler.java b/AndEngine/src/org/anddev/andengine/engine/handler/runnable/RunnableHandler.java new file mode 100644 index 0000000..f13b0c0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/runnable/RunnableHandler.java @@ -0,0 +1,60 @@ +package org.anddev.andengine.engine.handler.runnable; + +import java.util.ArrayList; + +import org.anddev.andengine.engine.handler.IUpdateHandler; + +/** + * @author Nicolas Gramlich + * @since 10:24:39 - 18.06.2010 + */ +public class RunnableHandler implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ArrayList mRunnables = new ArrayList(); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public synchronized void onUpdate(final float pSecondsElapsed) { + final ArrayList runnables = this.mRunnables; + final int runnableCount = runnables.size(); + for(int i = runnableCount - 1; i >= 0; i--) { + runnables.get(i).run(); + } + runnables.clear(); + } + + @Override + public void reset() { + this.mRunnables.clear(); + } + + // =========================================================== + // Methods + // =========================================================== + + public synchronized void postRunnable(final Runnable pRunnable) { + this.mRunnables.add(pRunnable); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/timer/ITimerCallback.java b/AndEngine/src/org/anddev/andengine/engine/handler/timer/ITimerCallback.java new file mode 100644 index 0000000..b190e1c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/timer/ITimerCallback.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.engine.handler.timer; + +/** + * @author Nicolas Gramlich + * @since 16:23:25 - 12.03.2010 + */ +public interface ITimerCallback { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onTimePassed(final TimerHandler pTimerHandler); +} diff --git a/AndEngine/src/org/anddev/andengine/engine/handler/timer/TimerHandler.java b/AndEngine/src/org/anddev/andengine/engine/handler/timer/TimerHandler.java new file mode 100644 index 0000000..4ce3709 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/handler/timer/TimerHandler.java @@ -0,0 +1,102 @@ +package org.anddev.andengine.engine.handler.timer; + +import org.anddev.andengine.engine.handler.IUpdateHandler; + +/** + * @author Nicolas Gramlich + * @since 16:23:58 - 12.03.2010 + */ +public class TimerHandler implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mTimerSeconds; + private float mTimerSecondsElapsed; + private boolean mCallbackTriggered = false; + protected final ITimerCallback mTimerCallback; + private boolean mAutoReset; + + // =========================================================== + // Constructors + // =========================================================== + + public TimerHandler(final float pTimerSeconds, final ITimerCallback pTimerCallback) { + this(pTimerSeconds, false, pTimerCallback); + } + + public TimerHandler(final float pTimerSeconds, final boolean pAutoReset, final ITimerCallback pTimerCallback) { + this.mTimerSeconds = pTimerSeconds; + this.mAutoReset = pAutoReset; + this.mTimerCallback = pTimerCallback; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isAutoReset() { + return this.mAutoReset; + } + + public void setAutoReset(final boolean pAutoReset) { + this.mAutoReset = pAutoReset; + } + + /** + * You probably want to use this in conjunction with {@link TimerHandler#reset()}. + * @param pTimerSeconds + */ + public void setTimerSeconds(final float pTimerSeconds) { + this.mTimerSeconds = pTimerSeconds; + } + + public float getTimerSeconds() { + return this.mTimerSeconds; + } + + public float getTimerSecondsElapsed() { + return this.mTimerSecondsElapsed; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + if(this.mAutoReset) { + this.mTimerSecondsElapsed += pSecondsElapsed; + while(this.mTimerSecondsElapsed >= this.mTimerSeconds) { + this.mTimerSecondsElapsed -= this.mTimerSeconds; + this.mTimerCallback.onTimePassed(this); + } + } else { + if(!this.mCallbackTriggered) { + this.mTimerSecondsElapsed += pSecondsElapsed; + if(this.mTimerSecondsElapsed >= this.mTimerSeconds) { + this.mCallbackTriggered = true; + this.mTimerCallback.onTimePassed(this); + } + } + } + } + + @Override + public void reset() { + this.mCallbackTriggered = false; + this.mTimerSecondsElapsed = 0; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/EngineOptions.java b/AndEngine/src/org/anddev/andengine/engine/options/EngineOptions.java new file mode 100644 index 0000000..74e3900 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/EngineOptions.java @@ -0,0 +1,129 @@ +package org.anddev.andengine.engine.options; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.options.resolutionpolicy.IResolutionPolicy; + +/** + * @author Nicolas Gramlich + * @since 15:59:52 - 09.03.2010 + */ +public class EngineOptions { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final boolean mFullscreen; + private final ScreenOrientation mScreenOrientation; + private final IResolutionPolicy mResolutionPolicy; + private final Camera mCamera; + + private final TouchOptions mTouchOptions = new TouchOptions(); + private final RenderOptions mRenderOptions = new RenderOptions(); + + private boolean mNeedsSound; + private boolean mNeedsMusic; + private WakeLockOptions mWakeLockOptions = WakeLockOptions.SCREEN_BRIGHT; + private int mUpdateThreadPriority = android.os.Process.THREAD_PRIORITY_DEFAULT;; + + // =========================================================== + // Constructors + // =========================================================== + + public EngineOptions(final boolean pFullscreen, final ScreenOrientation pScreenOrientation, final IResolutionPolicy pResolutionPolicy, final Camera pCamera) { + this.mFullscreen = pFullscreen; + this.mScreenOrientation = pScreenOrientation; + this.mResolutionPolicy = pResolutionPolicy; + this.mCamera = pCamera; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public TouchOptions getTouchOptions() { + return this.mTouchOptions; + } + + public RenderOptions getRenderOptions() { + return this.mRenderOptions; + } + + public boolean isFullscreen() { + return this.mFullscreen; + } + + public ScreenOrientation getScreenOrientation() { + return this.mScreenOrientation; + } + + public IResolutionPolicy getResolutionPolicy() { + return this.mResolutionPolicy; + } + + public Camera getCamera() { + return this.mCamera; + } + + public int getUpdateThreadPriority() { + return this.mUpdateThreadPriority; + } + + /** + * @param pUpdateThreadPriority Use constants from: {@link android.os.Process}. + */ + public void setUpdateThreadPriority(final int pUpdateThreadPriority) { + this.mUpdateThreadPriority = pUpdateThreadPriority; + } + + public boolean needsSound() { + return this.mNeedsSound; + } + + public EngineOptions setNeedsSound(final boolean pNeedsSound) { + this.mNeedsSound = pNeedsSound; + return this; + } + + public boolean needsMusic() { + return this.mNeedsMusic; + } + + public EngineOptions setNeedsMusic(final boolean pNeedsMusic) { + this.mNeedsMusic = pNeedsMusic; + return this; + } + + public WakeLockOptions getWakeLockOptions() { + return this.mWakeLockOptions; + } + + public EngineOptions setWakeLockOptions(final WakeLockOptions pWakeLockOptions) { + this.mWakeLockOptions = pWakeLockOptions; + return this; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static enum ScreenOrientation { + // =========================================================== + // Elements + // =========================================================== + + LANDSCAPE, + PORTRAIT; + } +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/engine/options/RenderOptions.java b/AndEngine/src/org/anddev/andengine/engine/options/RenderOptions.java new file mode 100644 index 0000000..0a46833 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/RenderOptions.java @@ -0,0 +1,57 @@ +package org.anddev.andengine.engine.options; + +/** + * @author Nicolas Gramlich + * @since 13:01:40 - 02.07.2010 + */ +public class RenderOptions { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private boolean mDisableExtensionVertexBufferObjects = false; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public RenderOptions enableExtensionVertexBufferObjects() { + return this.setDisableExtensionVertexBufferObjects(false); + } + + public RenderOptions disableExtensionVertexBufferObjects() { + return this.setDisableExtensionVertexBufferObjects(true); + } + + public RenderOptions setDisableExtensionVertexBufferObjects(final boolean pDisableExtensionVertexBufferObjects) { + this.mDisableExtensionVertexBufferObjects = pDisableExtensionVertexBufferObjects; + return this; + } + + /** + * Default: false + */ + public boolean isDisableExtensionVertexBufferObjects() { + return this.mDisableExtensionVertexBufferObjects; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/TouchOptions.java b/AndEngine/src/org/anddev/andengine/engine/options/TouchOptions.java new file mode 100644 index 0000000..76f9be1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/TouchOptions.java @@ -0,0 +1,57 @@ +package org.anddev.andengine.engine.options; + +/** + * @author Nicolas Gramlich + * @since 16:03:09 - 08.09.2010 + */ +public class TouchOptions { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private boolean mRunOnUpdateThread; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public TouchOptions enableRunOnUpdateThread() { + return this.setRunOnUpdateThread(true); + } + + public TouchOptions disableRunOnUpdateThread() { + return this.setRunOnUpdateThread(false); + } + + public TouchOptions setRunOnUpdateThread(final boolean pRunOnUpdateThread) { + this.mRunOnUpdateThread = pRunOnUpdateThread; + return this; + } + + /** + * Default: true + */ + public boolean isRunOnUpdateThread() { + return this.mRunOnUpdateThread; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/WakeLockOptions.java b/AndEngine/src/org/anddev/andengine/engine/options/WakeLockOptions.java new file mode 100644 index 0000000..89f93ed --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/WakeLockOptions.java @@ -0,0 +1,60 @@ +package org.anddev.andengine.engine.options; + +import android.os.PowerManager; + +/** + * @author Nicolas Gramlich + * @since 19:45:23 - 10.07.2010 + */ +public enum WakeLockOptions { + // =========================================================== + // Elements + // =========================================================== + + /** Screen is on at full brightness. Keyboard backlight is on at full brightness. Requires WAKE_LOCK permission! */ + BRIGHT(PowerManager.FULL_WAKE_LOCK), + /** Screen is on at full brightness. Keyboard backlight will be allowed to go off. Requires WAKE_LOCK permission!*/ + SCREEN_BRIGHT(PowerManager.SCREEN_BRIGHT_WAKE_LOCK), + /** Screen is on but may be dimmed. Keyboard backlight will be allowed to go off. Requires WAKE_LOCK permission!*/ + SCREEN_DIM(PowerManager.SCREEN_DIM_WAKE_LOCK), + /** Screen is on at full brightness. Does not require WAKE_LOCK permission! */ + SCREEN_ON(-1); + + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mFlag; + + // =========================================================== + // Constructors + // =========================================================== + + private WakeLockOptions(final int pFlag) { + this.mFlag = pFlag; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getFlag() { + return this.mFlag; + } + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java new file mode 100644 index 0000000..456aafe --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java @@ -0,0 +1,46 @@ +package org.anddev.andengine.engine.options.resolutionpolicy; + +import android.view.View.MeasureSpec; + +/** + * @author Nicolas Gramlich + * @since 22:46:43 - 06.10.2010 + */ +public abstract class BaseResolutionPolicy implements IResolutionPolicy { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected static void throwOnNotMeasureSpecEXACTLY(final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + final int specWidthMode = MeasureSpec.getMode(pWidthMeasureSpec); + final int specHeightMode = MeasureSpec.getMode(pHeightMeasureSpec); + + if (specWidthMode != MeasureSpec.EXACTLY || specHeightMode != MeasureSpec.EXACTLY) { + throw new IllegalStateException("This IResolutionPolicy requires MeasureSpec.EXACTLY ! That means "); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java new file mode 100644 index 0000000..2871c8c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java @@ -0,0 +1,49 @@ +package org.anddev.andengine.engine.options.resolutionpolicy; + +import org.anddev.andengine.opengl.view.RenderSurfaceView; + +import android.view.View.MeasureSpec; + +/** + * @author Nicolas Gramlich + * @since 11:22:48 - 29.03.2010 + */ +public class FillResolutionPolicy extends BaseResolutionPolicy { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + BaseResolutionPolicy.throwOnNotMeasureSpecEXACTLY(pWidthMeasureSpec, pHeightMeasureSpec); + + final int measuredWidth = MeasureSpec.getSize(pWidthMeasureSpec); + final int measuredHeight = MeasureSpec.getSize(pHeightMeasureSpec); + + pRenderSurfaceView.setMeasuredDimensionProxy(measuredWidth, measuredHeight); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java new file mode 100644 index 0000000..5c15df1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java @@ -0,0 +1,50 @@ +package org.anddev.andengine.engine.options.resolutionpolicy; + +import org.anddev.andengine.opengl.view.RenderSurfaceView; + +/** + * @author Nicolas Gramlich + * @since 11:23:00 - 29.03.2010 + */ +public class FixedResolutionPolicy extends BaseResolutionPolicy { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mWidth; + private final int mHeight; + + // =========================================================== + // Constructors + // =========================================================== + + public FixedResolutionPolicy(final int pWidth, final int pHeight) { + this.mWidth = pWidth; + this.mHeight = pHeight; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + pRenderSurfaceView.setMeasuredDimensionProxy(this.mWidth, this.mHeight); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java new file mode 100644 index 0000000..3d4c11b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java @@ -0,0 +1,19 @@ +package org.anddev.andengine.engine.options.resolutionpolicy; + +import org.anddev.andengine.opengl.view.RenderSurfaceView; + +/** + * @author Nicolas Gramlich + * @since 11:02:35 - 29.03.2010 + */ +public interface IResolutionPolicy { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec); +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java new file mode 100644 index 0000000..dcb2536 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java @@ -0,0 +1,72 @@ +package org.anddev.andengine.engine.options.resolutionpolicy; + +import org.anddev.andengine.opengl.view.RenderSurfaceView; + +import android.view.View.MeasureSpec; + +/** + * @author Nicolas Gramlich + * @since 11:23:00 - 29.03.2010 + */ +public class RatioResolutionPolicy extends BaseResolutionPolicy { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mRatio; + + // =========================================================== + // Constructors + // =========================================================== + + public RatioResolutionPolicy(final float pRatio) { + this.mRatio = pRatio; + } + + public RatioResolutionPolicy(final float pWidthRatio, final float pHeightRatio) { + this.mRatio = pWidthRatio / pHeightRatio; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + BaseResolutionPolicy.throwOnNotMeasureSpecEXACTLY(pWidthMeasureSpec, pHeightMeasureSpec); + + final int specWidth = MeasureSpec.getSize(pWidthMeasureSpec); + final int specHeight = MeasureSpec.getSize(pHeightMeasureSpec); + + final float desiredRatio = this.mRatio; + final float realRatio = (float)specWidth / specHeight; + + int measuredWidth; + int measuredHeight; + if(realRatio < desiredRatio) { + measuredWidth = specWidth; + measuredHeight = Math.round(measuredWidth / desiredRatio); + } else { + measuredHeight = specHeight; + measuredWidth = Math.round(measuredHeight * desiredRatio); + } + + pRenderSurfaceView.setMeasuredDimensionProxy(measuredWidth, measuredHeight); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java new file mode 100644 index 0000000..a7e0c2a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java @@ -0,0 +1,60 @@ +package org.anddev.andengine.engine.options.resolutionpolicy; + +import org.anddev.andengine.opengl.view.RenderSurfaceView; + +import android.view.View.MeasureSpec; + +/** + * @author Nicolas Gramlich + * @since 11:23:00 - 29.03.2010 + */ +public class RelativeResolutionPolicy extends BaseResolutionPolicy { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mWidthScale; + private final float mHeightScale; + + // =========================================================== + // Constructors + // =========================================================== + + public RelativeResolutionPolicy(final float pScale) { + this(pScale, pScale); + } + + public RelativeResolutionPolicy(final float pWidthScale, final float pHeightScale) { + this.mWidthScale = pWidthScale; + this.mHeightScale = pHeightScale; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + @Override + public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + BaseResolutionPolicy.throwOnNotMeasureSpecEXACTLY(pWidthMeasureSpec, pHeightMeasureSpec); + + final int measuredWidth = (int)(MeasureSpec.getSize(pWidthMeasureSpec) * this.mWidthScale); + final int measuredHeight = (int)(MeasureSpec.getSize(pHeightMeasureSpec) * this.mHeightScale); + + pRenderSurfaceView.setMeasuredDimensionProxy(measuredWidth, measuredHeight); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/Entity.java b/AndEngine/src/org/anddev/andengine/entity/Entity.java new file mode 100644 index 0000000..b725177 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/Entity.java @@ -0,0 +1,794 @@ +package org.anddev.andengine.entity; + +import java.util.ArrayList; +import java.util.Comparator; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.engine.handler.UpdateHandlerList; +import org.anddev.andengine.entity.layer.ZIndexSorter; +import org.anddev.andengine.entity.modifier.EntityModifierList; +import org.anddev.andengine.entity.modifier.IEntityModifier; +import org.anddev.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher; +import org.anddev.andengine.util.ParameterCallable; +import org.anddev.andengine.util.SmartList; +import org.anddev.andengine.util.Transformation; +import org.anddev.andengine.util.constants.Constants; + + +/** + * @author Nicolas Gramlich + * @since 12:00:48 - 08.03.2010 + */ +public class Entity implements IEntity { + // =========================================================== + // Constants + // =========================================================== + + private static final int CHILDREN_CAPACITY_DEFAULT = 4; + private static final int ENTITYMODIFIERS_CAPACITY_DEFAULT = 4; + private static final int UPDATEHANDLERS_CAPACITY_DEFAULT = 4; + + private static final float[] VERTICES_SCENE_TO_LOCAL_TMP = new float[2]; + private static final float[] VERTICES_LOCAL_TO_SCENE_TMP = new float[2]; + + private static final ParameterCallable PARAMETERCALLABLE_DETACHCHILD = new ParameterCallable() { + @Override + public void call(final IEntity pEntity) { + pEntity.setParent(null); + pEntity.onDetached(); + } + }; + + // =========================================================== + // Fields + // =========================================================== + + protected boolean mVisible = true; + protected boolean mIgnoreUpdate = false; + + protected int mZIndex = 0; + + private IEntity mParent; + + protected SmartList mChildren; + private EntityModifierList mEntityModifiers; + private UpdateHandlerList mUpdateHandlers; + + protected float mRed = 1f; + protected float mGreen = 1f; + protected float mBlue = 1f; + protected float mAlpha = 1f; + + protected float mX; + protected float mY; + + private final float mInitialX; + private final float mInitialY; + + protected float mRotation = 0; + + protected float mRotationCenterX = 0; + protected float mRotationCenterY = 0; + + protected float mScaleX = 1f; + protected float mScaleY = 1f; + + protected float mScaleCenterX = 0; + protected float mScaleCenterY = 0; + + private final Transformation mLocalToSceneTransformation = new Transformation(); + private final Transformation mSceneToLocalTransformation = new Transformation(); + + private Object mUserData; + + // =========================================================== + // Constructors + // =========================================================== + + public Entity() { + this(0, 0); + } + + public Entity(final float pX, final float pY) { + this.mInitialX = pX; + this.mInitialY = pY; + + this.mX = pX; + this.mY = pY; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isVisible() { + return this.mVisible; + } + + @Override + public void setVisible(final boolean pVisible) { + this.mVisible = pVisible; + } + + @Override + public boolean isIgnoreUpdate() { + return this.mIgnoreUpdate; + } + + @Override + public void setIgnoreUpdate(final boolean pIgnoreUpdate) { + this.mIgnoreUpdate = pIgnoreUpdate; + } + + @Override + public IEntity getParent() { + return this.mParent; + } + + @Override + public void setParent(final IEntity pEntity) { + this.mParent = pEntity; + } + + @Override + public int getZIndex() { + return this.mZIndex; + } + + @Override + public void setZIndex(final int pZIndex) { + this.mZIndex = pZIndex; + } + + @Override + public float getX() { + return this.mX; + } + + @Override + public float getY() { + return this.mY; + } + + @Override + public float getInitialX() { + return this.mInitialX; + } + + @Override + public float getInitialY() { + return this.mInitialY; + } + + @Override + public void setPosition(final IEntity pOtherEntity) { + this.setPosition(pOtherEntity.getX(), pOtherEntity.getY()); + } + + @Override + public void setPosition(final float pX, final float pY) { + this.mX = pX; + this.mY = pY; + } + + @Override + public void setInitialPosition() { + this.mX = this.mInitialX; + this.mY = this.mInitialY; + } + + @Override + public float getRotation() { + return this.mRotation; + } + + @Override + public void setRotation(final float pRotation) { + this.mRotation = pRotation; + } + + @Override + public float getRotationCenterX() { + return this.mRotationCenterX; + } + + @Override + public float getRotationCenterY() { + return this.mRotationCenterY; + } + + @Override + public void setRotationCenterX(final float pRotationCenterX) { + this.mRotationCenterX = pRotationCenterX; + } + + @Override + public void setRotationCenterY(final float pRotationCenterY) { + this.mRotationCenterY = pRotationCenterY; + } + + @Override + public void setRotationCenter(final float pRotationCenterX, final float pRotationCenterY) { + this.mRotationCenterX = pRotationCenterX; + this.mRotationCenterY = pRotationCenterY; + } + + @Override + public boolean isScaled() { + return this.mScaleX != 1 || this.mScaleY != 1; + } + + @Override + public float getScaleX() { + return this.mScaleX; + } + + @Override + public float getScaleY() { + return this.mScaleY; + } + + @Override + public void setScaleX(final float pScaleX) { + this.mScaleX = pScaleX; + } + + @Override + public void setScaleY(final float pScaleY) { + this.mScaleY = pScaleY; + } + + @Override + public void setScale(final float pScale) { + this.mScaleX = pScale; + this.mScaleY = pScale; + } + + @Override + public void setScale(final float pScaleX, final float pScaleY) { + this.mScaleX = pScaleX; + this.mScaleY = pScaleY; + } + + @Override + public float getScaleCenterX() { + return this.mScaleCenterX; + } + + @Override + public float getScaleCenterY() { + return this.mScaleCenterY; + } + + @Override + public void setScaleCenterX(final float pScaleCenterX) { + this.mScaleCenterX = pScaleCenterX; + } + + @Override + public void setScaleCenterY(final float pScaleCenterY) { + this.mScaleCenterY = pScaleCenterY; + } + + @Override + public void setScaleCenter(final float pScaleCenterX, final float pScaleCenterY) { + this.mScaleCenterX = pScaleCenterX; + this.mScaleCenterY = pScaleCenterY; + } + + @Override + public float getRed() { + return this.mRed; + } + + @Override + public float getGreen() { + return this.mGreen; + } + + @Override + public float getBlue() { + return this.mBlue; + } + + @Override + public float getAlpha() { + return this.mAlpha; + } + + /** + * @param pAlpha from 0.0f (transparent) to 1.0f (opaque) + */ + @Override + public void setAlpha(final float pAlpha) { + this.mAlpha = pAlpha; + } + + /** + * @param pRed from 0.0f to 1.0f + * @param pGreen from 0.0f to 1.0f + * @param pBlue from 0.0f to 1.0f + */ + @Override + public void setColor(final float pRed, final float pGreen, final float pBlue) { + this.mRed = pRed; + this.mGreen = pGreen; + this.mBlue = pBlue; + } + + /** + * @param pRed from 0.0f to 1.0f + * @param pGreen from 0.0f to 1.0f + * @param pBlue from 0.0f to 1.0f + * @param pAlpha from 0.0f (transparent) to 1.0f (opaque) + */ + @Override + public void setColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + this.mRed = pRed; + this.mGreen = pGreen; + this.mBlue = pBlue; + this.mAlpha = pAlpha; + } + + @Override + public int getChildCount() { + if(this.mChildren == null) { + return 0; + } + return this.mChildren.size(); + } + + @Override + public IEntity getChild(final int pIndex) { + if(this.mChildren == null) { + return null; + } + return this.mChildren.get(pIndex); + } + + @Override + public IEntity getFirstChild() { + if(this.mChildren == null) { + return null; + } + return this.mChildren.get(0); + } + + @Override + public IEntity getLastChild() { + if(this.mChildren == null) { + return null; + } + return this.mChildren.get(this.mChildren.size() - 1); + } + + @Override + public boolean detachSelf() { + final IEntity parent = this.mParent; + if(parent != null) { + return parent.detachChild(this); + } else { + return false; + } + } + + @Override + public void detachChildren() { + if(this.mChildren == null) { + return; + } + this.mChildren.clear(PARAMETERCALLABLE_DETACHCHILD); + } + + @Override + public void attachChild(final IEntity pEntity) { + if(this.mChildren == null) { + this.allocateChildren(); + } + + this.mChildren.add(pEntity); + pEntity.setParent(this); + pEntity.onAttached(); + } + + @Override + public IEntity findChild(final IEntityMatcher pEntityMatcher) { + if(this.mChildren == null) { + return null; + } + return this.mChildren.find(pEntityMatcher); + } + + @Override + public void sortChildren() { + if(this.mChildren == null) { + return; + } + ZIndexSorter.getInstance().sort(this.mChildren); + } + + @Override + public void sortChildren(final Comparator pEntityComparator) { + if(this.mChildren == null) { + return; + } + ZIndexSorter.getInstance().sort(this.mChildren, pEntityComparator); + } + + @Override + public boolean detachChild(final IEntity pEntity) { + if(this.mChildren == null) { + return false; + } + return this.mChildren.remove(pEntity, PARAMETERCALLABLE_DETACHCHILD); + } + + @Override + public IEntity detachChild(final IEntityMatcher pEntityMatcher) { + if(this.mChildren == null) { + return null; + } + return this.mChildren.remove(pEntityMatcher); + } + + @Override + public boolean detachChildren(final IEntityMatcher pEntityMatcher) { + if(this.mChildren == null) { + return false; + } + return this.mChildren.removeAll(pEntityMatcher, Entity.PARAMETERCALLABLE_DETACHCHILD); + } + + @Override + public void registerUpdateHandler(final IUpdateHandler pUpdateHandler) { + if(this.mUpdateHandlers == null) { + this.allocateUpdateHandlers(); + } + this.mUpdateHandlers.add(pUpdateHandler); + } + + @Override + public boolean unregisterUpdateHandler(final IUpdateHandler pUpdateHandler) { + if(this.mUpdateHandlers == null) { + return false; + } + return this.mUpdateHandlers.remove(pUpdateHandler); + } + + @Override + public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandlerMatcher) { + if(this.mUpdateHandlers == null) { + return false; + } + return this.mUpdateHandlers.removeAll(pUpdateHandlerMatcher); + } + + @Override + public void clearUpdateHandlers() { + if(this.mUpdateHandlers == null) { + return; + } + this.mUpdateHandlers.clear(); + } + + @Override + public void registerEntityModifier(final IEntityModifier pEntityModifier) { + if(this.mEntityModifiers == null) { + this.allocateEntityModifiers(); + } + this.mEntityModifiers.add(pEntityModifier); + } + + @Override + public boolean unregisterEntityModifier(final IEntityModifier pEntityModifier) { + if(this.mEntityModifiers == null) { + return false; + } + return this.mEntityModifiers.remove(pEntityModifier); + } + + @Override + public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityModifierMatcher) { + if(this.mEntityModifiers == null) { + return false; + } + return this.mEntityModifiers.removeAll(pEntityModifierMatcher); + } + + @Override + public void clearEntityModifiers() { + if(this.mEntityModifiers == null) { + return; + } + this.mEntityModifiers.clear(); + } + + @Override + public float[] getSceneCenterCoordinates() { + return this.convertLocalToSceneCoordinates(0, 0); + } + + @Override + public float[] convertLocalToSceneCoordinates(final float pX, final float pY) { + Entity.VERTICES_LOCAL_TO_SCENE_TMP[Constants.VERTEX_INDEX_X] = pX; + Entity.VERTICES_LOCAL_TO_SCENE_TMP[Constants.VERTEX_INDEX_Y] = pY; + + this.getLocalToSceneTransformation().transform(Entity.VERTICES_LOCAL_TO_SCENE_TMP); + + return Entity.VERTICES_LOCAL_TO_SCENE_TMP; + } + + @Override + public float[] convertSceneToLocalCoordinates(final float pX, final float pY) { + Entity.VERTICES_SCENE_TO_LOCAL_TMP[Constants.VERTEX_INDEX_X] = pX; + Entity.VERTICES_SCENE_TO_LOCAL_TMP[Constants.VERTEX_INDEX_Y] = pY; + + this.getSceneToLocalTransformation().transform(Entity.VERTICES_SCENE_TO_LOCAL_TMP); + + return Entity.VERTICES_SCENE_TO_LOCAL_TMP; + } + + @Override + public Transformation getLocalToSceneTransformation() { + // TODO skip this calculation when the transformation is not "dirty" + final Transformation localToSceneTransformation = this.mLocalToSceneTransformation; + localToSceneTransformation.setToIdentity(); + + /* Scale. */ + final float scaleX = this.mScaleX; + final float scaleY = this.mScaleY; + if(scaleX != 1 || scaleY != 1) { + final float scaleCenterX = this.mScaleCenterX; + final float scaleCenterY = this.mScaleCenterY; + + /* TODO Check if it is worth to check for scaleCenterX == 0 && scaleCenterY == 0 as the two postTranslate can be saved. + * The same obviously applies for all similar occurrences of this pattern in this class. */ + + localToSceneTransformation.postTranslate(-scaleCenterX, -scaleCenterY); + localToSceneTransformation.postScale(scaleX, scaleY); + localToSceneTransformation.postTranslate(scaleCenterX, scaleCenterY); + } + + /* TODO There is a special, but very likely case when mRotationCenter and mScaleCenter are the same. + * In that case the last postTranslate of the scale and the first postTranslate of the rotation is superfluous. */ + + /* Rotation. */ + final float rotation = this.mRotation; + if(rotation != 0) { + final float rotationCenterX = this.mRotationCenterX; + final float rotationCenterY = this.mRotationCenterY; + + localToSceneTransformation.postTranslate(-rotationCenterX, -rotationCenterY); + localToSceneTransformation.postRotate(rotation); + localToSceneTransformation.postTranslate(rotationCenterX, rotationCenterY); + } + + /* Translation. */ + localToSceneTransformation.postTranslate(this.mX, this.mY); + + final IEntity parent = this.mParent; + if(parent != null) { + localToSceneTransformation.postConcat(parent.getLocalToSceneTransformation()); + } + + return localToSceneTransformation; + } + + @Override + public Transformation getSceneToLocalTransformation() { + // TODO skip this calculation when the transformation is not "dirty" + final Transformation sceneToLocalTransformation = this.mSceneToLocalTransformation; + sceneToLocalTransformation.setToIdentity(); + + final IEntity parent = this.mParent; + if(parent != null) { + sceneToLocalTransformation.postConcat(parent.getSceneToLocalTransformation()); + } + + /* Translation. */ + sceneToLocalTransformation.postTranslate(-this.mX, -this.mY); + + /* Rotation. */ + final float rotation = this.mRotation; + if(rotation != 0) { + final float rotationCenterX = this.mRotationCenterX; + final float rotationCenterY = this.mRotationCenterY; + + sceneToLocalTransformation.postTranslate(-rotationCenterX, -rotationCenterY); + sceneToLocalTransformation.postRotate(-rotation); + sceneToLocalTransformation.postTranslate(rotationCenterX, rotationCenterY); + } + + /* TODO There is a special, but very likely case when mRotationCenter and mScaleCenter are the same. + * In that case the last postTranslate of the rotation and the first postTranslate of the scale is superfluous. */ + + /* Scale. */ + final float scaleX = this.mScaleX; + final float scaleY = this.mScaleY; + if(scaleX != 1 || scaleY != 1) { + final float scaleCenterX = this.mScaleCenterX; + final float scaleCenterY = this.mScaleCenterY; + + sceneToLocalTransformation.postTranslate(-scaleCenterX, -scaleCenterY); + sceneToLocalTransformation.postScale(1 / scaleX, 1 / scaleY); + sceneToLocalTransformation.postTranslate(scaleCenterX, scaleCenterY); + } + + return sceneToLocalTransformation; + } + + @Override + public void onAttached() { + + } + + @Override + public void onDetached() { + + } + + @Override + public Object getUserData() { + return this.mUserData; + } + + @Override + public void setUserData(final Object pUserData) { + this.mUserData = pUserData; + } + + @Override + public final void onDraw(final GL10 pGL, final Camera pCamera) { + if(this.mVisible) { + this.onManagedDraw(pGL, pCamera); + } + } + + @Override + public final void onUpdate(final float pSecondsElapsed) { + if(!this.mIgnoreUpdate) { + this.onManagedUpdate(pSecondsElapsed); + } + } + + @Override + public void reset() { + this.mVisible = true; + this.mIgnoreUpdate = false; + + this.mX = this.mInitialX; + this.mY = this.mInitialY; + this.mRotation = 0; + this.mScaleX = 1; + this.mScaleY = 1; + + this.mRed = 1.0f; + this.mGreen = 1.0f; + this.mBlue = 1.0f; + this.mAlpha = 1.0f; + + if(this.mEntityModifiers != null) { + this.mEntityModifiers.reset(); + } + + if(this.mChildren != null) { + final ArrayList entities = this.mChildren; + for(int i = entities.size() - 1; i >= 0; i--) { + entities.get(i).reset(); + } + } + } + + // =========================================================== + // Methods + // =========================================================== + + protected void doDraw(final GL10 pGL, final Camera pCamera) { + + } + + private void allocateEntityModifiers() { + this.mEntityModifiers = new EntityModifierList(this, Entity.ENTITYMODIFIERS_CAPACITY_DEFAULT); + } + + private void allocateChildren() { + this.mChildren = new SmartList(Entity.CHILDREN_CAPACITY_DEFAULT); + } + + private void allocateUpdateHandlers() { + this.mUpdateHandlers = new UpdateHandlerList(Entity.UPDATEHANDLERS_CAPACITY_DEFAULT); + } + + protected void onApplyTransformations(final GL10 pGL) { + /* Translation. */ + this.applyTranslation(pGL); + + /* Rotation. */ + this.applyRotation(pGL); + + /* Scale. */ + this.applyScale(pGL); + } + + protected void applyTranslation(final GL10 pGL) { + pGL.glTranslatef(this.mX, this.mY, 0); + } + + protected void applyRotation(final GL10 pGL) { + final float rotation = this.mRotation; + + if(rotation != 0) { + final float rotationCenterX = this.mRotationCenterX; + final float rotationCenterY = this.mRotationCenterY; + + pGL.glTranslatef(rotationCenterX, rotationCenterY, 0); + pGL.glRotatef(rotation, 0, 0, 1); + pGL.glTranslatef(-rotationCenterX, -rotationCenterY, 0); + + /* TODO There is a special, but very likely case when mRotationCenter and mScaleCenter are the same. + * In that case the last glTranslatef of the rotation and the first glTranslatef of the scale is superfluous. + * The problem is that applyRotation and applyScale would need to be "merged" in order to efficiently check for that condition. */ + } + } + + protected void applyScale(final GL10 pGL) { + final float scaleX = this.mScaleX; + final float scaleY = this.mScaleY; + + if(scaleX != 1 || scaleY != 1) { + final float scaleCenterX = this.mScaleCenterX; + final float scaleCenterY = this.mScaleCenterY; + + pGL.glTranslatef(scaleCenterX, scaleCenterY, 0); + pGL.glScalef(scaleX, scaleY, 1); + pGL.glTranslatef(-scaleCenterX, -scaleCenterY, 0); + } + } + + protected void onManagedDraw(final GL10 pGL, final Camera pCamera) { + pGL.glPushMatrix(); + { + this.onApplyTransformations(pGL); + + this.doDraw(pGL, pCamera); + + if(this.mChildren != null) { + final ArrayList entities = this.mChildren; + final int entityCount = entities.size(); + for(int i = 0; i < entityCount; i++) { + entities.get(i).onDraw(pGL, pCamera); + } + } + } + pGL.glPopMatrix(); + } + + protected void onManagedUpdate(final float pSecondsElapsed) { + if(this.mEntityModifiers != null) { + this.mEntityModifiers.onUpdate(pSecondsElapsed); + } + if(this.mUpdateHandlers != null) { + this.mUpdateHandlers.onUpdate(pSecondsElapsed); + } + + if(this.mChildren != null) { + final ArrayList entities = this.mChildren; + final int entityCount = entities.size(); + for(int i = 0; i < entityCount; i++) { + entities.get(i).onUpdate(pSecondsElapsed); + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/IEntity.java b/AndEngine/src/org/anddev/andengine/entity/IEntity.java new file mode 100644 index 0000000..9b3fa5d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/IEntity.java @@ -0,0 +1,171 @@ +package org.anddev.andengine.entity; + +import java.util.Comparator; + +import org.anddev.andengine.engine.Engine; +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.engine.handler.runnable.RunnableHandler; +import org.anddev.andengine.entity.modifier.IEntityModifier; +import org.anddev.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.opengl.IDrawable; +import org.anddev.andengine.util.IMatcher; +import org.anddev.andengine.util.Transformation; + + + +/** + * @author Nicolas Gramlich + * @since 11:20:25 - 08.03.2010 + */ +public interface IEntity extends IDrawable, IUpdateHandler { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean isVisible(); + public void setVisible(boolean pVisible); + + public boolean isIgnoreUpdate(); + public void setIgnoreUpdate(boolean pIgnoreUpdate); + + public int getZIndex(); + public void setZIndex(final int pZIndex); + + public IEntity getParent(); + public void setParent(final IEntity pEntity); + + public float getX(); + public float getY(); + + public float getInitialX(); + public float getInitialY(); + + public void setInitialPosition(); + public void setPosition(final IEntity pOtherEntity); + public void setPosition(final float pX, final float pY); + + public float getRotation(); + public void setRotation(final float pRotation); + + public float getRotationCenterX(); + public float getRotationCenterY(); + public void setRotationCenterX(final float pRotationCenterX); + public void setRotationCenterY(final float pRotationCenterY); + public void setRotationCenter(final float pRotationCenterX, final float pRotationCenterY); + + public boolean isScaled(); + public float getScaleX(); + public float getScaleY(); + public void setScaleX(final float pScaleX); + public void setScaleY(final float pScaleY); + public void setScale(final float pScale); + public void setScale(final float pScaleX, final float pScaleY); + + public float getScaleCenterX(); + public float getScaleCenterY(); + public void setScaleCenterX(final float pScaleCenterX); + public void setScaleCenterY(final float pScaleCenterY); + public void setScaleCenter(final float pScaleCenterX, final float pScaleCenterY); + + public float getRed(); + public float getGreen(); + public float getBlue(); + public float getAlpha(); + public void setAlpha(final float pAlpha); + + public void setColor(final float pRed, final float pGreen, final float pBlue); + public void setColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha); + + public float[] getSceneCenterCoordinates(); + + public float[] convertLocalToSceneCoordinates(final float pX, final float pY); + public float[] convertSceneToLocalCoordinates(final float pX, final float pY); + + public Transformation getLocalToSceneTransformation(); + public Transformation getSceneToLocalTransformation(); + + public int getChildCount(); + + public void onAttached(); + public void onDetached(); + + public void attachChild(final IEntity pEntity); + + public IEntity getChild(final int pIndex); + public IEntity getFirstChild(); + public IEntity getLastChild(); + + public IEntity findChild(final IEntityMatcher pEntityMatcher); + + /** + * Sorts the {@link IEntity}s based on their ZIndex. Sort is stable. + */ + public void sortChildren(); + + /** + * Sorts the {@link IEntity}s based on the {@link Comparator} supplied. Sort is stable. + * @param pEntityComparator + */ + public void sortChildren(final Comparator pEntityComparator); + + public boolean detachSelf(); + + /** + * WARNING: This function should be called from within + * {@link RunnableHandler#postRunnable(Runnable)} which is registered + * to a {@link Scene} or the {@link Engine} itself, because otherwise + * it may throw an {@link ArrayIndexOutOfBoundsException} in the + * Update-Thread or the GL-Thread! + */ + public boolean detachChild(final IEntity pEntity); + /** + * WARNING: This function should be called from within + * {@link RunnableHandler#postRunnable(Runnable)} which is registered + * to a {@link Scene} or the {@link Engine} itself, because otherwise + * it may throw an {@link ArrayIndexOutOfBoundsException} in the + * Update-Thread or the GL-Thread! + */ + public IEntity detachChild(final IEntityMatcher pEntityMatcher); + /** + * WARNING: This function should be called from within + * {@link RunnableHandler#postRunnable(Runnable)} which is registered + * to a {@link Scene} or the {@link Engine} itself, because otherwise + * it may throw an {@link ArrayIndexOutOfBoundsException} in the + * Update-Thread or the GL-Thread! + */ + public boolean detachChildren(final IEntityMatcher pEntityMatcher); + + public void detachChildren(); + + public void registerUpdateHandler(final IUpdateHandler pUpdateHandler); + public boolean unregisterUpdateHandler(final IUpdateHandler pUpdateHandler); + public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandlerMatcher); + public void clearUpdateHandlers(); + + public void registerEntityModifier(final IEntityModifier pEntityModifier); + public boolean unregisterEntityModifier(final IEntityModifier pEntityModifier); + public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityModifierMatcher); + public void clearEntityModifiers(); + + public void setUserData(Object pUserData); + public Object getUserData(); + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface IEntityMatcher extends IMatcher { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/Layer.java b/AndEngine/src/org/anddev/andengine/entity/layer/Layer.java new file mode 100644 index 0000000..4780685 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/Layer.java @@ -0,0 +1,45 @@ +package org.anddev.andengine.entity.layer; + +import org.anddev.andengine.entity.Entity; + +/** + * @author Nicolas Gramlich + * @since 11:48:23 - 20.12.2010 + */ +public class Layer extends Entity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public Layer() { + super(0, 0); + } + + public Layer(final float pX, final float pY) { + super(pX, pY); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/ZIndexSorter.java b/AndEngine/src/org/anddev/andengine/entity/layer/ZIndexSorter.java new file mode 100644 index 0000000..e41e972 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/ZIndexSorter.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.layer; + +import java.util.Comparator; +import java.util.List; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.sort.InsertionSorter; + +public class ZIndexSorter extends InsertionSorter { + // =========================================================== + // Constants + // =========================================================== + + private static ZIndexSorter INSTANCE; + + // =========================================================== + // Fields + // =========================================================== + + private final Comparator mZIndexComparator = new Comparator() { + @Override + public int compare(final IEntity pEntityA, final IEntity pEntityB) { + return pEntityA.getZIndex() - pEntityB.getZIndex(); + } + }; + + // =========================================================== + // Constructors + // =========================================================== + + private ZIndexSorter() { + + } + + public static ZIndexSorter getInstance() { + if(INSTANCE == null) { + INSTANCE = new ZIndexSorter(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void sort(final IEntity[] pEntities) { + this.sort(pEntities, this.mZIndexComparator); + } + + public void sort(final IEntity[] pEntities, final int pStart, final int pEnd) { + this.sort(pEntities, pStart, pEnd, this.mZIndexComparator); + } + + public void sort(final List pEntities) { + this.sort(pEntities, this.mZIndexComparator); + } + + public void sort(final List pEntities, final int pStart, final int pEnd) { + this.sort(pEntities, pStart, pEnd, this.mZIndexComparator); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayer.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayer.java new file mode 100644 index 0000000..332e0d3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayer.java @@ -0,0 +1,321 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.GZIPInputStream; + +import javax.microedition.khronos.opengles.GL10; +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.collision.RectangularShapeCollisionChecker; +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.layer.tiled.tmx.TMXLoader.ITMXTilePropertiesListener; +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; +import org.anddev.andengine.entity.shape.RectangularShape; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; +import org.anddev.andengine.util.Base64; +import org.anddev.andengine.util.Base64InputStream; +import org.anddev.andengine.util.MathUtils; +import org.anddev.andengine.util.SAXUtils; +import org.anddev.andengine.util.StreamUtils; +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 20:27:31 - 20.07.2010 + */ +public class TMXLayer extends RectangularShape implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final TMXTiledMap mTMXTiledMap; + + private final String mName; + private final int mTileColumns; + private final int mTileRows; + private final TMXTile[][] mTMXTiles; + + private int mTilesAdded; + private final int mGlobalTileIDsExpected; + + private final float[] mCullingVertices = new float[2 * RectangleVertexBuffer.VERTICES_PER_RECTANGLE]; + + private final TMXProperties mTMXLayerProperties = new TMXProperties(); + + // =========================================================== + // Constructors + // =========================================================== + + public TMXLayer(final TMXTiledMap pTMXTiledMap, final Attributes pAttributes) { + super(0, 0, 0, 0, null); + + this.mTMXTiledMap = pTMXTiledMap; + this.mName = pAttributes.getValue("", TAG_LAYER_ATTRIBUTE_NAME); + this.mTileColumns = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_LAYER_ATTRIBUTE_WIDTH); + this.mTileRows = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_LAYER_ATTRIBUTE_HEIGHT); + this.mTMXTiles = new TMXTile[this.mTileRows][this.mTileColumns]; + + super.mWidth = pTMXTiledMap.getTileWidth() * this.mTileColumns; + final float width = super.mWidth; + super.mBaseWidth = width; + + super.mHeight = pTMXTiledMap.getTileHeight() * this.mTileRows; + final float height = super.mHeight; + super.mBaseHeight = height; + + this.mRotationCenterX = width * 0.5f; + this.mRotationCenterY = height * 0.5f; + + this.mScaleCenterX = this.mRotationCenterX; + this.mScaleCenterY = this.mRotationCenterY; + + this.mGlobalTileIDsExpected = this.mTileColumns * this.mTileRows; + + this.setVisible(SAXUtils.getIntAttribute(pAttributes, TAG_LAYER_ATTRIBUTE_VISIBLE, TAG_LAYER_ATTRIBUTE_VISIBLE_VALUE_DEFAULT) == 1); + this.setAlpha(SAXUtils.getFloatAttribute(pAttributes, TAG_LAYER_ATTRIBUTE_OPACITY, TAG_LAYER_ATTRIBUTE_OPACITY_VALUE_DEFAULT)); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public String getName() { + return this.mName; + } + + public int getTileColumns() { + return this.mTileColumns; + } + + public int getTileRows() { + return this.mTileRows; + } + + public TMXTile[][] getTMXTiles() { + return this.mTMXTiles; + } + + public TMXTile getTMXTile(final int pTileColumn, final int pTileRow) throws ArrayIndexOutOfBoundsException { + return this.mTMXTiles[pTileRow][pTileColumn]; + } + + /** + * @param pX in SceneCoordinates. + * @param pY in SceneCoordinates. + * @return the {@link TMXTile} located at pX/pY. + */ + public TMXTile getTMXTileAt(final float pX, final float pY) { + final float[] localCoords = this.convertSceneToLocalCoordinates(pX, pY); + final TMXTiledMap tmxTiledMap = this.mTMXTiledMap; + + final int tileColumn = (int)(localCoords[VERTEX_INDEX_X] / tmxTiledMap.getTileWidth()); + if(tileColumn < 0 || tileColumn > this.mTileColumns - 1) { + return null; + } + final int tileRow = (int)(localCoords[VERTEX_INDEX_Y] / tmxTiledMap.getTileWidth()); + if(tileRow < 0 || tileRow > this.mTileRows - 1) { + return null; + } + + return this.mTMXTiles[tileRow][tileColumn]; + } + + public void addTMXLayerProperty(final TMXLayerProperty pTMXLayerProperty) { + this.mTMXLayerProperties.add(pTMXLayerProperty); + } + + public TMXProperties getTMXLayerProperties() { + return this.mTMXLayerProperties; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + @Deprecated + public void setRotation(final float pRotation) { + + } + + @Override + protected void onUpdateVertexBuffer() { + /* Nothing. */ + } + + @Override + protected void onInitDraw(final GL10 pGL) { + super.onInitDraw(pGL); + + GLHelper.enableTextures(pGL); + GLHelper.enableTexCoordArray(pGL); + } + + @Override + protected void onApplyVertices(final GL10 pGL) { + if(GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS) { + final GL11 gl11 = (GL11)pGL; + + this.mTMXTiledMap.getSharedVertexBuffer().selectOnHardware(gl11); + GLHelper.vertexZeroPointer(gl11); + } else { + GLHelper.vertexPointer(pGL, this.mTMXTiledMap.getSharedVertexBuffer().getFloatBuffer()); + } + } + + @Override + protected void drawVertices(final GL10 pGL, final Camera pCamera) { + final TMXTile[][] tmxTiles = this.mTMXTiles; + + final int tileColumns = this.mTileColumns; + final int tileRows = this.mTileRows; + final int tileWidth = this.mTMXTiledMap.getTileWidth(); + final int tileHeight = this.mTMXTiledMap.getTileHeight(); + + final float scaledTileWidth = tileWidth * this.mScaleX; + final float scaledTileHeight = tileHeight * this.mScaleY; + + final float[] cullingVertices = this.mCullingVertices; + RectangularShapeCollisionChecker.fillVertices(this, cullingVertices); + + final float layerMinX = cullingVertices[VERTEX_INDEX_X]; + final float layerMinY = cullingVertices[VERTEX_INDEX_Y]; + + final float cameraMinX = pCamera.getMinX(); + final float cameraMinY = pCamera.getMinY(); + final float cameraWidth = pCamera.getWidth(); + final float cameraHeight = pCamera.getHeight(); + + /* Determine the area that is visible in the camera. */ + final float firstColumnRaw = (cameraMinX - layerMinX) / scaledTileWidth; + final int firstColumn = MathUtils.bringToBounds(0, tileColumns - 1, (int)Math.floor(firstColumnRaw)); + final int lastColumn = MathUtils.bringToBounds(0, tileColumns - 1, (int)Math.ceil(firstColumnRaw + cameraWidth / scaledTileWidth)); + + final float firstRowRaw = (cameraMinY - layerMinY) / scaledTileHeight; + final int firstRow = MathUtils.bringToBounds(0, tileRows - 1, (int)Math.floor(firstRowRaw)); + final int lastRow = MathUtils.bringToBounds(0, tileRows - 1, (int)Math.floor(firstRowRaw + cameraHeight / scaledTileHeight)); + + final int visibleTilesTotalWidth = (lastColumn - firstColumn + 1) * tileWidth; + + pGL.glTranslatef(firstColumn * tileWidth, firstRow * tileHeight, 0); + + for(int row = firstRow; row <= lastRow; row++) { + final TMXTile[] tmxTileRow = tmxTiles[row]; + + for(int column = firstColumn; column <= lastColumn; column++) { + final TextureRegion textureRegion = tmxTileRow[column].mTextureRegion; + if(textureRegion != null) { + textureRegion.onApply(pGL); + + pGL.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); + } + pGL.glTranslatef(tileWidth, 0, 0); + } + /* Translate one row downwards and the back left to the first column. + * Just like the 'Carriage Return' + 'New Line' (\r\n) on a typewriter. */ + pGL.glTranslatef(-visibleTilesTotalWidth, tileHeight, 0); + } + pGL.glLoadIdentity(); + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed) { + /* Nothing. */ + } + + // =========================================================== + // Methods + // =========================================================== + + void initializeTMXTileFromXML(final Attributes pAttributes, final ITMXTilePropertiesListener pTMXTilePropertyListener) { + this.addTileByGlobalTileID(SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_TILE_ATTRIBUTE_GID), pTMXTilePropertyListener); + } + + void initializeTMXTilesFromDataString(final String pDataString, final String pDataEncoding, final String pDataCompression, final ITMXTilePropertiesListener pTMXTilePropertyListener) throws IOException, IllegalArgumentException { + DataInputStream dataIn = null; + try{ + InputStream in = new ByteArrayInputStream(pDataString.getBytes("UTF-8")); + + /* Wrap decoding Streams if neccessary. */ + if(pDataEncoding != null && pDataEncoding.equals(TAG_DATA_ATTRIBUTE_ENCODING_VALUE_BASE64)) { + in = new Base64InputStream(in, Base64.DEFAULT); + } + if(pDataCompression != null){ + if(pDataCompression.equals(TAG_DATA_ATTRIBUTE_COMPRESSION_VALUE_GZIP)) { + in = new GZIPInputStream(in); + } else { + throw new IllegalArgumentException("Supplied compression '" + pDataCompression + "' is not supported yet."); + } + } + dataIn = new DataInputStream(in); + + while(this.mTilesAdded < this.mGlobalTileIDsExpected) { + final int globalTileID = this.readGlobalTileID(dataIn); + this.addTileByGlobalTileID(globalTileID, pTMXTilePropertyListener); + } + } finally { + StreamUtils.close(dataIn); + } + } + + private void addTileByGlobalTileID(final int pGlobalTileID, final ITMXTilePropertiesListener pTMXTilePropertyListener) { + final TMXTiledMap tmxTiledMap = this.mTMXTiledMap; + + final int tilesHorizontal = this.mTileColumns; + + final int column = this.mTilesAdded % tilesHorizontal; + final int row = this.mTilesAdded / tilesHorizontal; + + final TMXTile[][] tmxTiles = this.mTMXTiles; + + final TextureRegion tmxTileTextureRegion; + if(pGlobalTileID == 0) { + tmxTileTextureRegion = null; + } else { + tmxTileTextureRegion = tmxTiledMap.getTextureRegionFromGlobalTileID(pGlobalTileID); + } + final TMXTile tmxTile = new TMXTile(pGlobalTileID, column, row, this.mTMXTiledMap.getTileWidth(), this.mTMXTiledMap.getTileHeight(), tmxTileTextureRegion); + tmxTiles[row][column] = tmxTile; + + if(pGlobalTileID != 0) { + /* Notify the ITMXTilePropertiesListener if it exists. */ + if(pTMXTilePropertyListener != null) { + final TMXProperties tmxTileProperties = tmxTiledMap.getTMXTileProperties(pGlobalTileID); + if(tmxTileProperties != null) { + pTMXTilePropertyListener.onTMXTileWithPropertiesCreated(tmxTiledMap, this, tmxTile, tmxTileProperties); + } + } + } + + this.mTilesAdded++; + } + + private int readGlobalTileID(final DataInputStream pDataIn) throws IOException { + final int lowestByte = pDataIn.read(); + final int secondLowestByte = pDataIn.read(); + final int secondHighestByte = pDataIn.read(); + final int highestByte = pDataIn.read(); + + if(lowestByte < 0 || secondLowestByte < 0 || secondHighestByte < 0 || highestByte < 0) { + throw new IllegalArgumentException("Couldn't read global Tile ID."); + } + + return lowestByte | secondLowestByte << 8 |secondHighestByte << 16 | highestByte << 24; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayerProperty.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayerProperty.java new file mode 100644 index 0000000..0c47b5b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLayerProperty.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 18:48:46 - 12.10.2010 + */ +public class TMXLayerProperty extends TMXProperty { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TMXLayerProperty(final Attributes pAttributes) { + super(pAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLoader.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLoader.java new file mode 100644 index 0000000..0b272f8 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXLoader.java @@ -0,0 +1,118 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TMXLoadException; +import org.anddev.andengine.opengl.texture.TextureManager; +import org.anddev.andengine.opengl.texture.TextureOptions; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import android.content.Context; + +/** + * @author Nicolas Gramlich + * @since 19:10:45 - 20.07.2010 + */ +public class TMXLoader { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Context mContext; + private final TextureManager mTextureManager; + private final TextureOptions mTextureOptions; + private final ITMXTilePropertiesListener mTMXTilePropertyListener; + + // =========================================================== + // Constructors + // =========================================================== + + public TMXLoader(final Context pContext, final TextureManager pTextureManager) { + this(pContext, pTextureManager, TextureOptions.DEFAULT); + } + + public TMXLoader(final Context pContext, final TextureManager pTextureManager, final TextureOptions pTextureOptions) { + this(pContext, pTextureManager, pTextureOptions, null); + } + + public TMXLoader(final Context pContext, final TextureManager pTextureManager, final ITMXTilePropertiesListener pTMXTilePropertyListener) { + this(pContext, pTextureManager, TextureOptions.DEFAULT, pTMXTilePropertyListener); + } + + public TMXLoader(final Context pContext, final TextureManager pTextureManager, final TextureOptions pTextureOptions, final ITMXTilePropertiesListener pTMXTilePropertyListener) { + this.mContext = pContext; + this.mTextureManager = pTextureManager; + this.mTextureOptions = pTextureOptions; + this.mTMXTilePropertyListener = pTMXTilePropertyListener; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public TMXTiledMap loadFromAsset(final Context pContext, final String pAssetPath) throws TMXLoadException { + try { + return this.load(pContext.getAssets().open(pAssetPath)); + } catch (final IOException e) { + throw new TMXLoadException("Could not load TMXTiledMap from asset: " + pAssetPath, e); + } + } + + public TMXTiledMap load(final InputStream pInputStream) throws TMXLoadException { + try{ + final SAXParserFactory spf = SAXParserFactory.newInstance(); + final SAXParser sp = spf.newSAXParser(); + + final XMLReader xr = sp.getXMLReader(); + final TMXParser tmxParser = new TMXParser(this.mContext, this.mTextureManager, this.mTextureOptions, this.mTMXTilePropertyListener); + xr.setContentHandler(tmxParser); + + xr.parse(new InputSource(new BufferedInputStream(pInputStream))); + + return tmxParser.getTMXTiledMap(); + } catch (final SAXException e) { + throw new TMXLoadException(e); + } catch (final ParserConfigurationException pe) { + /* Doesn't happen. */ + return null; + } catch (final IOException e) { + throw new TMXLoadException(e); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface ITMXTilePropertiesListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onTMXTileWithPropertiesCreated(final TMXTiledMap pTMXTiledMap, final TMXLayer pTMXLayer, final TMXTile pTMXTile, final TMXProperties pTMXTileProperties); + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObject.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObject.java new file mode 100644 index 0000000..023b45f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObject.java @@ -0,0 +1,88 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; +import org.anddev.andengine.util.SAXUtils; +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 11:21:01 - 29.07.2010 + */ +public class TMXObject implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final String mName; + private final String mType; + private final int mX; + private final int mY; + private final int mWidth; + private final int mHeight; + private final TMXProperties mTMXObjectProperties = new TMXProperties(); + + // =========================================================== + // Constructors + // =========================================================== + + public TMXObject(final Attributes pAttributes) { + this.mName = pAttributes.getValue("", TAG_OBJECT_ATTRIBUTE_NAME); + this.mType = pAttributes.getValue("", TAG_OBJECT_ATTRIBUTE_TYPE); + this.mX = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_OBJECT_ATTRIBUTE_X); + this.mY = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_OBJECT_ATTRIBUTE_Y); + this.mWidth = SAXUtils.getIntAttribute(pAttributes, TAG_OBJECT_ATTRIBUTE_WIDTH, 0); + this.mHeight = SAXUtils.getIntAttribute(pAttributes, TAG_OBJECT_ATTRIBUTE_HEIGHT, 0); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public String getName() { + return this.mName; + } + + public String getType() { + return this.mType; + } + + public int getX() { + return this.mX; + } + + public int getY() { + return this.mY; + } + + public int getWidth() { + return this.mWidth; + } + + public int getHeight() { + return this.mHeight; + } + + public void addTMXObjectProperty(final TMXObjectProperty pTMXObjectProperty) { + this.mTMXObjectProperties.add(pTMXObjectProperty); + } + + public TMXProperties getTMXObjectProperties() { + return this.mTMXObjectProperties; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroup.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroup.java new file mode 100644 index 0000000..42a286d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroup.java @@ -0,0 +1,81 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import java.util.ArrayList; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; +import org.anddev.andengine.util.SAXUtils; +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 11:20:49 - 29.07.2010 + */ +public class TMXObjectGroup implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final String mName; + private final int mWidth; + private final int mHeight; + private final ArrayList mTMXObjects = new ArrayList(); + private final TMXProperties mTMXObjectGroupProperties = new TMXProperties(); + + // =========================================================== + // Constructors + // =========================================================== + + public TMXObjectGroup(final Attributes pAttributes) { + this.mName = pAttributes.getValue("", TAG_OBJECTGROUP_ATTRIBUTE_NAME); + this.mWidth = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_OBJECTGROUP_ATTRIBUTE_WIDTH); + this.mHeight = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_OBJECTGROUP_ATTRIBUTE_HEIGHT); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public String getName() { + return this.mName; + } + + public int getWidth() { + return this.mWidth; + } + + public int getHeight() { + return this.mHeight; + } + + void addTMXObject(final TMXObject pTMXObject) { + this.mTMXObjects.add(pTMXObject); + } + + public ArrayList getTMXObjects() { + return this.mTMXObjects ; + } + + public void addTMXObjectGroupProperty(final TMXObjectGroupProperty pTMXObjectGroupProperty) { + this.mTMXObjectGroupProperties.add(pTMXObjectGroupProperty); + } + + public TMXProperties getTMXObjectGroupProperties() { + return this.mTMXObjectGroupProperties; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroupProperty.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroupProperty.java new file mode 100644 index 0000000..9732aee --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectGroupProperty.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 19:48:01 - 12.10.2010 + */ +public class TMXObjectGroupProperty extends TMXProperty { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TMXObjectGroupProperty(final Attributes pAttributes) { + super(pAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectProperty.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectProperty.java new file mode 100644 index 0000000..5edb1a0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXObjectProperty.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 11:19:44 - 29.07.2010 + */ +public class TMXObjectProperty extends TMXProperty { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TMXObjectProperty(final Attributes pAttributes) { + super(pAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXParser.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXParser.java new file mode 100644 index 0000000..f7bf943 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXParser.java @@ -0,0 +1,217 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import java.io.IOException; +import java.util.ArrayList; + +import org.anddev.andengine.entity.layer.tiled.tmx.TMXLoader.ITMXTilePropertiesListener; +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; +import org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TMXParseException; +import org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TSXLoadException; +import org.anddev.andengine.opengl.texture.TextureManager; +import org.anddev.andengine.opengl.texture.TextureOptions; +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.SAXUtils; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import android.content.Context; + +/** + * @author Nicolas Gramlich + * @since 19:11:29 - 20.07.2010 + */ +public class TMXParser extends DefaultHandler implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Context mContext; + private final TextureManager mTextureManager; + private final ITMXTilePropertiesListener mTMXTilePropertyListener; + private final TextureOptions mTextureOptions; + + private TMXTiledMap mTMXTiledMap; + + private int mLastTileSetTileID; + + private final StringBuilder mStringBuilder = new StringBuilder(); + + private String mDataEncoding; + private String mDataCompression; + + private boolean mInMap; + private boolean mInTileset; + @SuppressWarnings("unused") + private boolean mInImage; + private boolean mInTile; + private boolean mInProperties; + @SuppressWarnings("unused") + private boolean mInProperty; + private boolean mInLayer; + private boolean mInData; + private boolean mInObjectGroup; + private boolean mInObject; + + // =========================================================== + // Constructors + // =========================================================== + + public TMXParser(final Context pContext, final TextureManager pTextureManager, final TextureOptions pTextureOptions, final ITMXTilePropertiesListener pTMXTilePropertyListener) { + this.mContext = pContext; + this.mTextureManager = pTextureManager; + this.mTextureOptions = pTextureOptions; + this.mTMXTilePropertyListener = pTMXTilePropertyListener; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + TMXTiledMap getTMXTiledMap() { + return this.mTMXTiledMap; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException { + if(pLocalName.equals(TAG_MAP)){ + this.mInMap = true; + this.mTMXTiledMap = new TMXTiledMap(pAttributes); + } else if(pLocalName.equals(TAG_TILESET)){ + this.mInTileset = true; + final TMXTileSet tmxTileSet; + final String tsxTileSetSource = pAttributes.getValue("", TAG_TILESET_ATTRIBUTE_SOURCE); + if(tsxTileSetSource == null) { + tmxTileSet = new TMXTileSet(pAttributes, this.mTextureOptions); + } else { + try { + final int firstGlobalTileID = SAXUtils.getIntAttribute(pAttributes, TAG_TILESET_ATTRIBUTE_FIRSTGID, 1); + tmxTileSet = new TSXLoader(this.mContext, this.mTextureManager, this.mTextureOptions).loadFromAsset(this.mContext, firstGlobalTileID, tsxTileSetSource); + } catch (final TSXLoadException e) { + throw new TMXParseException("Failed to load TMXTileSet from source: " + tsxTileSetSource, e); + } + } + this.mTMXTiledMap.addTMXTileSet(tmxTileSet); + } else if(pLocalName.equals(TAG_IMAGE)){ + this.mInImage = true; + final ArrayList tmxTileSets = this.mTMXTiledMap.getTMXTileSets(); + tmxTileSets.get(tmxTileSets.size() - 1).setImageSource(this.mContext, this.mTextureManager, pAttributes); + } else if(pLocalName.equals(TAG_TILE)) { + this.mInTile = true; + if(this.mInTileset) { + this.mLastTileSetTileID = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_TILE_ATTRIBUTE_ID); + } else if(this.mInData) { + final ArrayList tmxLayers = this.mTMXTiledMap.getTMXLayers(); + tmxLayers.get(tmxLayers.size() - 1).initializeTMXTileFromXML(pAttributes, this.mTMXTilePropertyListener); + } + } else if(pLocalName.equals(TAG_PROPERTIES)) { + this.mInProperties = true; + } else if(this.mInProperties && pLocalName.equals(TAG_PROPERTY)) { + this.mInProperty = true; + if(this.mInTile) { + final ArrayList tmxTileSets = this.mTMXTiledMap.getTMXTileSets(); + final TMXTileSet lastTMXTileSet = tmxTileSets.get(tmxTileSets.size() - 1); + + lastTMXTileSet.addTMXTileProperty(this.mLastTileSetTileID, new TMXTileProperty(pAttributes)); + } else if(this.mInLayer) { + final ArrayList tmxLayers = this.mTMXTiledMap.getTMXLayers(); + final TMXLayer lastTMXLayer = tmxLayers.get(tmxLayers.size() - 1); + + lastTMXLayer.addTMXLayerProperty(new TMXLayerProperty(pAttributes)); + } else if(this.mInObject) { + final ArrayList tmxObjectGroups = this.mTMXTiledMap.getTMXObjectGroups(); + final TMXObjectGroup lastTMXObjectGroup = tmxObjectGroups.get(tmxObjectGroups.size() - 1); + + final ArrayList tmxObjects = lastTMXObjectGroup.getTMXObjects(); + final TMXObject lastTMXObject = tmxObjects.get(tmxObjects.size() - 1); + + lastTMXObject.addTMXObjectProperty(new TMXObjectProperty(pAttributes)); + } else if(this.mInObjectGroup) { + final ArrayList tmxObjectGroups = this.mTMXTiledMap.getTMXObjectGroups(); + final TMXObjectGroup lastTMXObjectGroup = tmxObjectGroups.get(tmxObjectGroups.size() - 1); + + lastTMXObjectGroup.addTMXObjectGroupProperty(new TMXObjectGroupProperty(pAttributes)); + } else if(this.mInMap) { + this.mTMXTiledMap.addTMXTiledMapProperty(new TMXTiledMapProperty(pAttributes)); + } + } else if(pLocalName.equals(TAG_LAYER)){ + this.mInLayer = true; + this.mTMXTiledMap.addTMXLayer(new TMXLayer(this.mTMXTiledMap, pAttributes)); + } else if(pLocalName.equals(TAG_DATA)){ + this.mInData = true; + this.mDataEncoding = pAttributes.getValue("", TAG_DATA_ATTRIBUTE_ENCODING); + this.mDataCompression = pAttributes.getValue("", TAG_DATA_ATTRIBUTE_COMPRESSION); + } else if(pLocalName.equals(TAG_OBJECTGROUP)){ + this.mInObjectGroup = true; + this.mTMXTiledMap.addTMXObjectGroup(new TMXObjectGroup(pAttributes)); + } else if(pLocalName.equals(TAG_OBJECT)){ + this.mInObject = true; + final ArrayList tmxObjectGroups = this.mTMXTiledMap.getTMXObjectGroups(); + tmxObjectGroups.get(tmxObjectGroups.size() - 1).addTMXObject(new TMXObject(pAttributes)); + } else { + throw new TMXParseException("Unexpected start tag: '" + pLocalName + "'."); + } + } + + @Override + public void characters(final char[] pCharacters, final int pStart, final int pLength) throws SAXException { + this.mStringBuilder.append(pCharacters, pStart, pLength); + } + + @Override + public void endElement(final String pUri, final String pLocalName, final String pQualifiedName) throws SAXException { + if(pLocalName.equals(TAG_MAP)){ + this.mInMap = false; + } else if(pLocalName.equals(TAG_TILESET)){ + this.mInTileset = false; + } else if(pLocalName.equals(TAG_IMAGE)){ + this.mInImage = false; + } else if(pLocalName.equals(TAG_TILE)) { + this.mInTile = false; + } else if(pLocalName.equals(TAG_PROPERTIES)) { + this.mInProperties = false; + } else if(pLocalName.equals(TAG_PROPERTY)) { + this.mInProperty = false; + } else if(pLocalName.equals(TAG_LAYER)){ + this.mInLayer = false; + } else if(pLocalName.equals(TAG_DATA)){ + final boolean binarySaved = this.mDataCompression != null && this.mDataEncoding != null; + if(binarySaved) { + final ArrayList tmxLayers = this.mTMXTiledMap.getTMXLayers(); + try { + tmxLayers.get(tmxLayers.size() - 1).initializeTMXTilesFromDataString(this.mStringBuilder.toString().trim(), this.mDataEncoding, this.mDataCompression, this.mTMXTilePropertyListener); + } catch (final IOException e) { + Debug.e(e); + } + this.mDataCompression = null; + this.mDataEncoding = null; + } + this.mInData = false; + } else if(pLocalName.equals(TAG_OBJECTGROUP)){ + this.mInObjectGroup = false; + } else if(pLocalName.equals(TAG_OBJECT)){ + this.mInObject = false; + } else { + throw new TMXParseException("Unexpected end tag: '" + pLocalName + "'."); + } + + /* Reset the StringBuilder. */ + this.mStringBuilder.setLength(0); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperties.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperties.java new file mode 100644 index 0000000..da5af71 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperties.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import java.util.ArrayList; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; + +/** + * @author Nicolas Gramlich + * @since 10:14:06 - 27.07.2010 + */ +public class TMXProperties extends ArrayList implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 8912773556975105201L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean containsTMXProperty(final String pName, final String pValue) { + for(int i = this.size() - 1; i >= 0; i--) { + final T tmxProperty = this.get(i); + if(tmxProperty.getName().equals(pName) && tmxProperty.getValue().equals(pValue)) { + return true; + } + } + return false; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperty.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperty.java new file mode 100644 index 0000000..12341b7 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXProperty.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 10:14:06 - 27.07.2010 + */ +public class TMXProperty implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final String mName; + private final String mValue; + + // =========================================================== + // Constructors + // =========================================================== + + public TMXProperty(final Attributes pAttributes) { + this.mName = pAttributes.getValue("", TAG_PROPERTY_ATTRIBUTE_NAME); + this.mValue = pAttributes.getValue("", TAG_PROPERTY_ATTRIBUTE_VALUE); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public String getName() { + return this.mName; + } + + public String getValue() { + return this.mValue; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public String toString() { + return this.mName + "='" + this.mValue + "'"; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTile.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTile.java new file mode 100644 index 0000000..2f42a68 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTile.java @@ -0,0 +1,107 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.anddev.andengine.opengl.texture.region.TextureRegion; + +/** + * @author Nicolas Gramlich + * @since 10:39:48 - 05.08.2010 + */ +public class TMXTile { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + int mGlobalTileID; + private final int mTileRow; + private final int mTileColumn; + private final int mTileWidth; + private final int mTileHeight; + TextureRegion mTextureRegion; + + // =========================================================== + // Constructors + // =========================================================== + + public TMXTile(final int pGlobalTileID, final int pTileColumn, final int pTileRow, final int pTileWidth, final int pTileHeight, final TextureRegion pTextureRegion) { + this.mGlobalTileID = pGlobalTileID; + this.mTileRow = pTileRow; + this.mTileColumn = pTileColumn; + this.mTileWidth = pTileWidth; + this.mTileHeight = pTileHeight; + this.mTextureRegion = pTextureRegion; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getGlobalTileID() { + return this.mGlobalTileID; + } + + public int getTileRow() { + return this.mTileRow; + } + + public int getTileColumn() { + return this.mTileColumn; + } + + public int getTileX() { + return this.mTileColumn * this.mTileWidth; + } + + public int getTileY() { + return this.mTileRow * this.mTileHeight; + } + + public int getTileWidth() { + return this.mTileWidth; + } + + public int getTileHeight() { + return this.mTileHeight; + } + + public TextureRegion getTextureRegion() { + return this.mTextureRegion; + } + + /** + * Note this will also set the {@link TextureRegion} with the associated pGlobalTileID of the {@link TMXTiledMap}. + * @param pTMXTiledMap + * @param pGlobalTileID + */ + public void setGlobalTileID(final TMXTiledMap pTMXTiledMap, final int pGlobalTileID) { + this.mGlobalTileID = pGlobalTileID; + this.mTextureRegion = pTMXTiledMap.getTextureRegionFromGlobalTileID(pGlobalTileID); + } + + /** + * You'd probably want to call {@link TMXTile#setGlobalTileID(TMXTiledMap, int)} instead. + * @param pTextureRegion + */ + public void setTextureRegion(final TextureRegion pTextureRegion) { + this.mTextureRegion = pTextureRegion; + } + + public TMXProperties getTMXTileProperties(final TMXTiledMap pTMXTiledMap) { + return pTMXTiledMap.getTMXTileProperties(this.mGlobalTileID); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileProperty.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileProperty.java new file mode 100644 index 0000000..ee7c1d5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileProperty.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 11:20:09 - 29.07.2010 + */ +public class TMXTileProperty extends TMXProperty { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TMXTileProperty(final Attributes pAttributes) { + super(pAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileSet.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileSet.java new file mode 100644 index 0000000..ee05c7e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTileSet.java @@ -0,0 +1,177 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; +import org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TMXParseException; +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.texture.TextureFactory; +import org.anddev.andengine.opengl.texture.TextureManager; +import org.anddev.andengine.opengl.texture.TextureOptions; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.texture.region.TextureRegionFactory; +import org.anddev.andengine.opengl.texture.source.AssetTextureSource; +import org.anddev.andengine.opengl.texture.source.decorator.ColorKeyTextureSourceDecorator; +import org.anddev.andengine.opengl.texture.source.decorator.shape.RectangleTextureSourceDecoratorShape; +import org.anddev.andengine.util.SAXUtils; +import org.xml.sax.Attributes; + +import android.content.Context; +import android.graphics.Color; +import android.util.SparseArray; + +/** + * @author Nicolas Gramlich + * @since 19:03:24 - 20.07.2010 + */ +public class TMXTileSet implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mFirstGlobalTileID; + private final String mName; + private final int mTileWidth; + private final int mTileHeight; + + private String mImageSource; + private Texture mTexture; + private final TextureOptions mTextureOptions; + + private int mTilesHorizontal; + @SuppressWarnings("unused") + private int mTilesVertical; + + private final int mSpacing; + private final int mMargin; + + private final SparseArray> mTMXTileProperties = new SparseArray>(); + // =========================================================== + // Constructors + // =========================================================== + + TMXTileSet(final Attributes pAttributes, final TextureOptions pTextureOptions) { + this(SAXUtils.getIntAttribute(pAttributes, TAG_TILESET_ATTRIBUTE_FIRSTGID, 1), pAttributes, pTextureOptions); + } + + TMXTileSet(final int pFirstGlobalTileID, final Attributes pAttributes, final TextureOptions pTextureOptions) { + this.mFirstGlobalTileID = SAXUtils.getIntAttribute(pAttributes, TAG_TILESET_ATTRIBUTE_FIRSTGID, 1); + this.mName = pAttributes.getValue("", TAG_TILESET_ATTRIBUTE_NAME); + this.mTileWidth = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_TILESET_ATTRIBUTE_TILEWIDTH); + this.mTileHeight = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_TILESET_ATTRIBUTE_TILEHEIGHT); + this.mSpacing = SAXUtils.getIntAttribute(pAttributes, TAG_TILESET_ATTRIBUTE_SPACING, 0); + this.mMargin = SAXUtils.getIntAttribute(pAttributes, TAG_TILESET_ATTRIBUTE_MARGIN, 0); + + this.mTextureOptions = pTextureOptions; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public final int getFirstGlobalTileID() { + return this.mFirstGlobalTileID; + } + + public final String getName() { + return this.mName; + } + + public final int getTileWidth() { + return this.mTileWidth; + } + + public final int getTileHeight() { + return this.mTileHeight; + } + + public Texture getTexture() { + return this.mTexture; + } + + public void setImageSource(final Context pContext, final TextureManager pTextureManager, final Attributes pAttributes) throws TMXParseException { + this.mImageSource = pAttributes.getValue("", TAG_IMAGE_ATTRIBUTE_SOURCE); + + final AssetTextureSource assetTextureSource = new AssetTextureSource(pContext, this.mImageSource); + this.mTilesHorizontal = TMXTileSet.determineCount(assetTextureSource.getWidth(), this.mTileWidth, this.mMargin, this.mSpacing); + this.mTilesVertical = TMXTileSet.determineCount(assetTextureSource.getHeight(), this.mTileHeight, this.mMargin, this.mSpacing); + this.mTexture = TextureFactory.createForTextureSourceSize(assetTextureSource, this.mTextureOptions); + + final String transparentColor = SAXUtils.getAttribute(pAttributes, TAG_IMAGE_ATTRIBUTE_TRANS, null); + if(transparentColor == null) { + TextureRegionFactory.createFromSource(this.mTexture, assetTextureSource, 0, 0); + } else { + try{ + final int color = Color.parseColor((transparentColor.startsWith("#")) ? transparentColor : "#" + transparentColor); + TextureRegionFactory.createFromSource(this.mTexture, new ColorKeyTextureSourceDecorator(assetTextureSource, RectangleTextureSourceDecoratorShape.getDefaultInstance(), color), 0, 0); + } catch (final IllegalArgumentException e) { + throw new TMXParseException("Illegal value: '" + transparentColor + "' for attribute 'trans' supplied!", e); + } + } + pTextureManager.loadTexture(this.mTexture); + } + + public String getImageSource() { + return this.mImageSource; + } + + public SparseArray> getTMXTileProperties() { + return this.mTMXTileProperties; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public TMXProperties getTMXTilePropertiesFromGlobalTileID(final int pGlobalTileID) { + final int localTileID = pGlobalTileID - this.mFirstGlobalTileID; + return this.mTMXTileProperties.get(localTileID); + } + + public void addTMXTileProperty(final int pLocalTileID, final TMXTileProperty pTMXTileProperty) { + final TMXProperties existingProperties = this.mTMXTileProperties.get(pLocalTileID); + if(existingProperties != null) { + existingProperties.add(pTMXTileProperty); + } else { + final TMXProperties newProperties = new TMXProperties(); + newProperties.add(pTMXTileProperty); + this.mTMXTileProperties.put(pLocalTileID, newProperties); + } + } + + public TextureRegion getTextureRegionFromGlobalTileID(final int pGlobalTileID) { + final int localTileID = pGlobalTileID - this.mFirstGlobalTileID; + final int tileColumn = localTileID % this.mTilesHorizontal; + final int tileRow = localTileID / this.mTilesHorizontal; + + final int texturePositionX = this.mMargin + (this.mSpacing + this.mTileWidth) * tileColumn; + final int texturePositionY = this.mMargin + (this.mSpacing + this.mTileHeight) * tileRow; + + return new TextureRegion(this.mTexture, texturePositionX, texturePositionY, this.mTileWidth, this.mTileHeight); + } + + private static int determineCount(final int pTotalExtent, final int pTileExtent, final int pMargin, final int pSpacing) { + int count = 0; + int remainingExtent = pTotalExtent; + + remainingExtent -= pMargin * 2; + + while(remainingExtent > 0) { + remainingExtent -= pTileExtent; + remainingExtent -= pSpacing; + count++; + } + + return count; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMap.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMap.java new file mode 100644 index 0000000..f07b49d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMap.java @@ -0,0 +1,198 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import java.util.ArrayList; + +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; +import org.anddev.andengine.opengl.buffer.BufferObjectManager; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; +import org.anddev.andengine.util.SAXUtils; +import org.xml.sax.Attributes; + +import android.util.SparseArray; + +/** + * @author Nicolas Gramlich + * @since 19:38:11 - 20.07.2010 + */ +public class TMXTiledMap implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final String mOrientation; + private final int mTileColumns; + private final int mTilesRows; + private final int mTileWidth; + private final int mTileHeight; + + private final ArrayList mTMXTileSets = new ArrayList(); + private final ArrayList mTMXLayers = new ArrayList(); + private final ArrayList mTMXObjectGroups = new ArrayList(); + + private final RectangleVertexBuffer mSharedVertexBuffer; + + private final SparseArray mGlobalTileIDToTextureRegionCache = new SparseArray(); + private final SparseArray> mGlobalTileIDToTMXTilePropertiesCache = new SparseArray>(); + + private final TMXProperties mTMXTiledMapProperties = new TMXProperties(); + + // =========================================================== + // Constructors + // =========================================================== + + TMXTiledMap(final Attributes pAttributes) { + this.mOrientation = pAttributes.getValue("", TAG_MAP_ATTRIBUTE_ORIENTATION); + if(this.mOrientation.equals(TAG_MAP_ATTRIBUTE_ORIENTATION_VALUE_ORTHOGONAL) == false) { + throw new IllegalArgumentException(TAG_MAP_ATTRIBUTE_ORIENTATION + ": '" + this.mOrientation + "' is not supported."); + } + this.mTileColumns = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_MAP_ATTRIBUTE_WIDTH); + this.mTilesRows = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_MAP_ATTRIBUTE_HEIGHT); + this.mTileWidth = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_MAP_ATTRIBUTE_TILEWIDTH); + this.mTileHeight = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_MAP_ATTRIBUTE_TILEHEIGHT); + + this.mSharedVertexBuffer = new RectangleVertexBuffer(GL11.GL_STATIC_DRAW); + BufferObjectManager.getActiveInstance().loadBufferObject(this.mSharedVertexBuffer); + this.mSharedVertexBuffer.update(this.mTileWidth, this.mTileHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public final String getOrientation() { + return this.mOrientation; + } + /** + * @deprecated Instead use {@link TMXTiledMap#getTileColumns()} * {@link TMXTiledMap#getTileWidth()}. + * @return + */ + @Deprecated + public final int getWidth() { + return this.mTileColumns; + } + + public final int getTileColumns() { + return this.mTileColumns; + } + + /** + * @deprecated Instead use {@link TMXTiledMap#getTileRows()} * {@link TMXTiledMap#getTileHeight()}. + * @return + */ + @Deprecated + public final int getHeight() { + return this.mTilesRows; + } + + public final int getTileRows() { + return this.mTilesRows; + } + + public final int getTileWidth() { + return this.mTileWidth; + } + + public final int getTileHeight() { + return this.mTileHeight; + } + + public RectangleVertexBuffer getSharedVertexBuffer() { + return this.mSharedVertexBuffer; + } + + void addTMXTileSet(final TMXTileSet pTMXTileSet) { + this.mTMXTileSets.add(pTMXTileSet); + } + + public ArrayList getTMXTileSets() { + return this.mTMXTileSets; + } + + void addTMXLayer(final TMXLayer pTMXLayer) { + this.mTMXLayers.add(pTMXLayer); + } + + public ArrayList getTMXLayers() { + return this.mTMXLayers; + } + + void addTMXObjectGroup(final TMXObjectGroup pTMXObjectGroup) { + this.mTMXObjectGroups.add(pTMXObjectGroup); + } + + public ArrayList getTMXObjectGroups() { + return this.mTMXObjectGroups; + } + + public TMXProperties getTMXTilePropertiesByGlobalTileID(final int pGlobalTileID) { + return this.mGlobalTileIDToTMXTilePropertiesCache.get(pGlobalTileID); + } + + public void addTMXTiledMapProperty(final TMXTiledMapProperty pTMXTiledMapProperty) { + this.mTMXTiledMapProperties.add(pTMXTiledMapProperty); + } + + public TMXProperties getTMXTiledMapProperties() { + return this.mTMXTiledMapProperties; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public TMXProperties getTMXTileProperties(final int pGlobalTileID) { + final SparseArray> globalTileIDToTMXTilePropertiesCache = this.mGlobalTileIDToTMXTilePropertiesCache; + + final TMXProperties cachedTMXTileProperties = globalTileIDToTMXTilePropertiesCache.get(pGlobalTileID); + if(cachedTMXTileProperties != null) { + return cachedTMXTileProperties; + } else { + final ArrayList tmxTileSets = this.mTMXTileSets; + + for(int i = tmxTileSets.size() - 1; i >= 0; i--) { + final TMXTileSet tmxTileSet = tmxTileSets.get(i); + if(pGlobalTileID >= tmxTileSet.getFirstGlobalTileID()) { + return tmxTileSet.getTMXTilePropertiesFromGlobalTileID(pGlobalTileID); + } + } + throw new IllegalArgumentException("No TMXTileProperties found for pGlobalTileID=" + pGlobalTileID); + } + } + + public TextureRegion getTextureRegionFromGlobalTileID(final int pGlobalTileID) { + final SparseArray globalTileIDToTextureRegionCache = this.mGlobalTileIDToTextureRegionCache; + + final TextureRegion cachedTextureRegion = globalTileIDToTextureRegionCache.get(pGlobalTileID); + if(cachedTextureRegion != null) { + return cachedTextureRegion; + } else { + final ArrayList tmxTileSets = this.mTMXTileSets; + + for(int i = tmxTileSets.size() - 1; i >= 0; i--) { + final TMXTileSet tmxTileSet = tmxTileSets.get(i); + if(pGlobalTileID >= tmxTileSet.getFirstGlobalTileID()) { + final TextureRegion textureRegion = tmxTileSet.getTextureRegionFromGlobalTileID(pGlobalTileID); + /* Add to cache for the all future pGlobalTileIDs with the same value. */ + globalTileIDToTextureRegionCache.put(pGlobalTileID, textureRegion); + return textureRegion; + } + } + throw new IllegalArgumentException("No TextureRegion found for pGlobalTileID=" + pGlobalTileID); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMapProperty.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMapProperty.java new file mode 100644 index 0000000..832860b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TMXTiledMapProperty.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 18:48:41 - 12.10.2010 + */ +public class TMXTiledMapProperty extends TMXProperty { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TMXTiledMapProperty(final Attributes pAttributes) { + super(pAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXLoader.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXLoader.java new file mode 100644 index 0000000..13648a4 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXLoader.java @@ -0,0 +1,92 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TSXLoadException; +import org.anddev.andengine.opengl.texture.TextureManager; +import org.anddev.andengine.opengl.texture.TextureOptions; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import android.content.Context; + +/** + * @author Nicolas Gramlich + * @since 17:18:37 - 08.08.2010 + */ +public class TSXLoader { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Context mContext; + private final TextureManager mTextureManager; + private final TextureOptions mTextureOptions; + + // =========================================================== + // Constructors + // =========================================================== + + public TSXLoader(final Context pContext, final TextureManager pTextureManager, final TextureOptions pTextureOptions) { + this.mContext = pContext; + this.mTextureManager = pTextureManager; + this.mTextureOptions = pTextureOptions; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public TMXTileSet loadFromAsset(final Context pContext, final int pFirstGlobalTileID, final String pAssetPath) throws TSXLoadException { + try { + return this.load(pFirstGlobalTileID, pContext.getAssets().open(pAssetPath)); + } catch (final IOException e) { + throw new TSXLoadException("Could not load TMXTileSet from asset: " + pAssetPath, e); + } + } + + private TMXTileSet load(final int pFirstGlobalTileID, final InputStream pInputStream) throws TSXLoadException { + try{ + final SAXParserFactory spf = SAXParserFactory.newInstance(); + final SAXParser sp = spf.newSAXParser(); + + final XMLReader xr = sp.getXMLReader(); + final TSXParser tsxParser = new TSXParser(this.mContext, this.mTextureManager, this.mTextureOptions, pFirstGlobalTileID); + xr.setContentHandler(tsxParser); + + xr.parse(new InputSource(new BufferedInputStream(pInputStream))); + + return tsxParser.getTMXTileSet(); + } catch (final SAXException e) { + throw new TSXLoadException(e); + } catch (final ParserConfigurationException pe) { + /* Doesn't happen. */ + return null; + } catch (final IOException e) { + throw new TSXLoadException(e); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXParser.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXParser.java new file mode 100644 index 0000000..47f6f59 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/TSXParser.java @@ -0,0 +1,115 @@ +package org.anddev.andengine.entity.layer.tiled.tmx; + +import org.anddev.andengine.entity.layer.tiled.tmx.util.constants.TMXConstants; +import org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TMXParseException; +import org.anddev.andengine.opengl.texture.TextureManager; +import org.anddev.andengine.opengl.texture.TextureOptions; +import org.anddev.andengine.util.SAXUtils; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import android.content.Context; + +/** + * @author Nicolas Gramlich + * @since 18:37:32 - 08.08.2010 + */ +public class TSXParser extends DefaultHandler implements TMXConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Context mContext; + private final TextureManager mTextureManager; + private final TextureOptions mTextureOptions; + + private TMXTileSet mTMXTileSet; + + private int mLastTileSetTileID; + + @SuppressWarnings("unused") + private boolean mInTileset; + @SuppressWarnings("unused") + private boolean mInImage; + @SuppressWarnings("unused") + private boolean mInTile; + @SuppressWarnings("unused") + private boolean mInProperties; + @SuppressWarnings("unused") + private boolean mInProperty; + private final int mFirstGlobalTileID; + + // =========================================================== + // Constructors + // =========================================================== + + public TSXParser(final Context pContext, final TextureManager pTextureManager, final TextureOptions pTextureOptions, final int pFirstGlobalTileID) { + this.mContext = pContext; + this.mTextureManager = pTextureManager; + this.mTextureOptions = pTextureOptions; + this.mFirstGlobalTileID = pFirstGlobalTileID; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + TMXTileSet getTMXTileSet() { + return this.mTMXTileSet; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException { + if(pLocalName.equals(TAG_TILESET)){ + this.mInTileset = true; + this.mTMXTileSet = new TMXTileSet(this.mFirstGlobalTileID, pAttributes, this.mTextureOptions); + } else if(pLocalName.equals(TAG_IMAGE)){ + this.mInImage = true; + this.mTMXTileSet.setImageSource(this.mContext, this.mTextureManager, pAttributes); + } else if(pLocalName.equals(TAG_TILE)) { + this.mInTile = true; + this.mLastTileSetTileID = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_TILE_ATTRIBUTE_ID); + } else if(pLocalName.equals(TAG_PROPERTIES)) { + this.mInProperties = true; + } else if(pLocalName.equals(TAG_PROPERTY)) { + this.mInProperty = true; + this.mTMXTileSet.addTMXTileProperty(this.mLastTileSetTileID, new TMXTileProperty(pAttributes)); + } else { + throw new TMXParseException("Unexpected start tag: '" + pLocalName + "'."); + } + } + + @Override + public void endElement(final String pUri, final String pLocalName, final String pQualifiedName) throws SAXException { + if(pLocalName.equals(TAG_TILESET)){ + this.mInTileset = false; + } else if(pLocalName.equals(TAG_IMAGE)){ + this.mInImage = false; + } else if(pLocalName.equals(TAG_TILE)) { + this.mInTile = false; + } else if(pLocalName.equals(TAG_PROPERTIES)) { + this.mInProperties = false; + } else if(pLocalName.equals(TAG_PROPERTY)) { + this.mInProperty = false; + } else { + throw new TMXParseException("Unexpected end tag: '" + pLocalName + "'."); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/constants/TMXConstants.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/constants/TMXConstants.java new file mode 100644 index 0000000..0542684 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/constants/TMXConstants.java @@ -0,0 +1,81 @@ +package org.anddev.andengine.entity.layer.tiled.tmx.util.constants; + +/** + * See: TMX Map Format. + * + * @author Nicolas Gramlich + * @since 19:20:22 - 20.07.2010 + */ +public interface TMXConstants { + // =========================================================== + // Final Fields + // =========================================================== + + public static final int BYTES_PER_GLOBALTILEID = 4; + + public static final String TAG_MAP = "map"; + public static final String TAG_MAP_ATTRIBUTE_ORIENTATION = "orientation"; + public static final String TAG_MAP_ATTRIBUTE_ORIENTATION_VALUE_ORTHOGONAL = "orthogonal"; + public static final String TAG_MAP_ATTRIBUTE_ORIENTATION_VALUE_ISOMETRIC = "isometric"; + public static final String TAG_MAP_ATTRIBUTE_WIDTH = "width"; + public static final String TAG_MAP_ATTRIBUTE_HEIGHT = "height"; + public static final String TAG_MAP_ATTRIBUTE_TILEWIDTH = "tilewidth"; + public static final String TAG_MAP_ATTRIBUTE_TILEHEIGHT = "tileheight"; + + public static final String TAG_TILESET = "tileset"; + public static final String TAG_TILESET_ATTRIBUTE_FIRSTGID = "firstgid"; + public static final String TAG_TILESET_ATTRIBUTE_SOURCE = "source"; + public static final String TAG_TILESET_ATTRIBUTE_NAME = "name"; + public static final String TAG_TILESET_ATTRIBUTE_TILEWIDTH = "tilewidth"; + public static final String TAG_TILESET_ATTRIBUTE_TILEHEIGHT = "tileheight"; + public static final String TAG_TILESET_ATTRIBUTE_SPACING = "spacing"; + public static final String TAG_TILESET_ATTRIBUTE_MARGIN = "margin"; + + public static final String TAG_IMAGE = "image"; + public static final String TAG_IMAGE_ATTRIBUTE_SOURCE = "source"; + public static final String TAG_IMAGE_ATTRIBUTE_TRANS = "trans"; + + public static final String TAG_TILE = "tile"; + public static final String TAG_TILE_ATTRIBUTE_ID = "id"; + public static final String TAG_TILE_ATTRIBUTE_GID = "gid"; + + public static final String TAG_PROPERTIES = "properties"; + + public static final String TAG_PROPERTY = "property"; + public static final String TAG_PROPERTY_ATTRIBUTE_NAME = "name"; + public static final String TAG_PROPERTY_ATTRIBUTE_VALUE = "value"; + + public static final String TAG_LAYER = "layer"; + public static final String TAG_LAYER_ATTRIBUTE_NAME = "name"; + public static final String TAG_LAYER_ATTRIBUTE_WIDTH = "width"; + public static final String TAG_LAYER_ATTRIBUTE_HEIGHT = "height"; + public static final String TAG_LAYER_ATTRIBUTE_VISIBLE = "visible"; + public static final int TAG_LAYER_ATTRIBUTE_VISIBLE_VALUE_DEFAULT = 1; + public static final String TAG_LAYER_ATTRIBUTE_OPACITY = "opacity"; + public static final float TAG_LAYER_ATTRIBUTE_OPACITY_VALUE_DEFAULT = 1.0f; + + public static final String TAG_DATA = "data"; + public static final String TAG_DATA_ATTRIBUTE_ENCODING = "encoding"; + public static final String TAG_DATA_ATTRIBUTE_ENCODING_VALUE_BASE64 = "base64"; + public static final String TAG_DATA_ATTRIBUTE_COMPRESSION = "compression"; + public static final String TAG_DATA_ATTRIBUTE_COMPRESSION_VALUE_GZIP = "gzip"; + public static final String TAG_DATA_ATTRIBUTE_COMPRESSION_VALUE_ZLIB = "zlib"; + + + public static final String TAG_OBJECTGROUP = "objectgroup"; + public static final String TAG_OBJECTGROUP_ATTRIBUTE_NAME = "name"; + public static final String TAG_OBJECTGROUP_ATTRIBUTE_WIDTH = "width"; + public static final String TAG_OBJECTGROUP_ATTRIBUTE_HEIGHT = "height"; + + public static final String TAG_OBJECT = "object"; + public static final String TAG_OBJECT_ATTRIBUTE_NAME = "name"; + public static final String TAG_OBJECT_ATTRIBUTE_TYPE = "type"; + public static final String TAG_OBJECT_ATTRIBUTE_X = "x"; + public static final String TAG_OBJECT_ATTRIBUTE_Y = "y"; + public static final String TAG_OBJECT_ATTRIBUTE_WIDTH = "width"; + public static final String TAG_OBJECT_ATTRIBUTE_HEIGHT = "height"; + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXException.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXException.java new file mode 100644 index 0000000..d5e4f6f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXException.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.entity.layer.tiled.tmx.util.exception; + +/** + * @author Nicolas Gramlich + * @since 17:20:25 - 08.08.2010 + */ +public abstract class TMXException extends Exception { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 337819550394833109L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TMXException() { + super(); + } + + public TMXException(final String pDetailMessage, final Throwable pThrowable) { + super(pDetailMessage, pThrowable); + } + + public TMXException(final String pDetailMessage) { + super(pDetailMessage); + } + + public TMXException(final Throwable pThrowable) { + super(pThrowable); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXLoadException.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXLoadException.java new file mode 100644 index 0000000..5c32e15 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXLoadException.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.entity.layer.tiled.tmx.util.exception; + +/** + * @author Nicolas Gramlich + * @since 00:10:02 - 28.07.2010 + */ +public class TMXLoadException extends TMXException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = -8295358631698809883L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TMXLoadException() { + super(); + } + + public TMXLoadException(final String pDetailMessage, final Throwable pThrowable) { + super(pDetailMessage, pThrowable); + } + + public TMXLoadException(final String pDetailMessage) { + super(pDetailMessage); + } + + public TMXLoadException(final Throwable pThrowable) { + super(pThrowable); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXParseException.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXParseException.java new file mode 100644 index 0000000..2d94f66 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TMXParseException.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.entity.layer.tiled.tmx.util.exception; + +import org.xml.sax.SAXException; + +/** + * @author Nicolas Gramlich + * @since 00:10:02 - 28.07.2010 + */ +public class TMXParseException extends SAXException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 2213964295487921492L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TMXParseException() { + super(); + } + + public TMXParseException(final String pDetailMessage) { + super(pDetailMessage); + } + + public TMXParseException(final Exception pException) { + super(pException); + } + + public TMXParseException(final String pMessage, final Exception pException) { + super(pMessage, pException); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXLoadException.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXLoadException.java new file mode 100644 index 0000000..c2d6f3a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXLoadException.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.entity.layer.tiled.tmx.util.exception; + +/** + * @author Nicolas Gramlich + * @since 18:37:53 - 08.08.2010 + */ +public class TSXLoadException extends TMXException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 10055223972707703L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TSXLoadException() { + super(); + } + + public TSXLoadException(final String pDetailMessage, final Throwable pThrowable) { + super(pDetailMessage, pThrowable); + } + + public TSXLoadException(final String pDetailMessage) { + super(pDetailMessage); + } + + public TSXLoadException(final Throwable pThrowable) { + super(pThrowable); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXParseException.java b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXParseException.java new file mode 100644 index 0000000..2265725 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/layer/tiled/tmx/util/exception/TSXParseException.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.entity.layer.tiled.tmx.util.exception; + +import org.xml.sax.SAXException; + +/** + * @author Nicolas Gramlich + * @since 18:37:46 - 08.08.2010 + */ +public class TSXParseException extends SAXException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = -7598783248970268198L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TSXParseException() { + super(); + } + + public TSXParseException(final String pDetailMessage) { + super(pDetailMessage); + } + + public TSXParseException(final Exception pException) { + super(pException); + } + + public TSXParseException(final String pMessage, final Exception pException) { + super(pMessage, pException); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/AlphaModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/AlphaModifier.java new file mode 100644 index 0000000..ea1ca11 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/AlphaModifier.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 23:13:01 - 19.03.2010 + */ +public class AlphaModifier extends SingleValueSpanShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public AlphaModifier(final float pDuration, final float pFromAlpha, final float pToAlpha) { + this(pDuration, pFromAlpha, pToAlpha, null, IEaseFunction.DEFAULT); + } + + public AlphaModifier(final float pDuration, final float pFromAlpha, final float pToAlpha, final IEaseFunction pEaseFunction) { + this(pDuration, pFromAlpha, pToAlpha, null, pEaseFunction); + } + + public AlphaModifier(final float pDuration, final float pFromAlpha, final float pToAlpha, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromAlpha, pToAlpha, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public AlphaModifier(final float pDuration, final float pFromAlpha, final float pToAlpha, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromAlpha, pToAlpha, pEntityModifierListener, pEaseFunction); + } + + protected AlphaModifier(final AlphaModifier pAlphaModifier) { + super(pAlphaModifier); + } + + @Override + public AlphaModifier clone(){ + return new AlphaModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValue(final IEntity pEntity, final float pAlpha) { + pEntity.setAlpha(pAlpha); + } + + @Override + protected void onSetValue(final IEntity pEntity, final float pPercentageDone, final float pAlpha) { + pEntity.setAlpha(pAlpha); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/ColorModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/ColorModifier.java new file mode 100644 index 0000000..30368aa --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/ColorModifier.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 15:39:50 - 29.06.2010 + */ +public class ColorModifier extends TripleValueSpanShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ColorModifier(final float pDuration, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue) { + this(pDuration, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, null, IEaseFunction.DEFAULT); + } + + public ColorModifier(final float pDuration, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final IEaseFunction pEaseFunction) { + this(pDuration, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, null, pEaseFunction); + } + + public ColorModifier(final float pDuration, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public ColorModifier(final float pDuration, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, pEntityModifierListener, pEaseFunction); + } + + protected ColorModifier(final ColorModifier pColorModifier) { + super(pColorModifier); + } + + @Override + public ColorModifier clone(){ + return new ColorModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValues(final IEntity pEntity, final float pRed, final float pGreen, final float pBlue) { + pEntity.setColor(pRed, pGreen, pBlue); + } + + @Override + protected void onSetValues(final IEntity pEntity, final float pPerctentageDone, final float pRed, final float pGreen, final float pBlue) { + pEntity.setColor(pRed, pGreen, pBlue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/DelayModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/DelayModifier.java new file mode 100644 index 0000000..6f54ce1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/DelayModifier.java @@ -0,0 +1,64 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; + +/** + * @author Nicolas Gramlich + * @since 22:55:13 - 19.03.2010 + */ +public class DelayModifier extends DurationShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public DelayModifier(final float pDuration, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pEntityModifierListener); + } + + public DelayModifier(final float pDuration) { + super(pDuration); + } + + protected DelayModifier(final DelayModifier pDelayModifier) { + super(pDelayModifier); + } + + @Override + public DelayModifier clone(){ + return new DelayModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedInitialize(final IEntity pEntity) { + + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed, final IEntity pEntity) { + + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/DoubleValueSpanShapeModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/DoubleValueSpanShapeModifier.java new file mode 100644 index 0000000..7bd40f9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/DoubleValueSpanShapeModifier.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.BaseDoubleValueSpanModifier; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 23:29:22 - 19.03.2010 + */ +public abstract class DoubleValueSpanShapeModifier extends BaseDoubleValueSpanModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public DoubleValueSpanShapeModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB) { + super(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB); + } + + public DoubleValueSpanShapeModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final IEaseFunction pEaseFunction) { + super(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, pEaseFunction); + } + + public DoubleValueSpanShapeModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, pEntityModifierListener); + } + + public DoubleValueSpanShapeModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, pEntityModifierListener, pEaseFunction); + } + + protected DoubleValueSpanShapeModifier(final DoubleValueSpanShapeModifier pDoubleValueSpanModifier) { + super(pDoubleValueSpanModifier); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/DurationShapeModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/DurationShapeModifier.java new file mode 100644 index 0000000..19b46bb --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/DurationShapeModifier.java @@ -0,0 +1,54 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.BaseDurationModifier; + +/** + * @author Nicolas Gramlich + * @since 16:10:42 - 19.03.2010 + */ +public abstract class DurationShapeModifier extends BaseDurationModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public DurationShapeModifier() { + super(); + } + + public DurationShapeModifier(final float pDuration) { + super(pDuration); + } + + public DurationShapeModifier(final float pDuration, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pEntityModifierListener); + } + + protected DurationShapeModifier(final DurationShapeModifier pDurationShapeModifier) { + super(pDurationShapeModifier); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/EntityModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/EntityModifier.java new file mode 100644 index 0000000..2c584e6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/EntityModifier.java @@ -0,0 +1,50 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.BaseModifier; + +/** + * @author Nicolas Gramlich + * @since 10:53:16 - 03.09.2010 + */ +public abstract class EntityModifier extends BaseModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public EntityModifier() { + super(); + } + + public EntityModifier(final IEntityModifierListener pEntityModifierListener) { + super(pEntityModifierListener); + } + + protected EntityModifier(final EntityModifier pEntityModifier) { + super(pEntityModifier); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/EntityModifierList.java b/AndEngine/src/org/anddev/andengine/entity/modifier/EntityModifierList.java new file mode 100644 index 0000000..9499623 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/EntityModifierList.java @@ -0,0 +1,48 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ModifierList; + +/** + * @author Nicolas Gramlich + * @since 14:19:18 - 24.12.2010 + */ +public class EntityModifierList extends ModifierList { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 161652765736600082L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public EntityModifierList(final IEntity pTarget) { + super(pTarget); + } + + public EntityModifierList(final IEntity pTarget, final int pCapacity) { + super(pTarget, pCapacity); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/FadeInModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/FadeInModifier.java new file mode 100644 index 0000000..afac975 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/FadeInModifier.java @@ -0,0 +1,63 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + + +/** + * @author Nicolas Gramlich + * @since 19:03:12 - 08.06.2010 + */ +public class FadeInModifier extends AlphaModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public FadeInModifier(final float pDuration) { + super(pDuration, 0.0f, 1.0f, IEaseFunction.DEFAULT); + } + + public FadeInModifier(final float pDuration, final IEaseFunction pEaseFunction) { + super(pDuration, 0.0f, 1.0f, pEaseFunction); + } + + public FadeInModifier(final float pDuration, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, 0.0f, 1.0f, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public FadeInModifier(final float pDuration, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, 0.0f, 1.0f, pEntityModifierListener, pEaseFunction); + } + + protected FadeInModifier(final FadeInModifier pFadeInModifier) { + super(pFadeInModifier); + } + + @Override + public FadeInModifier clone() { + return new FadeInModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/FadeOutModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/FadeOutModifier.java new file mode 100644 index 0000000..ace0648 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/FadeOutModifier.java @@ -0,0 +1,63 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + + +/** + * @author Nicolas Gramlich + * @since 19:03:12 - 08.06.2010 + */ +public class FadeOutModifier extends AlphaModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public FadeOutModifier(final float pDuration) { + super(pDuration, 1.0f, 0.0f, IEaseFunction.DEFAULT); + } + + public FadeOutModifier(final float pDuration, final IEaseFunction pEaseFunction) { + super(pDuration, 1.0f, 0.0f, pEaseFunction); + } + + public FadeOutModifier(final float pDuration, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, 1.0f, 0.0f, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public FadeOutModifier(final float pDuration, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, 1.0f, 0.0f, pEntityModifierListener, pEaseFunction); + } + + protected FadeOutModifier(final FadeOutModifier pFadeOutModifier) { + super(pFadeOutModifier); + } + + @Override + public FadeOutModifier clone() { + return new FadeOutModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/IEntityModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/IEntityModifier.java new file mode 100644 index 0000000..8ccf302 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/IEntityModifier.java @@ -0,0 +1,43 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.IMatcher; +import org.anddev.andengine.util.modifier.IModifier; + +/** + * @author Nicolas Gramlich + * @since 11:17:50 - 19.03.2010 + */ +public interface IEntityModifier extends IModifier { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IEntityModifierListener extends IModifierListener{ + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } + + public interface IEntityModifierMatcher extends IMatcher> { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/LoopEntityModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/LoopEntityModifier.java new file mode 100644 index 0000000..b9f3d7b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/LoopEntityModifier.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.LoopModifier; + +/** + * @author Nicolas Gramlich + * @since 12:42:13 - 03.09.2010 + */ +public class LoopEntityModifier extends LoopModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public LoopEntityModifier(final IEntityModifier pEntityModifier) { + super(pEntityModifier); + } + + public LoopEntityModifier(final IEntityModifierListener pEntityModifierListener, final int pLoopCount, final ILoopEntityModifierListener pLoopModifierListener, final IEntityModifier pEntityModifier) { + super(pEntityModifierListener, pLoopCount, pLoopModifierListener, pEntityModifier); + } + + public LoopEntityModifier(final IEntityModifierListener pEntityModifierListener, final int pLoopCount, final IEntityModifier pEntityModifier) { + super(pEntityModifierListener, pLoopCount, pEntityModifier); + } + + public LoopEntityModifier(final int pLoopCount, final IEntityModifier pEntityModifier) { + super(pLoopCount, pEntityModifier); + } + + protected LoopEntityModifier(final LoopEntityModifier pLoopEntityModifier) { + super(pLoopEntityModifier); + } + + @Override + public LoopEntityModifier clone() { + return new LoopEntityModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface ILoopEntityModifierListener extends ILoopModifierListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/MoveModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/MoveModifier.java new file mode 100644 index 0000000..0afd687 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/MoveModifier.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 16:12:52 - 19.03.2010 + */ +public class MoveModifier extends DoubleValueSpanShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public MoveModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY) { + this(pDuration, pFromX, pToX, pFromY, pToY, null, IEaseFunction.DEFAULT); + } + + public MoveModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY, final IEaseFunction pEaseFunction) { + this(pDuration, pFromX, pToX, pFromY, pToY, null, pEaseFunction); + } + + public MoveModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromX, pToX, pFromY, pToY, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public MoveModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromX, pToX, pFromY, pToY, pEntityModifierListener, pEaseFunction); + } + + protected MoveModifier(final MoveModifier pMoveModifier) { + super(pMoveModifier); + } + + @Override + public MoveModifier clone(){ + return new MoveModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValues(final IEntity pEntity, final float pX, final float pY) { + pEntity.setPosition(pX, pY); + } + + @Override + protected void onSetValues(final IEntity pEntity, final float pPercentageDone, final float pX, final float pY) { + pEntity.setPosition(pX, pY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/MoveXModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/MoveXModifier.java new file mode 100644 index 0000000..2c254ac --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/MoveXModifier.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 12:03:22 - 30.08.2010 + */ +public class MoveXModifier extends SingleValueSpanShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public MoveXModifier(final float pDuration, final float pFromX, final float pToX) { + this(pDuration, pFromX, pToX, null, IEaseFunction.DEFAULT); + } + + public MoveXModifier(final float pDuration, final float pFromX, final float pToX, final IEaseFunction pEaseFunction) { + this(pDuration, pFromX, pToX, null, pEaseFunction); + } + + public MoveXModifier(final float pDuration, final float pFromX, final float pToX, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromX, pToX, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public MoveXModifier(final float pDuration, final float pFromX, final float pToX, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromX, pToX, pEntityModifierListener, pEaseFunction); + } + + protected MoveXModifier(final MoveXModifier pMoveXModifier) { + super(pMoveXModifier); + } + + @Override + public MoveXModifier clone(){ + return new MoveXModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValue(final IEntity pEntity, final float pX) { + pEntity.setPosition(pX, pEntity.getY()); + } + + @Override + protected void onSetValue(final IEntity pEntity, final float pPercentageDone, final float pX) { + pEntity.setPosition(pX, pEntity.getY()); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/MoveYModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/MoveYModifier.java new file mode 100644 index 0000000..87a511b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/MoveYModifier.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 12:04:21 - 30.08.2010 + */ +public class MoveYModifier extends SingleValueSpanShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public MoveYModifier(final float pDuration, final float pFromY, final float pToY) { + this(pDuration, pFromY, pToY, null, IEaseFunction.DEFAULT); + } + + public MoveYModifier(final float pDuration, final float pFromY, final float pToY, final IEaseFunction pEaseFunction) { + this(pDuration, pFromY, pToY, null, pEaseFunction); + } + + public MoveYModifier(final float pDuration, final float pFromY, final float pToY, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromY, pToY, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public MoveYModifier(final float pDuration, final float pFromY, final float pToY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromY, pToY, pEntityModifierListener, pEaseFunction); + } + + protected MoveYModifier(final MoveYModifier pMoveYModifier) { + super(pMoveYModifier); + } + + @Override + public MoveYModifier clone(){ + return new MoveYModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValue(final IEntity pEntity, final float pY) { + pEntity.setPosition(pEntity.getX(), pY); + } + + @Override + protected void onSetValue(final IEntity pEntity, final float pPercentageDone, final float pY) { + pEntity.setPosition(pEntity.getX(), pY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/ParallelEntityModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/ParallelEntityModifier.java new file mode 100644 index 0000000..73047f3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/ParallelEntityModifier.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ParallelModifier; + +/** + * @author Nicolas Gramlich + * @since 12:40:31 - 03.09.2010 + */ +public class ParallelEntityModifier extends ParallelModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ParallelEntityModifier(final IEntityModifier... pEntityModifiers) throws IllegalArgumentException { + super(pEntityModifiers); + } + + public ParallelEntityModifier(final IEntityModifierListener pEntityModifierListener, final IEntityModifier... pEntityModifiers) throws IllegalArgumentException { + super(pEntityModifierListener, pEntityModifiers); + } + + protected ParallelEntityModifier(final ParallelEntityModifier pParallelShapeModifier) { + super(pParallelShapeModifier); + } + + @Override + public ParallelEntityModifier clone() { + return new ParallelEntityModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/PathModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/PathModifier.java new file mode 100644 index 0000000..5d1e6e9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/PathModifier.java @@ -0,0 +1,316 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.IModifier; +import org.anddev.andengine.util.modifier.SequenceModifier; +import org.anddev.andengine.util.modifier.SequenceModifier.ISubSequenceModifierListener; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +import android.util.FloatMath; + +/** + * @author Nicolas Gramlich + * @since 16:50:02 - 16.06.2010 + */ +public class PathModifier extends EntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final SequenceModifier mSequenceModifier; + + private IPathModifierListener mPathModifierListener; + + private final Path mPath; + + // =========================================================== + // Constructors + // =========================================================== + + public PathModifier(final float pDuration, final Path pPath) { + this(pDuration, pPath, null, IEaseFunction.DEFAULT); + } + + public PathModifier(final float pDuration, final Path pPath, final IEaseFunction pEaseFunction) { + this(pDuration, pPath, null, pEaseFunction); + } + + public PathModifier(final float pDuration, final Path pPath, final IEntityModifierListener pEntityModiferListener) { + this(pDuration, pPath, pEntityModiferListener, null, IEaseFunction.DEFAULT); + } + + public PathModifier(final float pDuration, final Path pPath, final IEntityModifierListener pEntityModiferListener, final IEaseFunction pEaseFunction) { + this(pDuration, pPath, pEntityModiferListener, null, pEaseFunction); + } + + public PathModifier(final float pDuration, final Path pPath, final IEntityModifierListener pEntityModiferListener, final IPathModifierListener pPathModifierListener) throws IllegalArgumentException { + this(pDuration, pPath, pEntityModiferListener, pPathModifierListener, IEaseFunction.DEFAULT); + } + + public PathModifier(final float pDuration, final Path pPath, final IEntityModifierListener pEntityModiferListener, final IPathModifierListener pPathModifierListener, final IEaseFunction pEaseFunction) throws IllegalArgumentException { + final int pathSize = pPath.getSize(); + + if (pathSize < 2) { + throw new IllegalArgumentException("Path needs at least 2 waypoints!"); + } + + this.mPath = pPath; + this.mModifierListener = pEntityModiferListener; + this.mPathModifierListener = pPathModifierListener; + + final MoveModifier[] moveModifiers = new MoveModifier[pathSize - 1]; + + final float[] coordinatesX = pPath.getCoordinatesX(); + final float[] coordinatesY = pPath.getCoordinatesY(); + + final float velocity = pPath.getLength() / pDuration; + + final int modifierCount = moveModifiers.length; + for(int i = 0; i < modifierCount; i++) { + final float duration = pPath.getSegmentLength(i) / velocity; + + if(i == 0) { + /* When the first modifier is initialized, we have to + * fire onWaypointPassed of mPathModifierListener. */ + moveModifiers[i] = new MoveModifier(duration, coordinatesX[i], coordinatesX[i + 1], coordinatesY[i], coordinatesY[i + 1], null, pEaseFunction){ + @Override + protected void onManagedInitialize(final IEntity pEntity) { + super.onManagedInitialize(pEntity); + if(PathModifier.this.mPathModifierListener != null) { + PathModifier.this.mPathModifierListener.onWaypointPassed(PathModifier.this, pEntity, 0); + } + } + }; + } else { + moveModifiers[i] = new MoveModifier(duration, coordinatesX[i], coordinatesX[i + 1], coordinatesY[i], coordinatesY[i + 1], null, pEaseFunction); + } + } + + + /* Create a new SequenceModifier and register the listeners that + * call through to mEntityModifierListener and mPathModifierListener. */ + this.mSequenceModifier = new SequenceModifier( + new IEntityModifierListener() { + @Override + public void onModifierFinished(final IModifier pEntityModifier, final IEntity pEntity) { + if(PathModifier.this.mPathModifierListener != null) { + PathModifier.this.mPathModifierListener.onWaypointPassed(PathModifier.this, pEntity, modifierCount); + } + if(PathModifier.this.mModifierListener != null) { + PathModifier.this.mModifierListener.onModifierFinished(PathModifier.this, pEntity); + } + } + }, + new ISubSequenceModifierListener() { + @Override + public void onSubSequenceFinished(final IModifier pEntityModifier, final IEntity pEntity, final int pIndex) { + if(PathModifier.this.mPathModifierListener != null) { + PathModifier.this.mPathModifierListener.onWaypointPassed(PathModifier.this, pEntity, pIndex); + } + } + }, + moveModifiers + ); + } + + protected PathModifier(final PathModifier pPathModifier) { + this.mPath = pPathModifier.mPath.clone(); + this.mSequenceModifier = pPathModifier.mSequenceModifier.clone(); + } + + @Override + public PathModifier clone() { + return new PathModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Path getPath() { + return this.mPath; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isFinished() { + return this.mSequenceModifier.isFinished(); + } + + @Override + public float getDuration() { + return this.mSequenceModifier.getDuration(); + } + + public IPathModifierListener getPathModifierListener() { + return this.mPathModifierListener; + } + + public void setPathModifierListener(final IPathModifierListener pPathModifierListener) { + this.mPathModifierListener = pPathModifierListener; + } + + @Override + public void reset() { + this.mSequenceModifier.reset(); + } + + @Override + public void onUpdate(final float pSecondsElapsed, final IEntity pEntity) { + this.mSequenceModifier.onUpdate(pSecondsElapsed, pEntity); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IPathModifierListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + public void onWaypointPassed(final PathModifier pPathModifier, final IEntity pEntity, final int pWaypointIndex); + } + + public static class Path { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float[] mCoordinatesX; + private final float[] mCoordinatesY; + + private int mIndex; + private boolean mLengthChanged = false; + private float mLength; + + // =========================================================== + // Constructors + // =========================================================== + + public Path(final int pLength) { + this.mCoordinatesX = new float[pLength]; + this.mCoordinatesY = new float[pLength]; + + this.mIndex = 0; + this.mLengthChanged = false; + } + + public Path(final float[] pCoordinatesX, final float[] pCoordinatesY) throws IllegalArgumentException { + if (pCoordinatesX.length != pCoordinatesY.length) { + throw new IllegalArgumentException("Coordinate-Arrays must have the same length."); + } + + this.mCoordinatesX = pCoordinatesX; + this.mCoordinatesY = pCoordinatesY; + + this.mIndex = pCoordinatesX.length; + this.mLengthChanged = true; + } + + public Path(final Path pPath) { + final int size = pPath.getSize(); + this.mCoordinatesX = new float[size]; + this.mCoordinatesY = new float[size]; + + System.arraycopy(pPath.mCoordinatesX, 0, this.mCoordinatesX, 0, size); + System.arraycopy(pPath.mCoordinatesY, 0, this.mCoordinatesY, 0, size); + + this.mIndex = pPath.mIndex; + this.mLengthChanged = pPath.mLengthChanged; + this.mLength = pPath.mLength; + } + + @Override + public Path clone() { + return new Path(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Path to(final float pX, final float pY) { + this.mCoordinatesX[this.mIndex] = pX; + this.mCoordinatesY[this.mIndex] = pY; + + this.mIndex++; + + this.mLengthChanged = true; + + return this; + } + + public float[] getCoordinatesX() { + return this.mCoordinatesX; + } + + public float[] getCoordinatesY() { + return this.mCoordinatesY; + } + + public int getSize() { + return this.mCoordinatesX.length; + } + + public float getLength() { + if(this.mLengthChanged) { + this.updateLength(); + } + return this.mLength; + } + + public float getSegmentLength(final int pSegmentIndex) { + final float[] coordinatesX = this.mCoordinatesX; + final float[] coordinatesY = this.mCoordinatesY; + + final int nextSegmentIndex = pSegmentIndex + 1; + + final float dx = coordinatesX[pSegmentIndex] - coordinatesX[nextSegmentIndex]; + final float dy = coordinatesY[pSegmentIndex] - coordinatesY[nextSegmentIndex]; + + return FloatMath.sqrt(dx * dx + dy * dy); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + private void updateLength() { + float length = 0.0f; + + for(int i = this.mIndex - 2; i >= 0; i--) { + length += this.getSegmentLength(i); + } + this.mLength = length; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } + +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/RotationAtModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/RotationAtModifier.java new file mode 100644 index 0000000..0592bbc --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/RotationAtModifier.java @@ -0,0 +1,83 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + + +/** + * @author Nicolas Gramlich + * @since 21:59:38 - 06.07.2010 + */ +public class RotationAtModifier extends RotationModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mRotationCenterX; + private final float mRotationCenterY; + + // =========================================================== + // Constructors + // =========================================================== + + public RotationAtModifier(final float pDuration, final float pFromRotation, final float pToRotation, final float pRotationCenterX, final float pRotationCenterY) { + super(pDuration, pFromRotation, pToRotation, IEaseFunction.DEFAULT); + this.mRotationCenterX = pRotationCenterX; + this.mRotationCenterY = pRotationCenterY; + } + + public RotationAtModifier(final float pDuration, final float pFromRotation, final float pToRotation, final float pRotationCenterX, final float pRotationCenterY, final IEaseFunction pEaseFunction) { + super(pDuration, pFromRotation, pToRotation, pEaseFunction); + this.mRotationCenterX = pRotationCenterX; + this.mRotationCenterY = pRotationCenterY; + } + + public RotationAtModifier(final float pDuration, final float pFromRotation, final float pToRotation, final float pRotationCenterX, final float pRotationCenterY, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromRotation, pToRotation, pEntityModifierListener, IEaseFunction.DEFAULT); + this.mRotationCenterX = pRotationCenterX; + this.mRotationCenterY = pRotationCenterY; + } + + public RotationAtModifier(final float pDuration, final float pFromRotation, final float pToRotation, final float pRotationCenterX, final float pRotationCenterY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromRotation, pToRotation, pEntityModifierListener, pEaseFunction); + this.mRotationCenterX = pRotationCenterX; + this.mRotationCenterY = pRotationCenterY; + } + + protected RotationAtModifier(final RotationAtModifier pRotationAtModifier) { + super(pRotationAtModifier); + this.mRotationCenterX = pRotationAtModifier.mRotationCenterX; + this.mRotationCenterY = pRotationAtModifier.mRotationCenterY; + } + + @Override + public RotationAtModifier clone(){ + return new RotationAtModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedInitialize(final IEntity pEntity) { + super.onManagedInitialize(pEntity); + pEntity.setRotationCenter(this.mRotationCenterX, this.mRotationCenterY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/RotationByModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/RotationByModifier.java new file mode 100644 index 0000000..2566343 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/RotationByModifier.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; + +/** + * @author Nicolas Gramlich + * @since 16:12:52 - 19.03.2010 + */ +public class RotationByModifier extends SingleValueChangeShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public RotationByModifier(final float pDuration, final float pRotation) { + super(pDuration, pRotation); + } + + protected RotationByModifier(final RotationByModifier pRotationByModifier) { + super(pRotationByModifier); + } + + @Override + public RotationByModifier clone(){ + return new RotationByModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onChangeValue(final IEntity pEntity, final float pValue) { + pEntity.setRotation(pEntity.getRotation() + pValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/RotationModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/RotationModifier.java new file mode 100644 index 0000000..935e5dd --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/RotationModifier.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 16:12:52 - 19.03.2010 + */ +public class RotationModifier extends SingleValueSpanShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public RotationModifier(final float pDuration, final float pFromRotation, final float pToRotation) { + this(pDuration, pFromRotation, pToRotation, null, IEaseFunction.DEFAULT); + } + + public RotationModifier(final float pDuration, final float pFromRotation, final float pToRotation, final IEaseFunction pEaseFunction) { + this(pDuration, pFromRotation, pToRotation, null, pEaseFunction); + } + + public RotationModifier(final float pDuration, final float pFromRotation, final float pToRotation, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromRotation, pToRotation, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public RotationModifier(final float pDuration, final float pFromRotation, final float pToRotation, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromRotation, pToRotation, pEntityModifierListener, pEaseFunction); + } + + protected RotationModifier(final RotationModifier pRotationModifier) { + super(pRotationModifier); + } + + @Override + public RotationModifier clone(){ + return new RotationModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValue(final IEntity pEntity, final float pRotation) { + pEntity.setRotation(pRotation); + } + + @Override + protected void onSetValue(final IEntity pEntity, final float pPercentageDone, final float pRotation) { + pEntity.setRotation(pRotation); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/ScaleAtModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/ScaleAtModifier.java new file mode 100644 index 0000000..10f4c2a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/ScaleAtModifier.java @@ -0,0 +1,93 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + + +/** + * @author Nicolas Gramlich + * @since 21:53:30 - 06.07.2010 + */ +public class ScaleAtModifier extends ScaleModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mScaleCenterX; + private final float mScaleCenterY; + + // =========================================================== + // Constructors + // =========================================================== + + public ScaleAtModifier(final float pDuration, final float pFromScale, final float pToScale, final float pScaleCenterX, final float pScaleCenterY) { + this(pDuration, pFromScale, pToScale, pScaleCenterX, pScaleCenterY, IEaseFunction.DEFAULT); + } + + public ScaleAtModifier(final float pDuration, final float pFromScale, final float pToScale, final float pScaleCenterX, final float pScaleCenterY, final IEaseFunction pEaseFunction) { + this(pDuration, pFromScale, pToScale, pScaleCenterX, pScaleCenterY, null, pEaseFunction); + } + + public ScaleAtModifier(final float pDuration, final float pFromScale, final float pToScale, final float pScaleCenterX, final float pScaleCenterY, final IEntityModifierListener pEntityModifierListener) { + this(pDuration, pFromScale, pToScale, pScaleCenterX, pScaleCenterY, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public ScaleAtModifier(final float pDuration, final float pFromScale, final float pToScale, final float pScaleCenterX, final float pScaleCenterY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + this(pDuration, pFromScale, pToScale, pFromScale, pToScale, pScaleCenterX, pScaleCenterY, pEntityModifierListener, pEaseFunction); + } + + public ScaleAtModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final float pScaleCenterX, final float pScaleCenterY) { + this(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pScaleCenterX, pScaleCenterY, IEaseFunction.DEFAULT); + } + + public ScaleAtModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final float pScaleCenterX, final float pScaleCenterY, final IEaseFunction pEaseFunction) { + this(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pScaleCenterX, pScaleCenterY, null, pEaseFunction); + } + + public ScaleAtModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final float pScaleCenterX, final float pScaleCenterY, final IEntityModifierListener pEntityModifierListener) { + this(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pScaleCenterX, pScaleCenterY, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public ScaleAtModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final float pScaleCenterX, final float pScaleCenterY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pEntityModifierListener, pEaseFunction); + this.mScaleCenterX = pScaleCenterX; + this.mScaleCenterY = pScaleCenterY; + } + + protected ScaleAtModifier(final ScaleAtModifier pScaleAtModifier) { + super(pScaleAtModifier); + this.mScaleCenterX = pScaleAtModifier.mScaleCenterX; + this.mScaleCenterY = pScaleAtModifier.mScaleCenterY; + } + + @Override + public ScaleAtModifier clone(){ + return new ScaleAtModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedInitialize(final IEntity pEntity) { + super.onManagedInitialize(pEntity); + pEntity.setScaleCenter(this.mScaleCenterX, this.mScaleCenterY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/ScaleModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/ScaleModifier.java new file mode 100644 index 0000000..19685e2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/ScaleModifier.java @@ -0,0 +1,89 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 23:37:53 - 19.03.2010 + */ +public class ScaleModifier extends DoubleValueSpanShapeModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ScaleModifier(final float pDuration, final float pFromScale, final float pToScale) { + this(pDuration, pFromScale, pToScale, null, IEaseFunction.DEFAULT); + } + + public ScaleModifier(final float pDuration, final float pFromScale, final float pToScale, final IEaseFunction pEaseFunction) { + this(pDuration, pFromScale, pToScale, null, pEaseFunction); + } + + public ScaleModifier(final float pDuration, final float pFromScale, final float pToScale, final IEntityModifierListener pEntityModifierListener) { + this(pDuration, pFromScale, pToScale, pFromScale, pToScale, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public ScaleModifier(final float pDuration, final float pFromScale, final float pToScale, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + this(pDuration, pFromScale, pToScale, pFromScale, pToScale, pEntityModifierListener, pEaseFunction); + } + + public ScaleModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY) { + this(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, null, IEaseFunction.DEFAULT); + } + + public ScaleModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final IEaseFunction pEaseFunction) { + this(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, null, pEaseFunction); + } + + public ScaleModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pEntityModifierListener, IEaseFunction.DEFAULT); + } + + public ScaleModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pEntityModifierListener, pEaseFunction); + } + + protected ScaleModifier(final ScaleModifier pScaleModifier) { + super(pScaleModifier); + } + + @Override + public ScaleModifier clone(){ + return new ScaleModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValues(final IEntity pEntity, final float pScaleA, final float pScaleB) { + pEntity.setScale(pScaleA, pScaleB); + } + + @Override + protected void onSetValues(final IEntity pEntity, final float pPercentageDone, final float pScaleA, final float pScaleB) { + pEntity.setScale(pScaleA, pScaleB); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/SequenceEntityModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/SequenceEntityModifier.java new file mode 100644 index 0000000..3179e04 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/SequenceEntityModifier.java @@ -0,0 +1,69 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.SequenceModifier; + +/** + * @author Nicolas Gramlich + * @since 12:41:15 - 03.09.2010 + */ +public class SequenceEntityModifier extends SequenceModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SequenceEntityModifier(final IEntityModifier... pEntityModifiers) throws IllegalArgumentException { + super(pEntityModifiers); + } + + public SequenceEntityModifier(final IEntityModifierListener pEntityModifierListener, final IEntityModifier... pEntityModifiers) throws IllegalArgumentException { + super(pEntityModifierListener, pEntityModifiers); + } + + public SequenceEntityModifier(final IEntityModifierListener pEntityModifierListener, final ISubSequenceShapeModifierListener pSubSequenceShapeModifierListener, final IEntityModifier... pEntityModifiers) throws IllegalArgumentException { + super(pEntityModifierListener, pSubSequenceShapeModifierListener, pEntityModifiers); + } + + protected SequenceEntityModifier(final SequenceEntityModifier pSequenceShapeModifier) { + super(pSequenceShapeModifier); + } + + @Override + public SequenceEntityModifier clone() { + return new SequenceEntityModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface ISubSequenceShapeModifierListener extends ISubSequenceModifierListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/SingleValueChangeShapeModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/SingleValueChangeShapeModifier.java new file mode 100644 index 0000000..7715b95 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/SingleValueChangeShapeModifier.java @@ -0,0 +1,50 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.BaseSingleValueChangeModifier; + +/** + * @author Nicolas Gramlich + * @since 15:34:35 - 17.06.2010 + */ +public abstract class SingleValueChangeShapeModifier extends BaseSingleValueChangeModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SingleValueChangeShapeModifier(final float pDuration, final float pValueChange) { + super(pDuration, pValueChange); + } + + public SingleValueChangeShapeModifier(final float pDuration, final float pValueChange, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pValueChange, pEntityModifierListener); + } + + protected SingleValueChangeShapeModifier(final SingleValueChangeShapeModifier pSingleValueChangeShapeModifier) { + super(pSingleValueChangeShapeModifier); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/SingleValueSpanShapeModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/SingleValueSpanShapeModifier.java new file mode 100644 index 0000000..bd15413 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/SingleValueSpanShapeModifier.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.BaseSingleValueSpanModifier; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 23:29:22 - 19.03.2010 + */ +public abstract class SingleValueSpanShapeModifier extends BaseSingleValueSpanModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SingleValueSpanShapeModifier(final float pDuration, final float pFromValue, final float pToValue) { + super(pDuration, pFromValue, pToValue); + } + + public SingleValueSpanShapeModifier(final float pDuration, final float pFromValue, final float pToValue, final IEaseFunction pEaseFunction) { + super(pDuration, pFromValue, pToValue, pEaseFunction); + } + + public SingleValueSpanShapeModifier(final float pDuration, final float pFromValue, final float pToValue, final IEntityModifierListener pEntityModifierListener) { + super(pDuration, pFromValue, pToValue, pEntityModifierListener); + } + + public SingleValueSpanShapeModifier(final float pDuration, final float pFromValue, final float pToValue, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromValue, pToValue, pEntityModifierListener, pEaseFunction); + } + + protected SingleValueSpanShapeModifier(final SingleValueSpanShapeModifier pSingleValueSpanShapeModifier) { + super(pSingleValueSpanShapeModifier); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/modifier/TripleValueSpanShapeModifier.java b/AndEngine/src/org/anddev/andengine/entity/modifier/TripleValueSpanShapeModifier.java new file mode 100644 index 0000000..3e2d51e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/modifier/TripleValueSpanShapeModifier.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.entity.modifier; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.util.modifier.BaseTripleValueSpanModifier; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 15:35:18 - 29.06.2010 + */ +public abstract class TripleValueSpanShapeModifier extends BaseTripleValueSpanModifier implements IEntityModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TripleValueSpanShapeModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final float pFromValueC, final float pToValueC, final IEaseFunction pEaseFunction) { + super(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, pFromValueC, pToValueC, pEaseFunction); + } + + public TripleValueSpanShapeModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final float pFromValueC, final float pToValueC, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, pFromValueC, pToValueC, pEntityModifierListener, pEaseFunction); + } + + protected TripleValueSpanShapeModifier(final TripleValueSpanShapeModifier pTripleValueSpanModifier) { + super(pTripleValueSpanModifier); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/Particle.java b/AndEngine/src/org/anddev/andengine/entity/particle/Particle.java new file mode 100644 index 0000000..08c9e6d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/Particle.java @@ -0,0 +1,101 @@ +package org.anddev.andengine.entity.particle; + +import org.anddev.andengine.engine.handler.physics.PhysicsHandler; +import org.anddev.andengine.entity.sprite.Sprite; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 19:37:13 - 14.03.2010 + */ +public class Particle extends Sprite { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mLifeTime; + private float mDeathTime = -1; + boolean mDead = false; + private final PhysicsHandler mPhysicsHandler = new PhysicsHandler(this); + + // =========================================================== + // Constructors + // ===========================================================; + + public Particle(final float pX, final float pY, final TextureRegion pTextureRegion) { + super(pX, pY, pTextureRegion); + this.mLifeTime = 0; + } + + public Particle(final float pX, final float pY, final TextureRegion pTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pTextureRegion, pRectangleVertexBuffer); + this.mLifeTime = 0; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getLifeTime() { + return this.mLifeTime; + } + + public float getDeathTime() { + return this.mDeathTime; + } + + public void setDeathTime(final float pDeathTime) { + this.mDeathTime = pDeathTime; + } + + public boolean isDead() { + return this.mDead ; + } + + public void setDead(final boolean pDead) { + this.mDead = pDead; + } + + public PhysicsHandler getPhysicsHandler() { + return this.mPhysicsHandler; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedUpdate(final float pSecondsElapsed) { + if(!this.mDead){ + this.mLifeTime += pSecondsElapsed; + this.mPhysicsHandler.onUpdate(pSecondsElapsed); + super.onManagedUpdate(pSecondsElapsed); + final float deathTime = this.mDeathTime; + if(deathTime != -1 && this.mLifeTime > deathTime) { + this.setDead(true); + } + } + } + + // =========================================================== + // Methods + // =========================================================== + + @Override + public void reset() { + super.reset(); + this.mPhysicsHandler.reset(); + this.mDead = false; + this.mDeathTime = -1; + this.mLifeTime = 0; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/ParticleSystem.java b/AndEngine/src/org/anddev/andengine/entity/particle/ParticleSystem.java new file mode 100644 index 0000000..781c070 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/ParticleSystem.java @@ -0,0 +1,258 @@ +package org.anddev.andengine.entity.particle; + +import static org.anddev.andengine.util.MathUtils.RANDOM; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import java.util.ArrayList; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.Entity; +import org.anddev.andengine.entity.particle.emitter.IParticleEmitter; +import org.anddev.andengine.entity.particle.emitter.RectangleParticleEmitter; +import org.anddev.andengine.entity.particle.initializer.IParticleInitializer; +import org.anddev.andengine.entity.particle.modifier.IParticleModifier; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; + +import android.util.FloatMath; + +/** + * @author Nicolas Gramlich + * @since 19:42:27 - 14.03.2010 + */ +public class ParticleSystem extends Entity { + // =========================================================== + // Constants + // =========================================================== + + private static final int BLENDFUNCTION_SOURCE_DEFAULT = GL10.GL_ONE; + private static final int BLENDFUNCTION_DESTINATION_DEFAULT = GL10.GL_ONE_MINUS_SRC_ALPHA; + + private final float[] POSITION_OFFSET = new float[2]; + + // =========================================================== + // Fields + // =========================================================== + + private final IParticleEmitter mParticleEmitter; + + private final Particle[] mParticles; + + private int mSourceBlendFunction = BLENDFUNCTION_SOURCE_DEFAULT; + private int mDestinationBlendFunction = BLENDFUNCTION_DESTINATION_DEFAULT; + + private final ArrayList mParticleInitializers = new ArrayList(); + private final ArrayList mParticleModifiers = new ArrayList(); + + private final float mRateMinimum; + private final float mRateMaximum; + + private final TextureRegion mTextureRegion; + + private boolean mParticlesSpawnEnabled = true; + + private final int mParticlesMaximum; + private int mParticlesAlive; + private float mParticlesDueToSpawn; + + private int mParticleModifierCount; + private int mParticleInitializerCount; + + private RectangleVertexBuffer mSharedParticleVertexBuffer; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * Creates a ParticleSystem with a {@link RectangleParticleEmitter}. + * @deprecated Instead use {@link ParticleSystem#ParticleSystem(IParticleEmitter, float, float, int, TextureRegion)}. + */ + @Deprecated + public ParticleSystem(final float pX, final float pY, final float pWidth, final float pHeight, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final TextureRegion pTextureRegion) { + this(new RectangleParticleEmitter(pX + pWidth * 0.5f, pY + pHeight * 0.5f, pWidth, pHeight), pRateMinimum, pRateMaximum, pParticlesMaximum, pTextureRegion); + } + + public ParticleSystem(final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final TextureRegion pTextureRegion) { + super(0, 0); + + this.mParticleEmitter = pParticleEmitter; + this.mParticles = new Particle[pParticlesMaximum]; + this.mRateMinimum = pRateMinimum; + this.mRateMaximum = pRateMaximum; + this.mParticlesMaximum = pParticlesMaximum; + this.mTextureRegion = pTextureRegion; + + this.registerUpdateHandler(this.mParticleEmitter); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isParticlesSpawnEnabled() { + return this.mParticlesSpawnEnabled; + } + + public void setParticlesSpawnEnabled(final boolean pParticlesSpawnEnabled) { + this.mParticlesSpawnEnabled = pParticlesSpawnEnabled; + } + + public void setBlendFunction(final int pSourceBlendFunction, final int pDestinationBlendFunction) { + this.mSourceBlendFunction = pSourceBlendFunction; + this.mDestinationBlendFunction = pDestinationBlendFunction; + } + + public IParticleEmitter getParticleEmitter() { + return this.mParticleEmitter; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void reset() { + super.reset(); + + this.mParticlesDueToSpawn = 0; + this.mParticlesAlive = 0; + } + + @Override + protected void onManagedDraw(final GL10 pGL, final Camera pCamera) { + final Particle[] particles = this.mParticles; + for(int i = this.mParticlesAlive - 1; i >= 0; i--) { + particles[i].onDraw(pGL, pCamera); + } + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed) { + super.onManagedUpdate(pSecondsElapsed); + + if(this.mParticlesSpawnEnabled) { + this.spawnParticles(pSecondsElapsed); + } + + final Particle[] particles = this.mParticles; + + final ArrayList particleModifiers = this.mParticleModifiers; + final int particleModifierCountMinusOne = this.mParticleModifierCount - 1; + + for(int i = this.mParticlesAlive - 1; i >= 0; i--) { + final Particle particle = particles[i]; + + /* Apply all particleModifiers */ + for(int j = particleModifierCountMinusOne; j >= 0; j--) { + particleModifiers.get(j).onUpdateParticle(particle); + } + + particle.onUpdate(pSecondsElapsed); + if(particle.mDead){ + this.mParticlesAlive--; + final int particlesAlive = this.mParticlesAlive; + particles[i] = particles[particlesAlive]; + particles[particlesAlive] = particle; + } + } + } + + // =========================================================== + // Methods + // =========================================================== + + public void addParticleModifier(final IParticleModifier pParticleModifier) { + this.mParticleModifiers.add(pParticleModifier); + this.mParticleModifierCount++; + } + + public void removeParticleModifier(final IParticleModifier pParticleModifier) { + this.mParticleModifierCount--; + this.mParticleModifiers.remove(pParticleModifier); + } + + public void addParticleInitializer(final IParticleInitializer pParticleInitializer) { + this.mParticleInitializers.add(pParticleInitializer); + this.mParticleInitializerCount++; + } + + public void removeParticleInitializer(final IParticleInitializer pParticleInitializer) { + this.mParticleInitializerCount--; + this.mParticleInitializers.remove(pParticleInitializer); + } + + private void spawnParticles(final float pSecondsElapsed) { + final float currentRate = this.determineCurrentRate(); + final float newParticlesThisFrame = currentRate * pSecondsElapsed; + + this.mParticlesDueToSpawn += newParticlesThisFrame; + + final int particlesToSpawnThisFrame = Math.min(this.mParticlesMaximum - this.mParticlesAlive, (int)FloatMath.floor(this.mParticlesDueToSpawn)); + this.mParticlesDueToSpawn -= particlesToSpawnThisFrame; + + for(int i = 0; i < particlesToSpawnThisFrame; i++){ + this.spawnParticle(); + } + } + + private void spawnParticle() { + final Particle[] particles = this.mParticles; + + final int particlesAlive = this.mParticlesAlive; + if(particlesAlive < this.mParticlesMaximum){ + Particle particle = particles[particlesAlive]; + + /* New particle needs to be created. */ + this.mParticleEmitter.getPositionOffset(this.POSITION_OFFSET); + + final float x = this.POSITION_OFFSET[VERTEX_INDEX_X]; + final float y = this.POSITION_OFFSET[VERTEX_INDEX_Y]; + + if(particle != null) { + particle.reset(); + particle.setPosition(x, y); + } else { + if(particlesAlive == 0) { + /* This is the very first particle. */ + particle = new Particle(x, y, this.mTextureRegion); + this.mSharedParticleVertexBuffer = particle.getVertexBuffer(); + } else { + particle = new Particle(x, y, this.mTextureRegion, this.mSharedParticleVertexBuffer); + } + particles[particlesAlive] = particle; + } + particle.setBlendFunction(this.mSourceBlendFunction, this.mDestinationBlendFunction); + + /* Apply particle initializers. */ + { + final ArrayList particleInitializers = this.mParticleInitializers; + for(int i = this.mParticleInitializerCount - 1; i >= 0; i--) { + particleInitializers.get(i).onInitializeParticle(particle); + } + + final ArrayList particleModifiers = this.mParticleModifiers; + for(int i = this.mParticleModifierCount - 1; i >= 0; i--) { + particleModifiers.get(i).onInitializeParticle(particle); + } + } + + this.mParticlesAlive++; + } + } + + private float determineCurrentRate() { + if(this.mRateMinimum == this.mRateMaximum){ + return this.mRateMinimum; + } else { + return (RANDOM.nextFloat() * (this.mRateMaximum - this.mRateMinimum)) + this.mRateMinimum; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseCircleParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseCircleParticleEmitter.java new file mode 100644 index 0000000..3ebd53e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseCircleParticleEmitter.java @@ -0,0 +1,75 @@ +package org.anddev.andengine.entity.particle.emitter; + + +/** + * @author Nicolas Gramlich + * @since 20:14:43 - 01.10.2010 + */ +public abstract class BaseCircleParticleEmitter extends BaseParticleEmitter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mRadiusX; + protected float mRadiusY; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseCircleParticleEmitter(final float pCenterX, final float pCenterY, final float pRadius) { + this(pCenterX, pCenterY, pRadius, pRadius); + } + + public BaseCircleParticleEmitter(final float pCenterX, final float pCenterY, final float pRadiusX, final float pRadiusY) { + super(pCenterX, pCenterY); + this.setRadiusX(pRadiusX); + this.setRadiusY(pRadiusY); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getRadiusX() { + return this.mRadiusX; + } + + public void setRadiusX(final float pRadiusX) { + this.mRadiusX = pRadiusX; + } + + public float getRadiusY() { + return this.mRadiusY; + } + + public void setRadiusY(final float pRadiusY) { + this.mRadiusY = pRadiusY; + } + + public void setRadius(final float pRadius) { + this.mRadiusX = pRadius; + this.mRadiusY = pRadius; + } + + public void setRadius(final float pRadiusX, final float pRadiusY) { + this.mRadiusX = pRadiusX; + this.mRadiusY = pRadiusY; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseParticleEmitter.java new file mode 100644 index 0000000..66c0891 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseParticleEmitter.java @@ -0,0 +1,74 @@ +package org.anddev.andengine.entity.particle.emitter; + +/** + * @author Nicolas Gramlich + * @since 15:58:12 - 01.10.2010 + */ +public abstract class BaseParticleEmitter implements IParticleEmitter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mCenterX; + protected float mCenterY; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseParticleEmitter(final float pCenterX, final float pCenterY) { + this.mCenterX = pCenterX; + this.mCenterY = pCenterY; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getCenterX() { + return this.mCenterX; + } + + public float getCenterY() { + return this.mCenterY; + } + + public void setCenterX(final float pCenterX) { + this.mCenterX = pCenterX; + } + + public void setCenterY(final float pCenterY) { + this.mCenterY = pCenterY; + } + + public void setCenter(final float pCenterX, final float pCenterY) { + this.mCenterX = pCenterX; + this.mCenterY = pCenterY; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + + } + + @Override + public void reset() { + + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseRectangleParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseRectangleParticleEmitter.java new file mode 100644 index 0000000..cd5b334 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/BaseRectangleParticleEmitter.java @@ -0,0 +1,69 @@ +package org.anddev.andengine.entity.particle.emitter; + + +/** + * @author Nicolas Gramlich + * @since 18:53:18 - 01.10.2010 + */ +public abstract class BaseRectangleParticleEmitter extends BaseParticleEmitter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mWidth; + protected float mHeight; + protected float mWidthHalf; + protected float mHeightHalf; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseRectangleParticleEmitter(final float pCenterX, final float pCenterY, final float pSize) { + this(pCenterX, pCenterY, pSize, pSize); + } + + public BaseRectangleParticleEmitter(final float pCenterX, final float pCenterY, final float pWidth, final float pHeight) { + super(pCenterX, pCenterY); + this.setWidth(pWidth); + this.setHeight(pHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getWidth() { + return this.mWidth; + } + + public void setWidth(final float pWidth) { + this.mWidth = pWidth; + this.mWidthHalf = pWidth * 0.5f; + } + + public float getHeight() { + return this.mHeight; + } + + public void setHeight(final float pHeight) { + this.mHeight = pHeight; + this.mHeightHalf = pHeight * 0.5f; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java new file mode 100644 index 0000000..d292c6a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java @@ -0,0 +1,58 @@ +package org.anddev.andengine.entity.particle.emitter; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import org.anddev.andengine.util.MathUtils; +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Nicolas Gramlich + * @since 20:18:41 - 01.10.2010 + */ +public class CircleOutlineParticleEmitter extends BaseCircleParticleEmitter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public CircleOutlineParticleEmitter(final float pCenterX, final float pCenterY, final float pRadius) { + super(pCenterX, pCenterY, pRadius); + } + + public CircleOutlineParticleEmitter(final float pCenterX, final float pCenterY, final float pRadiusX, final float pRadiusY) { + super(pCenterX, pCenterY, pRadiusX, pRadiusY); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void getPositionOffset(final float[] pOffset) { + final float random = MathUtils.RANDOM.nextFloat() * MathConstants.PI * 2; + pOffset[VERTEX_INDEX_X] = this.mCenterX + FloatMath.cos(random) * this.mRadiusX; + pOffset[VERTEX_INDEX_Y] = this.mCenterY + FloatMath.sin(random) * this.mRadiusY; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/CircleParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/CircleParticleEmitter.java new file mode 100644 index 0000000..bc1a87b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/CircleParticleEmitter.java @@ -0,0 +1,58 @@ +package org.anddev.andengine.entity.particle.emitter; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import org.anddev.andengine.util.MathUtils; +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Nicolas Gramlich + * @since 20:18:41 - 01.10.2010 + */ +public class CircleParticleEmitter extends BaseCircleParticleEmitter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public CircleParticleEmitter(final float pCenterX, final float pCenterY, final float pRadius) { + super(pCenterX, pCenterY, pRadius); + } + + public CircleParticleEmitter(final float pCenterX, final float pCenterY, final float pRadiusX, final float pRadiusY) { + super(pCenterX, pCenterY, pRadiusX, pRadiusY); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void getPositionOffset(final float[] pOffset) { + final float random = MathUtils.RANDOM.nextFloat() * MathConstants.PI * 2; + pOffset[VERTEX_INDEX_X] = this.mCenterX + FloatMath.cos(random) * this.mRadiusX * MathUtils.RANDOM.nextFloat(); + pOffset[VERTEX_INDEX_Y] = this.mCenterY + FloatMath.sin(random) * this.mRadiusY * MathUtils.RANDOM.nextFloat(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/IParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/IParticleEmitter.java new file mode 100644 index 0000000..6e553b9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/IParticleEmitter.java @@ -0,0 +1,19 @@ +package org.anddev.andengine.entity.particle.emitter; + +import org.anddev.andengine.engine.handler.IUpdateHandler; + +/** + * @author Nicolas Gramlich + * @since 15:48:09 - 01.10.2010 + */ +public interface IParticleEmitter extends IUpdateHandler { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void getPositionOffset(final float[] pOffset); +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/PointParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/PointParticleEmitter.java new file mode 100644 index 0000000..6a76739 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/PointParticleEmitter.java @@ -0,0 +1,48 @@ +package org.anddev.andengine.entity.particle.emitter; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +/** + * @author Nicolas Gramlich + * @since 23:14:42 - 01.10.2010 + */ +public class PointParticleEmitter extends BaseParticleEmitter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public PointParticleEmitter(final float pCenterX, final float pCenterY) { + super(pCenterX, pCenterY); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void getPositionOffset(final float[] pOffset) { + pOffset[VERTEX_INDEX_X] = this.mCenterX; + pOffset[VERTEX_INDEX_Y] = this.mCenterY; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/RectangleOutlineParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/RectangleOutlineParticleEmitter.java new file mode 100644 index 0000000..2138c4d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/RectangleOutlineParticleEmitter.java @@ -0,0 +1,50 @@ +package org.anddev.andengine.entity.particle.emitter; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import org.anddev.andengine.util.MathUtils; + +/** + * @author Nicolas Gramlich + * @since 15:48:00 - 01.10.2010 + */ +public class RectangleOutlineParticleEmitter extends BaseRectangleParticleEmitter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public RectangleOutlineParticleEmitter(final float pCenterX, final float pCenterY, final float pWidth, final float pHeight) { + super(pCenterX, pCenterY, pWidth, pHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void getPositionOffset(final float[] pOffset) { + pOffset[VERTEX_INDEX_X] = this.mCenterX + MathUtils.randomSign() * this.mWidthHalf; + pOffset[VERTEX_INDEX_Y] = this.mCenterY + MathUtils.randomSign() * this.mHeightHalf; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/emitter/RectangleParticleEmitter.java b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/RectangleParticleEmitter.java new file mode 100644 index 0000000..8c5bfaa --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/emitter/RectangleParticleEmitter.java @@ -0,0 +1,50 @@ +package org.anddev.andengine.entity.particle.emitter; + +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_X; +import static org.anddev.andengine.util.constants.Constants.VERTEX_INDEX_Y; + +import org.anddev.andengine.util.MathUtils; + +/** + * @author Nicolas Gramlich + * @since 15:48:00 - 01.10.2010 + */ +public class RectangleParticleEmitter extends BaseRectangleParticleEmitter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public RectangleParticleEmitter(final float pCenterX, final float pCenterY, final float pWidth, final float pHeight) { + super(pCenterX, pCenterY, pWidth, pHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void getPositionOffset(final float[] pOffset) { + pOffset[VERTEX_INDEX_X] = this.mCenterX - this.mWidthHalf + MathUtils.RANDOM.nextFloat() * this.mWidth; + pOffset[VERTEX_INDEX_Y] = this.mCenterY - this.mHeightHalf + MathUtils.RANDOM.nextFloat() * this.mHeight; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/AccelerationInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/AccelerationInitializer.java new file mode 100644 index 0000000..fc06834 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/AccelerationInitializer.java @@ -0,0 +1,97 @@ +package org.anddev.andengine.entity.particle.initializer; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 21:21:10 - 14.03.2010 + */ +public class AccelerationInitializer extends BaseDoubleValueInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public AccelerationInitializer(final float pAcceleration) { + this(pAcceleration, pAcceleration); + } + + public AccelerationInitializer(final float pAccelerationX, final float pAccelerationY) { + this(pAccelerationX, pAccelerationX, pAccelerationY, pAccelerationY); + } + + public AccelerationInitializer(final float pMinAccelerationX, final float pMaxAccelerationX, final float pMinAccelerationY, final float pMaxAccelerationY) { + super(pMinAccelerationX, pMaxAccelerationX, pMinAccelerationY, pMaxAccelerationY); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getMinAccelerationX() { + return this.mMinValue; + } + + public float getMaxAccelerationX() { + return this.mMaxValue; + } + + public float getMinAccelerationY() { + return this.mMinValueB; + } + + public float getMaxAccelerationY() { + return this.mMaxValueB; + } + + public void setAccelerationX(final float pAccelerationX) { + this.mMinValue = pAccelerationX; + this.mMaxValue = pAccelerationX; + } + + public void setAccelerationY(final float pAccelerationY) { + this.mMinValueB = pAccelerationY; + this.mMaxValueB = pAccelerationY; + } + + public void setAccelerationX(final float pMinAccelerationX, final float pMaxAccelerationX) { + this.mMinValue = pMinAccelerationX; + this.mMaxValue = pMaxAccelerationX; + } + + public void setAccelerationY(final float pMinAccelerationY, final float pMaxAccelerationY) { + this.mMinValueB = pMinAccelerationY; + this.mMaxValueB = pMaxAccelerationY; + } + + public void setAcceleration(final float pMinAccelerationX, final float pMaxAccelerationX, final float pMinAccelerationY, final float pMaxAccelerationY) { + this.mMinValue = pMinAccelerationX; + this.mMaxValue = pMaxAccelerationX; + this.mMinValueB = pMinAccelerationY; + this.mMaxValueB = pMaxAccelerationY; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onInitializeParticle(final Particle pParticle, final float pAccelerationX, final float pAccelerationY) { + pParticle.getPhysicsHandler().accelerate(pAccelerationX, pAccelerationY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/AlphaInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/AlphaInitializer.java new file mode 100644 index 0000000..45f9a79 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/AlphaInitializer.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.entity.particle.initializer; + +import org.anddev.andengine.entity.particle.Particle; + + +/** + * @author Nicolas Gramlich + * @since 18:53:41 - 02.10.2010 + */ +public class AlphaInitializer extends BaseSingleValueInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public AlphaInitializer(final float pAlpha) { + super(pAlpha, pAlpha); + } + + public AlphaInitializer(final float pMinAlpha, final float pMaxAlpha) { + super(pMinAlpha, pMaxAlpha); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onInitializeParticle(final Particle pParticle, final float pAlpha) { + pParticle.setAlpha(pAlpha); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseDoubleValueInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseDoubleValueInitializer.java new file mode 100644 index 0000000..9d2841b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseDoubleValueInitializer.java @@ -0,0 +1,63 @@ +package org.anddev.andengine.entity.particle.initializer; + +import static org.anddev.andengine.util.MathUtils.RANDOM; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 15:58:29 - 04.05.2010 + */ +public abstract class BaseDoubleValueInitializer extends BaseSingleValueInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mMinValueB; + protected float mMaxValueB; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseDoubleValueInitializer(final float pMinValueA, final float pMaxValueA, final float pMinValueB, final float pMaxValueB) { + super(pMinValueA, pMaxValueA); + this.mMinValueB = pMinValueB; + this.mMaxValueB = pMaxValueB; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onInitializeParticle(final Particle pParticle, final float pValueA, final float pValueB); + + @Override + protected final void onInitializeParticle(final Particle pParticle, final float pValueA) { + this.onInitializeParticle(pParticle, pValueA, this.getRandomValueB()); + } + + // =========================================================== + // Methods + // =========================================================== + + private final float getRandomValueB() { + if(this.mMinValueB == this.mMaxValueB) { + return this.mMaxValueB; + } else { + return RANDOM.nextFloat() * (this.mMaxValueB - this.mMinValueB) + this.mMinValueB; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseSingleValueInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseSingleValueInitializer.java new file mode 100644 index 0000000..e4c1c05 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseSingleValueInitializer.java @@ -0,0 +1,62 @@ +package org.anddev.andengine.entity.particle.initializer; + +import static org.anddev.andengine.util.MathUtils.RANDOM; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 10:18:06 - 29.06.2010 + */ +public abstract class BaseSingleValueInitializer implements IParticleInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mMinValue; + protected float mMaxValue; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseSingleValueInitializer(final float pMinValue, final float pMaxValue) { + this.mMinValue = pMinValue; + this.mMaxValue = pMaxValue; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onInitializeParticle(final Particle pParticle, final float pValue); + + @Override + public final void onInitializeParticle(final Particle pParticle) { + this.onInitializeParticle(pParticle, this.getRandomValue()); + } + + // =========================================================== + // Methods + // =========================================================== + + private final float getRandomValue() { + if(this.mMinValue == this.mMaxValue) { + return this.mMaxValue; + } else { + return RANDOM.nextFloat() * (this.mMaxValue - this.mMinValue) + this.mMinValue; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseTripleValueInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseTripleValueInitializer.java new file mode 100644 index 0000000..369f2cf --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/BaseTripleValueInitializer.java @@ -0,0 +1,63 @@ +package org.anddev.andengine.entity.particle.initializer; + +import static org.anddev.andengine.util.MathUtils.RANDOM; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 15:58:29 - 04.05.2010 + */ +public abstract class BaseTripleValueInitializer extends BaseDoubleValueInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mMinValueC; + protected float mMaxValueC; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseTripleValueInitializer(final float pMinValueA, final float pMaxValueA, final float pMinValueB, final float pMaxValueB, final float pMinValueC, final float pMaxValueC) { + super(pMinValueA, pMaxValueA, pMinValueB, pMaxValueB); + this.mMinValueC = pMinValueC; + this.mMaxValueC = pMaxValueC; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onInitializeParticle(final Particle pParticle, final float pValueA, final float pValueB, final float pValueC); + + @Override + protected final void onInitializeParticle(final Particle pParticle, final float pValueA, final float pValueB) { + this.onInitializeParticle(pParticle, pValueA, pValueB, this.getRandomValueC()); + } + + // =========================================================== + // Methods + // =========================================================== + + private final float getRandomValueC() { + if(this.mMinValueC == this.mMaxValueC) { + return this.mMaxValueC; + } else { + return RANDOM.nextFloat() * (this.mMaxValueC - this.mMinValueC) + this.mMinValueC; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/ColorInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/ColorInitializer.java new file mode 100644 index 0000000..75c5a7b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/ColorInitializer.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.entity.particle.initializer; + +import org.anddev.andengine.entity.particle.Particle; + + +/** + * @author Nicolas Gramlich + * @since 10:17:42 - 29.06.2010 + */ +public class ColorInitializer extends BaseTripleValueInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ColorInitializer(final float pRed, final float pGreen, final float pBlue) { + super(pRed, pRed, pGreen, pGreen, pBlue, pBlue); + } + + public ColorInitializer(final float pMinRed, final float pMaxRed, final float pMinGreen, final float pMaxGreen, final float pMinBlue, final float pMaxBlue) { + super(pMinRed, pMaxRed, pMinGreen, pMaxGreen, pMinBlue, pMaxBlue); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onInitializeParticle(final Particle pParticle, final float pRed, final float pGreen, final float pBlue) { + pParticle.setColor(pRed, pGreen, pBlue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/GravityInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/GravityInitializer.java new file mode 100644 index 0000000..769447e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/GravityInitializer.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.entity.particle.initializer; + +import android.hardware.SensorManager; + +/** + * @author Nicolas Gramlich + * @since 12:04:00 - 15.03.2010 + */ +public class GravityInitializer extends AccelerationInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public GravityInitializer() { + super(0, SensorManager.GRAVITY_EARTH); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/IParticleInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/IParticleInitializer.java new file mode 100644 index 0000000..dca6467 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/IParticleInitializer.java @@ -0,0 +1,19 @@ +package org.anddev.andengine.entity.particle.initializer; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 10:12:09 - 29.06.2010 + */ +public interface IParticleInitializer { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onInitializeParticle(final Particle pParticle); +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/RotationInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/RotationInitializer.java new file mode 100644 index 0000000..30113d9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/RotationInitializer.java @@ -0,0 +1,68 @@ +package org.anddev.andengine.entity.particle.initializer; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 10:17:42 - 29.06.2010 + */ +public class RotationInitializer extends BaseSingleValueInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public RotationInitializer(final float pRotation) { + this(pRotation, pRotation); + } + + public RotationInitializer(final float pMinRotation, final float pMaxRotation) { + super(pMinRotation, pMaxRotation); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getMinRotation() { + return this.mMinValue; + } + + public float getMaxRotation() { + return this.mMaxValue; + } + + public void setRotation(final float pRotation) { + this.mMinValue = pRotation; + this.mMaxValue = pRotation; + } + + public void setRotation(final float pMinRotation, final float pMaxRotation) { + this.mMinValue = pMinRotation; + this.mMaxValue = pMaxRotation; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onInitializeParticle(final Particle pParticle, final float pRotation) { + pParticle.setRotation(pRotation); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/initializer/VelocityInitializer.java b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/VelocityInitializer.java new file mode 100644 index 0000000..fb9f7c2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/initializer/VelocityInitializer.java @@ -0,0 +1,97 @@ +package org.anddev.andengine.entity.particle.initializer; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 21:21:10 - 14.03.2010 + */ +public class VelocityInitializer extends BaseDoubleValueInitializer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public VelocityInitializer(final float pVelocity) { + this(pVelocity, pVelocity, pVelocity, pVelocity); + } + + public VelocityInitializer(final float pVelocityX, final float pVelocityY) { + this(pVelocityX, pVelocityX, pVelocityY, pVelocityY); + } + + public VelocityInitializer(final float pMinVelocityX, final float pMaxVelocityX, final float pMinVelocityY, final float pMaxVelocityY) { + super(pMinVelocityX, pMaxVelocityX, pMinVelocityY, pMaxVelocityY); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getMinVelocityX() { + return this.mMinValue; + } + + public float getMaxVelocityX() { + return this.mMaxValue; + } + + public float getMinVelocityY() { + return this.mMinValueB; + } + + public float getMaxVelocityY() { + return this.mMaxValueB; + } + + public void setVelocityX(final float pVelocityX) { + this.mMinValue = pVelocityX; + this.mMaxValue = pVelocityX; + } + + public void setVelocityY(final float pVelocityY) { + this.mMinValueB = pVelocityY; + this.mMaxValueB = pVelocityY; + } + + public void setVelocityX(final float pMinVelocityX, final float pMaxVelocityX) { + this.mMinValue = pMinVelocityX; + this.mMaxValue = pMaxVelocityX; + } + + public void setVelocityY(final float pMinVelocityY, final float pMaxVelocityY) { + this.mMinValueB = pMinVelocityY; + this.mMaxValueB = pMaxVelocityY; + } + + public void setVelocity(final float pMinVelocityX, final float pMaxVelocityX, final float pMinVelocityY, final float pMaxVelocityY) { + this.mMinValue = pMinVelocityX; + this.mMaxValue = pMaxVelocityX; + this.mMinValueB = pMinVelocityY; + this.mMaxValueB = pMaxVelocityY; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onInitializeParticle(final Particle pParticle, final float pVelocityX, final float pVelocityY) { + pParticle.getPhysicsHandler().setVelocity(pVelocityX, pVelocityY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/AlphaModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/AlphaModifier.java new file mode 100644 index 0000000..1529a73 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/AlphaModifier.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.entity.particle.modifier; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 21:21:10 - 14.03.2010 + */ +public class AlphaModifier extends BaseSingleValueSpanModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public AlphaModifier(final float pFromAlpha, final float pToAlpha, final float pFromTime, final float pToTime) { + super(pFromAlpha, pToAlpha, pFromTime, pToTime); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValue(final Particle pParticle, final float pAlpha) { + pParticle.setAlpha(pAlpha); + } + + @Override + protected void onSetValue(final Particle pParticle, final float pAlpha) { + pParticle.setAlpha(pAlpha); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseDoubleValueSpanModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseDoubleValueSpanModifier.java new file mode 100644 index 0000000..7bf67d2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseDoubleValueSpanModifier.java @@ -0,0 +1,71 @@ +package org.anddev.andengine.entity.particle.modifier; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 15:19:46 - 29.06.2010 + */ +public abstract class BaseDoubleValueSpanModifier extends BaseSingleValueSpanModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mFromValueB; + private final float mToValueB; + + private final float mSpanValueB; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseDoubleValueSpanModifier(final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final float pFromTime, final float pToTime) { + super(pFromValueA, pToValueA, pFromTime, pToTime); + this.mFromValueB = pFromValueB; + this.mToValueB = pToValueB; + + this.mSpanValueB = this.mToValueB - this.mFromValueB; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + @Deprecated + protected void onSetValue(final Particle pParticle, final float pValue) { } + + protected abstract void onSetInitialValues(final Particle pParticle, final float pValueA, final float pValueB); + protected abstract void onSetValues(final Particle pParticle, final float pValueA, final float pValueB); + + @Override + public void onSetInitialValue(final Particle pParticle, final float pValueA) { + this.onSetInitialValues(pParticle, pValueA, this.mFromValueB); + } + + @Override + protected void onSetValueInternal(final Particle pParticle, final float pPercent) { + this.onSetValues(pParticle, super.calculateValue(pPercent), this.calculateValueB(pPercent)); + } + + // =========================================================== + // Methods + // =========================================================== + + protected final float calculateValueB(final float pPercent) { + return this.mFromValueB + this.mSpanValueB * pPercent; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseSingleValueSpanModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseSingleValueSpanModifier.java new file mode 100644 index 0000000..e701603 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseSingleValueSpanModifier.java @@ -0,0 +1,81 @@ +package org.anddev.andengine.entity.particle.modifier; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 16:10:16 - 04.05.2010 + */ +public abstract class BaseSingleValueSpanModifier implements IParticleModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mFromValue; + private final float mToValue; + + private final float mFromTime; + private final float mToTime; + + private final float mDuration; + private final float mSpanValue; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseSingleValueSpanModifier(final float pFromValue, final float pToValue, final float pFromTime, final float pToTime) { + this.mFromValue = pFromValue; + this.mToValue = pToValue; + this.mFromTime = pFromTime; + this.mToTime = pToTime; + + this.mSpanValue = this.mToValue - this.mFromValue; + this.mDuration = this.mToTime - this.mFromTime; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onSetInitialValue(final Particle pParticle, final float pValue); + protected abstract void onSetValue(final Particle pParticle, final float pValue); + + @Override + public void onInitializeParticle(final Particle pParticle) { + this.onSetInitialValue(pParticle, this.mFromValue); + } + + @Override + public void onUpdateParticle(final Particle pParticle) { + final float lifeTime = pParticle.getLifeTime(); + if(lifeTime > this.mFromTime && lifeTime < this.mToTime) { + final float percent = (lifeTime - this.mFromTime) / this.mDuration; + this.onSetValueInternal(pParticle, percent); + } + } + + protected void onSetValueInternal(final Particle pParticle, final float pPercent) { + this.onSetValue(pParticle, this.calculateValue(pPercent)); + } + + protected final float calculateValue(final float pPercent) { + return this.mFromValue + this.mSpanValue * pPercent; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseTripleValueSpanModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseTripleValueSpanModifier.java new file mode 100644 index 0000000..2df6adb --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/BaseTripleValueSpanModifier.java @@ -0,0 +1,71 @@ +package org.anddev.andengine.entity.particle.modifier; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 15:19:46 - 29.06.2010 + */ +public abstract class BaseTripleValueSpanModifier extends BaseDoubleValueSpanModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mFromValueC; + private final float mToValueC; + + private final float mSpanValueC; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseTripleValueSpanModifier(final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final float pFromValueC, final float pToValueC, final float pFromTime, final float pToTime) { + super(pFromValueA, pToValueA, pFromValueB, pToValueB, pFromTime, pToTime); + this.mFromValueC = pFromValueC; + this.mToValueC = pToValueC; + + this.mSpanValueC = this.mToValueC - this.mFromValueC; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onSetInitialValues(final Particle pParticle, final float pValueA, final float pValueB, final float pValueC); + protected abstract void onSetValues(final Particle pParticle, final float pValueA, final float pValueB, final float pValueC); + + @Override + @Deprecated + protected void onSetValues(final Particle pParticle, final float pValueA, final float pValueB) { } + + @Override + public void onSetInitialValues(final Particle pParticle, final float pValueA, final float pValueB) { + this.onSetInitialValues(pParticle, pValueA, pValueB, this.mFromValueC); + } + + @Override + protected void onSetValueInternal(final Particle pParticle, final float pPercent) { + this.onSetValues(pParticle, super.calculateValue(pPercent), super.calculateValueB(pPercent), this.calculateValueC(pPercent)); + } + + // =========================================================== + // Methods + // =========================================================== + + private final float calculateValueC(final float pPercent) { + return this.mFromValueC + this.mSpanValueC * pPercent; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ColorModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ColorModifier.java new file mode 100644 index 0000000..f9ee3f2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ColorModifier.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.entity.particle.modifier; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 15:22:26 - 29.06.2010 + */ +public class ColorModifier extends BaseTripleValueSpanModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ColorModifier(final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final float pFromTime, final float pToTime) { + super(pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, pFromTime, pToTime); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValues(final Particle pParticle, final float pRed, final float pGreen, final float pBlue) { + pParticle.setColor(pRed, pGreen, pBlue); + } + + @Override + protected void onSetValues(final Particle pParticle, final float pRed, final float pGreen, final float pBlue) { + pParticle.setColor(pRed, pGreen, pBlue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ExpireModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ExpireModifier.java new file mode 100644 index 0000000..8ed2b9e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ExpireModifier.java @@ -0,0 +1,79 @@ +package org.anddev.andengine.entity.particle.modifier; + +import static org.anddev.andengine.util.MathUtils.RANDOM; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 21:21:10 - 14.03.2010 + */ +public class ExpireModifier implements IParticleModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mMinLifeTime; + private float mMaxLifeTime; + + // =========================================================== + // Constructors + // =========================================================== + + public ExpireModifier(final float pLifeTime) { + this(pLifeTime, pLifeTime); + } + + public ExpireModifier(final float pMinLifeTime, final float pMaxLifeTime) { + this.mMinLifeTime = pMinLifeTime; + this.mMaxLifeTime = pMaxLifeTime; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getMinLifeTime() { + return this.mMinLifeTime; + } + + public float getMaxLifeTime() { + return this.mMaxLifeTime; + } + + public void setLifeTime(final float pLifeTime) { + this.mMinLifeTime = pLifeTime; + this.mMaxLifeTime = pLifeTime; + } + + public void setLifeTime(final float pMinLifeTime, final float pMaxLifeTime) { + this.mMinLifeTime = pMinLifeTime; + this.mMaxLifeTime = pMaxLifeTime; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onInitializeParticle(final Particle pParticle) { + pParticle.setDeathTime((RANDOM.nextFloat() * (this.mMaxLifeTime - this.mMinLifeTime) + this.mMinLifeTime)); + } + + @Override + public void onUpdateParticle(final Particle pParticle) { + + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/IParticleModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/IParticleModifier.java new file mode 100644 index 0000000..4903c46 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/IParticleModifier.java @@ -0,0 +1,20 @@ +package org.anddev.andengine.entity.particle.modifier; + +import org.anddev.andengine.entity.particle.Particle; +import org.anddev.andengine.entity.particle.initializer.IParticleInitializer; + +/** + * @author Nicolas Gramlich + * @since 20:06:05 - 14.03.2010 + */ +public interface IParticleModifier extends IParticleInitializer { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onUpdateParticle(final Particle pParticle); +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/OffCameraExpireModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/OffCameraExpireModifier.java new file mode 100644 index 0000000..ce01e77 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/OffCameraExpireModifier.java @@ -0,0 +1,61 @@ +package org.anddev.andengine.entity.particle.modifier; + + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 21:21:10 - 14.03.2010 + */ +public class OffCameraExpireModifier implements IParticleModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Camera mCamera; + + // =========================================================== + // Constructors + // =========================================================== + + public OffCameraExpireModifier(final Camera pCamera) { + this.mCamera = pCamera; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Camera getCamera() { + return this.mCamera; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onInitializeParticle(final Particle pParticle) { + + } + + @Override + public void onUpdateParticle(final Particle pParticle) { + if(!this.mCamera.isRectangularShapeVisible(pParticle)) { + pParticle.setDead(true); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/RotationModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/RotationModifier.java new file mode 100644 index 0000000..ba6cd35 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/RotationModifier.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.entity.particle.modifier; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 10:36:18 - 29.06.2010 + */ +public class RotationModifier extends BaseSingleValueSpanModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public RotationModifier(final float pFromRotation, final float pToRotation, final float pFromTime, final float pToTime) { + super(pFromRotation, pToRotation, pFromTime, pToTime); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValue(final Particle pParticle, final float pRotation) { + pParticle.setRotation(pRotation); + } + + @Override + protected void onSetValue(final Particle pParticle, final float pRotation) { + pParticle.setRotation(pRotation); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ScaleModifier.java b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ScaleModifier.java new file mode 100644 index 0000000..e824830 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/particle/modifier/ScaleModifier.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.entity.particle.modifier; + +import org.anddev.andengine.entity.particle.Particle; + +/** + * @author Nicolas Gramlich + * @since 20:37:27 - 04.05.2010 + */ +public class ScaleModifier extends BaseDoubleValueSpanModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ScaleModifier(final float pFromScale, final float pToScale, final float pFromTime, final float pToTime) { + this(pFromScale, pToScale, pFromScale, pToScale, pFromTime, pToTime); + } + + public ScaleModifier(final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final float pFromTime, final float pToTime) { + super(pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pFromTime, pToTime); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValues(final Particle pParticle, final float pScaleX, final float pScaleY) { + pParticle.setScale(pScaleX, pScaleY); + } + + @Override + protected void onSetValues(final Particle pParticle, final float pScaleX, final float pScaleY) { + pParticle.setScale(pScaleX, pScaleY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/primitive/BaseRectangle.java b/AndEngine/src/org/anddev/andengine/entity/primitive/BaseRectangle.java new file mode 100644 index 0000000..e9e2afc --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/primitive/BaseRectangle.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.entity.primitive; + +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.entity.shape.RectangularShape; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 19:05:49 - 11.04.2010 + */ +public abstract class BaseRectangle extends RectangularShape { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public BaseRectangle(final float pX, final float pY, final float pWidth, final float pHeight) { + super(pX, pY, pWidth, pHeight, new RectangleVertexBuffer(GL11.GL_STATIC_DRAW)); + this.updateVertexBuffer(); + } + + public BaseRectangle(final float pX, final float pY, final float pWidth, final float pHeight, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pWidth, pHeight, pRectangleVertexBuffer); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public RectangleVertexBuffer getVertexBuffer() { + return (RectangleVertexBuffer)super.getVertexBuffer(); + } + + @Override + protected void onUpdateVertexBuffer(){ + this.getVertexBuffer().update(this.mWidth, this.mHeight); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/primitive/Line.java b/AndEngine/src/org/anddev/andengine/entity/primitive/Line.java new file mode 100644 index 0000000..ba172b5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/primitive/Line.java @@ -0,0 +1,229 @@ +package org.anddev.andengine.entity.primitive; + +import javax.microedition.khronos.opengles.GL10; +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.collision.LineCollisionChecker; +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.shape.IShape; +import org.anddev.andengine.entity.shape.Shape; +import org.anddev.andengine.opengl.buffer.BufferObjectManager; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.opengl.vertex.LineVertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 09:50:36 - 04.04.2010 + */ +public class Line extends Shape { + // =========================================================== + // Constants + // =========================================================== + + private static final float LINEWIDTH_DEFAULT = 1.0f; + + // =========================================================== + // Fields + // =========================================================== + + protected float mX2; + protected float mY2; + + private float mLineWidth; + + private final LineVertexBuffer mLineVertexBuffer; + + // =========================================================== + // Constructors + // =========================================================== + + public Line(final float pX1, final float pY1, final float pX2, final float pY2) { + this(pX1, pY1, pX2, pY2, LINEWIDTH_DEFAULT); + } + + public Line(final float pX1, final float pY1, final float pX2, final float pY2, final float pLineWidth) { + super(pX1, pY1); + + this.mX2 = pX2; + this.mY2 = pY2; + + this.mLineWidth = pLineWidth; + + this.mLineVertexBuffer = new LineVertexBuffer(GL11.GL_STATIC_DRAW); + BufferObjectManager.getActiveInstance().loadBufferObject(this.mLineVertexBuffer); + this.updateVertexBuffer(); + + final float width = this.getWidth(); + final float height = this.getHeight(); + + this.mRotationCenterX = width * 0.5f; + this.mRotationCenterY = height * 0.5f; + + this.mScaleCenterX = this.mRotationCenterX; + this.mScaleCenterY = this.mRotationCenterY; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + /** + * @deprecated Instead use {@link Line#getX1()} or {@link Line#getX2()}. + */ + @Deprecated + @Override + public float getX() { + return super.getX(); + } + + /** + * @deprecatedInstead use {@link Line#getY1()} or {@link Line#getY2()}. + */ + @Deprecated + @Override + public float getY() { + return super.getY(); + } + + public float getX1() { + return super.getX(); + } + + public float getY1() { + return super.getY(); + } + + public float getX2() { + return this.mX2; + } + + public float getY2() { + return this.mY2; + } + + public float getLineWidth() { + return this.mLineWidth; + } + + public void setLineWidth(final float pLineWidth) { + this.mLineWidth = pLineWidth; + } + + @Override + public float getBaseHeight() { + return this.mY2 - this.mY; + } + + @Override + public float getBaseWidth() { + return this.mX2 - this.mX; + } + + @Override + public float getHeight() { + return this.mY2 - this.mY; + } + + @Override + public float getWidth() { + return this.mX2 - this.mX; + } + + /** + * @deprecated Instead use {@link Line#setPosition(float, float, float, float)}. + */ + @Deprecated + @Override + public void setPosition(final float pX, final float pY) { + final float dX = this.mX - pX; + final float dY = this.mY - pY; + + super.setPosition(pX, pY); + + this.mX2 += dX; + this.mY2 += dY; + } + + public void setPosition(final float pX1, final float pY1, final float pX2, final float pY2) { + this.mX2 = pX2; + this.mY2 = pY2; + + super.setPosition(pX1, pY1); + + this.updateVertexBuffer(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected boolean isCulled(final Camera pCamera) { + return false; // TODO + } + + @Override + protected void onInitDraw(final GL10 pGL) { + super.onInitDraw(pGL); + GLHelper.disableTextures(pGL); + GLHelper.disableTexCoordArray(pGL); + GLHelper.lineWidth(pGL, this.mLineWidth); + } + + @Override + public LineVertexBuffer getVertexBuffer() { + return this.mLineVertexBuffer; + } + + @Override + protected void onUpdateVertexBuffer() { + this.mLineVertexBuffer.update(0, 0, this.mX2 - this.mX, this.mY2 - this.mY); + } + + @Override + protected void drawVertices(final GL10 pGL, final Camera pCamera) { + pGL.glDrawArrays(GL10.GL_LINES, 0, LineVertexBuffer.VERTICES_PER_LINE); + } + + @Override + public float[] getSceneCenterCoordinates() { + return null; // TODO + // return convertLocalToSceneCoordinates(this, (this.mX + this.mX2) * 0.5f, (this.mY + this.mY2) * 0.5f); + } + + @Override + @Deprecated + public boolean contains(final float pX, final float pY) { + return false; + } + + @Override + @Deprecated + public float[] convertSceneToLocalCoordinates(final float pX, final float pY) { + return null; + } + + @Override + @Deprecated + public float[] convertLocalToSceneCoordinates(final float pX, final float pY) { + return null; + } + + @Override + public boolean collidesWith(final IShape pOtherShape) { + if(pOtherShape instanceof Line) { + final Line otherLine = (Line)pOtherShape; + return LineCollisionChecker.checkLineCollision(this.mX, this.mY, this.mX2, this.mY2, otherLine.mX, otherLine.mY, otherLine.mX2, otherLine.mY2); + } else { + return false; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/primitive/Rectangle.java b/AndEngine/src/org/anddev/andengine/entity/primitive/Rectangle.java new file mode 100644 index 0000000..ade3177 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/primitive/Rectangle.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.entity.primitive; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 12:18:49 - 13.03.2010 + */ +public class Rectangle extends BaseRectangle { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public Rectangle(final float pX, final float pY, final float pWidth, final float pHeight) { + super(pX, pY, pWidth, pHeight); + } + + public Rectangle(final float pX, final float pY, final float pWidth, final float pHeight, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pWidth, pHeight, pRectangleVertexBuffer); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onInitDraw(final GL10 pGL) { + super.onInitDraw(pGL); + GLHelper.disableTextures(pGL); + GLHelper.disableTexCoordArray(pGL); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/CameraScene.java b/AndEngine/src/org/anddev/andengine/entity/scene/CameraScene.java new file mode 100644 index 0000000..ce1a4a5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/CameraScene.java @@ -0,0 +1,125 @@ +package org.anddev.andengine.entity.scene; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.shape.Shape; +import org.anddev.andengine.input.touch.TouchEvent; + +/** + * @author Nicolas Gramlich + * @since 15:35:53 - 29.03.2010 + */ +public class CameraScene extends Scene { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected Camera mCamera; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * {@link CameraScene#setCamera(Camera)} needs to be called manually. Otherwise nothing will be drawn. + */ + public CameraScene(final int pLayerCount) { + this(pLayerCount, null); + } + + public CameraScene(final int pLayerCount, final Camera pCamera) { + super(pLayerCount); + this.mCamera = pCamera; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Camera getCamera() { + return this.mCamera; + } + + public void setCamera(final Camera pCamera) { + this.mCamera = pCamera; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { + if(this.mCamera == null) { + return false; + } else { + this.mCamera.convertSceneToCameraSceneTouchEvent(pSceneTouchEvent); + + final boolean handled = super.onSceneTouchEvent(pSceneTouchEvent); + + if(handled) { + return true; + } else { + this.mCamera.convertCameraSceneToSceneTouchEvent(pSceneTouchEvent); + return false; + } + } + } + + @Override + protected boolean onChildSceneTouchEvent(final TouchEvent pSceneTouchEvent) { + final boolean childIsCameraScene = this.mChildScene instanceof CameraScene; + if(childIsCameraScene) { + this.mCamera.convertCameraSceneToSceneTouchEvent(pSceneTouchEvent); + final boolean result = super.onChildSceneTouchEvent(pSceneTouchEvent); + this.mCamera.convertSceneToCameraSceneTouchEvent(pSceneTouchEvent); + return result; + } else { + return super.onChildSceneTouchEvent(pSceneTouchEvent); + } + } + + @Override + protected void onManagedDraw(final GL10 pGL, final Camera pCamera) { + if(this.mCamera != null) { + pGL.glMatrixMode(GL10.GL_PROJECTION); + this.mCamera.onApplyCameraSceneMatrix(pGL); + { + pGL.glMatrixMode(GL10.GL_MODELVIEW); + pGL.glPushMatrix(); + pGL.glLoadIdentity(); + + super.onManagedDraw(pGL, pCamera); + + pGL.glPopMatrix(); + } + pGL.glMatrixMode(GL10.GL_PROJECTION); + } + } + + // =========================================================== + // Methods + // =========================================================== + + public void centerShapeInCamera(final Shape pShape) { + final Camera camera = this.mCamera; + pShape.setPosition((camera.getWidth() - pShape.getWidth()) * 0.5f, (camera.getHeight() - pShape.getHeight()) * 0.5f); + } + + public void centerShapeInCameraHorizontally(final Shape pShape) { + pShape.setPosition((this.mCamera.getWidth() - pShape.getWidth()) * 0.5f, pShape.getY()); + } + + public void centerShapeInCameraVertically(final Shape pShape) { + pShape.setPosition(pShape.getX(), (this.mCamera.getHeight() - pShape.getHeight()) * 0.5f); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/Scene.java b/AndEngine/src/org/anddev/andengine/entity/scene/Scene.java new file mode 100644 index 0000000..61fbc4b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/Scene.java @@ -0,0 +1,485 @@ +package org.anddev.andengine.entity.scene; + +import java.util.ArrayList; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.handler.runnable.RunnableHandler; +import org.anddev.andengine.entity.Entity; +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.entity.layer.Layer; +import org.anddev.andengine.entity.layer.ZIndexSorter; +import org.anddev.andengine.entity.scene.Scene.ITouchArea.ITouchAreaMatcher; +import org.anddev.andengine.entity.scene.background.ColorBackground; +import org.anddev.andengine.entity.scene.background.IBackground; +import org.anddev.andengine.entity.shape.Shape; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.util.IMatcher; +import org.anddev.andengine.util.SmartList; +import org.anddev.andengine.util.constants.Constants; + +import android.util.SparseArray; +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 12:47:39 - 08.03.2010 + */ +public class Scene extends Entity { + // =========================================================== + // Constants + // =========================================================== + + private static final int TOUCHAREAS_CAPACITY_DEFAULT = 4; + + // =========================================================== + // Fields + // =========================================================== + + private float mSecondsElapsedTotal; + + protected Scene mParentScene; + protected Scene mChildScene; + private boolean mChildSceneModalDraw; + private boolean mChildSceneModalUpdate; + private boolean mChildSceneModalTouch; + + protected SmartList mTouchAreas = new SmartList(TOUCHAREAS_CAPACITY_DEFAULT); + + private final RunnableHandler mRunnableHandler = new RunnableHandler(); + + private IOnSceneTouchListener mOnSceneTouchListener; + + private IOnAreaTouchListener mOnAreaTouchListener; + + private IBackground mBackground = new ColorBackground(0, 0, 0); // Black + private boolean mBackgroundEnabled = true; + + private boolean mOnAreaTouchTraversalBackToFront = true; + + private boolean mTouchAreaBindingEnabled = false; + private final SparseArray mTouchAreaBindings = new SparseArray(); + + // =========================================================== + // Constructors + // =========================================================== + + public Scene(final int pLayerCount) { + super(0, 0); + for(int i = pLayerCount - 1; i >= 0; i--) { + this.attachChild(new Layer()); + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getSecondsElapsedTotal() { + return this.mSecondsElapsedTotal; + } + + public IBackground getBackground() { + return this.mBackground; + } + + public void setBackground(final IBackground pBackground) { + this.mBackground = pBackground; + } + + /** + * @deprecated Instead use {@link Scene#getChild(int)}. + */ + @Deprecated + public Layer getLayer(final int pLayerIndex) throws ArrayIndexOutOfBoundsException { + return (Layer) this.getChild(pLayerIndex); + } + + /** + * @deprecated Instead use {@link Scene#getChildCount()}. + */ + @Deprecated + public int getLayerCount() { + return this.getChildCount(); + } + + /** + * @deprecated Instead use {@link Scene#getFirstChild()} + */ + @Deprecated + public Layer getBottomLayer() { + return (Layer) this.getFirstChild(); + } + + /** + * @deprecated Instead use {@link Scene#getLastChild()}. + */ + @Deprecated + public Layer getTopLayer() { + return (Layer) this.getLastChild(); + } + + /** + * Sorts the {@link Layer} based on their ZIndex. Sort is stable. + */ + public void sortLayers() { + ZIndexSorter.getInstance().sort(this.mChildren); + } + + public boolean isBackgroundEnabled() { + return this.mBackgroundEnabled; + } + + public void setBackgroundEnabled(final boolean pEnabled) { + this.mBackgroundEnabled = pEnabled; + } + + public void setOnSceneTouchListener(final IOnSceneTouchListener pOnSceneTouchListener) { + this.mOnSceneTouchListener = pOnSceneTouchListener; + } + + public IOnSceneTouchListener getOnSceneTouchListener() { + return this.mOnSceneTouchListener; + } + + public boolean hasOnSceneTouchListener() { + return this.mOnSceneTouchListener != null; + } + + public void setOnAreaTouchListener(final IOnAreaTouchListener pOnAreaTouchListener) { + this.mOnAreaTouchListener = pOnAreaTouchListener; + } + + public IOnAreaTouchListener getOnAreaTouchListener() { + return this.mOnAreaTouchListener; + } + + public boolean hasOnAreaTouchListener() { + return this.mOnAreaTouchListener != null; + } + + private void setParentScene(final Scene pParentScene) { + this.mParentScene = pParentScene; + } + + public boolean hasChildScene() { + return this.mChildScene != null; + } + + public Scene getChildScene() { + return this.mChildScene; + } + + public void setChildSceneModal(final Scene pChildScene) { + this.setChildScene(pChildScene, true, true, true); + } + + public void setChildScene(final Scene pChildScene) { + this.setChildScene(pChildScene, false, false, false); + } + + public void setChildScene(final Scene pChildScene, final boolean pModalDraw, final boolean pModalUpdate, final boolean pModalTouch) { + pChildScene.setParentScene(this); + this.mChildScene = pChildScene; + this.mChildSceneModalDraw = pModalDraw; + this.mChildSceneModalUpdate = pModalUpdate; + this.mChildSceneModalTouch = pModalTouch; + } + + public void clearChildScene() { + this.mChildScene = null; + } + + public void setOnAreaTouchTraversalBackToFront() { + this.mOnAreaTouchTraversalBackToFront = true; + } + + public void setOnAreaTouchTraversalFrontToBack() { + this.mOnAreaTouchTraversalBackToFront = false; + } + + /** + * Enable or disable the binding of TouchAreas to PointerIDs (fingers). + * When enabled: TouchAreas get bound to a PointerID (finger) when returning true in + * {@link Shape#onAreaTouched(TouchEvent, float, float)} or + * {@link IOnAreaTouchListener#onAreaTouched(TouchEvent, ITouchArea, float, float)} + * with {@link MotionEvent#ACTION_DOWN}, they will receive all subsequent {@link TouchEvent}s + * that are made with the same PointerID (finger) + * even if the {@link TouchEvent} is outside of the actual {@link ITouchArea}! + * + * @param pTouchAreaBindingEnabled + */ + public void setTouchAreaBindingEnabled(final boolean pTouchAreaBindingEnabled) { + if(this.mTouchAreaBindingEnabled && !pTouchAreaBindingEnabled) { + this.mTouchAreaBindings.clear(); + } + this.mTouchAreaBindingEnabled = pTouchAreaBindingEnabled; + } + + public boolean isTouchAreaBindingEnabled() { + return this.mTouchAreaBindingEnabled; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedDraw(final GL10 pGL, final Camera pCamera) { + final Scene childScene = this.mChildScene; + + if(childScene == null || !this.mChildSceneModalDraw) { + if(this.mBackgroundEnabled) { + pCamera.onApplyPositionIndependentMatrix(pGL); + GLHelper.setModelViewIdentityMatrix(pGL); + + this.mBackground.onDraw(pGL, pCamera); + } + + pCamera.onApplyMatrix(pGL); + GLHelper.setModelViewIdentityMatrix(pGL); + + super.onManagedDraw(pGL, pCamera); + } + + if(childScene != null) { + childScene.onDraw(pGL, pCamera); + } + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed) { + this.mSecondsElapsedTotal += pSecondsElapsed; + + this.mRunnableHandler.onUpdate(pSecondsElapsed); + + final Scene childScene = this.mChildScene; + if(childScene == null || !this.mChildSceneModalUpdate) { + this.mBackground.onUpdate(pSecondsElapsed); + super.onManagedUpdate(pSecondsElapsed); + } + + if(childScene != null) { + childScene.onUpdate(pSecondsElapsed); + } + } + + public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { + final int action = pSceneTouchEvent.getAction(); + final boolean isActionDown = pSceneTouchEvent.isActionDown(); + + if(this.mTouchAreaBindingEnabled && !isActionDown) { + final SparseArray touchAreaBindings = this.mTouchAreaBindings; + final ITouchArea boundTouchArea = touchAreaBindings.get(pSceneTouchEvent.getPointerID()); + /* In the case a ITouchArea has been bound to this PointerID, + * we'll pass this this TouchEvent to the same ITouchArea. */ + if(boundTouchArea != null) { + final float sceneTouchEventX = pSceneTouchEvent.getX(); + final float sceneTouchEventY = pSceneTouchEvent.getY(); + + /* Check if boundTouchArea needs to be removed. */ + switch(action) { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + touchAreaBindings.remove(pSceneTouchEvent.getPointerID()); + } + final Boolean handled = this.onAreaTouchEvent(pSceneTouchEvent, sceneTouchEventX, sceneTouchEventY, boundTouchArea); + if(handled != null && handled) { + return true; + } + } + } + + final Scene childScene = this.mChildScene; + if(childScene != null) { + final boolean handledByChild = this.onChildSceneTouchEvent(pSceneTouchEvent); + if(handledByChild) { + return true; + } else if(this.mChildSceneModalTouch) { + return false; + } + } + + final float sceneTouchEventX = pSceneTouchEvent.getX(); + final float sceneTouchEventY = pSceneTouchEvent.getY(); + + final ArrayList touchAreas = this.mTouchAreas; + if(touchAreas != null) { + final int touchAreaCount = touchAreas.size(); + if(touchAreaCount > 0) { + if(this.mOnAreaTouchTraversalBackToFront) { /* Back to Front. */ + for(int i = 0; i < touchAreaCount; i++) { + final ITouchArea touchArea = touchAreas.get(i); + if(touchArea.contains(sceneTouchEventX, sceneTouchEventY)) { + final Boolean handled = this.onAreaTouchEvent(pSceneTouchEvent, sceneTouchEventX, sceneTouchEventY, touchArea); + if(handled != null && handled) { + /* If binding of ITouchAreas is enabled and this is an ACTION_DOWN event, + * bind this ITouchArea to the PointerID. */ + if(this.mTouchAreaBindingEnabled && isActionDown) { + this.mTouchAreaBindings.put(pSceneTouchEvent.getPointerID(), touchArea); + } + return true; + } + } + } + } else { /* Front to back. */ + for(int i = touchAreaCount - 1; i >= 0; i--) { + final ITouchArea touchArea = touchAreas.get(i); + if(touchArea.contains(sceneTouchEventX, sceneTouchEventY)) { + final Boolean handled = this.onAreaTouchEvent(pSceneTouchEvent, sceneTouchEventX, sceneTouchEventY, touchArea); + if(handled != null && handled) { + /* If binding of ITouchAreas is enabled and this is an ACTION_DOWN event, + * bind this ITouchArea to the PointerID. */ + if(this.mTouchAreaBindingEnabled && isActionDown) { + this.mTouchAreaBindings.put(pSceneTouchEvent.getPointerID(), touchArea); + } + return true; + } + } + } + } + } + } + /* If no area was touched, the Scene itself was touched as a fallback. */ + if(this.mOnSceneTouchListener != null){ + return this.mOnSceneTouchListener.onSceneTouchEvent(this, pSceneTouchEvent); + } else { + return false; + } + } + + private Boolean onAreaTouchEvent(final TouchEvent pSceneTouchEvent, final float sceneTouchEventX, final float sceneTouchEventY, final ITouchArea touchArea) { + final float[] touchAreaLocalCoordinates = touchArea.convertSceneToLocalCoordinates(sceneTouchEventX, sceneTouchEventY); + final float touchAreaLocalX = touchAreaLocalCoordinates[Constants.VERTEX_INDEX_X]; + final float touchAreaLocalY = touchAreaLocalCoordinates[Constants.VERTEX_INDEX_Y]; + + final boolean handledSelf = touchArea.onAreaTouched(pSceneTouchEvent, touchAreaLocalX, touchAreaLocalY); + if(handledSelf) { + return Boolean.TRUE; + } else if(this.mOnAreaTouchListener != null) { + return this.mOnAreaTouchListener.onAreaTouched(pSceneTouchEvent, touchArea, touchAreaLocalX, touchAreaLocalY); + } else { + return null; + } + } + + protected boolean onChildSceneTouchEvent(final TouchEvent pSceneTouchEvent) { + return this.mChildScene.onSceneTouchEvent(pSceneTouchEvent); + } + + @Override + public void reset() { + super.reset(); + + this.clearChildScene(); + } + + @Override + public void setParent(final IEntity pEntity) { + // super.setParent(pEntity); + } + + // =========================================================== + // Methods + // =========================================================== + + public void postRunnable(final Runnable pRunnable) { + this.mRunnableHandler.postRunnable(pRunnable); + } + + public void registerTouchArea(final ITouchArea pTouchArea) { + this.mTouchAreas.add(pTouchArea); + } + + public boolean unregisterTouchArea(final ITouchArea pTouchArea) { + return this.mTouchAreas.remove(pTouchArea); + } + + public boolean unregisterTouchAreas(final ITouchAreaMatcher pTouchAreaMatcher) { + return this.mTouchAreas.removeAll(pTouchAreaMatcher); + } + + public void clearTouchAreas() { + this.mTouchAreas.clear(); + } + + public ArrayList getTouchAreas() { + return this.mTouchAreas; + } + + public void back() { + this.clearChildScene(); + + if(this.mParentScene != null) { + this.mParentScene.clearChildScene(); + this.mParentScene = null; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface ITouchArea { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean contains(final float pX, final float pY); + + public float[] convertSceneToLocalCoordinates(final float pX, final float pY); + public float[] convertLocalToSceneCoordinates(final float pX, final float pY); + + /** + * This method only fires if this {@link ITouchArea} is registered to the {@link Scene} via {@link Scene#registerTouchArea(ITouchArea)}. + * @param pSceneTouchEvent + * @return true if the event was handled (that means {@link IOnAreaTouchListener} of the {@link Scene} will not be fired!), otherwise false. + */ + public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY); + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface ITouchAreaMatcher extends IMatcher { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } + } + + public static interface IOnAreaTouchListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY); + } + + public static interface IOnSceneTouchListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent); + } + +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/SplashScene.java b/AndEngine/src/org/anddev/andengine/entity/scene/SplashScene.java new file mode 100644 index 0000000..b476882 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/SplashScene.java @@ -0,0 +1,57 @@ +package org.anddev.andengine.entity.scene; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.modifier.ScaleModifier; +import org.anddev.andengine.entity.sprite.Sprite; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 09:45:02 - 03.05.2010 + */ +public class SplashScene extends Scene { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SplashScene(final Camera pCamera, final TextureRegion pTextureRegion) { + this(pCamera, pTextureRegion, -1, 1, 1); + } + + public SplashScene(final Camera pCamera, final TextureRegion pTextureRegion, final float pDuration, final float pScaleFrom, final float pScaleTo) { + super(1); + + final Sprite loadingScreenSprite = new Sprite(pCamera.getMinX(), pCamera.getMinY(), pCamera.getWidth(), pCamera.getHeight(), pTextureRegion); + if(pScaleFrom != 1 || pScaleTo != 1) { + loadingScreenSprite.setScale(pScaleFrom); + loadingScreenSprite.registerEntityModifier(new ScaleModifier(pDuration, pScaleFrom, pScaleTo, IEaseFunction.DEFAULT)); + } + + this.getLastChild().attachChild(loadingScreenSprite); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/AutoParallaxBackground.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/AutoParallaxBackground.java new file mode 100644 index 0000000..a6aa497 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/AutoParallaxBackground.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.entity.scene.background; + + + +/** + * @author Nicolas Gramlich + * @since 19:44:31 - 19.07.2010 + */ +public class AutoParallaxBackground extends ParallaxBackground { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mParallaxChangePerSecond; + + // =========================================================== + // Constructors + // =========================================================== + + public AutoParallaxBackground(final float pRed, final float pGreen, final float pBlue, final float pParallaxChangePerSecond) { + super(pRed, pGreen, pBlue); + this.mParallaxChangePerSecond = pParallaxChangePerSecond; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + super.onUpdate(pSecondsElapsed); + + this.mParallaxValue += this.mParallaxChangePerSecond * pSecondsElapsed; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/BaseBackground.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/BaseBackground.java new file mode 100644 index 0000000..b59e94d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/BaseBackground.java @@ -0,0 +1,67 @@ +package org.anddev.andengine.entity.scene.background; + +import org.anddev.andengine.util.modifier.IModifier; +import org.anddev.andengine.util.modifier.ModifierList; + + + +/** + * @author Nicolas Gramlich + * @since 14:08:17 - 19.07.2010 + */ +public abstract class BaseBackground implements IBackground { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ModifierList mBackgroundModifiers = new ModifierList(this); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void addBackgroundModifier(final IModifier pBackgroundModifier) { + this.mBackgroundModifiers.add(pBackgroundModifier); + } + + @Override + public boolean removeBackgroundModifier(final IModifier pBackgroundModifier) { + return this.mBackgroundModifiers.remove(pBackgroundModifier); + } + + @Override + public void clearBackgroundModifiers() { + this.mBackgroundModifiers.clear(); + } + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mBackgroundModifiers.onUpdate(pSecondsElapsed); + } + + @Override + public void reset() { + this.mBackgroundModifiers.reset(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/ColorBackground.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/ColorBackground.java new file mode 100644 index 0000000..43c251a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/ColorBackground.java @@ -0,0 +1,127 @@ +package org.anddev.andengine.entity.scene.background; + +import static org.anddev.andengine.util.constants.ColorConstants.COLOR_FACTOR_INT_TO_FLOAT; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; + +/** + * @author Nicolas Gramlich + * @since 13:45:24 - 19.07.2010 + */ +public class ColorBackground extends BaseBackground { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mRed = 0.0f; + private float mGreen = 0.0f; + private float mBlue = 0.0f; + private float mAlpha = 1.0f; + + private boolean mColorEnabled = true; + + // =========================================================== + // Constructors + // =========================================================== + + protected ColorBackground() { + + } + + public ColorBackground(final float pRed, final float pGreen, final float pBlue) { + this.mRed = pRed; + this.mGreen = pGreen; + this.mBlue = pBlue; + } + + public ColorBackground(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + this.mRed = pRed; + this.mGreen = pGreen; + this.mBlue = pBlue; + this.mAlpha = pAlpha; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + /** + * Sets the color using the arithmetic scheme (0.0f - 1.0f RGB triple). + * @param pRed The red color value. Should be between 0.0 and 1.0, inclusive. + * @param pGreen The green color value. Should be between 0.0 and 1.0, inclusive. + * @param pBlue The blue color value. Should be between 0.0 and 1.0, inclusive. + */ + @Override + public void setColor(final float pRed, final float pGreen, final float pBlue) { + this.mRed = pRed; + this.mGreen = pGreen; + this.mBlue = pBlue; + } + + /** + * Sets the color using the arithmetic scheme (0.0f - 1.0f RGB quadruple). + * @param pRed The red color value. Should be between 0.0 and 1.0, inclusive. + * @param pGreen The green color value. Should be between 0.0 and 1.0, inclusive. + * @param pBlue The blue color value. Should be between 0.0 and 1.0, inclusive. + * @param pAlpha The alpha color value. Should be between 0.0 and 1.0, inclusive. + */ + @Override + public void setColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + this.setColor(pRed, pGreen, pBlue); + this.mAlpha = pAlpha; + } + + /** + * Sets the color using the digital 8-bit per channel scheme (0 - 255 RGB triple). + * @param pRed The red color value. Should be between 0 and 255, inclusive. + * @param pGreen The green color value. Should be between 0 and 255, inclusive. + * @param pBlue The blue color value. Should be between 0 and 255, inclusive. + */ + public void setColor(final int pRed, final int pGreen, final int pBlue) throws IllegalArgumentException { + this.setColor(pRed / COLOR_FACTOR_INT_TO_FLOAT, pGreen / COLOR_FACTOR_INT_TO_FLOAT, pBlue / COLOR_FACTOR_INT_TO_FLOAT); + } + + /** + * Sets the color using the digital 8-bit per channel scheme (0 - 255 RGB quadruple). + * @param pRed The red color value. Should be between 0 and 255, inclusive. + * @param pGreen The green color value. Should be between 0 and 255, inclusive. + * @param pBlue The blue color value. Should be between 0 and 255, inclusive. + */ + public void setColor(final int pRed, final int pGreen, final int pBlue, final int pAlpha) throws IllegalArgumentException { + this.setColor(pRed / COLOR_FACTOR_INT_TO_FLOAT, pGreen / COLOR_FACTOR_INT_TO_FLOAT, pBlue / COLOR_FACTOR_INT_TO_FLOAT, pAlpha / COLOR_FACTOR_INT_TO_FLOAT); + } + + public void setColorEnabled(final boolean pColorEnabled) { + this.mColorEnabled = pColorEnabled; + } + + public boolean isColorEnabled() { + return this.mColorEnabled; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onDraw(final GL10 pGL, final Camera pCamera) { + if(this.mColorEnabled) { + pGL.glClearColor(this.mRed, this.mGreen, this.mBlue, this.mAlpha); + pGL.glClear(GL10.GL_COLOR_BUFFER_BIT); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/EntityBackground.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/EntityBackground.java new file mode 100644 index 0000000..527883e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/EntityBackground.java @@ -0,0 +1,57 @@ +package org.anddev.andengine.entity.scene.background; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.IEntity; + +/** + * @author Nicolas Gramlich + * @since 18:25:10 - 21.07.2010 + */ +public class EntityBackground extends ColorBackground { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected IEntity mEntity; + + // =========================================================== + // Constructors + // =========================================================== + + public EntityBackground(final IEntity pEntity) { + this.mEntity = pEntity; + } + + public EntityBackground(final float pRed, final float pGreen, final float pBlue, final IEntity pEntity) { + super(pRed, pGreen, pBlue); + this.mEntity = pEntity; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onDraw(final GL10 pGL, final Camera pCamera) { + super.onDraw(pGL, pCamera); + this.mEntity.onDraw(pGL, pCamera); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/IBackground.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/IBackground.java new file mode 100644 index 0000000..f64b6d9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/IBackground.java @@ -0,0 +1,26 @@ +package org.anddev.andengine.entity.scene.background; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.opengl.IDrawable; +import org.anddev.andengine.util.modifier.IModifier; + +/** + * @author Nicolas Gramlich + * @since 13:47:41 - 19.07.2010 + */ +public interface IBackground extends IDrawable, IUpdateHandler { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void addBackgroundModifier(final IModifier pBackgroundModifier); + public boolean removeBackgroundModifier(final IModifier pBackgroundModifier); + public void clearBackgroundModifiers(); + + public void setColor(final float pRed, final float pGreen, final float pBlue); + public void setColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha); +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/ParallaxBackground.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/ParallaxBackground.java new file mode 100644 index 0000000..f828953 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/ParallaxBackground.java @@ -0,0 +1,142 @@ +package org.anddev.andengine.entity.scene.background; + +import java.util.ArrayList; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.shape.Shape; + +/** + * @author Nicolas Gramlich + * @since 15:36:26 - 19.07.2010 + */ +public class ParallaxBackground extends ColorBackground { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ArrayList mParallaxEntities = new ArrayList(); + private int mParallaxEntityCount; + + protected float mParallaxValue; + + // =========================================================== + // Constructors + // =========================================================== + + public ParallaxBackground(final float pRed, final float pGreen, final float pBlue) { + super(pRed, pGreen, pBlue); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public void setParallaxValue(final float pParallaxValue) { + this.mParallaxValue = pParallaxValue; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onDraw(final GL10 pGL, final Camera pCamera) { + super.onDraw(pGL, pCamera); + + final float parallaxValue = this.mParallaxValue; + final ArrayList parallaxEntities = this.mParallaxEntities; + + for(int i = 0; i < this.mParallaxEntityCount; i++) { + parallaxEntities.get(i).onDraw(pGL, parallaxValue, pCamera); + } + } + + // =========================================================== + // Methods + // =========================================================== + + public void attachParallaxEntity(final ParallaxEntity pParallaxEntity) { + this.mParallaxEntities.add(pParallaxEntity); + this.mParallaxEntityCount++; + } + + public boolean detachParallaxEntity(final ParallaxEntity pParallaxEntity) { + this.mParallaxEntityCount--; + final boolean success = this.mParallaxEntities.remove(pParallaxEntity); + if(success == false) { + this.mParallaxEntityCount++; + } + return success; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class ParallaxEntity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + final float mParallaxFactor; + final Shape mShape; + + // =========================================================== + // Constructors + // =========================================================== + + public ParallaxEntity(final float pParallaxFactor, final Shape pShape) { + this.mParallaxFactor = pParallaxFactor; + this.mShape = pShape; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onDraw(final GL10 pGL, final float pParallaxValue, final Camera pCamera) { + pGL.glPushMatrix(); + { + final float cameraWidth = pCamera.getWidth(); + final float shapeWidthScaled = this.mShape.getWidthScaled(); + float baseOffset = (pParallaxValue * this.mParallaxFactor) % shapeWidthScaled; + + while(baseOffset > 0) { + baseOffset -= shapeWidthScaled; + } + pGL.glTranslatef(baseOffset, 0, 0); + + float currentMaxX = baseOffset; + + do { + this.mShape.onDraw(pGL, pCamera); + pGL.glTranslatef(shapeWidthScaled, 0, 0); + currentMaxX += shapeWidthScaled; + } while(currentMaxX < cameraWidth); + } + pGL.glPopMatrix(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/RepeatingSpriteBackground.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/RepeatingSpriteBackground.java new file mode 100644 index 0000000..a32d43e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/RepeatingSpriteBackground.java @@ -0,0 +1,84 @@ +package org.anddev.andengine.entity.scene.background; + +import org.anddev.andengine.entity.sprite.Sprite; +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.texture.TextureManager; +import org.anddev.andengine.opengl.texture.TextureOptions; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.texture.region.TextureRegionFactory; +import org.anddev.andengine.opengl.texture.source.ITextureSource; + +/** + * @author Nicolas Gramlich + * @since 15:11:10 - 19.07.2010 + */ +public class RepeatingSpriteBackground extends SpriteBackground { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private Texture mTexture; + private final float mScale; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * @param pCameraWidth + * @param pCameraHeight + * @param pTextureManager + * @param pTextureSource needs to be a power of two as otherwise the repeating feature doesn't work. + */ + public RepeatingSpriteBackground(final float pCameraWidth, final float pCameraHeight, final TextureManager pTextureManager, final ITextureSource pTextureSource) throws IllegalArgumentException { + this(pCameraWidth, pCameraHeight, pTextureManager, pTextureSource, 1); + } + + public RepeatingSpriteBackground(final float pCameraWidth, final float pCameraHeight, final TextureManager pTextureManager, final ITextureSource pTextureSource, final float pScale) throws IllegalArgumentException { + super(null); + this.mScale = pScale; + this.mEntity = this.loadSprite(pCameraWidth, pCameraHeight, pTextureManager, pTextureSource); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Texture getTexture() { + return this.mTexture; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + private Sprite loadSprite(final float pCameraWidth, final float pCameraHeight, final TextureManager pTextureManager, final ITextureSource pTextureSource) throws IllegalArgumentException { + this.mTexture = new Texture(pTextureSource.getWidth(), pTextureSource.getHeight(), TextureOptions.REPEATING_PREMULTIPLYALPHA); + final TextureRegion textureRegion = TextureRegionFactory.createFromSource(this.mTexture, pTextureSource, 0, 0); + + final int width = Math.round(pCameraWidth / this.mScale); + final int height = Math.round(pCameraHeight / this.mScale); + + textureRegion.setWidth(width); + textureRegion.setHeight(height); + + pTextureManager.loadTexture(this.mTexture); + + final Sprite sprite = new Sprite(0, 0, width, height, textureRegion); + sprite.setScaleCenter(0, 0); + sprite.setScale(this.mScale); + return sprite; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/SpriteBackground.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/SpriteBackground.java new file mode 100644 index 0000000..8417dc1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/SpriteBackground.java @@ -0,0 +1,45 @@ +package org.anddev.andengine.entity.scene.background; + +import org.anddev.andengine.entity.sprite.BaseSprite; + +/** + * @author Nicolas Gramlich + * @since 14:01:43 - 19.07.2010 + */ +public class SpriteBackground extends EntityBackground { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SpriteBackground(final BaseSprite pBaseSprite) { + super(pBaseSprite); + } + + public SpriteBackground(final float pRed, final float pGreen, final float pBlue, final BaseSprite pBaseSprite) { + super(pRed, pGreen, pBlue, pBaseSprite); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/ColorModifier.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/ColorModifier.java new file mode 100644 index 0000000..75eebc9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/ColorModifier.java @@ -0,0 +1,74 @@ +package org.anddev.andengine.entity.scene.background.modifier; + +import org.anddev.andengine.entity.scene.background.IBackground; +import org.anddev.andengine.util.modifier.BaseTripleValueSpanModifier; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 14:51:03 - 03.09.2010 + */ +public class ColorModifier extends BaseTripleValueSpanModifier implements IBackgroundModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ColorModifier(final float pDuration, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue) { + this(pDuration, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, null, IEaseFunction.DEFAULT); + } + + public ColorModifier(final float pDuration, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final IEaseFunction pEaseFunction) { + this(pDuration, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, null, pEaseFunction); + } + + public ColorModifier(final float pDuration, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final IBackgroundModifierListener pBackgroundModifierListener) { + super(pDuration, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, pBackgroundModifierListener, IEaseFunction.DEFAULT); + } + + public ColorModifier(final float pDuration, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final IBackgroundModifierListener pBackgroundModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, pBackgroundModifierListener, pEaseFunction); + } + + protected ColorModifier(final ColorModifier pColorModifier) { + super(pColorModifier); + } + + @Override + public ColorModifier clone(){ + return new ColorModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onSetInitialValues(final IBackground pBackground, final float pRed, final float pGreen, final float pBlue) { + pBackground.setColor(pRed, pGreen, pBlue); + } + + @Override + protected void onSetValues(final IBackground pBackground, final float pPerctentageDone, final float pRed, final float pGreen, final float pBlue) { + pBackground.setColor(pRed, pGreen, pBlue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/IBackgroundModifier.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/IBackgroundModifier.java new file mode 100644 index 0000000..336cb0c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/IBackgroundModifier.java @@ -0,0 +1,32 @@ +package org.anddev.andengine.entity.scene.background.modifier; + +import org.anddev.andengine.entity.scene.background.IBackground; +import org.anddev.andengine.util.modifier.IModifier; + +/** + * @author Nicolas Gramlich + * @since 14:55:54 - 03.09.2010 + */ +public interface IBackgroundModifier extends IModifier { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IBackgroundModifierListener extends IModifierListener{ + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java new file mode 100644 index 0000000..6c7271c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.scene.background.modifier; + +import org.anddev.andengine.entity.scene.background.IBackground; +import org.anddev.andengine.util.modifier.LoopModifier; + +/** + * @author Nicolas Gramlich + * @since 15:03:53 - 03.09.2010 + */ +public class LoopBackgroundModifier extends LoopModifier implements IBackgroundModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public LoopBackgroundModifier(final IBackgroundModifier pBackgroundModifier) { + super(pBackgroundModifier); + } + + public LoopBackgroundModifier(final IBackgroundModifierListener pBackgroundModifierListener, final int pLoopCount, final ILoopBackgroundModifierListener pLoopModifierListener, final IBackgroundModifier pBackgroundModifier) { + super(pBackgroundModifierListener, pLoopCount, pLoopModifierListener, pBackgroundModifier); + } + + public LoopBackgroundModifier(final IBackgroundModifierListener pBackgroundModifierListener, final int pLoopCount, final IBackgroundModifier pBackgroundModifier) { + super(pBackgroundModifierListener, pLoopCount, pBackgroundModifier); + } + + public LoopBackgroundModifier(final int pLoopCount, final IBackgroundModifier pBackgroundModifier) { + super(pLoopCount, pBackgroundModifier); + } + + protected LoopBackgroundModifier(final LoopBackgroundModifier pLoopBackgroundModifier) { + super(pLoopBackgroundModifier); + } + + @Override + public LoopBackgroundModifier clone() { + return new LoopBackgroundModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface ILoopBackgroundModifierListener extends ILoopModifierListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java new file mode 100644 index 0000000..dcaabfd --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.entity.scene.background.modifier; + +import org.anddev.andengine.entity.scene.background.IBackground; +import org.anddev.andengine.util.modifier.ParallelModifier; + +/** + * @author Nicolas Gramlich + * @since 15:03:57 - 03.09.2010 + */ +public class ParallelBackgroundModifier extends ParallelModifier implements IBackgroundModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ParallelBackgroundModifier(final IBackgroundModifier... pBackgroundModifiers) throws IllegalArgumentException { + super(pBackgroundModifiers); + } + + public ParallelBackgroundModifier(final IBackgroundModifierListener pBackgroundModifierListener, final IBackgroundModifier... pBackgroundModifiers) throws IllegalArgumentException { + super(pBackgroundModifierListener, pBackgroundModifiers); + } + + protected ParallelBackgroundModifier(final ParallelBackgroundModifier pParallelBackgroundModifier) { + super(pParallelBackgroundModifier); + } + + @Override + public ParallelBackgroundModifier clone() { + return new ParallelBackgroundModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java new file mode 100644 index 0000000..df2ab10 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java @@ -0,0 +1,69 @@ +package org.anddev.andengine.entity.scene.background.modifier; + +import org.anddev.andengine.entity.scene.background.IBackground; +import org.anddev.andengine.util.modifier.SequenceModifier; + +/** + * @author Nicolas Gramlich + * @since 15:04:02 - 03.09.2010 + */ +public class SequenceBackgroundModifier extends SequenceModifier implements IBackgroundModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SequenceBackgroundModifier(final IBackgroundModifier... pBackgroundModifiers) throws IllegalArgumentException { + super(pBackgroundModifiers); + } + + public SequenceBackgroundModifier(final IBackgroundModifierListener pBackgroundModifierListener, final IBackgroundModifier... pBackgroundModifiers) throws IllegalArgumentException { + super(pBackgroundModifierListener, pBackgroundModifiers); + } + + public SequenceBackgroundModifier(final IBackgroundModifierListener pBackgroundModifierListener, final ISubSequenceBackgroundModifierListener pSubSequenceBackgroundModifierListener, final IBackgroundModifier... pBackgroundModifiers) throws IllegalArgumentException { + super(pBackgroundModifierListener, pSubSequenceBackgroundModifierListener, pBackgroundModifiers); + } + + protected SequenceBackgroundModifier(final SequenceBackgroundModifier pSequenceBackgroundModifier) { + super(pSequenceBackgroundModifier); + } + + @Override + public SequenceBackgroundModifier clone() { + return new SequenceBackgroundModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface ISubSequenceBackgroundModifierListener extends ISubSequenceModifierListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/MenuScene.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/MenuScene.java new file mode 100644 index 0000000..bb1186b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/MenuScene.java @@ -0,0 +1,206 @@ +package org.anddev.andengine.entity.scene.menu; + +import java.util.ArrayList; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.scene.CameraScene; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.entity.scene.Scene.IOnAreaTouchListener; +import org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener; +import org.anddev.andengine.entity.scene.menu.animator.IMenuAnimator; +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; +import org.anddev.andengine.input.touch.TouchEvent; + +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 20:06:51 - 01.04.2010 + */ +public class MenuScene extends CameraScene implements IOnAreaTouchListener, IOnSceneTouchListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ArrayList mMenuItems = new ArrayList(); + + private IOnMenuItemClickListener mOnMenuItemClickListener; + + private IMenuAnimator mMenuAnimator = IMenuAnimator.DEFAULT; + + private IMenuItem mSelectedMenuItem; + + // =========================================================== + // Constructors + // =========================================================== + + public MenuScene() { + this(null, null); + } + + public MenuScene(final IOnMenuItemClickListener pOnMenuItemClickListener) { + this(null, pOnMenuItemClickListener); + } + + public MenuScene(final Camera pCamera) { + this(pCamera, null); + } + + public MenuScene(final Camera pCamera, final IOnMenuItemClickListener pOnMenuItemClickListener) { + super(1, pCamera); + this.mOnMenuItemClickListener = pOnMenuItemClickListener; + this.setOnSceneTouchListener(this); + this.setOnAreaTouchListener(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public IOnMenuItemClickListener getOnMenuItemClickListener() { + return this.mOnMenuItemClickListener; + } + + public void setOnMenuItemClickListener(final IOnMenuItemClickListener pOnMenuItemClickListener) { + this.mOnMenuItemClickListener = pOnMenuItemClickListener; + } + + public int getMenuItemCount() { + return this.mMenuItems.size(); + } + + public void addMenuItem(final IMenuItem pMenuItem) { + this.mMenuItems.add(pMenuItem); + this.getFirstChild().attachChild(pMenuItem); + this.registerTouchArea(pMenuItem); + } + + @Override + public MenuScene getChildScene() { + return (MenuScene)super.getChildScene(); + } + + @Override + public void setChildScene(final Scene pChildScene, final boolean pModalDraw, final boolean pModalUpdate, final boolean pModalTouch) throws IllegalArgumentException { + if(pChildScene instanceof MenuScene) { + super.setChildScene(pChildScene, pModalDraw, pModalUpdate, pModalTouch); + } else { + throw new IllegalArgumentException("MenuScene accepts only MenuScenes as a ChildScene."); + } + } + + @Override + public void clearChildScene() { + if(this.getChildScene() != null) { + this.getChildScene().reset(); + super.clearChildScene(); + } + } + + public void setMenuAnimator(final IMenuAnimator pMenuAnimator) { + this.mMenuAnimator = pMenuAnimator; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { + final IMenuItem menuItem = ((IMenuItem)pTouchArea); + + switch(pSceneTouchEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: + if(this.mSelectedMenuItem != null && this.mSelectedMenuItem != menuItem) { + this.mSelectedMenuItem.onUnselected(); + } + this.mSelectedMenuItem = menuItem; + this.mSelectedMenuItem.onSelected(); + break; + case MotionEvent.ACTION_UP: + if(this.mOnMenuItemClickListener != null) { + final boolean handled = this.mOnMenuItemClickListener.onMenuItemClicked(this, menuItem, pTouchAreaLocalX, pTouchAreaLocalY); + menuItem.onUnselected(); + this.mSelectedMenuItem = null; + return handled; + } + break; + case MotionEvent.ACTION_CANCEL: + menuItem.onUnselected(); + this.mSelectedMenuItem = null; + break; + } + return true; + } + + @Override + public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { + if(this.mSelectedMenuItem != null) { + this.mSelectedMenuItem.onUnselected(); + this.mSelectedMenuItem = null; + } + return false; + } + + @Override + public void back() { + super.back(); + + this.reset(); + } + + @Override + public void reset() { + super.reset(); + + final ArrayList menuItems = this.mMenuItems; + for(int i = menuItems.size() - 1; i >= 0; i--) { + menuItems.get(i).reset(); + } + + this.prepareAnimations(); + } + + // =========================================================== + // Methods + // =========================================================== + + public void closeMenuScene() { + this.back(); + } + + public void buildAnimations() { + this.prepareAnimations(); + + final float cameraHeight = this.mCamera.getHeight(); + final float cameraWidth = this.mCamera.getWidth(); + this.mMenuAnimator.buildAnimations(this.mMenuItems, cameraWidth, cameraHeight); + } + + public void prepareAnimations() { + final float cameraHeight = this.mCamera.getHeight(); + final float cameraWidth = this.mCamera.getWidth(); + this.mMenuAnimator.prepareAnimations(this.mMenuItems, cameraWidth, cameraHeight); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IOnMenuItemClickListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean onMenuItemClicked(final MenuScene pMenuScene, final IMenuItem pMenuItem, final float pMenuItemLocalX, final float pMenuItemLocalY); + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java new file mode 100644 index 0000000..39f31de --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java @@ -0,0 +1,124 @@ +package org.anddev.andengine.entity.scene.menu.animator; + +import java.util.ArrayList; + +import org.anddev.andengine.entity.modifier.AlphaModifier; +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; +import org.anddev.andengine.util.HorizontalAlign; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 11:04:35 - 02.04.2010 + */ +public class AlphaMenuAnimator extends BaseMenuAnimator { + // =========================================================== + // Constants + // =========================================================== + + private static final float ALPHA_FROM = 0.0f; + private static final float ALPHA_TO = 1.0f; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public AlphaMenuAnimator(){ + super(); + } + + public AlphaMenuAnimator(final IEaseFunction pEaseFunction) { + super(pEaseFunction); + } + + public AlphaMenuAnimator(final HorizontalAlign pHorizontalAlign) { + super(pHorizontalAlign); + } + + public AlphaMenuAnimator(final HorizontalAlign pHorizontalAlign, final IEaseFunction pEaseFunction) { + super(pHorizontalAlign, pEaseFunction); + } + + public AlphaMenuAnimator(final float pMenuItemSpacing) { + super(pMenuItemSpacing); + } + + public AlphaMenuAnimator(final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { + super(pMenuItemSpacing, pEaseFunction); + } + + public AlphaMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing) { + super(pHorizontalAlign, pMenuItemSpacing); + } + + public AlphaMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { + super(pHorizontalAlign, pMenuItemSpacing, pEaseFunction); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void buildAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { + final IEaseFunction easeFunction = this.mEaseFunction; + final int menuItemCount = pMenuItems.size(); + for(int i = menuItemCount - 1; i >= 0; i--) { + final AlphaModifier alphaModifier = new AlphaModifier(DURATION, ALPHA_FROM, ALPHA_TO, easeFunction); + alphaModifier.setRemoveWhenFinished(false); + pMenuItems.get(i).registerEntityModifier(alphaModifier); + } + } + + @Override + public void prepareAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { + final float maximumWidth = this.getMaximumWidth(pMenuItems); + final float overallHeight = this.getOverallHeight(pMenuItems); + + final float baseX = (pCameraWidth - maximumWidth) * 0.5f; + final float baseY = (pCameraHeight - overallHeight) * 0.5f; + + final float menuItemSpacing = this.mMenuItemSpacing; + + float offsetY = 0; + final int menuItemCount = pMenuItems.size(); + for(int i = 0; i < menuItemCount; i++) { + final IMenuItem menuItem = pMenuItems.get(i); + + final float offsetX; + switch(this.mHorizontalAlign) { + case LEFT: + offsetX = 0; + break; + case RIGHT: + offsetX = maximumWidth - menuItem.getWidthScaled(); + break; + case CENTER: + default: + offsetX = (maximumWidth - menuItem.getWidthScaled()) * 0.5f; + break; + } + menuItem.setPosition(baseX + offsetX , baseY + offsetY); + + menuItem.setAlpha(ALPHA_FROM); + + offsetY += menuItem.getHeight() + menuItemSpacing; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/BaseMenuAnimator.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/BaseMenuAnimator.java new file mode 100644 index 0000000..8bd7e3c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/BaseMenuAnimator.java @@ -0,0 +1,105 @@ +package org.anddev.andengine.entity.scene.menu.animator; + +import java.util.ArrayList; + +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; +import org.anddev.andengine.util.HorizontalAlign; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 11:17:32 - 02.04.2010 + */ +public abstract class BaseMenuAnimator implements IMenuAnimator { + // =========================================================== + // Constants + // =========================================================== + + protected static final float DURATION = 1.0f; + + private static final float MENUITEMSPACING_DEFAULT = 1.0f; + + private static final HorizontalAlign HORIZONTALALIGN_DEFAULT = HorizontalAlign.CENTER; + + // =========================================================== + // Fields + // =========================================================== + + protected final float mMenuItemSpacing; + protected final HorizontalAlign mHorizontalAlign; + protected final IEaseFunction mEaseFunction; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseMenuAnimator() { + this(MENUITEMSPACING_DEFAULT); + } + + public BaseMenuAnimator(final IEaseFunction pEaseFunction) { + this(MENUITEMSPACING_DEFAULT, pEaseFunction); + } + + public BaseMenuAnimator(final float pMenuItemSpacing) { + this(HORIZONTALALIGN_DEFAULT, pMenuItemSpacing); + } + + public BaseMenuAnimator(final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { + this(HORIZONTALALIGN_DEFAULT, pMenuItemSpacing, pEaseFunction); + } + + public BaseMenuAnimator(final HorizontalAlign pHorizontalAlign) { + this(pHorizontalAlign, MENUITEMSPACING_DEFAULT); + } + + public BaseMenuAnimator(final HorizontalAlign pHorizontalAlign, final IEaseFunction pEaseFunction) { + this(pHorizontalAlign, MENUITEMSPACING_DEFAULT, pEaseFunction); + } + + public BaseMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing) { + this(pHorizontalAlign, pMenuItemSpacing, IEaseFunction.DEFAULT); + } + + public BaseMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { + this.mHorizontalAlign = pHorizontalAlign; + this.mMenuItemSpacing = pMenuItemSpacing; + this.mEaseFunction = pEaseFunction; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + protected float getMaximumWidth(final ArrayList pMenuItems) { + float maximumWidth = Float.MIN_VALUE; + for(int i = pMenuItems.size() - 1; i >= 0; i--) { + final IMenuItem menuItem = pMenuItems.get(i); + maximumWidth = Math.max(maximumWidth, menuItem.getWidthScaled()); + } + return maximumWidth; + } + + protected float getOverallHeight(final ArrayList pMenuItems) { + float overallHeight = 0; + for(int i = pMenuItems.size() - 1; i >= 0; i--) { + final IMenuItem menuItem = pMenuItems.get(i); + overallHeight += menuItem.getHeight(); + } + + overallHeight += (pMenuItems.size() - 1) * this.mMenuItemSpacing; + return overallHeight; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/DirectMenuAnimator.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/DirectMenuAnimator.java new file mode 100644 index 0000000..e098aef --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/DirectMenuAnimator.java @@ -0,0 +1,95 @@ +package org.anddev.andengine.entity.scene.menu.animator; + +import java.util.ArrayList; + +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; +import org.anddev.andengine.util.HorizontalAlign; + +/** + * @author Nicolas Gramlich + * @since 10:46:34 - 14.05.2010 + */ +public class DirectMenuAnimator extends BaseMenuAnimator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public DirectMenuAnimator(){ + super(); + } + + public DirectMenuAnimator(final HorizontalAlign pHorizontalAlign) { + super(pHorizontalAlign); + } + + public DirectMenuAnimator(final float pMenuItemSpacing) { + super(pMenuItemSpacing); + } + + public DirectMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing) { + super(pHorizontalAlign, pMenuItemSpacing); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void buildAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { + + } + + @Override + public void prepareAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { + final float maximumWidth = this.getMaximumWidth(pMenuItems); + final float overallHeight = this.getOverallHeight(pMenuItems); + + final float baseX = (pCameraWidth - maximumWidth) * 0.5f; + final float baseY = (pCameraHeight - overallHeight) * 0.5f; + + final float menuItemSpacing = this.mMenuItemSpacing; + + float offsetY = 0; + final int menuItemCount = pMenuItems.size(); + for(int i = 0; i < menuItemCount; i++) { + final IMenuItem menuItem = pMenuItems.get(i); + + final float offsetX; + switch(this.mHorizontalAlign) { + case LEFT: + offsetX = 0; + break; + case RIGHT: + offsetX = maximumWidth - menuItem.getWidthScaled(); + break; + case CENTER: + default: + offsetX = (maximumWidth - menuItem.getWidthScaled()) * 0.5f; + break; + } + menuItem.setPosition(baseX + offsetX , baseY + offsetY); + + offsetY += menuItem.getHeight() + menuItemSpacing; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/IMenuAnimator.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/IMenuAnimator.java new file mode 100644 index 0000000..1930dce --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/IMenuAnimator.java @@ -0,0 +1,24 @@ +package org.anddev.andengine.entity.scene.menu.animator; + +import java.util.ArrayList; + +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; + +/** + * @author Nicolas Gramlich + * @since 10:50:36 - 02.04.2010 + */ +public interface IMenuAnimator { + // =========================================================== + // Constants + // =========================================================== + + public static final IMenuAnimator DEFAULT = new AlphaMenuAnimator(); + + // =========================================================== + // Methods + // =========================================================== + + public void prepareAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight); + public void buildAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight); +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/SlideMenuAnimator.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/SlideMenuAnimator.java new file mode 100644 index 0000000..78bbd60 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/animator/SlideMenuAnimator.java @@ -0,0 +1,130 @@ +package org.anddev.andengine.entity.scene.menu.animator; + +import java.util.ArrayList; + +import org.anddev.andengine.entity.modifier.MoveModifier; +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; +import org.anddev.andengine.util.HorizontalAlign; +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 11:04:35 - 02.04.2010 + */ +public class SlideMenuAnimator extends BaseMenuAnimator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SlideMenuAnimator(){ + super(); + } + + public SlideMenuAnimator(final IEaseFunction pEaseFunction) { + super(pEaseFunction); + } + + public SlideMenuAnimator(final HorizontalAlign pHorizontalAlign) { + super(pHorizontalAlign); + } + + public SlideMenuAnimator(final HorizontalAlign pHorizontalAlign, final IEaseFunction pEaseFunction) { + super(pHorizontalAlign, pEaseFunction); + } + + public SlideMenuAnimator(final float pMenuItemSpacing) { + super(pMenuItemSpacing); + } + + public SlideMenuAnimator(final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { + super(pMenuItemSpacing, pEaseFunction); + } + + public SlideMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing) { + super(pHorizontalAlign, pMenuItemSpacing); + } + + public SlideMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { + super(pHorizontalAlign, pMenuItemSpacing, pEaseFunction); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void buildAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { + final IEaseFunction easeFunction = this.mEaseFunction; + final float maximumWidth = this.getMaximumWidth(pMenuItems); + final float overallHeight = this.getOverallHeight(pMenuItems); + + final float baseX = (pCameraWidth - maximumWidth) * 0.5f; + final float baseY = (pCameraHeight - overallHeight) * 0.5f; + + float offsetY = 0; + final int menuItemCount = pMenuItems.size(); + for(int i = 0; i < menuItemCount; i++) { + final IMenuItem menuItem = pMenuItems.get(i); + + final float offsetX; + switch(this.mHorizontalAlign) { + case LEFT: + offsetX = 0; + break; + case RIGHT: + offsetX = maximumWidth - menuItem.getWidthScaled(); + break; + case CENTER: + default: + offsetX = (maximumWidth - menuItem.getWidthScaled()) * 0.5f; + break; + } + + final MoveModifier moveModifier = new MoveModifier(DURATION, -maximumWidth, baseX + offsetX, baseY + offsetY, baseY + offsetY, easeFunction); + moveModifier.setRemoveWhenFinished(false); + menuItem.registerEntityModifier(moveModifier); + + offsetY += menuItem.getHeight() + this.mMenuItemSpacing; + } + } + + @Override + public void prepareAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { + final float maximumWidth = this.getMaximumWidth(pMenuItems); + final float overallHeight = this.getOverallHeight(pMenuItems); + + final float baseY = (pCameraHeight - overallHeight) * 0.5f; + + final float menuItemSpacing = this.mMenuItemSpacing; + + float offsetY = 0; + final int menuItemCount = pMenuItems.size(); + for(int i = 0; i < menuItemCount; i++) { + final IMenuItem menuItem = pMenuItems.get(i); + + menuItem.setPosition(-maximumWidth, baseY + offsetY); + + offsetY += menuItem.getHeight() + menuItemSpacing; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java new file mode 100644 index 0000000..5449118 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java @@ -0,0 +1,64 @@ +package org.anddev.andengine.entity.scene.menu.item; + +import org.anddev.andengine.entity.sprite.AnimatedSprite; +import org.anddev.andengine.opengl.texture.region.TiledTextureRegion; + +/** + * @author Nicolas Gramlich + * @since 15:44:39 - 07.07.2010 + */ +public class AnimatedSpriteMenuItem extends AnimatedSprite implements IMenuItem { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mID; + + // =========================================================== + // Constructors + // =========================================================== + + public AnimatedSpriteMenuItem(final int pID, final TiledTextureRegion pTiledTextureRegion) { + super(0, 0, pTiledTextureRegion); + this.mID = pID; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public int getID() { + return this.mID; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onSelected() { + /* Nothing. */ + } + + @Override + public void onUnselected() { + /* Nothing. */ + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/IMenuItem.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/IMenuItem.java new file mode 100644 index 0000000..cece578 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/IMenuItem.java @@ -0,0 +1,21 @@ +package org.anddev.andengine.entity.scene.menu.item; + +import org.anddev.andengine.entity.shape.IShape; + +/** + * @author Nicolas Gramlich + * @since 13:27:16 - 07.07.2010 + */ +public interface IMenuItem extends IShape { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public int getID(); + public abstract void onSelected(); + public abstract void onUnselected(); +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/SpriteMenuItem.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/SpriteMenuItem.java new file mode 100644 index 0000000..6522686 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/SpriteMenuItem.java @@ -0,0 +1,64 @@ +package org.anddev.andengine.entity.scene.menu.item; + +import org.anddev.andengine.entity.sprite.Sprite; +import org.anddev.andengine.opengl.texture.region.TextureRegion; + +/** + * @author Nicolas Gramlich + * @since 20:15:20 - 01.04.2010 + */ +public class SpriteMenuItem extends Sprite implements IMenuItem { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mID; + + // =========================================================== + // Constructors + // =========================================================== + + public SpriteMenuItem(final int pID, final TextureRegion pTextureRegion) { + super(0, 0, pTextureRegion); + this.mID = pID; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public int getID() { + return this.mID; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onSelected() { + /* Nothing. */ + } + + @Override + public void onUnselected() { + /* Nothing. */ + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/TextMenuItem.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/TextMenuItem.java new file mode 100644 index 0000000..79d382d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/TextMenuItem.java @@ -0,0 +1,64 @@ +package org.anddev.andengine.entity.scene.menu.item; + +import org.anddev.andengine.entity.text.Text; +import org.anddev.andengine.opengl.font.Font; + +/** + * @author Nicolas Gramlich + * @since 20:15:20 - 01.04.2010 + */ +public class TextMenuItem extends Text implements IMenuItem{ + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mID; + + // =========================================================== + // Constructors + // =========================================================== + + public TextMenuItem(final int pID, final Font pFont, final String pText) { + super(0, 0, pFont, pText); + this.mID = pID; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public int getID() { + return this.mID; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onSelected() { + /* Nothing. */ + } + + @Override + public void onUnselected() { + /* Nothing. */ + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java new file mode 100644 index 0000000..8c4c11c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -0,0 +1,507 @@ +package org.anddev.andengine.entity.scene.menu.item.decorator; + +import java.util.Comparator; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.entity.modifier.IEntityModifier; +import org.anddev.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher; +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; +import org.anddev.andengine.entity.shape.IShape; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.util.Transformation; + +/** + * @author Nicolas Gramlich + * @since 15:05:44 - 18.11.2010 + */ +public abstract class BaseMenuItemDecorator implements IMenuItem { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final IMenuItem mMenuItem; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseMenuItemDecorator(final IMenuItem pMenuItem) { + this.mMenuItem = pMenuItem; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onMenuItemSelected(final IMenuItem pMenuItem); + protected abstract void onMenuItemUnselected(final IMenuItem pMenuItem); + protected abstract void onMenuItemReset(final IMenuItem pMenuItem); + + @Override + public int getID() { + return this.mMenuItem.getID(); + } + + @Override + public final void onSelected() { + this.mMenuItem.onSelected(); + this.onMenuItemSelected(this.mMenuItem); + } + + @Override + public final void onUnselected() { + this.mMenuItem.onUnselected(); + this.onMenuItemUnselected(this.mMenuItem); + } + + @Override + public float getX() { + return this.mMenuItem.getX(); + } + + @Override + public float getY() { + return this.mMenuItem.getY(); + } + + @Override + public void setPosition(final IEntity pOtherEntity) { + this.mMenuItem.setPosition(pOtherEntity); + } + + @Override + public void setPosition(final float pX, final float pY) { + this.mMenuItem.setPosition(pX, pY); + } + + @Override + public float getBaseWidth() { + return this.mMenuItem.getBaseWidth(); + } + + @Override + public float getBaseHeight() { + return this.mMenuItem.getBaseHeight(); + } + + @Override + public float getWidth() { + return this.mMenuItem.getWidth(); + } + + @Override + public float getWidthScaled() { + return this.mMenuItem.getWidthScaled(); + } + + @Override + public float getHeight() { + return this.mMenuItem.getHeight(); + } + + @Override + public float getHeightScaled() { + return this.mMenuItem.getHeightScaled(); + } + + @Override + public float getInitialX() { + return this.mMenuItem.getInitialX(); + } + + @Override + public float getInitialY() { + return this.mMenuItem.getInitialY(); + } + + @Override + public float getRed() { + return this.mMenuItem.getRed(); + } + + @Override + public float getGreen() { + return this.mMenuItem.getGreen(); + } + + @Override + public float getBlue() { + return this.mMenuItem.getBlue(); + } + + @Override + public float getAlpha() { + return this.mMenuItem.getAlpha(); + } + + @Override + public void setAlpha(final float pAlpha) { + this.mMenuItem.setAlpha(pAlpha); + } + + @Override + public void setColor(final float pRed, final float pGreen, final float pBlue) { + this.mMenuItem.setColor(pRed, pGreen, pBlue); + } + + @Override + public void setColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + this.mMenuItem.setColor(pRed, pGreen, pBlue, pAlpha); + } + + @Override + public float getRotation() { + return this.mMenuItem.getRotation(); + } + + @Override + public void setRotation(final float pRotation) { + this.mMenuItem.setRotation(pRotation); + } + + @Override + public float getRotationCenterX() { + return this.mMenuItem.getRotationCenterX(); + } + + @Override + public float getRotationCenterY() { + return this.mMenuItem.getRotationCenterY(); + } + + @Override + public void setRotationCenterX(final float pRotationCenterX) { + this.mMenuItem.setRotationCenterX(pRotationCenterX); + } + + @Override + public void setRotationCenterY(final float pRotationCenterY) { + this.mMenuItem.setRotationCenterY(pRotationCenterY); + } + + @Override + public void setRotationCenter(final float pRotationCenterX, final float pRotationCenterY) { + this.mMenuItem.setRotationCenter(pRotationCenterX, pRotationCenterY); + } + + @Override + public boolean isScaled() { + return this.mMenuItem.isScaled(); + } + + @Override + public float getScaleX() { + return this.mMenuItem.getScaleX(); + } + + @Override + public float getScaleY() { + return this.mMenuItem.getScaleY(); + } + + @Override + public void setScale(final float pScale) { + this.mMenuItem.setScale(pScale); + } + + @Override + public void setScale(final float pScaleX, final float pScaleY) { + this.mMenuItem.setScale(pScaleX, pScaleY); + } + + @Override + public void setScaleX(final float pScaleX) { + this.mMenuItem.setScaleX(pScaleX); + } + + @Override + public void setScaleY(final float pScaleY) { + this.mMenuItem.setScaleY(pScaleY); + } + + @Override + public float getScaleCenterX() { + return this.mMenuItem.getScaleCenterX(); + } + + @Override + public float getScaleCenterY() { + return this.mMenuItem.getScaleCenterY(); + } + + @Override + public void setScaleCenterX(final float pScaleCenterX) { + this.mMenuItem.setScaleCenterX(pScaleCenterX); + } + + @Override + public void setScaleCenterY(final float pScaleCenterY) { + this.mMenuItem.setScaleCenterY(pScaleCenterY); + } + + @Override + public void setScaleCenter(final float pScaleCenterX, final float pScaleCenterY) { + this.mMenuItem.setScaleCenter(pScaleCenterX, pScaleCenterY); + } + + @Override + public boolean collidesWith(final IShape pOtherShape) { + return this.mMenuItem.collidesWith(pOtherShape); + } + + @Override + public float[] getSceneCenterCoordinates() { + return this.mMenuItem.getSceneCenterCoordinates(); + } + + @Override + public boolean isCullingEnabled() { + return this.mMenuItem.isCullingEnabled(); + } + + @Override + public void registerEntityModifier(final IEntityModifier pEntityModifier) { + this.mMenuItem.registerEntityModifier(pEntityModifier); + } + + @Override + public boolean unregisterEntityModifier(final IEntityModifier pEntityModifier) { + return this.mMenuItem.unregisterEntityModifier(pEntityModifier); + } + + @Override + public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityModifierMatcher) { + return this.mMenuItem.unregisterEntityModifiers(pEntityModifierMatcher); + } + + @Override + public void clearEntityModifiers() { + this.mMenuItem.clearEntityModifiers(); + } + + @Override + public void setInitialPosition() { + this.mMenuItem.setInitialPosition(); + } + + @Override + public void setBlendFunction(final int pSourceBlendFunction, final int pDestinationBlendFunction) { + this.mMenuItem.setBlendFunction(pSourceBlendFunction, pDestinationBlendFunction); + } + + @Override + public void setCullingEnabled(final boolean pCullingEnabled) { + this.mMenuItem.setCullingEnabled(pCullingEnabled); + } + + @Override + public int getZIndex() { + return this.mMenuItem.getZIndex(); + } + + @Override + public void setZIndex(final int pZIndex) { + this.mMenuItem.setZIndex(pZIndex); + } + + @Override + public void onDraw(final GL10 pGL, final Camera pCamera) { + this.mMenuItem.onDraw(pGL, pCamera); + } + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mMenuItem.onUpdate(pSecondsElapsed); + } + + @Override + public void reset() { + this.mMenuItem.reset(); + this.onMenuItemReset(this.mMenuItem); + } + + @Override + public boolean contains(final float pX, final float pY) { + return this.mMenuItem.contains(pX, pY); + } + + @Override + public float[] convertLocalToSceneCoordinates(final float pX, final float pY) { + return this.mMenuItem.convertLocalToSceneCoordinates(pX, pY); + } + + @Override + public float[] convertSceneToLocalCoordinates(final float pX, final float pY) { + return this.mMenuItem.convertSceneToLocalCoordinates(pX, pY); + } + + @Override + public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { + return this.mMenuItem.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY); + } + + @Override + public int getChildCount() { + return this.mMenuItem.getChildCount(); + } + + @Override + public void attachChild(final IEntity pEntity) { + this.mMenuItem.attachChild(pEntity); + } + + @Override + public IEntity getFirstChild() { + return this.mMenuItem.getFirstChild(); + } + + @Override + public IEntity getLastChild() { + return this.mMenuItem.getLastChild(); + } + + @Override + public IEntity getChild(final int pIndex) { + return this.mMenuItem.getChild(pIndex); + } + + @Override + public IEntity findChild(final IEntityMatcher pEntityMatcher) { + return this.mMenuItem.findChild(pEntityMatcher); + } + + @Override + public void sortChildren() { + this.mMenuItem.sortChildren(); + } + + @Override + public void sortChildren(final Comparator pEntityComparator) { + this.mMenuItem.sortChildren(pEntityComparator); + } + + @Override + public boolean detachSelf() { + return this.mMenuItem.detachSelf(); + } + + @Override + public boolean detachChild(final IEntity pEntity) { + return this.mMenuItem.detachChild(pEntity); + } + + @Override + public IEntity detachChild(final IEntityMatcher pEntityMatcher) { + return this.mMenuItem.detachChild(pEntityMatcher); + } + + @Override + public boolean detachChildren(final IEntityMatcher pEntityMatcher) { + return this.mMenuItem.detachChildren(pEntityMatcher); + } + + @Override + public void detachChildren() { + this.mMenuItem.detachChildren(); + } + + @Override + public Transformation getLocalToSceneTransformation() { + return this.mMenuItem.getLocalToSceneTransformation(); + } + + @Override + public Transformation getSceneToLocalTransformation() { + return this.mMenuItem.getSceneToLocalTransformation(); + } + + @Override + public IEntity getParent() { + return this.mMenuItem.getParent(); + } + + @Override + public void setParent(final IEntity pEntity) { + this.mMenuItem.setParent(pEntity); + } + + @Override + public boolean isVisible() { + return this.mMenuItem.isVisible(); + } + + @Override + public void setVisible(final boolean pVisible) { + this.mMenuItem.setVisible(pVisible); + } + + @Override + public boolean isIgnoreUpdate() { + return this.mMenuItem.isIgnoreUpdate(); + } + + @Override + public void setIgnoreUpdate(final boolean pIgnoreUpdate) { + this.mMenuItem.setIgnoreUpdate(pIgnoreUpdate); + } + + @Override + public void setUserData(final Object pUserData) { + this.mMenuItem.setUserData(pUserData); + } + + @Override + public Object getUserData() { + return this.mMenuItem.getUserData(); + } + + @Override + public void onAttached() { + this.mMenuItem.onAttached(); + } + + @Override + public void onDetached() { + this.mMenuItem.onDetached(); + } + + @Override + public void registerUpdateHandler(final IUpdateHandler pUpdateHandler) { + this.mMenuItem.registerUpdateHandler(pUpdateHandler); + } + + @Override + public boolean unregisterUpdateHandler(final IUpdateHandler pUpdateHandler) { + return this.mMenuItem.unregisterUpdateHandler(pUpdateHandler); + } + + @Override + public void clearUpdateHandlers() { + this.mMenuItem.clearUpdateHandlers(); + } + + @Override + public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandlerMatcher) { + return this.mMenuItem.unregisterUpdateHandlers(pUpdateHandlerMatcher); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java new file mode 100644 index 0000000..11afff8 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java @@ -0,0 +1,77 @@ +package org.anddev.andengine.entity.scene.menu.item.decorator; + +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; + +/** + * @author Nicolas Gramlich + * @since 14:25:35 - 07.07.2010 + */ +public class ColorMenuItemDecorator extends BaseMenuItemDecorator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mSelectedRed; + private final float mSelectedGreen; + private final float mSelectedBlue; + private final float mUnselectedRed; + private final float mUnselectedGreen; + private final float mUnselectedBlue; + + // =========================================================== + // Constructors + // =========================================================== + + public ColorMenuItemDecorator(final IMenuItem pMenuItem, final float pSelectedRed, final float pSelectedGreen, final float pSelectedBlue, final float pUnselectedRed, final float pUnselectedGreen, final float pUnselectedBlue) { + super(pMenuItem); + + this.mSelectedRed = pSelectedRed; + this.mSelectedGreen = pSelectedGreen; + this.mSelectedBlue = pSelectedBlue; + + this.mUnselectedRed = pUnselectedRed; + this.mUnselectedGreen = pUnselectedGreen; + this.mUnselectedBlue = pUnselectedBlue; + + pMenuItem.setColor(this.mUnselectedRed, this.mUnselectedGreen, this.mUnselectedBlue); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onMenuItemSelected(final IMenuItem pMenuItem) { + pMenuItem.setColor(this.mSelectedRed, this.mSelectedGreen, this.mSelectedBlue); + } + + @Override + public void onMenuItemUnselected(final IMenuItem pMenuItem) { + pMenuItem.setColor(this.mUnselectedRed, this.mUnselectedGreen, this.mUnselectedBlue); + } + + @Override + public void onMenuItemReset(final IMenuItem pMenuItem) { + pMenuItem.setColor(this.mUnselectedRed, this.mUnselectedGreen, this.mUnselectedBlue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java new file mode 100644 index 0000000..c49274b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java @@ -0,0 +1,68 @@ +package org.anddev.andengine.entity.scene.menu.item.decorator; + +import org.anddev.andengine.entity.scene.menu.item.IMenuItem; + +/** + * @author Nicolas Gramlich + * @since 15:04:29 - 18.11.2010 + */ +public class ScaleMenuItemDecorator extends BaseMenuItemDecorator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mSelectedScale; + private final float mUnselectedScale; + + // =========================================================== + // Constructors + // =========================================================== + + public ScaleMenuItemDecorator(final IMenuItem pMenuItem, final float pSelectedScale, final float pUnselectedScale) { + super(pMenuItem); + + this.mSelectedScale = pSelectedScale; + this.mUnselectedScale = pUnselectedScale; + + pMenuItem.setScale(pUnselectedScale); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onMenuItemSelected(final IMenuItem pMenuItem) { + this.setScale(this.mSelectedScale); + } + + @Override + public void onMenuItemUnselected(final IMenuItem pMenuItem) { + this.setScale(this.mUnselectedScale); + } + + @Override + public void onMenuItemReset(final IMenuItem pMenuItem) { + this.setScale(this.mUnselectedScale); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/popup/PopupScene.java b/AndEngine/src/org/anddev/andengine/entity/scene/popup/PopupScene.java new file mode 100644 index 0000000..a9142a8 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/popup/PopupScene.java @@ -0,0 +1,63 @@ +package org.anddev.andengine.entity.scene.popup; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.handler.timer.ITimerCallback; +import org.anddev.andengine.engine.handler.timer.TimerHandler; +import org.anddev.andengine.entity.scene.CameraScene; +import org.anddev.andengine.entity.scene.Scene; + +/** + * @author Nicolas Gramlich + * @since 16:36:51 - 03.08.2010 + */ +public class PopupScene extends CameraScene { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public PopupScene(final Camera pCamera, final Scene pParentScene, final float pDurationSeconds) { + this(pCamera, pParentScene, pDurationSeconds, null); + } + + public PopupScene(final Camera pCamera, final Scene pParentScene, final float pDurationSeconds, final Runnable pRunnable) { + super(1, pCamera); + this.setBackgroundEnabled(false); + + pParentScene.setChildScene(this, false, true, true); + + this.registerUpdateHandler(new TimerHandler(pDurationSeconds, new ITimerCallback() { + @Override + public void onTimePassed(final TimerHandler pTimerHandler) { + PopupScene.this.unregisterUpdateHandler(pTimerHandler); + pParentScene.clearChildScene(); + if(pRunnable != null) { + pRunnable.run(); + } + } + })); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/scene/popup/TextPopupScene.java b/AndEngine/src/org/anddev/andengine/entity/scene/popup/TextPopupScene.java new file mode 100644 index 0000000..900a1bf --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/scene/popup/TextPopupScene.java @@ -0,0 +1,73 @@ +package org.anddev.andengine.entity.scene.popup; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.modifier.IEntityModifier; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.entity.text.Text; +import org.anddev.andengine.opengl.font.Font; +import org.anddev.andengine.util.HorizontalAlign; + +/** + * @author Nicolas Gramlich + * @since 17:19:30 - 03.08.2010 + */ +public class TextPopupScene extends PopupScene { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Text mText; + + // =========================================================== + // Constructors + // =========================================================== + + public TextPopupScene(final Camera pCamera, final Scene pParentScene, final Font pFont, final String pText, final float pDurationSeconds) { + this(pCamera, pParentScene, pFont, pText, pDurationSeconds, null, null); + } + + public TextPopupScene(final Camera pCamera, final Scene pParentScene, final Font pFont, final String pText, final float pDurationSeconds, final IEntityModifier pShapeModifier) { + this(pCamera, pParentScene, pFont, pText, pDurationSeconds, pShapeModifier, null); + } + + public TextPopupScene(final Camera pCamera, final Scene pParentScene, final Font pFont, final String pText, final float pDurationSeconds, final Runnable pRunnable) { + this(pCamera, pParentScene, pFont, pText, pDurationSeconds, null, pRunnable); + } + + public TextPopupScene(final Camera pCamera, final Scene pParentScene, final Font pFont, final String pText, final float pDurationSeconds, final IEntityModifier pShapeModifier, final Runnable pRunnable) { + super(pCamera, pParentScene, pDurationSeconds, pRunnable); + + this.mText = new Text(0, 0, pFont, pText, HorizontalAlign.CENTER); + this.centerShapeInCamera(this.mText); + + if(pShapeModifier != null) { + this.mText.registerEntityModifier(pShapeModifier); + } + + this.getLastChild().attachChild(this.mText); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Text getText() { + return this.mText; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/shape/IShape.java b/AndEngine/src/org/anddev/andengine/entity/shape/IShape.java new file mode 100644 index 0000000..b66c5c8 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/shape/IShape.java @@ -0,0 +1,34 @@ +package org.anddev.andengine.entity.shape; + +import org.anddev.andengine.entity.IEntity; +import org.anddev.andengine.entity.scene.Scene.ITouchArea; + +/** + * @author Nicolas Gramlich + * @since 13:32:52 - 07.07.2010 + */ +public interface IShape extends IEntity, ITouchArea { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean isCullingEnabled(); + public void setCullingEnabled(final boolean pCullingEnabled); + + public float getWidth(); + public float getHeight(); + + public float getBaseWidth(); + public float getBaseHeight(); + + public float getWidthScaled(); + public float getHeightScaled(); + + public boolean collidesWith(final IShape pOtherShape); + + public void setBlendFunction(final int pSourceBlendFunction, final int pDestinationBlendFunction); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/entity/shape/RectangularShape.java b/AndEngine/src/org/anddev/andengine/entity/shape/RectangularShape.java new file mode 100644 index 0000000..b113159 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/shape/RectangularShape.java @@ -0,0 +1,169 @@ +package org.anddev.andengine.entity.shape; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.collision.RectangularShapeCollisionChecker; +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.opengl.buffer.BufferObjectManager; +import org.anddev.andengine.opengl.vertex.VertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 11:37:50 - 04.04.2010 + */ +public abstract class RectangularShape extends Shape { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mBaseWidth; + protected float mBaseHeight; + + protected float mWidth; + protected float mHeight; + + private final VertexBuffer mVertexBuffer; + + // =========================================================== + // Constructors + // =========================================================== + + public RectangularShape(final float pX, final float pY, final float pWidth, final float pHeight, final VertexBuffer pVertexBuffer) { + super(pX, pY); + + this.mBaseWidth = pWidth; + this.mBaseHeight = pHeight; + + this.mWidth = pWidth; + this.mHeight = pHeight; + + this.mVertexBuffer = pVertexBuffer; + BufferObjectManager.getActiveInstance().loadBufferObject(this.mVertexBuffer); + + this.mRotationCenterX = pWidth * 0.5f; + this.mRotationCenterY = pHeight * 0.5f; + + this.mScaleCenterX = this.mRotationCenterX; + this.mScaleCenterY = this.mRotationCenterY; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public VertexBuffer getVertexBuffer() { + return this.mVertexBuffer; + } + + @Override + public float getWidth() { + return this.mWidth; + } + + @Override + public float getHeight() { + return this.mHeight; + } + + @Override + public float getBaseWidth() { + return this.mBaseWidth; + } + + @Override + public float getBaseHeight() { + return this.mBaseHeight; + } + + public void setWidth(final float pWidth) { + this.mWidth = pWidth; + this.updateVertexBuffer(); + } + + public void setHeight(final float pHeight) { + this.mHeight = pHeight; + this.updateVertexBuffer(); + } + + public void setSize(final float pWidth, final float pHeight) { + this.mWidth = pWidth; + this.mHeight = pHeight; + this.updateVertexBuffer(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public void setBaseSize() { + if(this.mWidth != this.mBaseWidth || this.mHeight != this.mBaseHeight) { + this.mWidth = this.mBaseWidth; + this.mHeight = this.mBaseHeight; + this.updateVertexBuffer(); + } + } + + @Override + protected boolean isCulled(final Camera pCamera) { + final float x = this.mX; + final float y = this.mY; + return x > pCamera.getMaxX() + || y > pCamera.getMaxY() + || x + this.getWidth() < pCamera.getMinX() + || y + this.getHeight() < pCamera.getMinY(); + } + + @Override + protected void drawVertices(final GL10 pGL, final Camera pCamera) { + pGL.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); + } + + @Override + public void reset() { + super.reset(); + this.setBaseSize(); + + final float baseWidth = this.getBaseWidth(); + final float baseHeight = this.getBaseHeight(); + + this.mRotationCenterX = baseWidth * 0.5f; + this.mRotationCenterY = baseHeight * 0.5f; + + this.mScaleCenterX = this.mRotationCenterX; + this.mScaleCenterY = this.mRotationCenterY; + } + + @Override + public boolean contains(final float pX, final float pY) { + return RectangularShapeCollisionChecker.checkContains(this, pX, pY); + } + + @Override + public float[] getSceneCenterCoordinates() { + return this.convertLocalToSceneCoordinates(this.mWidth * 0.5f, this.mHeight * 0.5f); + } + + @Override + public boolean collidesWith(final IShape pOtherShape) { + if(pOtherShape instanceof RectangularShape) { + final RectangularShape pOtherRectangularShape = (RectangularShape) pOtherShape; + + return RectangularShapeCollisionChecker.checkCollision(this, pOtherRectangularShape); + } else { + return false; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/shape/Shape.java b/AndEngine/src/org/anddev/andengine/entity/shape/Shape.java new file mode 100644 index 0000000..ec8c03f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/shape/Shape.java @@ -0,0 +1,145 @@ +package org.anddev.andengine.entity.shape; + +import javax.microedition.khronos.opengles.GL10; +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.Entity; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.opengl.vertex.VertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 11:51:27 - 13.03.2010 + */ +public abstract class Shape extends Entity implements IShape { + // =========================================================== + // Constants + // =========================================================== + + public static final int BLENDFUNCTION_SOURCE_DEFAULT = GL10.GL_SRC_ALPHA; + public static final int BLENDFUNCTION_DESTINATION_DEFAULT = GL10.GL_ONE_MINUS_SRC_ALPHA; + + public static final int BLENDFUNCTION_SOURCE_PREMULTIPLYALPHA_DEFAULT = GL10.GL_ONE; + public static final int BLENDFUNCTION_DESTINATION_PREMULTIPLYALPHA_DEFAULT = GL10.GL_ONE_MINUS_SRC_ALPHA; + + // =========================================================== + // Fields + // =========================================================== + + protected int mSourceBlendFunction = BLENDFUNCTION_SOURCE_DEFAULT; + protected int mDestinationBlendFunction = BLENDFUNCTION_DESTINATION_DEFAULT; + + private boolean mCullingEnabled = false; + + // =========================================================== + // Constructors + // =========================================================== + + public Shape(final float pX, final float pY) { + super(pX, pY); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public void setBlendFunction(final int pSourceBlendFunction, final int pDestinationBlendFunction) { + this.mSourceBlendFunction = pSourceBlendFunction; + this.mDestinationBlendFunction = pDestinationBlendFunction; + } + + @Override + public boolean isCullingEnabled() { + return this.mCullingEnabled; + } + + @Override + public void setCullingEnabled(final boolean pCullingEnabled) { + this.mCullingEnabled = pCullingEnabled; + } + + @Override + public float getWidthScaled() { + return this.getWidth() * this.mScaleX; + } + + @Override + public float getHeightScaled() { + return this.getHeight() * this.mScaleY; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onUpdateVertexBuffer(); + protected abstract VertexBuffer getVertexBuffer(); + + protected abstract void drawVertices(final GL10 pGL, final Camera pCamera); + + @Override + protected void doDraw(final GL10 pGL, final Camera pCamera) { + this.onInitDraw(pGL); + this.onApplyVertices(pGL); + this.drawVertices(pGL, pCamera); + } + + @Override + public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { + return false; + } + + /** + * Will only be performed if {@link Shape#isCullingEnabled()} is true. + * @param pCamera + * @return true when this object is visible by the {@link Camera}, false otherwise. + */ + protected abstract boolean isCulled(final Camera pCamera); + + @Override + protected void onManagedDraw(final GL10 pGL, final Camera pCamera) { + if(this.mCullingEnabled == false || this.isCulled(pCamera) == false) { + super.onManagedDraw(pGL, pCamera); + } + } + + @Override + public void reset() { + super.reset(); + this.mSourceBlendFunction = BLENDFUNCTION_SOURCE_DEFAULT; + this.mDestinationBlendFunction = BLENDFUNCTION_DESTINATION_DEFAULT; + } + + // =========================================================== + // Methods + // =========================================================== + + protected void onInitDraw(final GL10 pGL) { + GLHelper.setColor(pGL, this.mRed, this.mGreen, this.mBlue, this.mAlpha); + + GLHelper.enableVertexArray(pGL); + GLHelper.blendFunction(pGL, this.mSourceBlendFunction, this.mDestinationBlendFunction); + } + + protected void onApplyVertices(final GL10 pGL) { + if(GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS) { + final GL11 gl11 = (GL11)pGL; + + this.getVertexBuffer().selectOnHardware(gl11); + GLHelper.vertexZeroPointer(gl11); + } else { + GLHelper.vertexPointer(pGL, this.getVertexBuffer().getFloatBuffer()); + } + } + + protected void updateVertexBuffer() { + this.onUpdateVertexBuffer(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/sprite/AnimatedSprite.java b/AndEngine/src/org/anddev/andengine/entity/sprite/AnimatedSprite.java new file mode 100644 index 0000000..5bbdc47 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/sprite/AnimatedSprite.java @@ -0,0 +1,256 @@ +package org.anddev.andengine.entity.sprite; + +import java.util.Arrays; + +import org.anddev.andengine.opengl.texture.region.TiledTextureRegion; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; +import org.anddev.andengine.util.MathUtils; +import org.anddev.andengine.util.constants.TimeConstants; + +public class AnimatedSprite extends TiledSprite implements TimeConstants { + // =========================================================== + // Constants + // =========================================================== + + private static final int LOOP_CONTINUOUS = -1; + + // =========================================================== + // Fields + // =========================================================== + + private boolean mAnimationRunning; + + private long mAnimationProgress; + private long mAnimationDuration; + private long[] mFrameEndsInNanoseconds; + + private int mFirstTileIndex; + private int mInitialLoopCount; + private int mLoopCount; + private IAnimationListener mAnimationListener; + + private int mFrameCount; + private int[] mFrames; + + // =========================================================== + // Constructors + // =========================================================== + + public AnimatedSprite(final float pX, final float pY, final TiledTextureRegion pTiledTextureRegion) { + super(pX, pY, pTiledTextureRegion); + } + + public AnimatedSprite(final float pX, final float pY, final float pTileWidth, final float pTileHeight, final TiledTextureRegion pTiledTextureRegion) { + super(pX, pY, pTileWidth, pTileHeight, pTiledTextureRegion); + } + + public AnimatedSprite(final float pX, final float pY, final TiledTextureRegion pTiledTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pTiledTextureRegion, pRectangleVertexBuffer); + } + + public AnimatedSprite(final float pX, final float pY, final float pTileWidth, final float pTileHeight, final TiledTextureRegion pTiledTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pTileWidth, pTileHeight, pTiledTextureRegion, pRectangleVertexBuffer); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isAnimationRunning() { + return this.mAnimationRunning; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedUpdate(final float pSecondsElapsed) { + super.onManagedUpdate(pSecondsElapsed); + if(this.mAnimationRunning) { + final long nanoSecondsElapsed = (long) (pSecondsElapsed * TimeConstants.NANOSECONDSPERSECOND); + this.mAnimationProgress += nanoSecondsElapsed; + + if(this.mAnimationProgress > this.mAnimationDuration) { + this.mAnimationProgress %= this.mAnimationDuration; + if(this.mInitialLoopCount != AnimatedSprite.LOOP_CONTINUOUS) { + this.mLoopCount--; + } + } + + if(this.mInitialLoopCount == AnimatedSprite.LOOP_CONTINUOUS || this.mLoopCount >= 0) { + final int currentFrameIndex = this.calculateCurrentFrameIndex(); + + if(this.mFrames == null) { + this.setCurrentTileIndex(this.mFirstTileIndex + currentFrameIndex); + } else { + this.setCurrentTileIndex(this.mFrames[currentFrameIndex]); + } + } else { + this.mAnimationRunning = false; + if(this.mAnimationListener != null) { + this.mAnimationListener.onAnimationEnd(this); + } + } + } + } + + // =========================================================== + // Methods + // =========================================================== + + public void stopAnimation() { + this.mAnimationRunning = false; + } + + public void stopAnimation(final int pTileIndex) { + this.mAnimationRunning = false; + this.setCurrentTileIndex(pTileIndex); + } + + private int calculateCurrentFrameIndex() { + final long animationProgress = this.mAnimationProgress; + final long[] frameEnds = this.mFrameEndsInNanoseconds; + final int frameCount = this.mFrameCount; + for(int i = 0; i < frameCount; i++) { + if(frameEnds[i] > animationProgress) { + return i; + } + } + + return frameCount - 1; + } + + public AnimatedSprite animate(final long pFrameDurationEach) { + return this.animate(pFrameDurationEach, true); + } + + public AnimatedSprite animate(final long pFrameDurationEach, final boolean pLoop) { + return this.animate(pFrameDurationEach, (pLoop) ? AnimatedSprite.LOOP_CONTINUOUS : 0, null); + } + + public AnimatedSprite animate(final long pFrameDurationEach, final int pLoopCount) { + return this.animate(pFrameDurationEach, pLoopCount, null); + } + + public AnimatedSprite animate(final long pFrameDurationEach, final boolean pLoop, final IAnimationListener pAnimationListener) { + return this.animate(pFrameDurationEach, (pLoop) ? AnimatedSprite.LOOP_CONTINUOUS : 0, pAnimationListener); + } + + public AnimatedSprite animate(final long pFrameDurationEach, final int pLoopCount, final IAnimationListener pAnimationListener) { + final long[] frameDurations = new long[this.getTextureRegion().getTileCount()]; + Arrays.fill(frameDurations, pFrameDurationEach); + return this.animate(frameDurations, pLoopCount, pAnimationListener); + } + + public AnimatedSprite animate(final long[] pFrameDurations) { + return this.animate(pFrameDurations, true); + } + + public AnimatedSprite animate(final long[] pFrameDurations, final boolean pLoop) { + return this.animate(pFrameDurations, (pLoop) ? AnimatedSprite.LOOP_CONTINUOUS : 0, null); + } + + public AnimatedSprite animate(final long[] pFrameDurations, final int pLoopCount) { + return this.animate(pFrameDurations, pLoopCount, null); + } + + public AnimatedSprite animate(final long[] pFrameDurations, final boolean pLoop, final IAnimationListener pAnimationListener) { + return this.animate(pFrameDurations, (pLoop) ? AnimatedSprite.LOOP_CONTINUOUS : 0, pAnimationListener); + } + + public AnimatedSprite animate(final long[] pFrameDurations, final int pLoopCount, final IAnimationListener pAnimationListener) { + return this.animate(pFrameDurations, 0, this.getTextureRegion().getTileCount() - 1, pLoopCount, pAnimationListener); + } + + public AnimatedSprite animate(final long[] pFrameDurations, final int pFirstTileIndex, final int pLastTileIndex, final boolean pLoop) { + return this.animate(pFrameDurations, pFirstTileIndex, pLastTileIndex, (pLoop) ? AnimatedSprite.LOOP_CONTINUOUS : 0, null); + } + + public AnimatedSprite animate(final long[] pFrameDurations, final int pFirstTileIndex, final int pLastTileIndex, final int pLoopCount) { + return this.animate(pFrameDurations, pFirstTileIndex, pLastTileIndex, pLoopCount, null); + } + + public AnimatedSprite animate(final long[] pFrameDurations, final int[] pFrames, final int pLoopCount) { + return this.animate(pFrameDurations, pFrames, pLoopCount, null); + } + + /** + * Animate specifics frames + * + * @param pFrameDurations must have the same length as pFrames. + * @param pFrames indices of the frames to animate. + * @param pLoopCount + * @param pAnimationListener + */ + public AnimatedSprite animate(final long[] pFrameDurations, final int[] pFrames, final int pLoopCount, final IAnimationListener pAnimationListener) { + final int frameCount = pFrames.length; + if(pFrameDurations.length != frameCount) { + throw new IllegalArgumentException("pFrameDurations must have the same length as pFrames."); + } + + return this.init(pFrameDurations, frameCount, pFrames, 0, pLoopCount, pAnimationListener); + } + + /** + * @param pFrameDurations + * must have the same length as pFirstTileIndex to + * pLastTileIndex. + * @param pFirstTileIndex + * @param pLastTileIndex + * @param pLoopCount + * @param pAnimationListener + */ + public AnimatedSprite animate(final long[] pFrameDurations, final int pFirstTileIndex, final int pLastTileIndex, final int pLoopCount, final IAnimationListener pAnimationListener) { + if(pLastTileIndex - pFirstTileIndex < 1) { + throw new IllegalArgumentException("An animation needs at least two tiles to animate between."); + } + + final int frameCount = (pLastTileIndex - pFirstTileIndex) + 1; + if(pFrameDurations.length != frameCount) { + throw new IllegalArgumentException("pFrameDurations must have the same length as pFirstTileIndex to pLastTileIndex."); + } + + return this.init(pFrameDurations, frameCount, null, pFirstTileIndex, pLoopCount, pAnimationListener); + } + + private AnimatedSprite init(final long[] pFrameDurations, final int frameCount, final int[] pFrames, final int pFirstTileIndex, final int pLoopCount, final IAnimationListener pAnimationListener) { + this.mFrameCount = frameCount; + this.mAnimationListener = pAnimationListener; + this.mInitialLoopCount = pLoopCount; + this.mLoopCount = pLoopCount; + this.mFrames = pFrames; + this.mFirstTileIndex = pFirstTileIndex; + + if(this.mFrameEndsInNanoseconds == null || this.mFrameCount > this.mFrameEndsInNanoseconds.length) { + this.mFrameEndsInNanoseconds = new long[this.mFrameCount]; + } + + final long[] frameEndsInNanoseconds = this.mFrameEndsInNanoseconds; + MathUtils.arraySumInto(pFrameDurations, frameEndsInNanoseconds, TimeConstants.NANOSECONDSPERMILLISECOND); + + final long lastFrameEnd = frameEndsInNanoseconds[this.mFrameCount - 1]; + this.mAnimationDuration = lastFrameEnd; + + this.mAnimationProgress = 0; + this.mAnimationRunning = true; + + return this; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IAnimationListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + public void onAnimationEnd(final AnimatedSprite pAnimatedSprite); + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/sprite/BaseSprite.java b/AndEngine/src/org/anddev/andengine/entity/sprite/BaseSprite.java new file mode 100644 index 0000000..59f2c4e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/sprite/BaseSprite.java @@ -0,0 +1,89 @@ +package org.anddev.andengine.entity.sprite; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.entity.primitive.BaseRectangle; +import org.anddev.andengine.opengl.texture.region.BaseTextureRegion; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 11:38:53 - 08.03.2010 + */ +public abstract class BaseSprite extends BaseRectangle { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final BaseTextureRegion mTextureRegion; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseSprite(final float pX, final float pY, final float pWidth, final float pHeight, final BaseTextureRegion pTextureRegion) { + super(pX, pY, pWidth, pHeight); + + this.mTextureRegion = pTextureRegion; + this.initBlendFunction(); + } + + public BaseSprite(final float pX, final float pY, final float pWidth, final float pHeight, final BaseTextureRegion pTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pWidth, pHeight, pRectangleVertexBuffer); + + this.mTextureRegion = pTextureRegion; + this.initBlendFunction(); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public BaseTextureRegion getTextureRegion() { + return this.mTextureRegion; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void reset() { + super.reset(); + + this.initBlendFunction(); + } + + @Override + protected void onInitDraw(final GL10 pGL) { + super.onInitDraw(pGL); + GLHelper.enableTextures(pGL); + GLHelper.enableTexCoordArray(pGL); + } + + @Override + protected void onApplyTransformations(final GL10 pGL) { + super.onApplyTransformations(pGL); + + this.mTextureRegion.onApply(pGL); + } + + // =========================================================== + // Methods + // =========================================================== + + private void initBlendFunction() { + if(this.mTextureRegion.getTexture().getTextureOptions().mPreMultipyAlpha) { + this.setBlendFunction(BLENDFUNCTION_SOURCE_PREMULTIPLYALPHA_DEFAULT, BLENDFUNCTION_DESTINATION_PREMULTIPLYALPHA_DEFAULT); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/sprite/Sprite.java b/AndEngine/src/org/anddev/andengine/entity/sprite/Sprite.java new file mode 100644 index 0000000..b10b406 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/sprite/Sprite.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.entity.sprite; + +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 19:22:38 - 09.03.2010 + */ +public class Sprite extends BaseSprite { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public Sprite(final float pX, final float pY, final TextureRegion pTextureRegion) { + super(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight(), pTextureRegion); + } + + public Sprite(final float pX, final float pY, final float pWidth, final float pHeight, final TextureRegion pTextureRegion) { + super(pX, pY, pWidth, pHeight, pTextureRegion); + } + + public Sprite(final float pX, final float pY, final TextureRegion pTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight(), pTextureRegion, pRectangleVertexBuffer); + } + + public Sprite(final float pX, final float pY, final float pWidth, final float pHeight, final TextureRegion pTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pWidth, pHeight, pTextureRegion, pRectangleVertexBuffer); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public TextureRegion getTextureRegion() { + return (TextureRegion)this.mTextureRegion; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/sprite/TiledSprite.java b/AndEngine/src/org/anddev/andengine/entity/sprite/TiledSprite.java new file mode 100644 index 0000000..ca4e773 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/sprite/TiledSprite.java @@ -0,0 +1,75 @@ +package org.anddev.andengine.entity.sprite; + +import org.anddev.andengine.opengl.texture.region.TiledTextureRegion; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; + +/** + * @author Nicolas Gramlich + * @since 19:30:13 - 09.03.2010 + */ +public class TiledSprite extends BaseSprite { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TiledSprite(final float pX, final float pY, final TiledTextureRegion pTiledTextureRegion) { + super(pX, pY, pTiledTextureRegion.getTileWidth(), pTiledTextureRegion.getTileHeight(), pTiledTextureRegion); + } + + public TiledSprite(final float pX, final float pY, final float pTileWidth, final float pTileHeight, final TiledTextureRegion pTiledTextureRegion) { + super(pX, pY, pTileWidth, pTileHeight, pTiledTextureRegion); + } + + public TiledSprite(final float pX, final float pY, final TiledTextureRegion pTiledTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pTiledTextureRegion.getTileWidth(), pTiledTextureRegion.getTileHeight(), pTiledTextureRegion, pRectangleVertexBuffer); + } + + public TiledSprite(final float pX, final float pY, final float pTileWidth, final float pTileHeight, final TiledTextureRegion pTiledTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer) { + super(pX, pY, pTileWidth, pTileHeight, pTiledTextureRegion, pRectangleVertexBuffer); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public TiledTextureRegion getTextureRegion() { + return (TiledTextureRegion)super.getTextureRegion(); + } + + // =========================================================== + // Methods + // =========================================================== + + public int getCurrentTileIndex() { + return this.getTextureRegion().getCurrentTileIndex(); + } + + public void setCurrentTileIndex(final int pTileIndex) { + this.getTextureRegion().setCurrentTileIndex(pTileIndex); + } + + public void setCurrentTileIndex(final int pTileColumn, final int pTileRow) { + this.getTextureRegion().setCurrentTileIndex(pTileColumn, pTileRow); + } + + public void nextTile() { + this.getTextureRegion().nextTile(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/text/ChangeableText.java b/AndEngine/src/org/anddev/andengine/entity/text/ChangeableText.java new file mode 100644 index 0000000..c7512bd --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/text/ChangeableText.java @@ -0,0 +1,90 @@ +package org.anddev.andengine.entity.text; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.opengl.font.Font; +import org.anddev.andengine.opengl.vertex.TextVertexBuffer; +import org.anddev.andengine.util.HorizontalAlign; +import org.anddev.andengine.util.StringUtils; + +/** + * @author Nicolas Gramlich + * @since 18:07:06 - 08.07.2010 + */ +public class ChangeableText extends Text { + // =========================================================== + // Constants + // =========================================================== + + private static final String ELLIPSIS = "..."; + private static final int ELLIPSIS_CHARACTER_COUNT = ELLIPSIS.length(); + + // =========================================================== + // Fields + // =========================================================== + + private int mCharacterCountCurrentText; + + // =========================================================== + // Constructors + // =========================================================== + + public ChangeableText(final float pX, final float pY, final Font pFont, final String pText) { + this(pX, pY, pFont, pText, pText.length() - StringUtils.countOccurrences(pText, '\n')); + } + + public ChangeableText(final float pX, final float pY, final Font pFont, final String pText, final int pCharactersMaximum) { + this(pX, pY, pFont, pText, HorizontalAlign.LEFT, pCharactersMaximum); + } + + public ChangeableText(final float pX, final float pY, final Font pFont, final String pText, final HorizontalAlign pHorizontalAlign, final int pCharactersMaximum) { + super(pX, pY, pFont, pText, pHorizontalAlign, pCharactersMaximum); + this.mCharacterCountCurrentText = pText.length() - StringUtils.countOccurrences(pText, '\n'); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public void setText(final String pText) { + this.setText(pText, false); + } + + /** + * @param pText + * @param pAllowEllipsis in the case pText is longer than pCharactersMaximum, + * which was passed to the constructor, the displayed text will end with an ellipsis ("..."). + */ + public void setText(final String pText, final boolean pAllowEllipsis) { + final int textCharacterCount = pText.length() - StringUtils.countOccurrences(pText, '\n'); + if(textCharacterCount > this.mCharactersMaximum) { + if(pAllowEllipsis && this.mCharactersMaximum > ELLIPSIS_CHARACTER_COUNT) { + this.updateText(pText.substring(0, this.mCharactersMaximum - ELLIPSIS_CHARACTER_COUNT).concat(ELLIPSIS)); // TODO This allocation could maybe be avoided... + } else { + this.updateText(pText.substring(0, this.mCharactersMaximum)); // TODO This allocation could be avoided... + } + this.mCharacterCountCurrentText = this.mCharactersMaximum; + } else { + this.updateText(pText); + this.mCharacterCountCurrentText = textCharacterCount; + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void drawVertices(final GL10 pGL, final Camera pCamera) { + pGL.glDrawArrays(GL10.GL_TRIANGLES, 0, this.mCharacterCountCurrentText * TextVertexBuffer.VERTICES_PER_CHARACTER); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/text/Text.java b/AndEngine/src/org/anddev/andengine/entity/text/Text.java new file mode 100644 index 0000000..391c3af --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/text/Text.java @@ -0,0 +1,179 @@ +package org.anddev.andengine.entity.text; + +import javax.microedition.khronos.opengles.GL10; +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.shape.RectangularShape; +import org.anddev.andengine.opengl.buffer.BufferObjectManager; +import org.anddev.andengine.opengl.font.Font; +import org.anddev.andengine.opengl.texture.buffer.TextTextureBuffer; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.opengl.vertex.TextVertexBuffer; +import org.anddev.andengine.util.HorizontalAlign; +import org.anddev.andengine.util.StringUtils; + +/** + * @author Nicolas Gramlich + * @since 10:54:59 - 03.04.2010 + */ +public class Text extends RectangularShape { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final TextTextureBuffer mTextTextureBuffer; + + private String mText; + private String[] mLines; + private int[] mWidths; + + private final Font mFont; + + private int mMaximumLineWidth; + + protected final int mCharactersMaximum; + protected final int mVertexCount; + + // =========================================================== + // Constructors + // =========================================================== + + public Text(final float pX, final float pY, final Font pFont, final String pText) { + this(pX, pY, pFont, pText, HorizontalAlign.LEFT); + } + + public Text(final float pX, final float pY, final Font pFont, final String pText, final HorizontalAlign pHorizontalAlign) { + this(pX, pY, pFont, pText, pHorizontalAlign, pText.length() - StringUtils.countOccurrences(pText, '\n')); + } + + protected Text(final float pX, final float pY, final Font pFont, final String pText, final HorizontalAlign pHorizontalAlign, final int pCharactersMaximum) { + super(pX, pY, 0, 0, new TextVertexBuffer(pCharactersMaximum, pHorizontalAlign, GL11.GL_STATIC_DRAW)); + + this.mCharactersMaximum = pCharactersMaximum; + this.mVertexCount = TextVertexBuffer.VERTICES_PER_CHARACTER * this.mCharactersMaximum; + + this.mTextTextureBuffer = new TextTextureBuffer(2 * this.mVertexCount, GL11.GL_STATIC_DRAW); + BufferObjectManager.getActiveInstance().loadBufferObject(this.mTextTextureBuffer); + this.mFont = pFont; + + this.updateText(pText); + + this.initBlendFunction(); + } + + protected void updateText(final String pText) { + this.mText = pText; + final Font font = this.mFont; + + this.mLines = StringUtils.split(this.mText, '\n', this.mLines); + final String[] lines = this.mLines; + + final int lineCount = lines.length; + final boolean widthsReusable = this.mWidths != null && this.mWidths.length == lineCount; + if(widthsReusable == false) { + this.mWidths = new int[lineCount]; + } + final int[] widths = this.mWidths; + + int maximumLineWidth = 0; + + for (int i = lineCount - 1; i >= 0; i--) { + widths[i] = font.getStringWidth(lines[i]); + maximumLineWidth = Math.max(maximumLineWidth, widths[i]); + } + this.mMaximumLineWidth = maximumLineWidth; + + super.mWidth = this.mMaximumLineWidth; + final float width = super.mWidth; + super.mBaseWidth = width; + + super.mHeight = lineCount * font.getLineHeight() + (lineCount - 1) * font.getLineGap(); + final float height = super.mHeight; + super.mBaseHeight = height; + + this.mRotationCenterX = width * 0.5f; + this.mRotationCenterY = height * 0.5f; + + this.mScaleCenterX = this.mRotationCenterX; + this.mScaleCenterY = this.mRotationCenterY; + + this.mTextTextureBuffer.update(font, lines); + this.updateVertexBuffer(); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getCharacterCount() { + return this.mCharactersMaximum; + } + + @Override + public TextVertexBuffer getVertexBuffer() { + return (TextVertexBuffer)super.getVertexBuffer(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onInitDraw(final GL10 pGL) { + super.onInitDraw(pGL); + GLHelper.enableTextures(pGL); + GLHelper.enableTexCoordArray(pGL); + } + + @Override + protected void drawVertices(final GL10 pGL, final Camera pCamera) { + pGL.glDrawArrays(GL10.GL_TRIANGLES, 0, this.mVertexCount); + } + + @Override + protected void onUpdateVertexBuffer() { + final Font font = this.mFont; + if(font != null) { + this.getVertexBuffer().update(font, this.mMaximumLineWidth, this.mWidths, this.mLines); + } + } + + @Override + protected void onApplyTransformations(final GL10 pGL) { + super.onApplyTransformations(pGL); + this.applyTexture(pGL); + } + + // =========================================================== + // Methods + // =========================================================== + + private void initBlendFunction() { + if(this.mFont.getTexture().getTextureOptions().mPreMultipyAlpha) { + this.setBlendFunction(BLENDFUNCTION_SOURCE_PREMULTIPLYALPHA_DEFAULT, BLENDFUNCTION_DESTINATION_PREMULTIPLYALPHA_DEFAULT); + } + } + + private void applyTexture(final GL10 pGL) { + if(GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS) { + final GL11 gl11 = (GL11)pGL; + + this.mTextTextureBuffer.selectOnHardware(gl11); + + GLHelper.bindTexture(pGL, this.mFont.getTexture().getHardwareTextureID()); + GLHelper.texCoordZeroPointer(gl11); + } else { + GLHelper.bindTexture(pGL, this.mFont.getTexture().getHardwareTextureID()); + GLHelper.texCoordPointer(pGL, this.mTextTextureBuffer.getFloatBuffer()); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/entity/text/TickerText.java b/AndEngine/src/org/anddev/andengine/entity/text/TickerText.java new file mode 100644 index 0000000..79b34a5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/text/TickerText.java @@ -0,0 +1,107 @@ +package org.anddev.andengine.entity.text; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.opengl.font.Font; +import org.anddev.andengine.opengl.vertex.TextVertexBuffer; +import org.anddev.andengine.util.HorizontalAlign; + +/** + * @author Nicolas Gramlich + * @since 10:02:04 - 05.05.2010 + */ +public class TickerText extends Text { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mCharactersPerSecond; + + private int mCharactersVisible = 0; + private float mSecondsElapsed = 0; + + private boolean mReverse = false; + + private float mDuration; + + // =========================================================== + // Constructors + // =========================================================== + + public TickerText(final float pX, final float pY, final Font pFont, final String pText, final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond) { + super(pX, pY, pFont, pText, pHorizontalAlign); + this.setCharactersPerSecond(pCharactersPerSecond); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isReverse() { + return this.mReverse; + } + + public void setReverse(final boolean pReverse) { + this.mReverse = pReverse; + } + + public float getCharactersPerSecond() { + return this.mCharactersPerSecond; + } + + public void setCharactersPerSecond(final float pCharactersPerSecond) { + this.mCharactersPerSecond = pCharactersPerSecond; + this.mDuration = this.mCharactersMaximum * this.mCharactersPerSecond; + } + + public int getCharactersVisible() { + return this.mCharactersVisible; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedUpdate(final float pSecondsElapsed) { + super.onManagedUpdate(pSecondsElapsed); + if(this.mReverse){ + if(this.mCharactersVisible < this.mCharactersMaximum){ + this.mSecondsElapsed = Math.max(0, this.mSecondsElapsed - pSecondsElapsed); + this.mCharactersVisible = (int)(this.mSecondsElapsed * this.mCharactersPerSecond); + } + } else { + if(this.mCharactersVisible < this.mCharactersMaximum){ + this.mSecondsElapsed = Math.min(this.mDuration, this.mSecondsElapsed + pSecondsElapsed); + this.mCharactersVisible = (int)(this.mSecondsElapsed * this.mCharactersPerSecond); + } + } + } + + @Override + protected void drawVertices(final GL10 pGL, final Camera pCamera) { + pGL.glDrawArrays(GL10.GL_TRIANGLES, 0, this.mCharactersVisible * TextVertexBuffer.VERTICES_PER_CHARACTER); + } + + @Override + public void reset() { + super.reset(); + + this.mCharactersVisible = 0; + this.mSecondsElapsed = 0; + this.mReverse = false; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/util/AverageFPSCounter.java b/AndEngine/src/org/anddev/andengine/entity/util/AverageFPSCounter.java new file mode 100644 index 0000000..67e8bba --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/util/AverageFPSCounter.java @@ -0,0 +1,64 @@ +package org.anddev.andengine.entity.util; + +import org.anddev.andengine.util.constants.TimeConstants; + + +/** + * @author Nicolas Gramlich + * @since 19:52:31 - 09.03.2010 + */ +public abstract class AverageFPSCounter extends FPSCounter implements TimeConstants { + // =========================================================== + // Constants + // =========================================================== + + private static final float AVERAGE_DURATION_DEFAULT = 5; + + // =========================================================== + // Fields + // =========================================================== + + protected final float mAverageDuration; + + // =========================================================== + // Constructors + // =========================================================== + + public AverageFPSCounter() { + this(AVERAGE_DURATION_DEFAULT); + } + + public AverageFPSCounter(final float pAverageDuration) { + this.mAverageDuration = pAverageDuration; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onHandleAverageDurationElapsed(final float pFPS); + + @Override + public void onUpdate(final float pSecondsElapsed) { + super.onUpdate(pSecondsElapsed); + + if(this.mSecondsElapsed > this.mAverageDuration){ + this.onHandleAverageDurationElapsed(this.getFPS()); + + this.mSecondsElapsed -= this.mAverageDuration; + this.mFrames = 0; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/util/FPSCounter.java b/AndEngine/src/org/anddev/andengine/entity/util/FPSCounter.java new file mode 100644 index 0000000..ca7c451 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/util/FPSCounter.java @@ -0,0 +1,57 @@ +package org.anddev.andengine.entity.util; + +import org.anddev.andengine.engine.handler.IUpdateHandler; + +/** + * @author Nicolas Gramlich + * @since 19:52:31 - 09.03.2010 + */ +public class FPSCounter implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mSecondsElapsed; + + protected int mFrames; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getFPS() { + return this.mFrames / this.mSecondsElapsed; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mFrames++; + this.mSecondsElapsed += pSecondsElapsed; + } + + @Override + public void reset() { + this.mFrames = 0; + this.mSecondsElapsed = 0; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/util/FPSLogger.java b/AndEngine/src/org/anddev/andengine/entity/util/FPSLogger.java new file mode 100644 index 0000000..9fff9a6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/util/FPSLogger.java @@ -0,0 +1,79 @@ +package org.anddev.andengine.entity.util; + +import org.anddev.andengine.util.Debug; + +/** + * @author Nicolas Gramlich + * @since 19:52:31 - 09.03.2010 + */ +public class FPSLogger extends AverageFPSCounter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected float mShortestFrame = Float.MAX_VALUE; + protected float mLongestFrame = Float.MIN_VALUE; + + // =========================================================== + // Constructors + // =========================================================== + + public FPSLogger() { + super(); + } + + public FPSLogger(final float pAverageDuration) { + super(pAverageDuration); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onHandleAverageDurationElapsed(final float pFPS) { + this.onLogFPS(); + + this.mLongestFrame = Float.MIN_VALUE; + this.mShortestFrame = Float.MAX_VALUE; + } + + @Override + public void onUpdate(final float pSecondsElapsed) { + super.onUpdate(pSecondsElapsed); + + this.mShortestFrame = Math.min(this.mShortestFrame, pSecondsElapsed); + this.mLongestFrame = Math.max(this.mLongestFrame, pSecondsElapsed); + } + + @Override + public void reset() { + super.reset(); + + this.mShortestFrame = Float.MAX_VALUE; + this.mLongestFrame = Float.MIN_VALUE; + } + + // =========================================================== + // Methods + // =========================================================== + + protected void onLogFPS() { + Debug.d(String.format("FPS: %.2f (MIN: %.0f ms | MAX: %.0f ms)", + this.mFrames / this.mSecondsElapsed, + this.mShortestFrame * MILLISECONDSPERSECOND, + this.mLongestFrame * MILLISECONDSPERSECOND)); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/util/FrameCountCrasher.java b/AndEngine/src/org/anddev/andengine/entity/util/FrameCountCrasher.java new file mode 100644 index 0000000..34b7cee --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/util/FrameCountCrasher.java @@ -0,0 +1,69 @@ +package org.anddev.andengine.entity.util; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.constants.TimeConstants; + +/** + * @author Nicolas Gramlich + * @since 19:52:31 - 09.03.2010 + */ +public class FrameCountCrasher implements IUpdateHandler, TimeConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private int mFramesLeft; + + private final float[] mFrameLengths; + + // =========================================================== + // Constructors + // =========================================================== + + public FrameCountCrasher(final int pFrameCount) { + this.mFramesLeft = pFrameCount; + this.mFrameLengths = new float[pFrameCount]; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mFramesLeft--; + + final float[] frameLengths = this.mFrameLengths; + if(this.mFramesLeft >= 0) { + frameLengths[this.mFramesLeft] = pSecondsElapsed; + } else { + for(int i = frameLengths.length - 1; i >= 0; i--) { + Debug.d("Elapsed: " + frameLengths[i]); + } + + throw new RuntimeException(); + } + } + + @Override + public void reset() { + + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/util/FrameCounter.java b/AndEngine/src/org/anddev/andengine/entity/util/FrameCounter.java new file mode 100644 index 0000000..a96509f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/util/FrameCounter.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.entity.util; + +import org.anddev.andengine.engine.handler.IUpdateHandler; + +/** + * @author Nicolas Gramlich + * @since 11:00:55 - 22.06.2010 + */ +public class FrameCounter implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private int mFrames; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getFrames() { + return this.mFrames; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mFrames++; + } + + @Override + public void reset() { + this.mFrames = 0; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/entity/util/ScreenCapture.java b/AndEngine/src/org/anddev/andengine/entity/util/ScreenCapture.java new file mode 100644 index 0000000..7ee0382 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/util/ScreenCapture.java @@ -0,0 +1,121 @@ +package org.anddev.andengine.entity.util; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.Entity; +import org.anddev.andengine.entity.util.ScreenGrabber.IScreenGrabberCallback; +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.StreamUtils; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.CompressFormat; + +/** + * @author Nicolas Gramlich + * @since 15:11:50 - 15.03.2010 + */ +public class ScreenCapture extends Entity implements IScreenGrabberCallback { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private String mFilePath; + + private final ScreenGrabber mScreenGrabber = new ScreenGrabber(); + + private IScreenCaptureCallback mScreenCaptureCallback; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedDraw(final GL10 pGL, final Camera pCamera) { + this.mScreenGrabber.onManagedDraw(pGL, pCamera); + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed) { + /* Nothing */ + } + + @Override + public void reset() { + /* Nothing */ + } + + @Override + public void onScreenGrabbed(final Bitmap pBitmap) { + try { + ScreenCapture.saveCapture(pBitmap, this.mFilePath); + this.mScreenCaptureCallback.onScreenCaptured(this.mFilePath); + } catch (final FileNotFoundException e) { + this.mScreenCaptureCallback.onScreenCaptureFailed(this.mFilePath, e); + } + } + + @Override + public void onScreenGrabFailed(final Exception pException) { + this.mScreenCaptureCallback.onScreenCaptureFailed(this.mFilePath, pException); + } + + // =========================================================== + // Methods + // =========================================================== + + public void capture(final int pCaptureWidth, final int pCaptureHeight, final String pFilePath, final IScreenCaptureCallback pScreenCaptureCallback) { + this.capture(0, 0, pCaptureWidth, pCaptureHeight, pFilePath, pScreenCaptureCallback); + } + + public void capture(final int pCaptureX, final int pCaptureY, final int pCaptureWidth, final int pCaptureHeight, final String pFilePath, final IScreenCaptureCallback pScreencaptureCallback) { + this.mFilePath = pFilePath; + this.mScreenCaptureCallback = pScreencaptureCallback; + this.mScreenGrabber.grab(pCaptureX, pCaptureY, pCaptureWidth, pCaptureHeight, this); + } + + private static void saveCapture(final Bitmap pBitmap, final String pFilePath) throws FileNotFoundException { + FileOutputStream fos = null; + try { + fos = new FileOutputStream(pFilePath); + pBitmap.compress(CompressFormat.PNG, 100, fos); + + } catch (final FileNotFoundException e) { + StreamUtils.flushCloseStream(fos); + Debug.e("Error saving file to: " + pFilePath, e); + throw e; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IScreenCaptureCallback { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onScreenCaptured(final String pFilePath); + public void onScreenCaptureFailed(final String pFilePath, final Exception pException); + } +} diff --git a/AndEngine/src/org/anddev/andengine/entity/util/ScreenGrabber.java b/AndEngine/src/org/anddev/andengine/entity/util/ScreenGrabber.java new file mode 100644 index 0000000..7219944 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/entity/util/ScreenGrabber.java @@ -0,0 +1,132 @@ +package org.anddev.andengine.entity.util; + +import java.nio.IntBuffer; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.entity.Entity; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; + +/** + * @author Nicolas Gramlich + * @since 15:27:22 - 10.01.2011 + */ +public class ScreenGrabber extends Entity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private int mGrabX; + private int mGrabY; + private int mGrabWidth; + private int mGrabHeight; + + private boolean mScreenGrabPending = false; + private IScreenGrabberCallback mScreenGrabCallback; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedDraw(final GL10 pGL, final Camera pCamera) { + if(this.mScreenGrabPending) { + try { + final Bitmap screenGrab = ScreenGrabber.grab(this.mGrabX, this.mGrabY, this.mGrabWidth, this.mGrabHeight, pGL); + + this.mScreenGrabCallback.onScreenGrabbed(screenGrab); + } catch (final Exception e) { + this.mScreenGrabCallback.onScreenGrabFailed(e); + } + + this.mScreenGrabPending = false; + } + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed) { + /* Nothing */ + } + + @Override + public void reset() { + /* Nothing */ + } + + // =========================================================== + // Methods + // =========================================================== + + public void grab(final int pGrabWidth, final int pGrabHeight, final IScreenGrabberCallback pScreenGrabCallback) { + this.grab(0, 0, pGrabWidth, pGrabHeight, pScreenGrabCallback); + } + + public void grab(final int pGrabX, final int pGrabY, final int pGrabWidth, final int pGrabHeight, final IScreenGrabberCallback pScreenGrabCallback) { + this.mGrabX = pGrabX; + this.mGrabY = pGrabY; + this.mGrabWidth = pGrabWidth; + this.mGrabHeight = pGrabHeight; + this.mScreenGrabCallback = pScreenGrabCallback; + + this.mScreenGrabPending = true; + } + + private static Bitmap grab(final int pGrabX, final int pGrabY, final int pGrabWidth, final int pGrabHeight, final GL10 pGL) { + final int[] source = new int[pGrabWidth * (pGrabY + pGrabHeight)]; + final IntBuffer sourceBuffer = IntBuffer.wrap(source); + sourceBuffer.position(0); + + // TODO Check availability of OpenGL and GL10.GL_RGBA combinations that require less conversion operations. + // Note: There is (said to be) a bug with glReadPixels when 'y != 0', so we simply read starting from 'y == 0'. + pGL.glReadPixels(pGrabX, 0, pGrabWidth, pGrabY + pGrabHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, sourceBuffer); + + final int[] pixels = new int[pGrabWidth * pGrabHeight]; + + // Convert from RGBA_8888 (Which is actually ABGR as the whole buffer seems to be inverted) --> ARGB_8888 + for (int y = 0; y < pGrabHeight; y++) { + for (int x = 0; x < pGrabWidth; x++) { + final int pixel = source[x + ((pGrabY + y) * pGrabWidth)]; + + final int blue = (pixel & 0x00FF0000) >> 16; + final int red = (pixel & 0x000000FF) << 16; + final int greenAlpha = pixel & 0xFF00FF00; + + pixels[x + ((pGrabHeight - y - 1) * pGrabWidth)] = greenAlpha | red | blue; + } + } + + return Bitmap.createBitmap(pixels, pGrabWidth, pGrabHeight, Config.ARGB_8888); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IScreenGrabberCallback { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onScreenGrabbed(final Bitmap pBitmap); + public void onScreenGrabFailed(final Exception pException); + } +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/FixedStepPhysicsWorld.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/FixedStepPhysicsWorld.java new file mode 100644 index 0000000..4d9f59b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/FixedStepPhysicsWorld.java @@ -0,0 +1,89 @@ +package org.anddev.andengine.extension.physics.box2d; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.World; + +/** + * A subclass of {@link PhysicsWorld} that tries to achieve a specific amount of steps per second. + * When the time since the last step is bigger long the steplength, additional steps are executed. + * + * @author Nicolas Gramlich + * @since 12:39:42 - 25.07.2010 + */ +public class FixedStepPhysicsWorld extends PhysicsWorld { + // =========================================================== + // Constants + // =========================================================== + + public static final int STEPSPERSECOND_DEFAULT = 60; + + // =========================================================== + // Fields + // =========================================================== + + private final float mTimeStep; + private final int mMaximumStepsPerUpdate; + private float mSecondsElapsedAccumulator; + + // =========================================================== + // Constructors + // =========================================================== + + public FixedStepPhysicsWorld(final int pStepsPerSecond, final Vector2 pGravity, final boolean pAllowSleep) { + this(pStepsPerSecond, Integer.MAX_VALUE, pGravity, pAllowSleep); + } + + public FixedStepPhysicsWorld(final int pStepsPerSecond, final int pMaximumStepsPerUpdate, final Vector2 pGravity, final boolean pAllowSleep) { + super(pGravity, pAllowSleep); + this.mTimeStep = 1.0f / pStepsPerSecond; + this.mMaximumStepsPerUpdate = pMaximumStepsPerUpdate; + } + + public FixedStepPhysicsWorld(final int pStepsPerSecond, final Vector2 pGravity, final boolean pAllowSleep, final int pVelocityIterations, final int pPositionIterations) { + this(pStepsPerSecond, Integer.MAX_VALUE, pGravity, pAllowSleep, pVelocityIterations, pPositionIterations); + } + + public FixedStepPhysicsWorld(final int pStepsPerSecond, final int pMaximumStepsPerUpdate, final Vector2 pGravity, final boolean pAllowSleep, final int pVelocityIterations, final int pPositionIterations) { + super(pGravity, pAllowSleep, pVelocityIterations, pPositionIterations); + this.mTimeStep = 1.0f / pStepsPerSecond; + this.mMaximumStepsPerUpdate = pMaximumStepsPerUpdate; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mRunnableHandler.onUpdate(pSecondsElapsed); + this.mSecondsElapsedAccumulator += pSecondsElapsed; + + final int velocityIterations = this.mVelocityIterations; + final int positionIterations = this.mPositionIterations; + + final World world = this.mWorld; + final float stepLength = this.mTimeStep; + + int stepsAllowed = this.mMaximumStepsPerUpdate; + + while(this.mSecondsElapsedAccumulator >= stepLength && stepsAllowed > 0) { + world.step(stepLength, velocityIterations, positionIterations); + this.mSecondsElapsedAccumulator -= stepLength; + stepsAllowed--; + } + + this.mPhysicsConnectorManager.onUpdate(pSecondsElapsed); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsConnector.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsConnector.java new file mode 100644 index 0000000..06f11ef --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsConnector.java @@ -0,0 +1,123 @@ +package org.anddev.andengine.extension.physics.box2d; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.entity.shape.IShape; +import org.anddev.andengine.extension.physics.box2d.util.constants.PhysicsConstants; +import org.anddev.andengine.util.MathUtils; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; + +/** + * @author Nicolas Gramlich + * @since 18:51:22 - 05.07.2010 + */ +public class PhysicsConnector implements IUpdateHandler, PhysicsConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final IShape mShape; + protected final Body mBody; + + protected final float mShapeHalfBaseWidth; + protected final float mShapeHalfBaseHeight; + + protected boolean mUpdatePosition; + protected boolean mUpdateRotation; + protected final float mPixelToMeterRatio; + + // =========================================================== + // Constructors + // =========================================================== + + public PhysicsConnector(final IShape pShape, final Body pBody) { + this(pShape, pBody, true, true); + } + + public PhysicsConnector(final IShape pShape, final Body pBody, final float pPixelToMeterRatio) { + this(pShape, pBody, true, true, pPixelToMeterRatio); + } + + public PhysicsConnector(final IShape pShape, final Body pBody, final boolean pUdatePosition, final boolean pUpdateRotation) { + this(pShape, pBody, pUdatePosition, pUpdateRotation, PIXEL_TO_METER_RATIO_DEFAULT); + } + + public PhysicsConnector(final IShape pShape, final Body pBody, final boolean pUdatePosition, final boolean pUpdateRotation, final float pPixelToMeterRatio) { + this.mShape = pShape; + this.mBody = pBody; + + this.mUpdatePosition = pUdatePosition; + this.mUpdateRotation = pUpdateRotation; + this.mPixelToMeterRatio = pPixelToMeterRatio; + + this.mShapeHalfBaseWidth = pShape.getBaseWidth() * 0.5f; + this.mShapeHalfBaseHeight = pShape.getBaseHeight() * 0.5f; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public IShape getShape() { + return this.mShape; + } + + public Body getBody() { + return this.mBody; + } + + public boolean isUpdatePosition() { + return this.mUpdatePosition; + } + + public boolean isUpdateRotation() { + return this.mUpdateRotation; + } + + public void setUpdatePosition(final boolean pUpdatePosition) { + this.mUpdatePosition = pUpdatePosition; + } + + public void setUpdateRotation(final boolean pUpdateRotation) { + this.mUpdateRotation = pUpdateRotation; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + final IShape shape = this.mShape; + final Body body = this.mBody; + + if(this.mUpdatePosition) { + final Vector2 position = body.getPosition(); + final float pixelToMeterRatio = this.mPixelToMeterRatio; + shape.setPosition(position.x * pixelToMeterRatio - this.mShapeHalfBaseWidth, position.y * pixelToMeterRatio - this.mShapeHalfBaseHeight); + } + + if(this.mUpdateRotation) { + final float angle = body.getAngle(); + shape.setRotation(MathUtils.radToDeg(angle)); + } + } + + @Override + public void reset() { + + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsConnectorManager.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsConnectorManager.java new file mode 100644 index 0000000..d7a0d1f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsConnectorManager.java @@ -0,0 +1,86 @@ +package org.anddev.andengine.extension.physics.box2d; + +import java.util.ArrayList; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.entity.shape.IShape; + +import com.badlogic.gdx.physics.box2d.Body; + +/** + * @author Nicolas Gramlich + * @since 15:52:27 - 15.07.2010 + */ +public class PhysicsConnectorManager extends ArrayList implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 412969510084261799L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + PhysicsConnectorManager() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + final ArrayList physicsConnectors = this; + for(int i = physicsConnectors.size() - 1; i >= 0; i--) { + physicsConnectors.get(i).onUpdate(pSecondsElapsed); + } + } + + @Override + public void reset() { + final ArrayList physicsConnectors = this; + for(int i = physicsConnectors.size() - 1; i >= 0; i--) { + physicsConnectors.get(i).reset(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + public Body findBodyByShape(final IShape pShape) { + final ArrayList physicsConnectors = this; + for(int i = physicsConnectors.size() - 1; i >= 0; i--) { + final PhysicsConnector physicsConnector = physicsConnectors.get(i); + if(physicsConnector.mShape == pShape){ + return physicsConnector.mBody; + } + } + return null; + } + + public PhysicsConnector findPhysicsConnectorByShape(final IShape pShape) { + final ArrayList physicsConnectors = this; + for(int i = physicsConnectors.size() - 1; i >= 0; i--) { + final PhysicsConnector physicsConnector = physicsConnectors.get(i); + if(physicsConnector.mShape == pShape){ + return physicsConnector; + } + } + return null; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsFactory.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsFactory.java new file mode 100644 index 0000000..f986970 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsFactory.java @@ -0,0 +1,260 @@ +package org.anddev.andengine.extension.physics.box2d; + + +import static org.anddev.andengine.extension.physics.box2d.util.constants.PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT; + +import java.util.List; + +import org.anddev.andengine.entity.primitive.Line; +import org.anddev.andengine.entity.shape.IShape; +import org.anddev.andengine.extension.physics.box2d.util.constants.PhysicsConstants; +import org.anddev.andengine.util.MathUtils; +import org.anddev.andengine.util.constants.Constants; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.BodyDef; +import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; +import com.badlogic.gdx.physics.box2d.CircleShape; +import com.badlogic.gdx.physics.box2d.Filter; +import com.badlogic.gdx.physics.box2d.Fixture; +import com.badlogic.gdx.physics.box2d.FixtureDef; +import com.badlogic.gdx.physics.box2d.PolygonShape; + +/** + * @author Nicolas Gramlich + * @since 13:59:03 - 15.07.2010 + */ +public class PhysicsFactory { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public static FixtureDef createFixtureDef(final float pDensity, final float pElasticity, final float pFriction) { + return PhysicsFactory.createFixtureDef(pDensity, pElasticity, pFriction, false); + } + + public static FixtureDef createFixtureDef(final float pDensity, final float pElasticity, final float pFriction, final boolean pSensor) { + final FixtureDef fixtureDef = new FixtureDef(); + fixtureDef.density = pDensity; + fixtureDef.restitution = pElasticity; + fixtureDef.friction = pFriction; + fixtureDef.isSensor = pSensor; + return fixtureDef; + } + + public static FixtureDef createFixtureDef(final float pDensity, final float pElasticity, final float pFriction, final boolean pSensor, final short pCategoryBits, final short pMaskBits, final short pGroupIndex) { + final FixtureDef fixtureDef = new FixtureDef(); + fixtureDef.density = pDensity; + fixtureDef.restitution = pElasticity; + fixtureDef.friction = pFriction; + fixtureDef.isSensor = pSensor; + final Filter filter = fixtureDef.filter; + filter.categoryBits = pCategoryBits; + filter.maskBits = pMaskBits; + filter.groupIndex = pGroupIndex; + return fixtureDef; + } + + public static Body createBoxBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final BodyType pBodyType, final FixtureDef pFixtureDef) { + return PhysicsFactory.createBoxBody(pPhysicsWorld, pIShape, pBodyType, pFixtureDef, PIXEL_TO_METER_RATIO_DEFAULT); + } + + public static Body createBoxBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final BodyType pBodyType, final FixtureDef pFixtureDef, final float pPixelToMeterRatio) { + final BodyDef boxBodyDef = new BodyDef(); + boxBodyDef.type = pBodyType; + + final float[] sceneCenterCoordinates = pIShape.getSceneCenterCoordinates(); + boxBodyDef.position.x = sceneCenterCoordinates[Constants.VERTEX_INDEX_X] / pPixelToMeterRatio; + boxBodyDef.position.y = sceneCenterCoordinates[Constants.VERTEX_INDEX_Y] / pPixelToMeterRatio; + + final Body boxBody = pPhysicsWorld.createBody(boxBodyDef); + + final PolygonShape boxPoly = new PolygonShape(); + + final float halfWidth = pIShape.getWidthScaled() * 0.5f / pPixelToMeterRatio; + final float halfHeight = pIShape.getHeightScaled() * 0.5f / pPixelToMeterRatio; + + boxPoly.setAsBox(halfWidth, halfHeight); + pFixtureDef.shape = boxPoly; + + boxBody.createFixture(pFixtureDef); + + boxPoly.dispose(); + + boxBody.setTransform(boxBody.getWorldCenter(), MathUtils.degToRad(pIShape.getRotation())); + + return boxBody; + } + + public static Body createCircleBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final BodyType pBodyType, final FixtureDef pFixtureDef) { + return PhysicsFactory.createCircleBody(pPhysicsWorld, pIShape, pBodyType, pFixtureDef, PIXEL_TO_METER_RATIO_DEFAULT); + } + + public static Body createCircleBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final BodyType pBodyType, final FixtureDef pFixtureDef, final float pPixelToMeterRatio) { + + final BodyDef circleBodyDef = new BodyDef(); + circleBodyDef.type = pBodyType; + + final float[] sceneCenterCoordinates = pIShape.getSceneCenterCoordinates(); + circleBodyDef.position.x = sceneCenterCoordinates[Constants.VERTEX_INDEX_X] / pPixelToMeterRatio; + circleBodyDef.position.y = sceneCenterCoordinates[Constants.VERTEX_INDEX_Y] / pPixelToMeterRatio; + + circleBodyDef.angle = MathUtils.degToRad(pIShape.getRotation()); + + final Body circleBody = pPhysicsWorld.createBody(circleBodyDef); + + final CircleShape circlePoly = new CircleShape(); + pFixtureDef.shape = circlePoly; + + final float radius = pIShape.getWidthScaled() * 0.5f / pPixelToMeterRatio; + circlePoly.setRadius(radius); + + circleBody.createFixture(pFixtureDef); + + circlePoly.dispose(); + + return circleBody; + } + + public static Body createLineBody(final PhysicsWorld pPhysicsWorld, final Line pLine, final FixtureDef pFixtureDef) { + return PhysicsFactory.createLineBody(pPhysicsWorld, pLine, pFixtureDef, PIXEL_TO_METER_RATIO_DEFAULT); + } + + public static Body createLineBody(final PhysicsWorld pPhysicsWorld, final Line pLine, final FixtureDef pFixtureDef, final float pPixelToMeterRatio) { + final BodyDef lineBodyDef = new BodyDef(); + lineBodyDef.type = BodyType.StaticBody; + + final Body boxBody = pPhysicsWorld.createBody(lineBodyDef); + + final PolygonShape linePoly = new PolygonShape(); + + linePoly.setAsEdge(new Vector2(pLine.getX1() / pPixelToMeterRatio, pLine.getY1() / pPixelToMeterRatio), new Vector2(pLine.getX2() / pPixelToMeterRatio, pLine.getY2() / pPixelToMeterRatio)); + pFixtureDef.shape = linePoly; + + boxBody.createFixture(pFixtureDef); + + linePoly.dispose(); + + return boxBody; + } + + /** + * @param pPhysicsWorld + * @param pIShape + * @param pVertices are to be defined relative to the center of the pIShape and have the {@link PhysicsConstants#PIXEL_TO_METER_RATIO_DEFAULT} applied. + * @param pBodyType + * @param pFixtureDef + * @return + */ + public static Body createPolygonBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final Vector2[] pVertices, final BodyType pBodyType, final FixtureDef pFixtureDef) { + return PhysicsFactory.createPolygonBody(pPhysicsWorld, pIShape, pVertices, pBodyType, pFixtureDef, PIXEL_TO_METER_RATIO_DEFAULT); + } + + /** + * @param pPhysicsWorld + * @param pIShape + * @param pVertices are to be defined relative to the center of the pIShape. + * @param pBodyType + * @param pFixtureDef + * @return + */ + public static Body createPolygonBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final Vector2[] pVertices, final BodyType pBodyType, final FixtureDef pFixtureDef, final float pPixelToMeterRatio) { + final BodyDef boxBodyDef = new BodyDef(); + boxBodyDef.type = pBodyType; + + final float[] sceneCenterCoordinates = pIShape.getSceneCenterCoordinates(); + boxBodyDef.position.x = sceneCenterCoordinates[Constants.VERTEX_INDEX_X] / pPixelToMeterRatio; + boxBodyDef.position.y = sceneCenterCoordinates[Constants.VERTEX_INDEX_Y] / pPixelToMeterRatio; + + final Body boxBody = pPhysicsWorld.createBody(boxBodyDef); + + final PolygonShape boxPoly = new PolygonShape(); + + boxPoly.set(pVertices); + pFixtureDef.shape = boxPoly; + + boxBody.createFixture(pFixtureDef); + + boxPoly.dispose(); + + return boxBody; + } + + + /** + * @param pPhysicsWorld + * @param pIShape + * @param pTriangleVertices are to be defined relative to the center of the pIShape and have the {@link PhysicsConstants#PIXEL_TO_METER_RATIO_DEFAULT} applied. + * @param pBodyType + * @param pFixtureDef + * @return + */ + public static Body createTrianglulatedBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final List pTriangleVertices, final BodyType pBodyType, final FixtureDef pFixtureDef) { + return PhysicsFactory.createTrianglulatedBody(pPhysicsWorld, pIShape, pTriangleVertices, pBodyType, pFixtureDef, PIXEL_TO_METER_RATIO_DEFAULT); + } + + /** + * @param pPhysicsWorld + * @param pIShape + * @param pTriangleVertices are to be defined relative to the center of the pIShape and have the {@link PhysicsConstants#PIXEL_TO_METER_RATIO_DEFAULT} applied. + * The vertices will be triangulated and for each triangle a {@link Fixture} will be created. + * @param pBodyType + * @param pFixtureDef + * @return + */ + public static Body createTrianglulatedBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final List pTriangleVertices, final BodyType pBodyType, final FixtureDef pFixtureDef, final float pPixelToMeterRatio) { + final Vector2[] TMP_TRIANGLE = new Vector2[3]; + + final BodyDef boxBodyDef = new BodyDef(); + boxBodyDef.type = pBodyType; + + final float[] sceneCenterCoordinates = pIShape.getSceneCenterCoordinates(); + boxBodyDef.position.x = sceneCenterCoordinates[Constants.VERTEX_INDEX_X] / pPixelToMeterRatio; + boxBodyDef.position.y = sceneCenterCoordinates[Constants.VERTEX_INDEX_Y] / pPixelToMeterRatio; + + final Body boxBody = pPhysicsWorld.createBody(boxBodyDef); + + final int vertexCount = pTriangleVertices.size(); + for(int i = 0; i < vertexCount; /* */) { + final PolygonShape boxPoly = new PolygonShape(); + + TMP_TRIANGLE[2] = pTriangleVertices.get(i++); + TMP_TRIANGLE[1] = pTriangleVertices.get(i++); + TMP_TRIANGLE[0] = pTriangleVertices.get(i++); + + boxPoly.set(TMP_TRIANGLE); + pFixtureDef.shape = boxPoly; + + boxBody.createFixture(pFixtureDef); + + boxPoly.dispose(); + } + + return boxBody; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsWorld.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsWorld.java new file mode 100644 index 0000000..b92a62b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/PhysicsWorld.java @@ -0,0 +1,228 @@ +package org.anddev.andengine.extension.physics.box2d; + +import java.util.List; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.engine.handler.runnable.RunnableHandler; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.BodyDef; +import com.badlogic.gdx.physics.box2d.Contact; +import com.badlogic.gdx.physics.box2d.ContactFilter; +import com.badlogic.gdx.physics.box2d.ContactListener; +import com.badlogic.gdx.physics.box2d.DestructionListener; +import com.badlogic.gdx.physics.box2d.Joint; +import com.badlogic.gdx.physics.box2d.JointDef; +import com.badlogic.gdx.physics.box2d.QueryCallback; +import com.badlogic.gdx.physics.box2d.World; + +/** + * @author Nicolas Gramlich + * @since 15:18:19 - 15.07.2010 + */ +public class PhysicsWorld implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + static { + System.loadLibrary( "andenginephysicsbox2dextension" ); + } + + public static final int VELOCITY_ITERATIONS_DEFAULT = 8; + public static final int POSITION_ITERATIONS_DEFAULT = 8; + + // =========================================================== + // Fields + // =========================================================== + + protected final PhysicsConnectorManager mPhysicsConnectorManager = new PhysicsConnectorManager(); + protected final RunnableHandler mRunnableHandler = new RunnableHandler(); + protected final World mWorld; + + protected int mVelocityIterations = VELOCITY_ITERATIONS_DEFAULT; + protected int mPositionIterations = POSITION_ITERATIONS_DEFAULT; + + // =========================================================== + // Constructors + // =========================================================== + + public PhysicsWorld(final Vector2 pGravity, final boolean pAllowSleep) { + this(pGravity, pAllowSleep, VELOCITY_ITERATIONS_DEFAULT, POSITION_ITERATIONS_DEFAULT); + } + + public PhysicsWorld(final Vector2 pGravity, final boolean pAllowSleep, final int pVelocityIterations, final int pPositionIterations) { + this.mWorld = new World(pGravity, pAllowSleep); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // public World getWorld() { + // return this.mWorld; + // } + + public int getPositionIterations() { + return this.mPositionIterations; + } + + public void setPositionIterations(final int pPositionIterations) { + this.mPositionIterations = pPositionIterations; + } + + public int getVelocityIterations() { + return this.mVelocityIterations; + } + + public void setVelocityIterations(final int pVelocityIterations) { + this.mVelocityIterations = pVelocityIterations; + } + + public PhysicsConnectorManager getPhysicsConnectorManager() { + return this.mPhysicsConnectorManager; + } + + public void clearPhysicsConnectors() { + this.mPhysicsConnectorManager.clear(); + } + + public void registerPhysicsConnector(final PhysicsConnector pPhysicsConnector) { + this.mPhysicsConnectorManager.add(pPhysicsConnector); + } + + public void unregisterPhysicsConnector(final PhysicsConnector pPhysicsConnector) { + this.mPhysicsConnectorManager.remove(pPhysicsConnector); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mRunnableHandler.onUpdate(pSecondsElapsed); + this.mWorld.step(pSecondsElapsed, this.mVelocityIterations, this.mPositionIterations); + this.mPhysicsConnectorManager.onUpdate(pSecondsElapsed); + } + + @Override + public void reset() { + // TODO Reset all native physics objects !?!??! + this.mPhysicsConnectorManager.reset(); + this.mRunnableHandler.reset(); + } + + // =========================================================== + // Methods + // =========================================================== + + public void postRunnable(final Runnable pRunnable) { + this.mRunnableHandler.postRunnable(pRunnable); + } + + public void clearForces() { + this.mWorld.clearForces(); + } + + public Body createBody(final BodyDef pDef) { + return this.mWorld.createBody(pDef); + } + + public Joint createJoint(final JointDef pDef) { + return this.mWorld.createJoint(pDef); + } + + public void destroyBody(final Body pBody) { + this.mWorld.destroyBody(pBody); + } + + public void destroyJoint(final Joint pJoint) { + this.mWorld.destroyJoint(pJoint); + } + + public void dispose() { + this.mWorld.dispose(); + } + + public boolean getAutoClearForces() { + return this.mWorld.getAutoClearForces(); + } + + public Iterable getBodies() { + return this.mWorld.getBodies(); + } + + public int getBodyCount() { + return this.mWorld.getBodyCount(); + } + + public int getContactCount() { + return this.mWorld.getContactCount(); + } + + public List getContactList() { + return this.mWorld.getContactList(); + } + + public Vector2 getGravity() { + return this.mWorld.getGravity(); + } + + public Iterable getJoints() { + return this.mWorld.getJoints(); + } + + public int getJointCount() { + return this.mWorld.getJointCount(); + } + + public int getProxyCount() { + return this.mWorld.getProxyCount(); + } + + public boolean isLocked() { + return this.mWorld.isLocked(); + } + + public void QueryAABB(final QueryCallback pCallback, final float pLowerX, final float pLowerY, final float pUpperX, final float pUpperY) { + this.mWorld.QueryAABB(pCallback, pLowerX, pLowerY, pUpperX, pUpperY); + } + + public void setAutoClearForces(final boolean pFlag) { + this.mWorld.setAutoClearForces(pFlag); + } + + public void setContactFilter(final ContactFilter pFilter) { + this.mWorld.setContactFilter(pFilter); + } + + public void setContactListener(final ContactListener pListener) { + this.mWorld.setContactListener(pListener); + } + + public void setContinuousPhysics(final boolean pFlag) { + this.mWorld.setContinuousPhysics(pFlag); + } + + public void setDestructionListener(final DestructionListener pListener) { + this.mWorld.setDestructionListener(pListener); + } + + public void setGravity(final Vector2 pGravity) { + this.mWorld.setGravity(pGravity); + } + + public void setWarmStarting(final boolean pFlag) { + this.mWorld.setWarmStarting(pFlag); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/Vector2Pool.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/Vector2Pool.java new file mode 100644 index 0000000..d861cb5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/Vector2Pool.java @@ -0,0 +1,62 @@ +package org.anddev.andengine.extension.physics.box2d.util; + +import org.anddev.andengine.util.pool.GenericPool; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 16:22:23 - 14.09.2010 + */ +public class Vector2Pool { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static final GenericPool POOL = new GenericPool() { + @Override + protected Vector2 onAllocatePoolItem() { + return new Vector2(); + } + }; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public static Vector2 obtain() { + return POOL.obtainPoolItem(); + } + + public static Vector2 obtain(final Vector2 pCopyFrom) { + return POOL.obtainPoolItem().set(pCopyFrom); + } + + public static Vector2 obtain(final float pX, final float pY) { + return POOL.obtainPoolItem().set(pX, pY); + } + + public static void recycle(final Vector2 pVector2) { + POOL.recyclePoolItem(pVector2); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/constants/PhysicsConstants.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/constants/PhysicsConstants.java new file mode 100644 index 0000000..92530fd --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/constants/PhysicsConstants.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.extension.physics.box2d.util.constants; + +/** + * @author Nicolas Gramlich + * @since 13:01:50 - 28.07.2010 + */ +public interface PhysicsConstants { + // =========================================================== + // Final Fields + // =========================================================== + + public static final float PIXEL_TO_METER_RATIO_DEFAULT = 32.0f; + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/BaseHullAlgorithm.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/BaseHullAlgorithm.java new file mode 100644 index 0000000..18beb9b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/BaseHullAlgorithm.java @@ -0,0 +1,64 @@ +package org.anddev.andengine.extension.physics.box2d.util.hull; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 14:05:51 - 14.09.2010 + */ +public abstract class BaseHullAlgorithm implements IHullAlgorithm { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected Vector2[] mVertices; + protected int mVertexCount; + protected int mHullVertexCount; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + protected int indexOfLowestVertex() { + final Vector2[] vertices = this.mVertices; + final int vertexCount = this.mVertexCount; + + int min = 0; + for(int i = 1; i < vertexCount; i++) { + final float dY = vertices[i].y - vertices[min].y; + final float dX = vertices[i].x - vertices[min].x; + if(dY < 0 || dY == 0 && dX < 0) { + min = i; + } + } + return min; + } + + protected void swap(final int pIndexA, final int pIndexB) { + final Vector2[] vertices = this.mVertices; + + final Vector2 tmp = vertices[pIndexA]; + vertices[pIndexA] = vertices[pIndexB]; + vertices[pIndexB] = tmp; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/GrahamScan.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/GrahamScan.java new file mode 100644 index 0000000..f512c36 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/GrahamScan.java @@ -0,0 +1,113 @@ +package org.anddev.andengine.extension.physics.box2d.util.hull; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 14:00:50 - 14.09.2010 + * @see http://www.iti.fh-flensburg.de/lang/algorithmen/geo/ + */ +public class GrahamScan extends BaseHullAlgorithm { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int computeHull(final Vector2[] pVertices) { + this.mVertices = pVertices; + this.mVertexCount = pVertices.length; + if(this.mVertexCount < 3) { + return this.mVertexCount; + } + this.mHullVertexCount = 0; + this.grahamScan(); + return this.mHullVertexCount; + } + + // =========================================================== + // Methods + // =========================================================== + + private void grahamScan() { + this.swap(0, this.indexOfLowestVertex()); + final Vector2 pl = new Vector2(this.mVertices[0]); + this.makeAllVerticesRelativeTo(pl); + this.sort(); + this.makeAllVerticesRelativeTo(new Vector2(pl).mul(-1)); + int i = 3; + int k = 3; + while(k < this.mVertexCount) { + this.swap(i, k); + while(!this.isConvex(i - 1)) { + this.swap(i - 1, i--); + } + k++; + i++; + } + this.mHullVertexCount = i; + } + + private void makeAllVerticesRelativeTo(final Vector2 pVector) { + final Vector2[] vertices = this.mVertices; + final int vertexCount = this.mVertexCount; + + final Vector2 vertexCopy = new Vector2(pVector); // necessary, as pVector might be in mVertices[] + for(int i = 0; i < vertexCount; i++) { + vertices[i].sub(vertexCopy); + } + } + + private boolean isConvex(final int pIndex) { + final Vector2[] vertices = this.mVertices; + return Vector2Util.isConvex(vertices[pIndex], vertices[pIndex - 1], vertices[pIndex + 1]); + } + + private void sort() { + this.quicksort(1, this.mVertexCount - 1); // without Vertex 0 + } + + private void quicksort(final int pFromIndex, final int pToIndex) { + final Vector2[] vertices = this.mVertices; + int i = pFromIndex; + int j = pToIndex; + + final Vector2 q = vertices[(pFromIndex + pToIndex) / 2]; + while(i <= j) { + while(Vector2Util.isLess(vertices[i], q)) { + i++; + } + while(Vector2Util.isLess(q, vertices[j])) { + j--; + } + if(i <= j) { + this.swap(i++, j--); + } + } + if(pFromIndex < j) { + this.quicksort(pFromIndex, j); + } + if(i < pToIndex) { + this.quicksort(i, pToIndex); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/IHullAlgorithm.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/IHullAlgorithm.java new file mode 100644 index 0000000..ffd5ad1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/IHullAlgorithm.java @@ -0,0 +1,19 @@ +package org.anddev.andengine.extension.physics.box2d.util.hull; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 13:46:22 - 14.09.2010 + */ +public interface IHullAlgorithm { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public int computeHull(final Vector2[] pVertices); +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/JarvisMarch.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/JarvisMarch.java new file mode 100644 index 0000000..284fd25 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/JarvisMarch.java @@ -0,0 +1,78 @@ +package org.anddev.andengine.extension.physics.box2d.util.hull; + +import org.anddev.andengine.extension.physics.box2d.util.Vector2Pool; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 14:01:18 - 14.09.2010 + * @see http://www.iti.fh-flensburg.de/lang/algorithmen/geo/ + */ +public class JarvisMarch extends BaseHullAlgorithm { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int computeHull(final Vector2[] pVectors) { + this.mVertices = pVectors; + this.mVertexCount = pVectors.length; + this.mHullVertexCount = 0; + this.jarvisMarch(); + return this.mHullVertexCount; + } + + // =========================================================== + // Methods + // =========================================================== + + private void jarvisMarch() { + final Vector2[] vertices = this.mVertices; + + int index = this.indexOfLowestVertex(); + do { + this.swap(this.mHullVertexCount, index); + index = this.indexOfRightmostVertexOf(vertices[this.mHullVertexCount]); + this.mHullVertexCount++; + } while(index > 0); + } + + private int indexOfRightmostVertexOf(final Vector2 pVector) { + final Vector2[] vertices = this.mVertices; + final int vertexCount = this.mVertexCount; + + int i = 0; + for(int j = 1; j < vertexCount; j++) { + + final Vector2 vector2A = Vector2Pool.obtain().set(vertices[j]); + final Vector2 vector2B = Vector2Pool.obtain().set(vertices[i]); + if(Vector2Util.isLess(vector2A.sub(pVector), vector2B.sub(pVector))) { + i = j; + } + Vector2Pool.recycle(vector2A); + Vector2Pool.recycle(vector2B); + } + return i; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/QuickHull.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/QuickHull.java new file mode 100644 index 0000000..d95d6b6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/QuickHull.java @@ -0,0 +1,117 @@ +package org.anddev.andengine.extension.physics.box2d.util.hull; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 14:01:34 - 14.09.2010 + * @see http://www.iti.fh-flensburg.de/lang/algorithmen/geo/ + */ +public class QuickHull extends BaseHullAlgorithm { + // =========================================================== + // Constants + // =========================================================== + + private final static float EPSILON = 1e-3f; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int computeHull(final Vector2[] pVectors) { + this.mVertices = pVectors; + this.mVertexCount = this.mVertices.length; + this.mHullVertexCount = 0; + this.quickHull(); + return this.mHullVertexCount; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + private void quickHull() { + this.swap(0, this.indexOfLowestVertex()); + this.mHullVertexCount++; + final Vector2Line line = new Vector2Line(this.mVertices[0], new Vector2(this.mVertices[0]).add(-EPSILON, 0)); + this.computeHullVertices(line, 1, this.mVertexCount - 1); + } + + private void computeHullVertices(final Vector2Line pLine, final int pIndexFrom, final int pIndexTo) { + if(pIndexFrom > pIndexTo) { + return; + } + final int k = this.indexOfFurthestVertex(pLine, pIndexFrom, pIndexTo); + + final Vector2Line lineA = new Vector2Line(pLine.mVertexA, this.mVertices[k]); + final Vector2Line lineB = new Vector2Line(this.mVertices[k], pLine.mVertexB); + this.swap(k, pIndexTo); + + final int i = this.partition(lineA, pIndexFrom, pIndexTo - 1); + /* All vertices from pIndexFrom to i-1 are right of lineA. */ + /* All vertices from i to pIndexTo-1 are left of lineA. */ + this.computeHullVertices(lineA, pIndexFrom, i - 1); + + /* All vertices before pIndexTo are now on the hull. */ + this.swap(pIndexTo, i); + this.swap(i, this.mHullVertexCount); + this.mHullVertexCount++; + + final int j = this.partition(lineB, i + 1, pIndexTo); + /* All vertices from i+1 to j-1 are right of lineB. */ + /* All vertices from j to pToIndex are on the inside. */ + this.computeHullVertices(lineB, i + 1, j - 1); + } + + private int indexOfFurthestVertex(final Vector2Line pLine, final int pFromIndex, final int pToIndex) { + final Vector2[] vertices = this.mVertices; + + int f = pFromIndex; + float mx = 0; + for(int i = pFromIndex; i <= pToIndex; i++) { + final float d = -Vector2Util.area2(vertices[i], pLine); + if(d > mx || d == mx && vertices[i].x > vertices[f].y) { + mx = d; + f = i; + } + } + return f; + } + + private int partition(final Vector2Line pLine, final int pFromIndex, final int pToIndex) { + final Vector2[] vertices = this.mVertices; + + int i = pFromIndex; + int j = pToIndex; + while(i <= j) { + while(i <= j && Vector2Util.isRightOf(vertices[i], pLine)) { + i++; + } + while(i <= j && !Vector2Util.isRightOf(vertices[j], pLine)) { + j--; + } + if(i <= j) { + this.swap(i++, j--); + } + } + return i; + } + +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/Vector2Line.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/Vector2Line.java new file mode 100644 index 0000000..58d2eed --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/Vector2Line.java @@ -0,0 +1,45 @@ +package org.anddev.andengine.extension.physics.box2d.util.hull; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 13:43:54 - 14.09.2010 + */ +class Vector2Line { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + Vector2 mVertexA; + Vector2 mVertexB; + + // =========================================================== + // Constructors + // =========================================================== + + public Vector2Line(final Vector2 pVertexA, final Vector2 pVertexB) { + this.mVertexA = pVertexA; + this.mVertexB = pVertexB; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/Vector2Util.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/Vector2Util.java new file mode 100644 index 0000000..44a1149 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/hull/Vector2Util.java @@ -0,0 +1,71 @@ +package org.anddev.andengine.extension.physics.box2d.util.hull; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 15:05:33 - 14.09.2010 + */ +class Vector2Util { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean isLess(final Vector2 pVertexA, final Vector2 pVertexB) { + final float f = pVertexA.cross(pVertexB); + return f > 0 || f == 0 && Vector2Util.isLonger(pVertexA, pVertexB); + } + + public static boolean isLonger(final Vector2 pVertexA, final Vector2 pVertexB) { + return pVertexA.lenManhattan() > pVertexB.lenManhattan(); + } + + public static float getManhattanDistance(final Vector2 pVertexA, final Vector2 pVertexB) { + return Math.abs(pVertexA.x - pVertexB.x) + Math.abs(pVertexA.y - pVertexB.y); + } + + public static boolean isConvex(final Vector2 pVertexTest, final Vector2 pVertexA, final Vector2 pVertexB) { + final float f = Vector2Util.area2(pVertexTest, pVertexA, pVertexB); + return f < 0 || f == 0 && !Vector2Util.isBetween(pVertexTest, pVertexA, pVertexB); + } + + public static float area2(final Vector2 pVertexTest, final Vector2 pVertexA, final Vector2 pVertexB) { + return (pVertexA.x - pVertexTest.x) * (pVertexB.y - pVertexTest.y) - (pVertexB.x - pVertexTest.x) * (pVertexA.y - pVertexTest.y); + } + + public static float area2(final Vector2 pVertexTest, final Vector2Line pLine) { + return Vector2Util.area2(pVertexTest, pLine.mVertexA, pLine.mVertexB); + } + + public static boolean isBetween(final Vector2 pVertexTest, final Vector2 pVertexA, final Vector2 pVertexB) { + return Vector2Util.getManhattanDistance(pVertexA, pVertexB) >= Vector2Util.getManhattanDistance(pVertexTest, pVertexA) + Vector2Util.getManhattanDistance(pVertexTest, pVertexB); + } + + public static boolean isRightOf(final Vector2 pVertexTest, final Vector2Line pLine) { + return Vector2Util.area2(pVertexTest, pLine) < 0; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/triangulation/EarClippingTriangulator.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/triangulation/EarClippingTriangulator.java new file mode 100644 index 0000000..9c9982b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/triangulation/EarClippingTriangulator.java @@ -0,0 +1,273 @@ +/******************************************************************************* + * Copyright 2010 Mario Zechner (contact@badlogicgames.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +package org.anddev.andengine.extension.physics.box2d.util.triangulation; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.badlogic.gdx.math.Vector2; + +/** + * A simple implementation of the ear cutting algorithm to triangulate simple + * polygons without holes. For more information: + * @see http://cgm.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Ian/algorithm2.html + * @see http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf + * + * @author badlogicgames@gmail.com + * @author Nicolas Gramlich (Improved performance. Collinear edges are now supported.) + */ +public final class EarClippingTriangulator implements ITriangulationAlgoritm { + // =========================================================== + // Constants + // =========================================================== + + private static final int CONCAVE = 1; + private static final int CONVEX = -1; + + // =========================================================== + // Fields + // =========================================================== + + private int mConcaveVertexCount; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public List computeTriangles(final List pVertices) { + // TODO Check if LinkedList performs better + final ArrayList triangles = new ArrayList(); + final ArrayList vertices = new ArrayList(pVertices.size()); + vertices.addAll(pVertices); + + if(vertices.size() == 3) { + triangles.addAll(vertices); + return triangles; + } + + while(vertices.size() >= 3) { + // TODO Usually(Always?) only the Types of the vertices next to the ear change! --> Improve + final int vertexTypes[] = this.classifyVertices(vertices); + + final int vertexCount = vertices.size(); + for(int index = 0; index < vertexCount; index++) { + if(this.isEarTip(vertices, index, vertexTypes)) { + this.cutEarTip(vertices, index, triangles); + break; + } + } + } + + return triangles; + } + + // =========================================================== + // Methods + // =========================================================== + + private static boolean areVerticesClockwise(final ArrayList pVertices) { + final int vertexCount = pVertices.size(); + + float area = 0; + for(int i = 0; i < vertexCount; i++) { + final Vector2 p1 = pVertices.get(i); + final Vector2 p2 = pVertices.get(EarClippingTriangulator.computeNextIndex(pVertices, i)); + area += p1.x * p2.y - p2.x * p1.y; + } + + if(area < 0) { + return true; + } else { + return false; + } + } + + /** + * @param pVertices + * @return An array of length pVertices.size() filled with either {@link EarClippingTriangulator#CONCAVE} or + * {@link EarClippingTriangulator#CONVEX}. + */ + private int[] classifyVertices(final ArrayList pVertices) { + final int vertexCount = pVertices.size(); + + final int[] vertexTypes = new int[vertexCount]; + this.mConcaveVertexCount = 0; + + /* Ensure vertices are in clockwise order. */ + if(!EarClippingTriangulator.areVerticesClockwise(pVertices)) { + Collections.reverse(pVertices); + } + + for(int index = 0; index < vertexCount; index++) { + final int previousIndex = EarClippingTriangulator.computePreviousIndex(pVertices, index); + final int nextIndex = EarClippingTriangulator.computeNextIndex(pVertices, index); + + final Vector2 previousVertex = pVertices.get(previousIndex); + final Vector2 currentVertex = pVertices.get(index); + final Vector2 nextVertex = pVertices.get(nextIndex); + + if(EarClippingTriangulator.isTriangleConvex(previousVertex.x, previousVertex.y, currentVertex.x, currentVertex.y, nextVertex.x, nextVertex.y)) { + vertexTypes[index] = CONVEX; + } else { + vertexTypes[index] = CONCAVE; + this.mConcaveVertexCount++; + } + } + + return vertexTypes; + } + + private static boolean isTriangleConvex(final float pX1, final float pY1, final float pX2, final float pY2, final float pX3, final float pY3) { + if(EarClippingTriangulator.computeSpannedAreaSign(pX1, pY1, pX2, pY2, pX3, pY3) < 0) { + return false; + } else { + return true; + } + } + + private static int computeSpannedAreaSign(final float pX1, final float pY1, final float pX2, final float pY2, final float pX3, final float pY3) { + float area = 0; + + area += pX1 * (pY3 - pY2); + area += pX2 * (pY1 - pY3); + area += pX3 * (pY2 - pY1); + + return (int)Math.signum(area); + } + + /** + * @return true when the Triangles contains one or more vertices, false otherwise. + */ + private static boolean isAnyVertexInTriangle(final ArrayList pVertices, final int[] pVertexTypes, final float pX1, final float pY1, final float pX2, final float pY2, final float pX3, final float pY3) { + int i = 0; + + final int vertexCount = pVertices.size(); + while(i < vertexCount - 1) { + if((pVertexTypes[i] == CONCAVE)) { + final Vector2 currentVertex = pVertices.get(i); + + final float currentVertexX = currentVertex.x; + final float currentVertexY = currentVertex.y; + + /* TODO The following condition fails for perpendicular, axis aligned triangles! + * Removing it doesn't seem to cause problems. + * Maybe it was an optimization? + * Maybe it tried to handle collinear pieces ? */ +// if(((currentVertexX != pX1) && (currentVertexY != pY1)) || ((currentVertexX != pX2) && (currentVertexY != pY2)) || ((currentVertexX != pX3) && (currentVertexY != pY3))) { + final int areaSign1 = EarClippingTriangulator.computeSpannedAreaSign(pX1, pY1, pX2, pY2, currentVertexX, currentVertexY); + final int areaSign2 = EarClippingTriangulator.computeSpannedAreaSign(pX2, pY2, pX3, pY3, currentVertexX, currentVertexY); + final int areaSign3 = EarClippingTriangulator.computeSpannedAreaSign(pX3, pY3, pX1, pY1, currentVertexX, currentVertexY); + + if(areaSign1 > 0 && areaSign2 > 0 && areaSign3 > 0) { + return true; + } else if(areaSign1 <= 0 && areaSign2 <= 0 && areaSign3 <= 0) { + return true; + } +// } + } + i++; + } + return false; + } + + private boolean isEarTip(final ArrayList pVertices, final int pEarTipIndex, final int[] pVertexTypes) { + if(this.mConcaveVertexCount != 0) { + final Vector2 previousVertex = pVertices.get(EarClippingTriangulator.computePreviousIndex(pVertices, pEarTipIndex)); + final Vector2 currentVertex = pVertices.get(pEarTipIndex); + final Vector2 nextVertex = pVertices.get(EarClippingTriangulator.computeNextIndex(pVertices, pEarTipIndex)); + + if(EarClippingTriangulator.isAnyVertexInTriangle(pVertices, pVertexTypes, previousVertex.x, previousVertex.y, currentVertex.x, currentVertex.y, nextVertex.x, nextVertex.y)) { + return false; + } else { + return true; + } + } else { + return true; + } + } + + private void cutEarTip(final ArrayList pVertices, final int pEarTipIndex, final ArrayList pTriangles) { + final int previousIndex = EarClippingTriangulator.computePreviousIndex(pVertices, pEarTipIndex); + final int nextIndex = EarClippingTriangulator.computeNextIndex(pVertices, pEarTipIndex); + + if(!EarClippingTriangulator.isCollinear(pVertices, previousIndex, pEarTipIndex, nextIndex)) { + pTriangles.add(new Vector2(pVertices.get(previousIndex))); + pTriangles.add(new Vector2(pVertices.get(pEarTipIndex))); + pTriangles.add(new Vector2(pVertices.get(nextIndex))); + } + + pVertices.remove(pEarTipIndex); + if(pVertices.size() >= 3) { + EarClippingTriangulator.removeCollinearNeighborEarsAfterRemovingEarTip(pVertices, pEarTipIndex); + } + } + + private static void removeCollinearNeighborEarsAfterRemovingEarTip(final ArrayList pVertices, final int pEarTipCutIndex) { + final int collinearityCheckNextIndex = pEarTipCutIndex % pVertices.size(); + int collinearCheckPreviousIndex = EarClippingTriangulator.computePreviousIndex(pVertices, collinearityCheckNextIndex); + + if(EarClippingTriangulator.isCollinear(pVertices, collinearityCheckNextIndex)) { + pVertices.remove(collinearityCheckNextIndex); + + if(pVertices.size() > 3) { + /* Update */ + collinearCheckPreviousIndex = EarClippingTriangulator.computePreviousIndex(pVertices, collinearityCheckNextIndex); + if(EarClippingTriangulator.isCollinear(pVertices, collinearCheckPreviousIndex)){ + pVertices.remove(collinearCheckPreviousIndex); + } + } + } else if(EarClippingTriangulator.isCollinear(pVertices, collinearCheckPreviousIndex)){ + pVertices.remove(collinearCheckPreviousIndex); + } + } + + private static boolean isCollinear(final ArrayList pVertices, final int pIndex) { + final int previousIndex = EarClippingTriangulator.computePreviousIndex(pVertices, pIndex); + final int nextIndex = EarClippingTriangulator.computeNextIndex(pVertices, pIndex); + + return EarClippingTriangulator.isCollinear(pVertices, previousIndex, pIndex, nextIndex); + } + + private static boolean isCollinear(final ArrayList pVertices, final int pPreviousIndex, final int pIndex, final int pNextIndex) { + final Vector2 previousVertex = pVertices.get(pPreviousIndex); + final Vector2 vertex = pVertices.get(pIndex); + final Vector2 nextVertex = pVertices.get(pNextIndex); + + return EarClippingTriangulator.computeSpannedAreaSign(previousVertex.x, previousVertex.y, vertex.x, vertex.y, nextVertex.x, nextVertex.y) == 0; + } + + private static int computePreviousIndex(final List pVertices, final int pIndex) { + return pIndex == 0 ? pVertices.size() - 1 : pIndex - 1; + } + + private static int computeNextIndex(final List pVertices, final int pIndex) { + return pIndex == pVertices.size() - 1 ? 0 : pIndex + 1; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/triangulation/ITriangulationAlgoritm.java b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/triangulation/ITriangulationAlgoritm.java new file mode 100644 index 0000000..7d7fb82 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/extension/physics/box2d/util/triangulation/ITriangulationAlgoritm.java @@ -0,0 +1,24 @@ +package org.anddev.andengine.extension.physics.box2d.util.triangulation; + +import java.util.List; + +import com.badlogic.gdx.math.Vector2; + +/** + * @author Nicolas Gramlich + * @since 20:16:04 - 14.09.2010 + */ +public interface ITriangulationAlgoritm { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * @return a {@link List} of {@link Vector2} objects where every three {@link Vector2} objects form a triangle. + */ + public List computeTriangles(final List pVertices); +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/TouchEvent.java b/AndEngine/src/org/anddev/andengine/input/touch/TouchEvent.java new file mode 100644 index 0000000..39e9995 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/TouchEvent.java @@ -0,0 +1,144 @@ +package org.anddev.andengine.input.touch; + +import org.anddev.andengine.util.pool.GenericPool; + +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 10:17:42 - 13.07.2010 + */ +public class TouchEvent { + // =========================================================== + // Constants + // =========================================================== + + public static final int ACTION_CANCEL = MotionEvent.ACTION_CANCEL; + public static final int ACTION_DOWN = MotionEvent.ACTION_DOWN; + public static final int ACTION_MOVE = MotionEvent.ACTION_MOVE; + public static final int ACTION_OUTSIDE = MotionEvent.ACTION_OUTSIDE; + public static final int ACTION_UP = MotionEvent.ACTION_UP; + + private static final TouchEventPool TOUCHEVENT_POOL = new TouchEventPool(); + + // =========================================================== + // Fields + // =========================================================== + + protected int mPointerID; + + protected float mX; + protected float mY; + + protected int mAction; + + protected MotionEvent mMotionEvent; + + // =========================================================== + // Constructors + // =========================================================== + + public static TouchEvent obtain(final float pX, final float pY, final int pAction, final int pPointerID, final MotionEvent pMotionEvent) { + final TouchEvent touchEvent = TOUCHEVENT_POOL.obtainPoolItem(); + touchEvent.set(pX, pY, pAction, pPointerID, pMotionEvent); + return touchEvent; + } + + private void set(final float pX, final float pY, final int pAction, final int pPointerID, final MotionEvent pMotionEvent) { + this.mX = pX; + this.mY = pY; + this.mAction = pAction; + this.mPointerID = pPointerID; + this.mMotionEvent = pMotionEvent; + } + + public void recycle() { + TOUCHEVENT_POOL.recyclePoolItem(this); + } + + public static void recycle(final TouchEvent pTouchEvent) { + TOUCHEVENT_POOL.recyclePoolItem(pTouchEvent); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getX() { + return this.mX; + } + + public float getY() { + return this.mY; + } + + public void set(final float pX, final float pY) { + this.mX = pX; + this.mY = pY; + } + + public void offset(final float pDeltaX, final float pDeltaY) { + this.mX += pDeltaX; + this.mY += pDeltaY; + } + + public int getPointerID() { + return this.mPointerID; + } + + public int getAction() { + return this.mAction; + } + + public boolean isActionDown() { + return this.mAction == TouchEvent.ACTION_DOWN; + } + + public boolean isActionUp() { + return this.mAction == TouchEvent.ACTION_UP; + } + + public boolean isActionMove() { + return this.mAction == TouchEvent.ACTION_MOVE; + } + + public boolean isActionCancel() { + return this.mAction == TouchEvent.ACTION_CANCEL; + } + + public boolean isActionOutside() { + return this.mAction == TouchEvent.ACTION_OUTSIDE; + } + + /** + * Provides the raw {@link MotionEvent} that originally caused this {@link TouchEvent}. + * The coordinates of this {@link MotionEvent} are in surface-coordinates! + * @return + */ + public MotionEvent getMotionEvent() { + return this.mMotionEvent; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + private static final class TouchEventPool extends GenericPool { + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected TouchEvent onAllocatePoolItem() { + return new TouchEvent(); + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/controller/BaseTouchController.java b/AndEngine/src/org/anddev/andengine/input/touch/controller/BaseTouchController.java new file mode 100644 index 0000000..2269c07 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/controller/BaseTouchController.java @@ -0,0 +1,134 @@ +package org.anddev.andengine.input.touch.controller; + +import org.anddev.andengine.engine.options.TouchOptions; +import org.anddev.andengine.input.touch.TouchEvent; +import org.anddev.andengine.util.pool.RunnablePoolItem; +import org.anddev.andengine.util.pool.RunnablePoolUpdateHandler; + +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 21:06:40 - 13.07.2010 + */ +public abstract class BaseTouchController implements ITouchController { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private ITouchEventCallback mTouchEventCallback; + + private boolean mRunOnUpdateThread; + + private final RunnablePoolUpdateHandler mTouchEventRunnablePoolUpdateHandler = new RunnablePoolUpdateHandler() { + @Override + protected TouchEventRunnablePoolItem onAllocatePoolItem() { + return new TouchEventRunnablePoolItem(); + } + }; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseTouchController() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public void setTouchEventCallback(final ITouchEventCallback pTouchEventCallback) { + this.mTouchEventCallback = pTouchEventCallback; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void reset() { + if(this.mRunOnUpdateThread) { + this.mTouchEventRunnablePoolUpdateHandler.reset(); + } + } + + @Override + public void onUpdate(final float pSecondsElapsed) { + if(this.mRunOnUpdateThread) { + this.mTouchEventRunnablePoolUpdateHandler.onUpdate(pSecondsElapsed); + } + } + + protected boolean fireTouchEvent(final float pX, final float pY, final int pAction, final int pPointerID, final MotionEvent pMotionEvent) { + final boolean handled; + + if(this.mRunOnUpdateThread) { + final TouchEvent touchEvent = TouchEvent.obtain(pX, pY, pAction, pPointerID, MotionEvent.obtain(pMotionEvent)); + + final TouchEventRunnablePoolItem touchEventRunnablePoolItem = this.mTouchEventRunnablePoolUpdateHandler.obtainPoolItem(); + touchEventRunnablePoolItem.set(touchEvent); + this.mTouchEventRunnablePoolUpdateHandler.postPoolItem(touchEventRunnablePoolItem); + + handled = true; + } else { + final TouchEvent touchEvent = TouchEvent.obtain(pX, pY, pAction, pPointerID, pMotionEvent); + handled = this.mTouchEventCallback.onTouchEvent(touchEvent); + touchEvent.recycle(); + } + + return handled; + } + + // =========================================================== + // Methods + // =========================================================== + + @Override + public void applyTouchOptions(final TouchOptions pTouchOptions) { + this.mRunOnUpdateThread = pTouchOptions.isRunOnUpdateThread(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + class TouchEventRunnablePoolItem extends RunnablePoolItem { + // =========================================================== + // Fields + // =========================================================== + + private TouchEvent mTouchEvent; + + // =========================================================== + // Getter & Setter + // =========================================================== + + public void set(final TouchEvent pTouchEvent) { + this.mTouchEvent = pTouchEvent; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void run() { + BaseTouchController.this.mTouchEventCallback.onTouchEvent(this.mTouchEvent); + } + + @Override + protected void onRecycle() { + super.onRecycle(); + final TouchEvent touchEvent = this.mTouchEvent; + touchEvent.getMotionEvent().recycle(); + touchEvent.recycle(); + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/controller/ITouchController.java b/AndEngine/src/org/anddev/andengine/input/touch/controller/ITouchController.java new file mode 100644 index 0000000..a4ece4c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/controller/ITouchController.java @@ -0,0 +1,35 @@ +package org.anddev.andengine.input.touch.controller; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.engine.options.TouchOptions; +import org.anddev.andengine.input.touch.TouchEvent; + +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 20:23:45 - 13.07.2010 + */ +public interface ITouchController extends IUpdateHandler { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void setTouchEventCallback(final ITouchEventCallback pTouchEventCallback); + + public void applyTouchOptions(final TouchOptions pTouchOptions); + + public boolean onHandleMotionEvent(final MotionEvent pMotionEvent); + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + static interface ITouchEventCallback { + public boolean onTouchEvent(final TouchEvent pTouchEvent); + } +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/controller/SingleTouchControler.java b/AndEngine/src/org/anddev/andengine/input/touch/controller/SingleTouchControler.java new file mode 100644 index 0000000..e5e2930 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/controller/SingleTouchControler.java @@ -0,0 +1,46 @@ +package org.anddev.andengine.input.touch.controller; + +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 20:23:33 - 13.07.2010 + */ +public class SingleTouchControler extends BaseTouchController { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SingleTouchControler() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean onHandleMotionEvent(final MotionEvent pMotionEvent) { + return this.fireTouchEvent(pMotionEvent.getX(), pMotionEvent.getY(), pMotionEvent.getAction(), 0, pMotionEvent); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/detector/BaseDetector.java b/AndEngine/src/org/anddev/andengine/input/touch/detector/BaseDetector.java new file mode 100644 index 0000000..e9cdb43 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/detector/BaseDetector.java @@ -0,0 +1,64 @@ +package org.anddev.andengine.input.touch.detector; + +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener; +import org.anddev.andengine.input.touch.TouchEvent; + +/** + * @author Nicolas Gramlich + * @since 15:59:00 - 05.11.2010 + */ +public abstract class BaseDetector implements IOnSceneTouchListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private boolean mEnabled = true; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isEnabled() { + return this.mEnabled; + } + + public void setEnabled(final boolean pEnabled) { + this.mEnabled = pEnabled; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract boolean onManagedTouchEvent(TouchEvent pSceneTouchEvent); + + @Override + public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { + return this.onTouchEvent(pSceneTouchEvent); + } + + public final boolean onTouchEvent(final TouchEvent pSceneTouchEvent) { + if(this.mEnabled) { + return this.onManagedTouchEvent(pSceneTouchEvent); + } else { + return false; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/detector/ClickDetector.java b/AndEngine/src/org/anddev/andengine/input/touch/detector/ClickDetector.java new file mode 100644 index 0000000..ba3937c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/detector/ClickDetector.java @@ -0,0 +1,95 @@ +package org.anddev.andengine.input.touch.detector; + +import org.anddev.andengine.input.touch.TouchEvent; + +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 14:29:59 - 16.08.2010 + */ +public class ClickDetector extends BaseDetector { + // =========================================================== + // Constants + // =========================================================== + + private static final long TRIGGER_CLICK_MAXIMUM_MILLISECONDS_DEFAULT = 200; + + // =========================================================== + // Fields + // =========================================================== + + private long mTriggerClickMaximumMilliseconds; + private final IClickDetectorListener mClickDetectorListener; + + private long mDownTimeMilliseconds = Long.MIN_VALUE; + + // =========================================================== + // Constructors + // =========================================================== + + public ClickDetector(final IClickDetectorListener pClickDetectorListener) { + this(TRIGGER_CLICK_MAXIMUM_MILLISECONDS_DEFAULT, pClickDetectorListener); + } + + public ClickDetector(final long pTriggerClickMaximumMilliseconds, final IClickDetectorListener pClickDetectorListener) { + this.mTriggerClickMaximumMilliseconds = pTriggerClickMaximumMilliseconds; + this.mClickDetectorListener = pClickDetectorListener; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public long getTriggerClickMaximumMilliseconds() { + return this.mTriggerClickMaximumMilliseconds; + } + + public void setTriggerClickMaximumMilliseconds(final long pClickMaximumMilliseconds) { + this.mTriggerClickMaximumMilliseconds = pClickMaximumMilliseconds; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { + switch(pSceneTouchEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + this.mDownTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getDownTime(); + return true; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + final long upTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getEventTime(); + + if(upTimeMilliseconds - this.mDownTimeMilliseconds <= this.mTriggerClickMaximumMilliseconds) { + this.mDownTimeMilliseconds = Long.MIN_VALUE; + this.mClickDetectorListener.onClick(this, pSceneTouchEvent); + } + return true; + default: + return false; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IClickDetectorListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onClick(final ClickDetector pClickDetector, final TouchEvent pTouchEvent); + } +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/detector/HoldDetector.java b/AndEngine/src/org/anddev/andengine/input/touch/detector/HoldDetector.java new file mode 100644 index 0000000..9ef6212 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/detector/HoldDetector.java @@ -0,0 +1,189 @@ +package org.anddev.andengine.input.touch.detector; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.engine.handler.timer.ITimerCallback; +import org.anddev.andengine.engine.handler.timer.TimerHandler; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.input.touch.TouchEvent; + +import android.os.SystemClock; +import android.speech.tts.TextToSpeech.Engine; +import android.view.MotionEvent; + +/** + * Note: Needs to be registered as an {@link IUpdateHandler} to the {@link Engine} or {@link Scene} to work properly. + * + * @author Nicolas Gramlich + * @since 20:49:25 - 23.08.2010 + */ +public class HoldDetector extends BaseDetector implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + private static final long TRIGGER_HOLD_MINIMUM_MILLISECONDS_DEFAULT = 200; + private static final float TRIGGER_HOLD_MAXIMUM_DISTANCE_DEFAULT = 10; + + private static final float TIME_BETWEEN_UPDATES_DEFAULT = 0.1f; + + // =========================================================== + // Fields + // =========================================================== + + private long mTriggerHoldMinimumMilliseconds; + private float mTriggerHoldMaximumDistance; + private final IHoldDetectorListener mHoldDetectorListener; + + private long mDownTimeMilliseconds = Long.MIN_VALUE; + + private float mDownX; + private float mDownY; + + private float mHoldX; + private float mHoldY; + + private boolean mMaximumDistanceExceeded = false; + + private boolean mTriggerOnHold = false; + private boolean mTriggerOnHoldFinished = false; + + private final TimerHandler mTimerHandler; + + // =========================================================== + // Constructors + // =========================================================== + + public HoldDetector(final IHoldDetectorListener pClickDetectorListener) { + this(TRIGGER_HOLD_MINIMUM_MILLISECONDS_DEFAULT, TRIGGER_HOLD_MAXIMUM_DISTANCE_DEFAULT, TIME_BETWEEN_UPDATES_DEFAULT, pClickDetectorListener); + } + + public HoldDetector(final long pTriggerHoldMinimumMilliseconds, final float pTriggerHoldMaximumDistance, final float pTimeBetweenUpdates, final IHoldDetectorListener pClickDetectorListener) { + this.mTriggerHoldMinimumMilliseconds = pTriggerHoldMinimumMilliseconds; + this.mTriggerHoldMaximumDistance = pTriggerHoldMaximumDistance; + this.mHoldDetectorListener = pClickDetectorListener; + + this.mTimerHandler = new TimerHandler(pTimeBetweenUpdates, true, new ITimerCallback() { + @Override + public void onTimePassed(final TimerHandler pTimerHandler) { + HoldDetector.this.fireListener(); + } + }); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public long getTriggerHoldMinimumMilliseconds() { + return this.mTriggerHoldMinimumMilliseconds; + } + + public void setTriggerHoldMinimumMilliseconds(final long pTriggerHoldMinimumMilliseconds) { + this.mTriggerHoldMinimumMilliseconds = pTriggerHoldMinimumMilliseconds; + } + + public float getTriggerHoldMaximumDistance() { + return this.mTriggerHoldMaximumDistance; + } + + public void setTriggerHoldMaximumDistance(final float pTriggerHoldMaximumDistance) { + this.mTriggerHoldMaximumDistance = pTriggerHoldMaximumDistance; + } + + public boolean isHolding() { + return this.mTriggerOnHold; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mTimerHandler.onUpdate(pSecondsElapsed); + } + + @Override + public void reset() { + this.mTimerHandler.reset(); + } + + @Override + public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { + final MotionEvent motionEvent = pSceneTouchEvent.getMotionEvent(); + + this.mHoldX = pSceneTouchEvent.getX(); + this.mHoldY = pSceneTouchEvent.getY(); + + switch(pSceneTouchEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + this.mDownTimeMilliseconds = motionEvent.getDownTime(); + this.mDownX = motionEvent.getX(); + this.mDownY = motionEvent.getY(); + this.mMaximumDistanceExceeded = false; + return true; + case MotionEvent.ACTION_MOVE: + { + final long currentTimeMilliseconds = motionEvent.getEventTime(); + + final float triggerHoldMaximumDistance = this.mTriggerHoldMaximumDistance; + this.mMaximumDistanceExceeded = this.mMaximumDistanceExceeded || Math.abs(this.mDownX - motionEvent.getX()) > triggerHoldMaximumDistance || Math.abs(this.mDownY - motionEvent.getY()) > triggerHoldMaximumDistance; + if(this.mTriggerOnHold || !this.mMaximumDistanceExceeded) { + final long holdTimeMilliseconds = currentTimeMilliseconds - this.mDownTimeMilliseconds; + if(holdTimeMilliseconds >= this.mTriggerHoldMinimumMilliseconds) { + this.mTriggerOnHold = true; + } + } + return true; + } + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + { + final long upTimeMilliseconds = motionEvent.getEventTime(); + + final float triggerHoldMaximumDistance = this.mTriggerHoldMaximumDistance; + this.mMaximumDistanceExceeded = this.mMaximumDistanceExceeded || Math.abs(this.mDownX - motionEvent.getX()) > triggerHoldMaximumDistance || Math.abs(this.mDownY - motionEvent.getY()) > triggerHoldMaximumDistance; + if(this.mTriggerOnHold || !this.mMaximumDistanceExceeded) { + final long holdTimeMilliseconds = upTimeMilliseconds - this.mDownTimeMilliseconds; + if(holdTimeMilliseconds >= this.mTriggerHoldMinimumMilliseconds) { + this.mTriggerOnHoldFinished = true; + } + } + return true; + } + default: + return false; + } + } + + // =========================================================== + // Methods + // =========================================================== + + protected void fireListener() { + if(this.mTriggerOnHoldFinished) { + this.mHoldDetectorListener.onHoldFinished(this, SystemClock.uptimeMillis() - this.mDownTimeMilliseconds, this.mHoldX, this.mHoldY); + this.mTriggerOnHoldFinished = false; + this.mTriggerOnHold = false; + } else if(this.mTriggerOnHold) { + this.mHoldDetectorListener.onHold(this, SystemClock.uptimeMillis() - this.mDownTimeMilliseconds, this.mHoldX, this.mHoldY); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IHoldDetectorListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onHold(final HoldDetector pHoldDetector, final long pHoldTimeMilliseconds, final float pHoldX, final float pHoldY); + public void onHoldFinished(final HoldDetector pHoldDetector, final long pHoldTimeMilliseconds, final float pHoldX, final float pHoldY); + } +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/detector/ScrollDetector.java b/AndEngine/src/org/anddev/andengine/input/touch/detector/ScrollDetector.java new file mode 100644 index 0000000..1e87f02 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/detector/ScrollDetector.java @@ -0,0 +1,117 @@ +package org.anddev.andengine.input.touch.detector; + +import org.anddev.andengine.input.touch.TouchEvent; + +import android.view.MotionEvent; + +/** + * @author Nicolas Gramlich + * @since 14:29:59 - 16.08.2010 + */ +public class ScrollDetector extends BaseDetector { + // =========================================================== + // Constants + // =========================================================== + + private static final float TRIGGER_SCROLL_MINIMUM_DISTANCE_DEFAULT = 10; + + // =========================================================== + // Fields + // =========================================================== + + private float mTriggerScrollMinimumDistance; + + private final IScrollDetectorListener mScrollDetectorListener; + + private boolean mTriggered; + + private float mLastX; + private float mLastY; + + // =========================================================== + // Constructors + // =========================================================== + + public ScrollDetector(final IScrollDetectorListener pScrollDetectorListener) { + this(TRIGGER_SCROLL_MINIMUM_DISTANCE_DEFAULT, pScrollDetectorListener); + } + + public ScrollDetector(final float pTriggerScrollMinimumDistance, final IScrollDetectorListener pScrollDetectorListener) { + this.mTriggerScrollMinimumDistance = pTriggerScrollMinimumDistance; + this.mScrollDetectorListener = pScrollDetectorListener; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getTriggerScrollMinimumDistance() { + return this.mTriggerScrollMinimumDistance; + } + + public void setTriggerScrollMinimumDistance(final float pTriggerScrollMinimumDistance) { + this.mTriggerScrollMinimumDistance = pTriggerScrollMinimumDistance; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { + final float touchX = this.getX(pSceneTouchEvent); + final float touchY = this.getY(pSceneTouchEvent); + + switch(pSceneTouchEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + this.mLastX = touchX; + this.mLastY = touchY; + this.mTriggered = false; + return true; + case MotionEvent.ACTION_MOVE: + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + final float distanceX = touchX - this.mLastX; + final float distanceY = touchY - this.mLastY; + + final float triggerScrollMinimumDistance = this.mTriggerScrollMinimumDistance; + if(this.mTriggered || Math.abs(distanceX) > triggerScrollMinimumDistance || Math.abs(distanceY) > triggerScrollMinimumDistance) { + this.mScrollDetectorListener.onScroll(this, pSceneTouchEvent, distanceX, distanceY); + this.mLastX = touchX; + this.mLastY = touchY; + this.mTriggered = true; + } + return true; + default: + return false; + } + } + + // =========================================================== + // Methods + // =========================================================== + + protected float getX(final TouchEvent pTouchEvent) { + return pTouchEvent.getX(); + } + + protected float getY(final TouchEvent pTouchEvent) { + return pTouchEvent.getY(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IScrollDetectorListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onScroll(final ScrollDetector pScollDetector, final TouchEvent pTouchEvent, final float pDistanceX, final float pDistanceY); + } +} diff --git a/AndEngine/src/org/anddev/andengine/input/touch/detector/SurfaceGestureDetector.java b/AndEngine/src/org/anddev/andengine/input/touch/detector/SurfaceGestureDetector.java new file mode 100644 index 0000000..fba10f6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/detector/SurfaceGestureDetector.java @@ -0,0 +1,195 @@ +package org.anddev.andengine.input.touch.detector; + +import org.anddev.andengine.input.touch.TouchEvent; + +import android.view.GestureDetector; +import android.view.GestureDetector.SimpleOnGestureListener; +import android.view.MotionEvent; + +/** + * @author rkpost + * @author Nicolas Gramlich + * @since 11:36:26 - 11.10.2010 + */ +public abstract class SurfaceGestureDetector extends BaseDetector { + // =========================================================== + // Constants + // =========================================================== + + private static final float SWIPE_MIN_DISTANCE_DEFAULT = 120; + + // =========================================================== + // Fields + // =========================================================== + + private final GestureDetector mGestureDetector; + + // =========================================================== + // Constructors + // =========================================================== + + public SurfaceGestureDetector() { + this(SWIPE_MIN_DISTANCE_DEFAULT); + } + + public SurfaceGestureDetector(final float pSwipeMinDistance) { + this.mGestureDetector = new GestureDetector(new InnerOnGestureDetectorListener(pSwipeMinDistance)); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract boolean onSingleTap(); + protected abstract boolean onDoubleTap(); + protected abstract boolean onSwipeUp(); + protected abstract boolean onSwipeDown(); + protected abstract boolean onSwipeLeft(); + protected abstract boolean onSwipeRight(); + + @Override + public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { + return this.mGestureDetector.onTouchEvent(pSceneTouchEvent.getMotionEvent()); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + private class InnerOnGestureDetectorListener extends SimpleOnGestureListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mSwipeMinDistance; + + // =========================================================== + // Constructors + // =========================================================== + + public InnerOnGestureDetectorListener(final float pSwipeMinDistance) { + this.mSwipeMinDistance = pSwipeMinDistance; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean onSingleTapConfirmed(final MotionEvent pMotionEvent) { + return SurfaceGestureDetector.this.onSingleTap(); + } + + @Override + public boolean onDoubleTap(final MotionEvent pMotionEvent) { + return SurfaceGestureDetector.this.onDoubleTap(); + } + + @Override + public boolean onFling(final MotionEvent pMotionEventStart, final MotionEvent pMotionEventEnd, final float pVelocityX, final float pVelocityY) { + final float swipeMinDistance = this.mSwipeMinDistance; + + final boolean isHorizontalFling = Math.abs(pVelocityX) > Math.abs(pVelocityY); + + if(isHorizontalFling) { + if(pMotionEventStart.getX() - pMotionEventEnd.getX() > swipeMinDistance) { + return SurfaceGestureDetector.this.onSwipeLeft(); + } else if(pMotionEventEnd.getX() - pMotionEventStart.getX() > swipeMinDistance) { + return SurfaceGestureDetector.this.onSwipeRight(); + } + } else { + if(pMotionEventStart.getY() - pMotionEventEnd.getY() > swipeMinDistance) { + return SurfaceGestureDetector.this.onSwipeUp(); + } else if(pMotionEventEnd.getY() - pMotionEventStart.getY() > swipeMinDistance) { + return SurfaceGestureDetector.this.onSwipeDown(); + } + } + + return false; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } + + public static class SurfaceGestureDetectorAdapter extends SurfaceGestureDetector { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected boolean onDoubleTap() { + return false; + } + + @Override + protected boolean onSingleTap() { + return false; + } + + @Override + protected boolean onSwipeDown() { + return false; + } + + @Override + protected boolean onSwipeLeft() { + return false; + } + + @Override + protected boolean onSwipeRight() { + return false; + } + + @Override + protected boolean onSwipeUp() { + return false; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/input/touch/detector/SurfaceScrollDetector.java b/AndEngine/src/org/anddev/andengine/input/touch/detector/SurfaceScrollDetector.java new file mode 100644 index 0000000..41c8c04 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/input/touch/detector/SurfaceScrollDetector.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.input.touch.detector; + +import org.anddev.andengine.input.touch.TouchEvent; + +/** + * @author Nicolas Gramlich + * @since 16:12:29 - 16.08.2010 + */ +public class SurfaceScrollDetector extends ScrollDetector { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SurfaceScrollDetector(final float pTriggerScrollMinimumDistance, final IScrollDetectorListener pScrollDetectorListener) { + super(pTriggerScrollMinimumDistance, pScrollDetectorListener); + } + + public SurfaceScrollDetector(final IScrollDetectorListener pScrollDetectorListener) { + super(pScrollDetectorListener); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected float getX(final TouchEvent pTouchEvent) { + return pTouchEvent.getMotionEvent().getX(); + } + + @Override + protected float getY(final TouchEvent pTouchEvent) { + return pTouchEvent.getMotionEvent().getY(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/level/LevelLoader.java b/AndEngine/src/org/anddev/andengine/level/LevelLoader.java new file mode 100644 index 0000000..3be1487 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/level/LevelLoader.java @@ -0,0 +1,143 @@ +package org.anddev.andengine.level; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.anddev.andengine.level.util.constants.LevelConstants; +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.StreamUtils; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import android.content.Context; + +/** + * @author Nicolas Gramlich + * @since 14:16:19 - 11.10.2010 + */ +public class LevelLoader implements LevelConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private String mAssetBasePath; + + private final HashMap mEntityLoaders = new HashMap(); + + // =========================================================== + // Constructors + // =========================================================== + + public LevelLoader() { + this(""); + } + + public LevelLoader(final String pAssetBasePath) { + this.setAssetBasePath(pAssetBasePath); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + /** + * @param pAssetBasePath must end with '/' or have .length() == 0. + */ + public void setAssetBasePath(final String pAssetBasePath) { + if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + this.mAssetBasePath = pAssetBasePath; + } else { + throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected void onAfterLoadLevel() { + + } + + protected void onBeforeLoadLevel() { + + } + + // =========================================================== + // Methods + // =========================================================== + + public void registerEntityLoader(final String pEntityName, final IEntityLoader pEntityLoader) { + this.mEntityLoaders.put(pEntityName, pEntityLoader); + } + + public void registerEntityLoader(final String[] pEntityNames, final IEntityLoader pEntityLoader) { + final HashMap entityLoaders = this.mEntityLoaders; + + for(int i = pEntityNames.length - 1; i >= 0; i--) { + entityLoaders.put(pEntityNames[i], pEntityLoader); + } + } + + public void loadLevelFromAsset(final Context pContext, final String pAssetPath) throws IOException { + this.loadLevelFromStream(pContext.getAssets().open(this.mAssetBasePath + pAssetPath)); + } + + public void loadLevelFromResource(final Context pContext, final int pRawResourceID) throws IOException { + this.loadLevelFromStream(pContext.getResources().openRawResource(pRawResourceID)); + } + + public void loadLevelFromStream(final InputStream pInputStream) throws IOException { + try{ + final SAXParserFactory spf = SAXParserFactory.newInstance(); + final SAXParser sp = spf.newSAXParser(); + + final XMLReader xr = sp.getXMLReader(); + + this.onBeforeLoadLevel(); + + final LevelParser levelParser = new LevelParser(this.mEntityLoaders); + xr.setContentHandler(levelParser); + + xr.parse(new InputSource(new BufferedInputStream(pInputStream))); + + this.onAfterLoadLevel(); + } catch (final SAXException se) { + Debug.e(se); + /* Doesn't happen. */ + } catch (final ParserConfigurationException pe) { + Debug.e(pe); + /* Doesn't happen. */ + } finally { + StreamUtils.close(pInputStream); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IEntityLoader { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onLoadEntity(final String pEntityName, final Attributes pAttributes); + } +} diff --git a/AndEngine/src/org/anddev/andengine/level/LevelParser.java b/AndEngine/src/org/anddev/andengine/level/LevelParser.java new file mode 100644 index 0000000..d97b699 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/level/LevelParser.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.level; + +import java.util.HashMap; + +import org.anddev.andengine.level.LevelLoader.IEntityLoader; +import org.anddev.andengine.level.util.constants.LevelConstants; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * @author Nicolas Gramlich + * @since 14:35:32 - 11.10.2010 + */ +public class LevelParser extends DefaultHandler implements LevelConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final HashMap mEntityLoaders; + + // =========================================================== + // Constructors + // =========================================================== + + public LevelParser(final HashMap pEntityLoaders) { + this.mEntityLoaders = pEntityLoaders; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException { + final IEntityLoader entityLoader = this.mEntityLoaders.get(pLocalName); + if(entityLoader != null) { + entityLoader.onLoadEntity(pLocalName, pAttributes); + } else { + throw new IllegalArgumentException("Unexpected tag: '" + pLocalName + "'."); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/level/util/constants/LevelConstants.java b/AndEngine/src/org/anddev/andengine/level/util/constants/LevelConstants.java new file mode 100644 index 0000000..dee65d8 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/level/util/constants/LevelConstants.java @@ -0,0 +1,22 @@ +package org.anddev.andengine.level.util.constants; + + +/** + * @author Nicolas Gramlich + * @since 14:23:27 - 11.10.2010 + */ +public interface LevelConstants { + // =========================================================== + // Final Fields + // =========================================================== + + public static final String TAG_LEVEL = "level"; + public static final String TAG_LEVEL_ATTRIBUTE_NAME = "name"; + public static final String TAG_LEVEL_ATTRIBUTE_UID = "uid"; + public static final String TAG_LEVEL_ATTRIBUTE_WIDTH = "width"; + public static final String TAG_LEVEL_ATTRIBUTE_HEIGHT = "height"; + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/IDrawable.java b/AndEngine/src/org/anddev/andengine/opengl/IDrawable.java new file mode 100644 index 0000000..d9e62de --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/IDrawable.java @@ -0,0 +1,22 @@ +package org.anddev.andengine.opengl; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.camera.Camera; + + +/** + * @author Nicolas Gramlich + * @since 10:50:58 - 08.08.2010 + */ +public interface IDrawable { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onDraw(final GL10 pGL, final Camera pCamera); +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/buffer/BufferObject.java b/AndEngine/src/org/anddev/andengine/opengl/buffer/BufferObject.java new file mode 100644 index 0000000..935a56e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/buffer/BufferObject.java @@ -0,0 +1,120 @@ +package org.anddev.andengine.opengl.buffer; + +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.opengl.util.FastFloatBuffer; +import org.anddev.andengine.opengl.util.GLHelper; + +/** + * @author Nicolas Gramlich + * @since 14:22:56 - 07.04.2010 + */ +public abstract class BufferObject { + // =========================================================== + // Constants + // =========================================================== + + private static final int[] HARDWAREBUFFERID_FETCHER = new int[1]; + + // =========================================================== + // Fields + // =========================================================== + + protected final int[] mBufferData; + + private final int mDrawType; + + private final FastFloatBuffer mFloatBuffer; + + private int mHardwareBufferID = -1; + private boolean mLoadedToHardware; + private boolean mHardwareBufferNeedsUpdate = true; + + // =========================================================== + // Constructors + // =========================================================== + + public BufferObject(final int pCapacity, final int pDrawType) { + this.mDrawType = pDrawType; + this.mBufferData = new int[pCapacity]; + this.mFloatBuffer = new FastFloatBuffer(pCapacity); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public FastFloatBuffer getFloatBuffer() { + return this.mFloatBuffer; + } + + public int getHardwareBufferID() { + return this.mHardwareBufferID; + } + + public boolean isLoadedToHardware() { + return this.mLoadedToHardware; + } + + void setLoadedToHardware(final boolean pLoadedToHardware) { + this.mLoadedToHardware = pLoadedToHardware; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public void setHardwareBufferNeedsUpdate(){ + this.mHardwareBufferNeedsUpdate = true; + } + + // =========================================================== + // Methods + // =========================================================== + + public void selectOnHardware(final GL11 pGL11) { + final int hardwareBufferID = this.mHardwareBufferID; + if(hardwareBufferID == -1) { + return; + } + + GLHelper.bindBuffer(pGL11, hardwareBufferID); // TODO Does this always need to be binded, or are just for buffers of the same 'type'(texture/vertex)? + + if(this.mHardwareBufferNeedsUpdate) { + // Debug.d("BufferObject.updating: ID = " + this.mHardwareBufferID); + this.mHardwareBufferNeedsUpdate = false; + synchronized(this) { + GLHelper.bufferData(pGL11, this.mFloatBuffer.mByteBuffer, this.mDrawType); + } + } + } + + public void loadToHardware(final GL11 pGL11) { + this.mHardwareBufferID = this.generateHardwareBufferID(pGL11); + // Debug.d("BufferObject.loadToHardware(): ID = " + this.mHardwareBufferID); + + this.mLoadedToHardware = true; + } + + public void unloadFromHardware(final GL11 pGL11) { + this.deleteBufferOnHardware(pGL11); + + this.mHardwareBufferID = -1; + + this.mLoadedToHardware = false; + } + + private void deleteBufferOnHardware(final GL11 pGL11) { + GLHelper.deleteBuffer(pGL11, this.mHardwareBufferID); + } + + private int generateHardwareBufferID(final GL11 pGL11) { + pGL11.glGenBuffers(1, HARDWAREBUFFERID_FETCHER, 0); + + return HARDWAREBUFFERID_FETCHER[0]; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/buffer/BufferObjectManager.java b/AndEngine/src/org/anddev/andengine/opengl/buffer/BufferObjectManager.java new file mode 100644 index 0000000..7f6c495 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/buffer/BufferObjectManager.java @@ -0,0 +1,151 @@ +package org.anddev.andengine.opengl.buffer; + +import java.util.ArrayList; +import java.util.HashSet; + +import javax.microedition.khronos.opengles.GL11; + +/** + * @author Nicolas Gramlich + * @since 17:48:46 - 08.03.2010 + */ +public class BufferObjectManager { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static final HashSet mBufferObjectsManaged = new HashSet(); + + private static final ArrayList mBufferObjectsLoaded = new ArrayList(); + + private static final ArrayList mBufferObjectsToBeLoaded = new ArrayList(); + private static final ArrayList mBufferObjectsToBeUnloaded = new ArrayList(); + + private static BufferObjectManager mActiveInstance = null; + + // =========================================================== + // Constructors + // =========================================================== + + public static BufferObjectManager getActiveInstance() { + return BufferObjectManager.mActiveInstance; + } + + public static void setActiveInstance(final BufferObjectManager pActiveInstance) { + BufferObjectManager.mActiveInstance = pActiveInstance; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void clear() { + BufferObjectManager.mBufferObjectsToBeLoaded.clear(); + BufferObjectManager.mBufferObjectsLoaded.clear(); + BufferObjectManager.mBufferObjectsManaged.clear(); + } + + public void loadBufferObject(final BufferObject pBufferObject) { + if(pBufferObject == null) { + return; + } + + if(BufferObjectManager.mBufferObjectsManaged.contains(pBufferObject)) { + /* Just make sure it doesn't get deleted. */ + BufferObjectManager.mBufferObjectsToBeUnloaded.remove(pBufferObject); + } else { + BufferObjectManager.mBufferObjectsManaged.add(pBufferObject); + BufferObjectManager.mBufferObjectsToBeLoaded.add(pBufferObject); + } + } + + public void unloadBufferObject(final BufferObject pBufferObject) { + if(pBufferObject == null) { + return; + } + if(BufferObjectManager.mBufferObjectsManaged.contains(pBufferObject)) { + if(BufferObjectManager.mBufferObjectsLoaded.contains(pBufferObject)) { + BufferObjectManager.mBufferObjectsToBeUnloaded.add(pBufferObject); + } else if(BufferObjectManager.mBufferObjectsToBeLoaded.remove(pBufferObject)) { + BufferObjectManager.mBufferObjectsManaged.remove(pBufferObject); + } + } + } + + public void loadBufferObjects(final BufferObject... pBufferObjects) { + for(int i = pBufferObjects.length - 1; i >= 0; i--) { + this.loadBufferObject(pBufferObjects[i]); + } + } + + public void unloadBufferObjects(final BufferObject... pBufferObjects) { + for(int i = pBufferObjects.length - 1; i >= 0; i--) { + this.unloadBufferObject(pBufferObjects[i]); + } + } + + public void reloadBufferObjects() { + final ArrayList loadedBufferObjects = BufferObjectManager.mBufferObjectsLoaded; + for(int i = loadedBufferObjects.size() - 1; i >= 0; i--) { + loadedBufferObjects.get(i).setLoadedToHardware(false); + } + + BufferObjectManager.mBufferObjectsToBeLoaded.addAll(loadedBufferObjects); + + loadedBufferObjects.clear(); + } + + public void updateBufferObjects(final GL11 pGL11) { + final HashSet bufferObjectsManaged = BufferObjectManager.mBufferObjectsManaged; + final ArrayList bufferObjectsLoaded = BufferObjectManager.mBufferObjectsLoaded; + final ArrayList bufferObjectsToBeLoaded = BufferObjectManager.mBufferObjectsToBeLoaded; + final ArrayList bufferObjectsToBeUnloaded = BufferObjectManager.mBufferObjectsToBeUnloaded; + + /* First load pending BufferObjects. */ + final int bufferObjectToBeLoadedCount = bufferObjectsToBeLoaded.size(); + + if(bufferObjectToBeLoadedCount > 0) { + for(int i = bufferObjectToBeLoadedCount - 1; i >= 0; i--) { + final BufferObject bufferObjectToBeLoaded = bufferObjectsToBeLoaded.get(i); + if(!bufferObjectToBeLoaded.isLoadedToHardware()) { + bufferObjectToBeLoaded.loadToHardware(pGL11); + bufferObjectToBeLoaded.setHardwareBufferNeedsUpdate(); + } + bufferObjectsLoaded.add(bufferObjectToBeLoaded); + } + + bufferObjectsToBeLoaded.clear(); + } + + /* Then unload pending BufferObjects. */ + final int bufferObjectsToBeUnloadedCount = bufferObjectsToBeUnloaded.size(); + + if(bufferObjectsToBeUnloadedCount > 0){ + for(int i = bufferObjectsToBeUnloadedCount - 1; i >= 0; i--){ + final BufferObject bufferObjectToBeUnloaded = bufferObjectsToBeUnloaded.remove(i); + if(bufferObjectToBeUnloaded.isLoadedToHardware()){ + bufferObjectToBeUnloaded.unloadFromHardware(pGL11); + } + bufferObjectsLoaded.remove(bufferObjectToBeUnloaded); + bufferObjectsManaged.remove(bufferObjectToBeUnloaded); + } + } + + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/font/Font.java b/AndEngine/src/org/anddev/andengine/opengl/font/Font.java new file mode 100644 index 0000000..d0ba3ad --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/font/Font.java @@ -0,0 +1,226 @@ +package org.anddev.andengine.opengl.font; + +import java.util.ArrayList; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.util.GLHelper; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Paint.FontMetrics; +import android.graphics.Paint.Style; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.opengl.GLUtils; +import android.util.FloatMath; +import android.util.SparseArray; + +/** + * @author Nicolas Gramlich + * @since 10:39:33 - 03.04.2010 + */ +public class Font { + // =========================================================== + // Constants + // =========================================================== + + protected static final float LETTER_LEFT_OFFSET = 0; + private static final int LETTER_EXTRA_WIDTH = 10; + + // =========================================================== + // Fields + // =========================================================== + + private final Texture mTexture; + private final float mTextureWidth; + private final float mTextureHeight; + private int mCurrentTextureX = 0; + private int mCurrentTextureY = 0; + + private final SparseArray mManagedCharacterToLetterMap = new SparseArray(); + private final ArrayList mLettersPendingToBeDrawnToTexture = new ArrayList(); + + protected final Paint mPaint; + private final Paint mBackgroundPaint; + + protected final FontMetrics mFontMetrics; + private final int mLineHeight; + private final int mLineGap; + + private final Size mCreateLetterTemporarySize = new Size(); + private final Rect mGetLetterBitmapTemporaryRect = new Rect(); + private final Rect mGetStringWidthTemporaryRect = new Rect(); + private final Rect mGetLetterBoundsTemporaryRect = new Rect(); + private final float[] mTemporaryTextWidthFetchers = new float[1]; + + protected final Canvas mCanvas = new Canvas(); + + // =========================================================== + // Constructors + // =========================================================== + + public Font(final Texture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor) { + this.mTexture = pTexture; + this.mTextureWidth = pTexture.getWidth(); + this.mTextureHeight = pTexture.getHeight(); + + this.mPaint = new Paint(); + this.mPaint.setTypeface(pTypeface); + this.mPaint.setColor(pColor); + this.mPaint.setTextSize(pSize); + this.mPaint.setAntiAlias(pAntiAlias); + + this.mBackgroundPaint = new Paint(); + this.mBackgroundPaint.setColor(Color.TRANSPARENT); + this.mBackgroundPaint.setStyle(Style.FILL); + + this.mFontMetrics = this.mPaint.getFontMetrics(); + this.mLineHeight = (int) FloatMath.ceil(Math.abs(this.mFontMetrics.ascent) + Math.abs(this.mFontMetrics.descent)); + this.mLineGap = (int) (FloatMath.ceil(this.mFontMetrics.leading)); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getLineGap() { + return this.mLineGap; + } + + public int getLineHeight() { + return this.mLineHeight; + } + + public Texture getTexture() { + return this.mTexture; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public synchronized void reload() { + final ArrayList lettersPendingToBeDrawnToTexture = this.mLettersPendingToBeDrawnToTexture; + final SparseArray managedCharacterToLetterMap = this.mManagedCharacterToLetterMap; + + /* Make all letters redraw to the texture. */ + for(int i = managedCharacterToLetterMap.size() - 1; i >= 0; i--) { + lettersPendingToBeDrawnToTexture.add(managedCharacterToLetterMap.valueAt(i)); + } + } + + private int getLetterAdvance(final char pCharacter) { + this.mPaint.getTextWidths(String.valueOf(pCharacter), this.mTemporaryTextWidthFetchers); + return (int) (FloatMath.ceil(this.mTemporaryTextWidthFetchers[0])); + } + + private Bitmap getLetterBitmap(final char pCharacter) { + final Rect getLetterBitmapTemporaryRect = this.mGetLetterBitmapTemporaryRect; + final String characterAsString = String.valueOf(pCharacter); + this.mPaint.getTextBounds(characterAsString, 0, 1, getLetterBitmapTemporaryRect); + + final int lineHeight = this.getLineHeight(); + final Bitmap bitmap = Bitmap.createBitmap(getLetterBitmapTemporaryRect.width() == 0 ? 1 : getLetterBitmapTemporaryRect.width() + LETTER_EXTRA_WIDTH, lineHeight, Bitmap.Config.ARGB_8888); + this.mCanvas.setBitmap(bitmap); + + /* Make background transparent. */ + this.mCanvas.drawRect(0, 0, getLetterBitmapTemporaryRect.width() + LETTER_EXTRA_WIDTH, lineHeight, this.mBackgroundPaint); + + /* Actually draw the character. */ + this.drawCharacterString(characterAsString); + + return bitmap; + } + + protected void drawCharacterString(final String pCharacterAsString) { + this.mCanvas.drawText(pCharacterAsString, LETTER_LEFT_OFFSET, -this.mFontMetrics.ascent, this.mPaint); + } + + public int getStringWidth(final String pText) { + this.mPaint.getTextBounds(pText, 0, pText.length(), this.mGetStringWidthTemporaryRect); + return this.mGetStringWidthTemporaryRect.width(); + } + + private void getLetterBounds(final char pCharacter, final Size pSize) { + this.mPaint.getTextBounds(String.valueOf(pCharacter), 0, 1, this.mGetLetterBoundsTemporaryRect); + pSize.set(this.mGetLetterBoundsTemporaryRect.width() + LETTER_EXTRA_WIDTH, this.getLineHeight()); + } + + public void prepareLettes(final char ... pCharacters) { + for(final char character : pCharacters) { + this.getLetter(character); + } + } + + public synchronized Letter getLetter(final char pCharacter) { + final SparseArray managedCharacterToLetterMap = this.mManagedCharacterToLetterMap; + Letter letter = managedCharacterToLetterMap.get(pCharacter); + if (letter == null) { + letter = this.createLetter(pCharacter); + + this.mLettersPendingToBeDrawnToTexture.add(letter); + managedCharacterToLetterMap.put(pCharacter, letter); + } + return letter; + } + + private Letter createLetter(final char pCharacter) { + final float textureWidth = this.mTextureWidth; + final float textureHeight = this.mTextureHeight; + + final Size createLetterTemporarySize = this.mCreateLetterTemporarySize; + this.getLetterBounds(pCharacter, createLetterTemporarySize); + + final float letterWidth = createLetterTemporarySize.getWidth(); + final float letterHeight = createLetterTemporarySize.getHeight(); + + if (this.mCurrentTextureX + letterWidth >= textureWidth) { + this.mCurrentTextureX = 0; + this.mCurrentTextureY += this.getLineGap() + this.getLineHeight(); + } + + final float letterTextureX = this.mCurrentTextureX / textureWidth; + final float letterTextureY = this.mCurrentTextureY / textureHeight; + final float letterTextureWidth = letterWidth / textureWidth; + final float letterTextureHeight = letterHeight / textureHeight; + + final Letter letter = new Letter(pCharacter, this.getLetterAdvance(pCharacter), (int)letterWidth, (int)letterHeight, letterTextureX, letterTextureY, letterTextureWidth, letterTextureHeight); + this.mCurrentTextureX += letterWidth; + + return letter; + } + + public synchronized void update(final GL10 pGL) { + final ArrayList lettersPendingToBeDrawnToTexture = this.mLettersPendingToBeDrawnToTexture; + if(lettersPendingToBeDrawnToTexture.size() > 0) { + final int hardwareTextureID = this.mTexture.getHardwareTextureID(); + + final float textureWidth = this.mTextureWidth; + final float textureHeight = this.mTextureHeight; + + for(int i = lettersPendingToBeDrawnToTexture.size() - 1; i >= 0; i--) { + final Letter letter = lettersPendingToBeDrawnToTexture.get(i); + final Bitmap bitmap = this.getLetterBitmap(letter.mCharacter); + + GLHelper.bindTexture(pGL, hardwareTextureID); + GLUtils.texSubImage2D(GL10.GL_TEXTURE_2D, 0, (int)(letter.mTextureX * textureWidth), (int)(letter.mTextureY * textureHeight), bitmap); + + bitmap.recycle(); + } + lettersPendingToBeDrawnToTexture.clear(); + System.gc(); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/font/FontFactory.java b/AndEngine/src/org/anddev/andengine/opengl/font/FontFactory.java new file mode 100644 index 0000000..3f6be15 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/font/FontFactory.java @@ -0,0 +1,77 @@ +package org.anddev.andengine.opengl.font; + +import org.anddev.andengine.opengl.texture.Texture; + +import android.content.Context; +import android.graphics.Typeface; + +/** + * @author Nicolas Gramlich + * @since 17:17:28 - 16.06.2010 + */ +public class FontFactory { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static String sAssetBasePath = ""; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + /** + * @param pAssetBasePath must end with '/' or have .length() == 0. + */ + public static void setAssetBasePath(final String pAssetBasePath) { + if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + FontFactory.sAssetBasePath = pAssetBasePath; + } else { + throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static Font create(final Texture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor) { + return new Font(pTexture, pTypeface, pSize, pAntiAlias, pColor); + } + + public static StrokeFont createStroke(final Texture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return new StrokeFont(pTexture, pTypeface, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final Texture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor, final boolean pStrokeOnly) { + return new StrokeFont(pTexture, pTypeface, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor, pStrokeOnly); + } + + public static Font createFromAsset(final Texture pTexture, final Context pContext, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor) { + return new Font(pTexture, Typeface.createFromAsset(pContext.getAssets(), FontFactory.sAssetBasePath + pAssetPath), pSize, pAntiAlias, pColor); + } + + public static StrokeFont createStrokeFromAsset(final Texture pTexture, final Context pContext, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return new StrokeFont(pTexture, Typeface.createFromAsset(pContext.getAssets(), FontFactory.sAssetBasePath + pAssetPath), pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStrokeFromAsset(final Texture pTexture, final Context pContext, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor, final boolean pStrokeOnly) { + return new StrokeFont(pTexture, Typeface.createFromAsset(pContext.getAssets(), FontFactory.sAssetBasePath + pAssetPath), pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor, pStrokeOnly); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/font/FontLibrary.java b/AndEngine/src/org/anddev/andengine/opengl/font/FontLibrary.java new file mode 100644 index 0000000..cede114 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/font/FontLibrary.java @@ -0,0 +1,57 @@ +package org.anddev.andengine.opengl.font; + +import org.anddev.andengine.util.Library; + +import android.util.SparseArray; + +/** + * @author Nicolas Gramlich + * @since 11:52:26 - 20.08.2010 + */ +public class FontLibrary extends Library { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public FontLibrary() { + super(); + } + + public FontLibrary(final int pInitialCapacity) { + super(pInitialCapacity); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + void loadFonts(final FontManager pFontManager) { + final SparseArray items = this.mItems; + for(int i = items.size() - 1; i >= 0; i--) { + final Font font = items.valueAt(i); + if(font != null) { + pFontManager.loadFont(font); + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/font/FontManager.java b/AndEngine/src/org/anddev/andengine/opengl/font/FontManager.java new file mode 100644 index 0000000..459c437 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/font/FontManager.java @@ -0,0 +1,80 @@ +package org.anddev.andengine.opengl.font; + +import java.util.ArrayList; + +import javax.microedition.khronos.opengles.GL10; + + +/** + * @author Nicolas Gramlich + * @since 17:48:46 - 08.03.2010 + */ +public class FontManager { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ArrayList mFontsManaged = new ArrayList(); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void clear() { + this.mFontsManaged.clear(); + } + + public void loadFont(final Font pFont) { + if(pFont == null) { + throw new IllegalArgumentException("pFont must not be null!"); + } + this.mFontsManaged.add(pFont); + } + + public void loadFonts(final FontLibrary pFontLibrary) { + pFontLibrary.loadFonts(this); + } + + public void loadFonts(final Font ... pFonts) { + for(int i = pFonts.length - 1; i >= 0; i--) { + this.loadFont(pFonts[i]); + } + } + + public void updateFonts(final GL10 pGL) { + final ArrayList fonts = this.mFontsManaged; + final int fontCount = fonts.size(); + if(fontCount > 0){ + for(int i = fontCount - 1; i >= 0; i--){ + fonts.get(i).update(pGL); + } + } + } + + public void reloadFonts() { + final ArrayList managedFonts = this.mFontsManaged; + for(int i = managedFonts.size() - 1; i >= 0; i--) { + managedFonts.get(i).reload(); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/font/Letter.java b/AndEngine/src/org/anddev/andengine/opengl/font/Letter.java new file mode 100644 index 0000000..384be3a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/font/Letter.java @@ -0,0 +1,84 @@ +/** + * + */ +package org.anddev.andengine.opengl.font; + +/** + * @author Nicolas Gramlich + * @since 10:30:22 - 03.04.2010 + */ +public class Letter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + public final int mAdvance; + public final int mWidth; + public final int mHeight; + public final float mTextureX; + public final float mTextureY; + public final float mTextureWidth; + public final float mTextureHeight; + public final char mCharacter; + + // =========================================================== + // Constructors + // =========================================================== + + Letter(final char pCharacter, final int pAdvance, final int pWidth, final int pHeight, final float pTextureX, final float pTextureY, final float pTextureWidth, final float pTextureHeight) { + this.mCharacter = pCharacter; + this.mAdvance = pAdvance; + this.mWidth = pWidth; + this.mHeight = pHeight; + this.mTextureX = pTextureX; + this.mTextureY = pTextureY; + this.mTextureWidth = pTextureWidth; + this.mTextureHeight = pTextureHeight; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + this.mCharacter; + return result; + } + + @Override + public boolean equals(final Object obj) { + if(this == obj) { + return true; + } + if(obj == null) { + return false; + } + if(this.getClass() != obj.getClass()) { + return false; + } + final Letter other = (Letter) obj; + if(this.mCharacter != other.mCharacter) { + return false; + } + return true; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/font/Size.java b/AndEngine/src/org/anddev/andengine/opengl/font/Size.java new file mode 100644 index 0000000..1fb60ea --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/font/Size.java @@ -0,0 +1,68 @@ +package org.anddev.andengine.opengl.font; + +/** + * @author Nicolas Gramlich + * @since 10:29:21 - 03.04.2010 + */ +class Size { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mWidth; + private float mHeight; + + // =========================================================== + // Constructors + // =========================================================== + + public Size() { + this(0, 0); + } + + public Size(final float pWidth, final float pHeight) { + this.setWidth(pWidth); + this.setHeight(pHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public void setWidth(final float width) { + this.mWidth = width; + } + + public float getWidth() { + return this.mWidth; + } + + public void setHeight(final float height) { + this.mHeight = height; + } + + public float getHeight() { + return this.mHeight; + } + + public void set(final int pWidth, final int pHeight) { + this.setWidth(pWidth); + this.setHeight(pHeight); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/font/StrokeFont.java b/AndEngine/src/org/anddev/andengine/opengl/font/StrokeFont.java new file mode 100644 index 0000000..979bcaa --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/font/StrokeFont.java @@ -0,0 +1,69 @@ +package org.anddev.andengine.opengl.font; + +import org.anddev.andengine.opengl.texture.Texture; + +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.graphics.Typeface; + +/** + * @author Nicolas Gramlich + * @since 10:39:33 - 03.04.2010 + */ +public class StrokeFont extends Font { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Paint mStrokePaint; + private final boolean mStrokeOnly; + + // =========================================================== + // Constructors + // =========================================================== + + public StrokeFont(final Texture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + this(pTexture, pTypeface, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor, false); + } + + public StrokeFont(final Texture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor, final boolean pStrokeOnly) { + super(pTexture, pTypeface, pSize, pAntiAlias, pColor); + this.mStrokePaint = new Paint(); + this.mStrokePaint.setTypeface(pTypeface); + this.mStrokePaint.setStyle(Style.STROKE); + this.mStrokePaint.setStrokeWidth(pStrokeWidth); + this.mStrokePaint.setColor(pStrokeColor); + this.mStrokePaint.setTextSize(pSize); + this.mStrokePaint.setAntiAlias(pAntiAlias); + + this.mStrokeOnly = pStrokeOnly; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void drawCharacterString(final String pCharacterAsString) { + if(this.mStrokeOnly == false) { + super.drawCharacterString(pCharacterAsString); + } + this.mCanvas.drawText(pCharacterAsString, LETTER_LEFT_OFFSET, -this.mFontMetrics.ascent, this.mStrokePaint); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/BuildableTexture.java b/AndEngine/src/org/anddev/andengine/opengl/texture/BuildableTexture.java new file mode 100644 index 0000000..34f5301 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/BuildableTexture.java @@ -0,0 +1,206 @@ +package org.anddev.andengine.opengl.texture; + +import java.util.ArrayList; + +import org.anddev.andengine.opengl.texture.builder.ITextureBuilder; +import org.anddev.andengine.opengl.texture.builder.ITextureBuilder.TextureSourcePackingException; +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.util.Callback; + +import android.graphics.Bitmap; + +/** + * @author Nicolas Gramlich + * @since 21:26:38 - 12.08.2010 + */ +public class BuildableTexture extends Texture { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ArrayList mTextureSourcesToPlace = new ArrayList(); + + // =========================================================== + // Constructors + // =========================================================== + + /** + * @param pWidth must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pHeight must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + */ + public BuildableTexture(final int pWidth, final int pHeight) { + super(pWidth, pHeight, TextureOptions.DEFAULT, null); + } + + /** + * @param pWidth must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pHeight must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pTextureStateListener to be informed when this {@link BuildableTexture} is loaded, unloaded or a {@link ITextureSource} failed to load. + */ + public BuildableTexture(final int pWidth, final int pHeight, final ITextureStateListener pTextureStateListener) { + super(pWidth, pHeight, TextureOptions.DEFAULT, pTextureStateListener); + } + + /** + * @param pWidth must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pHeight must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pTextureOptions the (quality) settings of the Texture. + */ + public BuildableTexture(final int pWidth, final int pHeight, final TextureOptions pTextureOptions) throws IllegalArgumentException { + super(pWidth, pHeight, pTextureOptions, null); + } + + /** + * @param pWidth must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pHeight must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pTextureOptions the (quality) settings of the Texture. + * @param pTextureStateListener to be informed when this {@link BuildableTexture} is loaded, unloaded or a {@link ITextureSource} failed to load. + */ + public BuildableTexture(final int pWidth, final int pHeight, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) throws IllegalArgumentException { + super(pWidth, pHeight, pTextureOptions, pTextureStateListener); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + /** + * Most likely this is not the method you'd want to be using, as the {@link ITextureSource} won't get packed through this. + * @deprecated Use {@link BuildableTexture#addTextureSource(ITextureSource)} instead. + */ + @Deprecated + @Override + public TextureSourceWithLocation addTextureSource(final ITextureSource pTextureSource, final int pTexturePositionX, final int pTexturePositionY) { + return super.addTextureSource(pTextureSource, pTexturePositionX, pTexturePositionY); + } + + @Override + public void clearTextureSources() { + super.clearTextureSources(); + this.mTextureSourcesToPlace.clear(); + } + + // =========================================================== + // Methods + // =========================================================== + + /** + * When all {@link ITextureSource}s are added you have to call {@link BuildableTexture#build(ITextureBuilder)}. + * @param pTextureSource to be added. + * @param pTextureRegion + */ + public void addTextureSource(final ITextureSource pTextureSource, final Callback pCallback) { + this.mTextureSourcesToPlace.add(new TextureSourceWithWithLocationCallback(pTextureSource, pCallback)); + } + + /** + * Removes a {@link ITextureSource} before {@link BuildableTexture#build(ITextureBuilder)} is called. + * @param pTextureSource to be removed. + */ + public void removeTextureSource(final ITextureSource pTextureSource) { + final ArrayList textureSources = this.mTextureSourcesToPlace; + for(int i = textureSources.size() - 1; i >= 0; i--) { + final TextureSourceWithWithLocationCallback textureSource = textureSources.get(i); + if(textureSource.mTextureSource == pTextureSource) { + textureSources.remove(i); + this.mUpdateOnHardwareNeeded = true; + return; + } + } + } + + /** + * May draw over already added {@link ITextureSource}s. + * + * @param pTextureSourcePackingAlgorithm the {@link ITextureBuilder} to use for packing the {@link ITextureSource} in this {@link BuildableTexture}. + * @throws TextureSourcePackingException i.e. when the {@link ITextureSource}s didn't fit into this {@link BuildableTexture}. + */ + public void build(final ITextureBuilder pTextureSourcePackingAlgorithm) throws TextureSourcePackingException { + pTextureSourcePackingAlgorithm.pack(this, this.mTextureSourcesToPlace); + this.mTextureSourcesToPlace.clear(); + this.mUpdateOnHardwareNeeded = true; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class TextureSourceWithWithLocationCallback implements ITextureSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ITextureSource mTextureSource; + private final Callback mCallback; + + // =========================================================== + // Constructors + // =========================================================== + + public TextureSourceWithWithLocationCallback(final ITextureSource pTextureSource, final Callback pCallback) { + this.mTextureSource = pTextureSource; + this.mCallback = pCallback; + } + + @Override + public TextureSourceWithWithLocationCallback clone() { + return null; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Callback getCallback() { + return this.mCallback; + } + + public ITextureSource getTextureSource() { + return this.mTextureSource; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int getWidth() { + return this.mTextureSource.getWidth(); + } + + @Override + public int getHeight() { + return this.mTextureSource.getHeight(); + } + + @Override + public Bitmap onLoadBitmap() { + return this.mTextureSource.onLoadBitmap(); + } + + @Override + public String toString() { + return this.mTextureSource.toString(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/Texture.java b/AndEngine/src/org/anddev/andengine/opengl/texture/Texture.java new file mode 100644 index 0000000..eb31c93 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/Texture.java @@ -0,0 +1,380 @@ +package org.anddev.andengine.opengl.texture; + +import java.util.ArrayList; + +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.MathUtils; + +import android.graphics.Bitmap; +import android.opengl.GLUtils; + +/** + * @author Nicolas Gramlich + * @since 14:55:02 - 08.03.2010 + */ +public class Texture { + // =========================================================== + // Constants + // =========================================================== + + private static final int[] HARDWARETEXTUREID_FETCHER = new int[1]; + + // =========================================================== + // Fields + // =========================================================== + + private final int mWidth; + private final int mHeight; + + private boolean mLoadedToHardware; + private int mHardwareTextureID = -1; + private final TextureOptions mTextureOptions; + + private final ArrayList mTextureSources = new ArrayList(); + + private final ITextureStateListener mTextureStateListener; + + protected boolean mUpdateOnHardwareNeeded = false; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * @param pWidth must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pHeight must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + */ + public Texture(final int pWidth, final int pHeight) { + this(pWidth, pHeight, TextureOptions.DEFAULT, null); + } + + /** + * @param pWidth must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pHeight must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pTextureStateListener to be informed when this {@link Texture} is loaded, unloaded or a {@link ITextureSource} failed to load. + */ + public Texture(final int pWidth, final int pHeight, final ITextureStateListener pTextureStateListener) { + this(pWidth, pHeight, TextureOptions.DEFAULT, pTextureStateListener); + } + + /** + * @param pWidth must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pHeight must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pTextureOptions the (quality) settings of the Texture. + */ + public Texture(final int pWidth, final int pHeight, final TextureOptions pTextureOptions) throws IllegalArgumentException { + this(pWidth, pHeight, pTextureOptions, null); + } + + /** + * @param pWidth must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pHeight must be a power of 2 (i.e. 32, 64, 128, 256, 512, 1024). + * @param pTextureOptions the (quality) settings of the Texture. + * @param pTextureStateListener to be informed when this {@link Texture} is loaded, unloaded or a {@link ITextureSource} failed to load. + */ + public Texture(final int pWidth, final int pHeight, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) throws IllegalArgumentException { + if (!MathUtils.isPowerOfTwo(pWidth) || !MathUtils.isPowerOfTwo(pHeight)){ + throw new IllegalArgumentException("pWidth and pHeight must be a power of 2!"); + } + + this.mWidth = pWidth; + this.mHeight = pHeight; + this.mTextureOptions = pTextureOptions; + this.mTextureStateListener = pTextureStateListener; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getHardwareTextureID() { + return this.mHardwareTextureID; + } + + public boolean isLoadedToHardware() { + return this.mLoadedToHardware; + } + + public boolean isUpdateOnHardwareNeeded() { + return this.mUpdateOnHardwareNeeded; + } + + void setLoadedToHardware(final boolean pLoadedToHardware) { + this.mLoadedToHardware = pLoadedToHardware; + } + + public int getWidth() { + return this.mWidth; + } + + public int getHeight() { + return this.mHeight; + } + + public TextureOptions getTextureOptions() { + return this.mTextureOptions; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public TextureSourceWithLocation addTextureSource(final ITextureSource pTextureSource, final int pTexturePositionX, final int pTexturePositionY) throws IllegalArgumentException { + this.checkTextureSourcePosition(pTextureSource, pTexturePositionX, pTexturePositionY); + + final TextureSourceWithLocation textureSourceWithLocation = new TextureSourceWithLocation(pTextureSource, pTexturePositionX, pTexturePositionY); + this.mTextureSources.add(textureSourceWithLocation); + this.mUpdateOnHardwareNeeded = true; + return textureSourceWithLocation; + } + + private void checkTextureSourcePosition(final ITextureSource pTextureSource, final int pTexturePositionX, final int pTexturePositionY) throws IllegalArgumentException { + if(pTexturePositionX < 0) { + throw new IllegalArgumentException("Illegal negative pTexturePositionX supplied: '" + pTexturePositionX + "'"); + } else if(pTexturePositionY < 0) { + throw new IllegalArgumentException("Illegal negative pTexturePositionY supplied: '" + pTexturePositionY + "'"); + } else if(pTexturePositionX + pTextureSource.getWidth() > this.mWidth || pTexturePositionY + pTextureSource.getHeight() > this.mHeight) { + throw new IllegalArgumentException("Supplied pTextureSource must not exceed bounds of Texture."); + } + } + + public void removeTextureSource(final ITextureSource pTextureSource, final int pTexturePositionX, final int pTexturePositionY) { + final ArrayList textureSources = this.mTextureSources; + for(int i = textureSources.size() - 1; i >= 0; i--) { + final TextureSourceWithLocation textureSourceWithLocation = textureSources.get(i); + if(textureSourceWithLocation.mTextureSource == pTextureSource && textureSourceWithLocation.mTexturePositionX == pTexturePositionX && textureSourceWithLocation.mTexturePositionY == pTexturePositionY) { + textureSources.remove(i); + this.mUpdateOnHardwareNeeded = true; + return; + } + } + } + + public void clearTextureSources() { + this.mTextureSources.clear(); + this.mUpdateOnHardwareNeeded = true; + } + + public void loadToHardware(final GL10 pGL) { + GLHelper.enableTextures(pGL); + + this.mHardwareTextureID = Texture.generateHardwareTextureID(pGL); + + this.allocateAndBindTextureOnHardware(pGL); + + this.applyTextureOptions(pGL); + + this.writeTextureToHardware(pGL); + + this.mUpdateOnHardwareNeeded = false; + this.mLoadedToHardware = true; + + if(this.mTextureStateListener != null) { + this.mTextureStateListener.onLoadedToHardware(this); + } + } + + public void unloadFromHardware(final GL10 pGL) { + GLHelper.enableTextures(pGL); + + this.deleteTextureOnHardware(pGL); + + this.mHardwareTextureID = -1; + + this.mLoadedToHardware = false; + + if(this.mTextureStateListener != null) { + this.mTextureStateListener.onUnloadedFromHardware(this); + } + } + + private void writeTextureToHardware(final GL10 pGL) { + final boolean preMultipyAlpha = this.mTextureOptions.mPreMultipyAlpha; + + final ArrayList textureSources = this.mTextureSources; + final int textureSourceCount = textureSources.size(); + + for(int j = 0; j < textureSourceCount; j++) { + final TextureSourceWithLocation textureSourceWithLocation = textureSources.get(j); + if(textureSourceWithLocation != null) { + final Bitmap bmp = textureSourceWithLocation.onLoadBitmap(); + try{ + if(bmp == null) { + throw new IllegalArgumentException("TextureSource: " + textureSourceWithLocation.toString() + " returned a null Bitmap."); + } + if(preMultipyAlpha) { + GLUtils.texSubImage2D(GL10.GL_TEXTURE_2D, 0, textureSourceWithLocation.getTexturePositionX(), textureSourceWithLocation.getTexturePositionY(), bmp, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE); + } else { + GLHelper.glTexSubImage2D(pGL, GL10.GL_TEXTURE_2D, 0, textureSourceWithLocation.getTexturePositionX(), textureSourceWithLocation.getTexturePositionY(), bmp, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE); + } + + bmp.recycle(); + } catch (final IllegalArgumentException iae) { + // TODO Load some static checkerboard or so to visualize that loading the texture has failed. + Debug.e("Error loading: " + textureSourceWithLocation.toString(), iae); + if(this.mTextureStateListener != null) { + this.mTextureStateListener.onTextureSourceLoadExeption(this, textureSourceWithLocation.mTextureSource, iae); + } else { + throw iae; + } + } + } + } + } + + private void applyTextureOptions(final GL10 pGL) { + final TextureOptions textureOptions = this.mTextureOptions; + pGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, textureOptions.mMinFilter); + pGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, textureOptions.mMagFilter); + pGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, textureOptions.mWrapS); + pGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, textureOptions.mWrapT); + pGL.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, textureOptions.mTextureEnvironment); + } + + private void allocateAndBindTextureOnHardware(final GL10 pGL) { + GLHelper.bindTexture(pGL, this.mHardwareTextureID); + + Texture.sendPlaceholderBitmapToHardware(this.mWidth, this.mHeight); + } + + private void deleteTextureOnHardware(final GL10 pGL) { + GLHelper.deleteTexture(pGL, this.mHardwareTextureID); + } + + private static int generateHardwareTextureID(final GL10 pGL) { + pGL.glGenTextures(1, Texture.HARDWARETEXTUREID_FETCHER, 0); + + return Texture.HARDWARETEXTUREID_FETCHER[0]; + } + + private static void sendPlaceholderBitmapToHardware(final int pWidth, final int pHeight) { + final Bitmap textureBitmap = Bitmap.createBitmap(pWidth, pHeight, Bitmap.Config.ARGB_8888); + + GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, textureBitmap, 0); + + textureBitmap.recycle(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface ITextureStateListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onLoadedToHardware(final Texture pTexture); + public void onTextureSourceLoadExeption(final Texture pTexture, final ITextureSource pTextureSource, final Throwable pThrowable); + public void onUnloadedFromHardware(final Texture pTexture); + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class TextureStateAdapter implements ITextureStateListener { + @Override + public void onLoadedToHardware(final Texture pTexture) { } + + @Override + public void onTextureSourceLoadExeption(final Texture pTexture, final ITextureSource pTextureSource, final Throwable pThrowable) { } + + @Override + public void onUnloadedFromHardware(final Texture pTexture) { } + } + + public static class DebugTextureStateListener implements ITextureStateListener { + @Override + public void onLoadedToHardware(final Texture pTexture) { + Debug.d("Texture loaded: " + pTexture.toString()); + } + + @Override + public void onTextureSourceLoadExeption(final Texture pTexture, final ITextureSource pTextureSource, final Throwable pThrowable) { + Debug.e("Exception loading TextureSource. Texture: " + pTexture.toString() + " TextureSource: " + pTextureSource.toString(), pThrowable); + } + + @Override + public void onUnloadedFromHardware(final Texture pTexture) { + Debug.d("Texture unloaded: " + pTexture.toString()); + } + } + } + + public static class TextureSourceWithLocation { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ITextureSource mTextureSource; + private final int mTexturePositionX; + private final int mTexturePositionY; + + // =========================================================== + // Constructors + // =========================================================== + + public TextureSourceWithLocation(final ITextureSource pTextureSource, final int pTexturePositionX, final int pTexturePositionY) { + this.mTextureSource = pTextureSource; + this.mTexturePositionX = pTexturePositionX; + this.mTexturePositionY = pTexturePositionY; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getTexturePositionX() { + return this.mTexturePositionX; + } + + public int getTexturePositionY() { + return this.mTexturePositionY; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public int getWidth() { + return this.mTextureSource.getWidth(); + } + + public int getHeight() { + return this.mTextureSource.getHeight(); + } + + public Bitmap onLoadBitmap() { + return this.mTextureSource.onLoadBitmap(); + } + + @Override + public String toString() { + return this.mTextureSource.toString(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/TextureFactory.java b/AndEngine/src/org/anddev/andengine/opengl/texture/TextureFactory.java new file mode 100644 index 0000000..816337a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/TextureFactory.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.opengl.texture; + +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.util.MathUtils; + +/** + * @author Nicolas Gramlich + * @since 09:38:51 - 03.05.2010 + */ +public class TextureFactory { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public static Texture createForTextureSourceSize(final TextureRegion pTextureRegion) { + return TextureFactory.createForTextureRegionSize(pTextureRegion, TextureOptions.DEFAULT); + } + + public static Texture createForTextureRegionSize(final TextureRegion pTextureRegion, final TextureOptions pTextureOptions) { + final int loadingScreenWidth = pTextureRegion.getWidth(); + final int loadingScreenHeight = pTextureRegion.getHeight(); + return new Texture(MathUtils.nextPowerOfTwo(loadingScreenWidth), MathUtils.nextPowerOfTwo(loadingScreenHeight), pTextureOptions); + } + + public static Texture createForTextureSourceSize(final ITextureSource pTextureSource) { + return TextureFactory.createForTextureSourceSize(pTextureSource, TextureOptions.DEFAULT); + } + + public static Texture createForTextureSourceSize(final ITextureSource pTextureSource, final TextureOptions pTextureOptions) { + final int loadingScreenWidth = pTextureSource.getWidth(); + final int loadingScreenHeight = pTextureSource.getHeight(); + return new Texture(MathUtils.nextPowerOfTwo(loadingScreenWidth), MathUtils.nextPowerOfTwo(loadingScreenHeight), pTextureOptions); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/TextureManager.java b/AndEngine/src/org/anddev/andengine/opengl/texture/TextureManager.java new file mode 100644 index 0000000..fe81247 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/TextureManager.java @@ -0,0 +1,165 @@ +package org.anddev.andengine.opengl.texture; + +import java.util.ArrayList; +import java.util.HashSet; + +import javax.microedition.khronos.opengles.GL10; + +/** + * @author Nicolas Gramlich + * @since 17:48:46 - 08.03.2010 + */ +public class TextureManager { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final HashSet mTexturesManaged = new HashSet(); + + private final ArrayList mTexturesLoaded = new ArrayList(); + + private final ArrayList mTexturesToBeLoaded = new ArrayList(); + private final ArrayList mTexturesToBeUnloaded = new ArrayList(); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + protected void clear() { + this.mTexturesToBeLoaded.clear(); + this.mTexturesLoaded.clear(); + this.mTexturesManaged.clear(); + } + + /** + * @param pTexture the {@link Texture} to be loaded before the very next frame is drawn (Or prevent it from being unloaded then). + * @return true when the {@link Texture} was previously not managed by this {@link TextureManager}, false if it was already managed. + */ + public boolean loadTexture(final Texture pTexture) { + if(this.mTexturesManaged.contains(pTexture)) { + /* Just make sure it doesn't get deleted. */ + this.mTexturesToBeUnloaded.remove(pTexture); + return false; + } else { + this.mTexturesManaged.add(pTexture); + this.mTexturesToBeLoaded.add(pTexture); + return true; + } + } + + /** + * @param pTexture the {@link Texture} to be unloaded before the very next frame is drawn (Or prevent it from being loaded then). + * @return true when the {@link Texture} was already managed by this {@link TextureManager}, false if it was not managed. + */ + public boolean unloadTexture(final Texture pTexture) { + if(this.mTexturesManaged.contains(pTexture)) { + /* If the Texture is loaded, unload it. + * If the Texture is about to be loaded, stop it from being loaded. */ + if(this.mTexturesLoaded.contains(pTexture)){ + this.mTexturesToBeUnloaded.add(pTexture); + } else if(this.mTexturesToBeLoaded.remove(pTexture)){ + this.mTexturesManaged.remove(pTexture); + } + return true; + } else { + return false; + } + } + + public void loadTextures(final Texture ... pTextures) { + for(int i = pTextures.length - 1; i >= 0; i--) { + this.loadTexture(pTextures[i]); + } + } + + public void unloadTextures(final Texture ... pTextures) { + for(int i = pTextures.length - 1; i >= 0; i--) { + this.unloadTexture(pTextures[i]); + } + } + + public void reloadTextures() { + final HashSet managedTextures = this.mTexturesManaged; + for(final Texture texture : managedTextures) { // TODO Can the use of the iterator be avoided somehow? + texture.setLoadedToHardware(false); + } + + this.mTexturesToBeLoaded.addAll(this.mTexturesLoaded); // TODO Check if addAll uses iterator internally! + this.mTexturesLoaded.clear(); + + this.mTexturesManaged.removeAll(this.mTexturesToBeUnloaded); // TODO Check if removeAll uses iterator internally! + this.mTexturesToBeUnloaded.clear(); + } + + public void updateTextures(final GL10 pGL) { + final HashSet texturesManaged = this.mTexturesManaged; + final ArrayList texturesLoaded = this.mTexturesLoaded; + final ArrayList texturesToBeLoaded = this.mTexturesToBeLoaded; + final ArrayList texturesToBeUnloaded = this.mTexturesToBeUnloaded; + + /* First reload Textures that need to be updated. */ + final int textursLoadedCount = texturesLoaded.size(); + + if(textursLoadedCount > 0){ + for(int i = textursLoadedCount - 1; i >= 0; i--){ + final Texture textureToBeUpdated = texturesLoaded.get(i); + if(textureToBeUpdated.isUpdateOnHardwareNeeded()){ + textureToBeUpdated.unloadFromHardware(pGL); + textureToBeUpdated.loadToHardware(pGL); + } + } + } + + /* Then load pending Textures. */ + final int texturesToBeLoadedCount = texturesToBeLoaded.size(); + + if(texturesToBeLoadedCount > 0){ + for(int i = texturesToBeLoadedCount - 1; i >= 0; i--){ + final Texture textureToBeLoaded = texturesToBeLoaded.remove(i); + if(!textureToBeLoaded.isLoadedToHardware()){ + textureToBeLoaded.loadToHardware(pGL); + } + texturesLoaded.add(textureToBeLoaded); + } + } + + /* Then unload pending Textures. */ + final int texturesToBeUnloadedCount = texturesToBeUnloaded.size(); + + if(texturesToBeUnloadedCount > 0){ + for(int i = texturesToBeUnloadedCount - 1; i >= 0; i--){ + final Texture textureToBeUnloaded = texturesToBeUnloaded.remove(i); + if(textureToBeUnloaded.isLoadedToHardware()){ + textureToBeUnloaded.unloadFromHardware(pGL); + } + texturesLoaded.remove(textureToBeUnloaded); + texturesManaged.remove(textureToBeUnloaded); + } + } + + /* Finally invoke the GC if anything has changed. */ + if(texturesToBeLoadedCount > 0 || texturesToBeUnloadedCount > 0){ + System.gc(); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/TextureOptions.java b/AndEngine/src/org/anddev/andengine/opengl/texture/TextureOptions.java new file mode 100644 index 0000000..786aff6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/TextureOptions.java @@ -0,0 +1,65 @@ +package org.anddev.andengine.opengl.texture; + +import javax.microedition.khronos.opengles.GL10; + +/** + * @author Nicolas Gramlich + * @since 13:00:09 - 05.04.2010 + */ +public class TextureOptions { + // =========================================================== + // Constants + // =========================================================== + + public static final TextureOptions NEAREST = new TextureOptions(GL10.GL_NEAREST, GL10.GL_NEAREST, GL10.GL_CLAMP_TO_EDGE, GL10.GL_CLAMP_TO_EDGE, GL10.GL_MODULATE, false); + public static final TextureOptions BILINEAR = new TextureOptions(GL10.GL_LINEAR, GL10.GL_LINEAR, GL10.GL_CLAMP_TO_EDGE, GL10.GL_CLAMP_TO_EDGE, GL10.GL_MODULATE, false); + public static final TextureOptions REPEATING = new TextureOptions(GL10.GL_NEAREST, GL10.GL_NEAREST, GL10.GL_REPEAT, GL10.GL_REPEAT, GL10.GL_MODULATE, false); + public static final TextureOptions REPEATING_BILINEAR = new TextureOptions(GL10.GL_LINEAR, GL10.GL_LINEAR, GL10.GL_REPEAT, GL10.GL_REPEAT, GL10.GL_MODULATE, false); + + public static final TextureOptions NEAREST_PREMULTIPLYALPHA = new TextureOptions(GL10.GL_NEAREST, GL10.GL_NEAREST, GL10.GL_CLAMP_TO_EDGE, GL10.GL_CLAMP_TO_EDGE, GL10.GL_MODULATE, true); + public static final TextureOptions BILINEAR_PREMULTIPLYALPHA = new TextureOptions(GL10.GL_LINEAR, GL10.GL_LINEAR, GL10.GL_CLAMP_TO_EDGE, GL10.GL_CLAMP_TO_EDGE, GL10.GL_MODULATE, true); + public static final TextureOptions REPEATING_PREMULTIPLYALPHA = new TextureOptions(GL10.GL_NEAREST, GL10.GL_NEAREST, GL10.GL_REPEAT, GL10.GL_REPEAT, GL10.GL_MODULATE, true); + public static final TextureOptions REPEATING_BILINEAR_PREMULTIPLYALPHA = new TextureOptions(GL10.GL_LINEAR, GL10.GL_LINEAR, GL10.GL_REPEAT, GL10.GL_REPEAT, GL10.GL_MODULATE, true); + + public static final TextureOptions DEFAULT = NEAREST_PREMULTIPLYALPHA; + + // =========================================================== + // Fields + // =========================================================== + + public final int mMagFilter; + public final int mMinFilter; + public final float mWrapT; + public final float mWrapS; + public final int mTextureEnvironment; + public final boolean mPreMultipyAlpha; + + // =========================================================== + // Constructors + // =========================================================== + + public TextureOptions(final int pMinFilter, final int pMagFilter, final int pWrapT, final int pWrapS, final int pTextureEnvironment, final boolean pPreMultiplyAlpha) { + this.mMinFilter = pMinFilter; + this.mMagFilter = pMagFilter; + this.mWrapT = pWrapT; + this.mWrapS = pWrapS; + this.mTextureEnvironment = pTextureEnvironment; + this.mPreMultipyAlpha = pPreMultiplyAlpha; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/buffer/TextTextureBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/texture/buffer/TextTextureBuffer.java new file mode 100644 index 0000000..d95695b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/buffer/TextTextureBuffer.java @@ -0,0 +1,88 @@ +package org.anddev.andengine.opengl.texture.buffer; + +import org.anddev.andengine.opengl.buffer.BufferObject; +import org.anddev.andengine.opengl.font.Font; +import org.anddev.andengine.opengl.font.Letter; +import org.anddev.andengine.opengl.util.FastFloatBuffer; + +/** + * @author Nicolas Gramlich + * @since 11:05:56 - 03.04.2010 + */ +public class TextTextureBuffer extends BufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TextTextureBuffer(final int pCapacity, final int pDrawType) { + super(pCapacity, pDrawType); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public synchronized void update(final Font pFont, final String[] pLines) { + final FastFloatBuffer textureFloatBuffer = this.getFloatBuffer(); + textureFloatBuffer.position(0); + + final Font font = pFont; + final String[] lines = pLines; + + final int lineCount = lines.length; + for (int i = 0; i < lineCount; i++) { + final String line = lines[i]; + + final int lineLength = line.length(); + for (int j = 0; j < lineLength; j++) { + final Letter letter = font.getLetter(line.charAt(j)); + + final float letterTextureX = letter.mTextureX; + final float letterTextureY = letter.mTextureY; + final float letterTextureX2 = letterTextureX + letter.mTextureWidth; + final float letterTextureY2 = letterTextureY + letter.mTextureHeight; + + textureFloatBuffer.put(letterTextureX); + textureFloatBuffer.put(letterTextureY); + + textureFloatBuffer.put(letterTextureX); + textureFloatBuffer.put(letterTextureY2); + + textureFloatBuffer.put(letterTextureX2); + textureFloatBuffer.put(letterTextureY2); + + textureFloatBuffer.put(letterTextureX2); + textureFloatBuffer.put(letterTextureY2); + + textureFloatBuffer.put(letterTextureX2); + textureFloatBuffer.put(letterTextureY); + + textureFloatBuffer.put(letterTextureX); + textureFloatBuffer.put(letterTextureY); + } + } + textureFloatBuffer.position(0); + + this.setHardwareBufferNeedsUpdate(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/builder/BlackPawnTextureBuilder.java b/AndEngine/src/org/anddev/andengine/opengl/texture/builder/BlackPawnTextureBuilder.java new file mode 100644 index 0000000..8caf801 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/builder/BlackPawnTextureBuilder.java @@ -0,0 +1,324 @@ +package org.anddev.andengine.opengl.texture.builder; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +import org.anddev.andengine.opengl.texture.BuildableTexture; +import org.anddev.andengine.opengl.texture.BuildableTexture.TextureSourceWithWithLocationCallback; +import org.anddev.andengine.opengl.texture.Texture.TextureSourceWithLocation; +import org.anddev.andengine.opengl.texture.source.ITextureSource; + +/** + * @author Nicolas Gramlich + * @since 16:03:01 - 12.08.2010 + * @see http://www.blackpawn.com/texts/lightmaps/default.html + */ +public class BlackPawnTextureBuilder implements ITextureBuilder { + // =========================================================== + // Constants + // =========================================================== + + private static final Comparator TEXTURESOURCE_COMPARATOR = new Comparator() { + @Override + public int compare(final ITextureSource pTextureSourceA, final ITextureSource pTextureSourceB) { + final int deltaWidth = pTextureSourceB.getWidth() - pTextureSourceA.getWidth(); + if(deltaWidth != 0) { + return deltaWidth; + } else { + return pTextureSourceB.getHeight() - pTextureSourceA.getHeight(); + } + } + }; + + // =========================================================== + // Fields + // =========================================================== + + private final int mTextureSourceSpacing; + + // =========================================================== + // Constructors + // =========================================================== + + public BlackPawnTextureBuilder(final int pTextureSourceSpacing) { + this.mTextureSourceSpacing = pTextureSourceSpacing; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @SuppressWarnings("deprecation") + @Override + public void pack(final BuildableTexture pBuildableTexture, final ArrayList pTextureSourcesWithLocationCallback) throws IllegalArgumentException { + Collections.sort(pTextureSourcesWithLocationCallback, TEXTURESOURCE_COMPARATOR); + + final Node root = new Node(new Rect(0, 0, pBuildableTexture.getWidth(), pBuildableTexture.getHeight())); + + final int textureSourceCount = pTextureSourcesWithLocationCallback.size(); + + for(int i = 0; i < textureSourceCount; i++) { + final TextureSourceWithWithLocationCallback textureSourceWithLocationCallback = pTextureSourcesWithLocationCallback.get(i); + final ITextureSource textureSource = textureSourceWithLocationCallback.getTextureSource(); + + final Node inserted = root.insert(textureSource, pBuildableTexture.getWidth(), pBuildableTexture.getHeight(), this.mTextureSourceSpacing); + + if(inserted == null) { + throw new IllegalArgumentException("Could not pack: " + textureSource.toString()); + } + final TextureSourceWithLocation textureSourceWithLocation = pBuildableTexture.addTextureSource(textureSource, inserted.mRect.mLeft, inserted.mRect.mTop); + textureSourceWithLocationCallback.getCallback().onCallback(textureSourceWithLocation); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + protected static class Rect { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mLeft; + private final int mTop; + private final int mWidth; + private final int mHeight; + + // =========================================================== + // Constructors + // =========================================================== + + public Rect(final int pLeft, final int pTop, final int pWidth, final int pHeight) { + this.mLeft = pLeft; + this.mTop = pTop; + this.mWidth = pWidth; + this.mHeight = pHeight; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getWidth() { + return this.mWidth; + } + + public int getHeight() { + return this.mHeight; + } + + public int getLeft() { + return this.mLeft; + } + + public int getTop() { + return this.mTop; + } + + public int getRight() { + return this.mLeft + this.mWidth; + } + + public int getBottom() { + return this.mTop + this.mHeight; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public String toString() { + return "@: " + this.mLeft + "/" + this.mTop + " * " + this.mWidth + "x" + this.mHeight; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } + + protected static class Node { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private Node mChildA; + private Node mChildB; + private final Rect mRect; + private ITextureSource mTextureSource; + + // =========================================================== + // Constructors + // =========================================================== + + public Node(final int pLeft, final int pTop, final int pWidth, final int pHeight) { + this(new Rect(pLeft, pTop, pWidth, pHeight)); + } + + public Node(final Rect pRect) { + this.mRect = pRect; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Rect getRect() { + return this.mRect; + } + + public Node getChildA() { + return this.mChildA; + } + + public Node getChildB() { + return this.mChildB; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public Node insert(final ITextureSource pTextureSource, final int pTextureWidth, final int pTextureHeight, final int pTextureSpacing) throws IllegalArgumentException { + if(this.mChildA != null && this.mChildB != null) { + final Node newNode = this.mChildA.insert(pTextureSource, pTextureWidth, pTextureHeight, pTextureSpacing); + if(newNode != null){ + return newNode; + } else { + return this.mChildB.insert(pTextureSource, pTextureWidth, pTextureHeight, pTextureSpacing); + } + } else { + if(this.mTextureSource != null) { + return null; + } + + final int textureSourceWidth = pTextureSource.getWidth(); + final int textureSourceHeight = pTextureSource.getHeight(); + + final int rectWidth = this.mRect.getWidth(); + final int rectHeight = this.mRect.getHeight(); + + if(textureSourceWidth > rectWidth || textureSourceHeight > rectHeight) { + return null; + } + + final int textureSourceWidthWithSpacing = textureSourceWidth + pTextureSpacing; + final int textureSourceHeightWithSpacing = textureSourceHeight + pTextureSpacing; + + final int rectLeft = this.mRect.getLeft(); + final int rectTop = this.mRect.getTop(); + + final boolean fitToBottomWithoutSpacing = textureSourceHeight == rectHeight && rectTop + textureSourceHeight == pTextureHeight; + final boolean fitToRightWithoutSpacing = textureSourceWidth == rectWidth && rectLeft + textureSourceWidth == pTextureWidth; + + if(textureSourceWidthWithSpacing == rectWidth){ + if(textureSourceHeightWithSpacing == rectHeight) { /* Normal case with padding. */ + this.mTextureSource = pTextureSource; + return this; + } else if(fitToBottomWithoutSpacing) { /* Bottom edge of the Texture. */ + this.mTextureSource = pTextureSource; + return this; + } + } + + if(fitToRightWithoutSpacing) { /* Right edge of the Texture. */ + if(textureSourceHeightWithSpacing == rectHeight) { + this.mTextureSource = pTextureSource; + return this; + } else if(fitToBottomWithoutSpacing) { /* Bottom edge of the Texture. */ + this.mTextureSource = pTextureSource; + return this; + } else if(textureSourceHeightWithSpacing > rectHeight) { + return null; + } else { + + return this.createChildren(pTextureSource, pTextureWidth, pTextureHeight, pTextureSpacing, rectWidth - textureSourceWidth, rectHeight - textureSourceHeightWithSpacing); + } + } + + if(fitToBottomWithoutSpacing) { + if(textureSourceWidthWithSpacing == rectWidth) { + this.mTextureSource = pTextureSource; + return this; + } else if(textureSourceWidthWithSpacing > rectWidth) { + return null; + } else { + return this.createChildren(pTextureSource, pTextureWidth, pTextureHeight, pTextureSpacing, rectWidth - textureSourceWidthWithSpacing, rectHeight - textureSourceHeight); + } + } else if(textureSourceWidthWithSpacing > rectWidth || textureSourceHeightWithSpacing > rectHeight) { + return null; + } else { + return this.createChildren(pTextureSource, pTextureWidth, pTextureHeight, pTextureSpacing, rectWidth - textureSourceWidthWithSpacing, rectHeight - textureSourceHeightWithSpacing); + } + } + } + + private Node createChildren(final ITextureSource pTextureSource, final int pTextureWidth, final int pTextureHeight, final int pTextureSpacing, final int pDeltaWidth, final int pDeltaHeight) { + final Rect rect = this.mRect; + + if(pDeltaWidth >= pDeltaHeight) { + /* Split using a vertical axis. */ + this.mChildA = new Node( + rect.getLeft(), + rect.getTop(), + pTextureSource.getWidth() + pTextureSpacing, + rect.getHeight() + ); + + this.mChildB = new Node( + rect.getLeft() + (pTextureSource.getWidth() + pTextureSpacing), + rect.getTop(), + rect.getWidth() - (pTextureSource.getWidth() + pTextureSpacing), + rect.getHeight() + ); + } else { + /* Split using a horizontal axis. */ + this.mChildA = new Node( + rect.getLeft(), + rect.getTop(), + rect.getWidth(), + pTextureSource.getHeight() + pTextureSpacing + ); + + this.mChildB = new Node( + rect.getLeft(), + rect.getTop() + (pTextureSource.getHeight() + pTextureSpacing), + rect.getWidth(), + rect.getHeight() - (pTextureSource.getHeight() + pTextureSpacing) + ); + } + + return this.mChildA.insert(pTextureSource, pTextureWidth, pTextureHeight, pTextureSpacing); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/builder/ITextureBuilder.java b/AndEngine/src/org/anddev/andengine/opengl/texture/builder/ITextureBuilder.java new file mode 100644 index 0000000..b2b8328 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/builder/ITextureBuilder.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.opengl.texture.builder; + +import java.util.ArrayList; + +import org.anddev.andengine.opengl.texture.BuildableTexture; +import org.anddev.andengine.opengl.texture.BuildableTexture.TextureSourceWithWithLocationCallback; + +/** + * @author Nicolas Gramlich + * @since 15:59:14 - 12.08.2010 + */ +public interface ITextureBuilder { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void pack(final BuildableTexture pBuildableTexture, final ArrayList pTextureSourcesWithLocationCallback) throws TextureSourcePackingException; + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class TextureSourcePackingException extends Exception { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 4700734424214372671L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } + +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/region/BaseTextureRegion.java b/AndEngine/src/org/anddev/andengine/opengl/texture/region/BaseTextureRegion.java new file mode 100644 index 0000000..ade50c0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/region/BaseTextureRegion.java @@ -0,0 +1,147 @@ +package org.anddev.andengine.opengl.texture.region; + +import javax.microedition.khronos.opengles.GL10; +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.opengl.buffer.BufferObjectManager; +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.texture.region.buffer.BaseTextureRegionBuffer; +import org.anddev.andengine.opengl.util.GLHelper; + +/** + * @author Nicolas Gramlich + * @since 14:29:59 - 08.03.2010 + */ +public abstract class BaseTextureRegion { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final Texture mTexture; + + protected final BaseTextureRegionBuffer mTextureRegionBuffer; + + protected int mWidth; + protected int mHeight; + + protected int mTexturePositionX; + protected int mTexturePositionY; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseTextureRegion(final Texture pTexture, final int pTexturePositionX, final int pTexturePositionY, final int pWidth, final int pHeight) { + this.mTexture = pTexture; + this.mTexturePositionX = pTexturePositionX; + this.mTexturePositionY = pTexturePositionY; + this.mWidth = pWidth; + this.mHeight = pHeight; + + this.mTextureRegionBuffer = this.onCreateTextureRegionBuffer(); + + BufferObjectManager.getActiveInstance().loadBufferObject(this.mTextureRegionBuffer); + + this.initTextureBuffer(); + } + + protected void initTextureBuffer() { + this.updateTextureRegionBuffer(); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getWidth() { + return this.mWidth; + } + + public int getHeight() { + return this.mHeight; + } + + public void setWidth(final int pWidth) { + this.mWidth = pWidth; + this.updateTextureRegionBuffer(); + } + + public void setHeight(final int pHeight) { + this.mHeight = pHeight; + this.updateTextureRegionBuffer(); + } + + public void setTexturePosition(final int pX, final int pY) { + this.mTexturePositionX = pX; + this.mTexturePositionY = pY; + this.updateTextureRegionBuffer(); + } + + public int getTexturePositionX() { + return this.mTexturePositionX; + } + + public int getTexturePositionY() { + return this.mTexturePositionY; + } + + public Texture getTexture() { + return this.mTexture; + } + + public BaseTextureRegionBuffer getTextureBuffer() { + return this.mTextureRegionBuffer; + } + + public boolean isFlippedHorizontal() { + return this.mTextureRegionBuffer.isFlippedHorizontal(); + } + + public void setFlippedHorizontal(final boolean pFlippedHorizontal) { + this.mTextureRegionBuffer.setFlippedHorizontal(pFlippedHorizontal); + } + + public boolean isFlippedVertical() { + return this.mTextureRegionBuffer.isFlippedVertical(); + } + + public void setFlippedVertical(final boolean pFlippedVertical) { + this.mTextureRegionBuffer.setFlippedVertical(pFlippedVertical); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract BaseTextureRegionBuffer onCreateTextureRegionBuffer(); + + // =========================================================== + // Methods + // =========================================================== + + protected void updateTextureRegionBuffer() { + this.mTextureRegionBuffer.update(); + } + + public void onApply(final GL10 pGL) { + if(GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS) { + final GL11 gl11 = (GL11)pGL; + + this.mTextureRegionBuffer.selectOnHardware(gl11); + + GLHelper.bindTexture(pGL, this.mTexture.getHardwareTextureID()); + GLHelper.texCoordZeroPointer(gl11); + } else { + GLHelper.bindTexture(pGL, this.mTexture.getHardwareTextureID()); + GLHelper.texCoordPointer(pGL, this.mTextureRegionBuffer.getFloatBuffer()); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegion.java b/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegion.java new file mode 100644 index 0000000..ac259a2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegion.java @@ -0,0 +1,60 @@ +package org.anddev.andengine.opengl.texture.region; + +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.texture.region.buffer.BaseTextureRegionBuffer; +import org.anddev.andengine.opengl.texture.region.buffer.TextureRegionBuffer; + +/** + * @author Nicolas Gramlich + * @since 14:29:59 - 08.03.2010 + */ +public class TextureRegion extends BaseTextureRegion { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TextureRegion(final Texture pTexture, final int pTexturePositionX, final int pTexturePositionY, final int pWidth, final int pHeight) { + super(pTexture, pTexturePositionX, pTexturePositionY, pWidth, pHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public TextureRegionBuffer getTextureBuffer() { + return (TextureRegionBuffer) this.mTextureRegionBuffer; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public TextureRegion clone() { + return new TextureRegion(this.mTexture, this.mTexturePositionX, this.mTexturePositionY, this.mWidth, this.mHeight); + } + + // =========================================================== + // Methods + // =========================================================== + + @Override + protected BaseTextureRegionBuffer onCreateTextureRegionBuffer() { + return new TextureRegionBuffer(this, GL11.GL_STATIC_DRAW); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegionFactory.java b/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegionFactory.java new file mode 100644 index 0000000..ee26475 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegionFactory.java @@ -0,0 +1,150 @@ +package org.anddev.andengine.opengl.texture.region; + + +import org.anddev.andengine.opengl.texture.BuildableTexture; +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.texture.Texture.TextureSourceWithLocation; +import org.anddev.andengine.opengl.texture.source.AssetTextureSource; +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.opengl.texture.source.ResourceTextureSource; +import org.anddev.andengine.util.Callback; + +import android.content.Context; + + +/** + * @author Nicolas Gramlich + * @since 18:15:14 - 09.03.2010 + */ +public class TextureRegionFactory { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static String sAssetBasePath = ""; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + /** + * @param pAssetBasePath must end with '/' or have .length() == 0. + */ + public static void setAssetBasePath(final String pAssetBasePath) { + if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + TextureRegionFactory.sAssetBasePath = pAssetBasePath; + } else { + throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static TextureRegion extractFromTexture(final Texture pTexture, final int pTexturePositionX, final int pTexturePositionY, final int pWidth, final int pHeight) { + return new TextureRegion(pTexture, pTexturePositionX, pTexturePositionY, pWidth, pHeight); + } + + // =========================================================== + // Methods using Texture + // =========================================================== + + public static TextureRegion createFromAsset(final Texture pTexture, final Context pContext, final String pAssetPath, final int pTexturePositionX, final int pTexturePositionY) { + final ITextureSource textureSource = new AssetTextureSource(pContext, TextureRegionFactory.sAssetBasePath + pAssetPath); + return TextureRegionFactory.createFromSource(pTexture, textureSource, pTexturePositionX, pTexturePositionY); + } + + public static TiledTextureRegion createTiledFromAsset(final Texture pTexture, final Context pContext, final String pAssetPath, final int pTexturePositionX, final int pTexturePositionY, final int pTileColumns, final int pTileRows) { + final ITextureSource textureSource = new AssetTextureSource(pContext, TextureRegionFactory.sAssetBasePath + pAssetPath); + return TextureRegionFactory.createTiledFromSource(pTexture, textureSource, pTexturePositionX, pTexturePositionY, pTileColumns, pTileRows); + } + + + public static TextureRegion createFromResource(final Texture pTexture, final Context pContext, final int pDrawableResourceID, final int pTexturePositionX, final int pTexturePositionY) { + final ITextureSource textureSource = new ResourceTextureSource(pContext, pDrawableResourceID); + return TextureRegionFactory.createFromSource(pTexture, textureSource, pTexturePositionX, pTexturePositionY); + } + + public static TiledTextureRegion createTiledFromResource(final Texture pTexture, final Context pContext, final int pDrawableResourceID, final int pTexturePositionX, final int pTexturePositionY, final int pTileColumns, final int pTileRows) { + final ITextureSource textureSource = new ResourceTextureSource(pContext, pDrawableResourceID); + return TextureRegionFactory.createTiledFromSource(pTexture, textureSource, pTexturePositionX, pTexturePositionY, pTileColumns, pTileRows); + } + + + public static TextureRegion createFromSource(final Texture pTexture, final ITextureSource pTextureSource, final int pTexturePositionX, final int pTexturePositionY) { + final TextureRegion textureRegion = new TextureRegion(pTexture, pTexturePositionX, pTexturePositionY, pTextureSource.getWidth(), pTextureSource.getHeight()); + pTexture.addTextureSource(pTextureSource, textureRegion.getTexturePositionX(), textureRegion.getTexturePositionY()); + return textureRegion; + } + + public static TiledTextureRegion createTiledFromSource(final Texture pTexture, final ITextureSource pTextureSource, final int pTexturePositionX, final int pTexturePositionY, final int pTileColumns, final int pTileRows) { + final TiledTextureRegion tiledTextureRegion = new TiledTextureRegion(pTexture, pTexturePositionX, pTexturePositionY, pTextureSource.getWidth(), pTextureSource.getHeight(), pTileColumns, pTileRows); + pTexture.addTextureSource(pTextureSource, tiledTextureRegion.getTexturePositionX(), tiledTextureRegion.getTexturePositionY()); + return tiledTextureRegion; + } + + // =========================================================== + // Methods using BuildableTexture + // =========================================================== + + public static TextureRegion createFromAsset(final BuildableTexture pBuildableTexture, final Context pContext, final String pAssetPath) { + final ITextureSource textureSource = new AssetTextureSource(pContext, TextureRegionFactory.sAssetBasePath + pAssetPath); + return TextureRegionFactory.createFromSource(pBuildableTexture, textureSource); + } + + public static TiledTextureRegion createTiledFromAsset(final BuildableTexture pBuildableTexture, final Context pContext, final String pAssetPath, final int pTileColumns, final int pTileRows) { + final ITextureSource textureSource = new AssetTextureSource(pContext, TextureRegionFactory.sAssetBasePath + pAssetPath); + return TextureRegionFactory.createTiledFromSource(pBuildableTexture, textureSource, pTileColumns, pTileRows); + } + + + public static TextureRegion createFromResource(final BuildableTexture pBuildableTexture, final Context pContext, final int pDrawableResourceID) { + final ITextureSource textureSource = new ResourceTextureSource(pContext, pDrawableResourceID); + return TextureRegionFactory.createFromSource(pBuildableTexture, textureSource); + } + + public static TiledTextureRegion createTiledFromResource(final BuildableTexture pBuildableTexture, final Context pContext, final int pDrawableResourceID, final int pTileColumns, final int pTileRows) { + final ITextureSource textureSource = new ResourceTextureSource(pContext, pDrawableResourceID); + return TextureRegionFactory.createTiledFromSource(pBuildableTexture, textureSource, pTileColumns, pTileRows); + } + + + public static TextureRegion createFromSource(final BuildableTexture pBuildableTexture, final ITextureSource pTextureSource) { + final TextureRegion textureRegion = new TextureRegion(pBuildableTexture, 0, 0, pTextureSource.getWidth(), pTextureSource.getHeight()); + pBuildableTexture.addTextureSource(pTextureSource, new Callback() { + @Override + public void onCallback(final TextureSourceWithLocation pCallbackValue) { + textureRegion.setTexturePosition(pCallbackValue.getTexturePositionX(), pCallbackValue.getTexturePositionY()); + } + }); + return textureRegion; + } + + public static TiledTextureRegion createTiledFromSource(final BuildableTexture pBuildableTexture, final ITextureSource pTextureSource, final int pTileColumns, final int pTileRows) { + final TiledTextureRegion tiledTextureRegion = new TiledTextureRegion(pBuildableTexture, 0, 0, pTextureSource.getWidth(), pTextureSource.getHeight(), pTileColumns, pTileRows); + pBuildableTexture.addTextureSource(pTextureSource, new Callback() { + @Override + public void onCallback(final TextureSourceWithLocation pCallbackValue) { + tiledTextureRegion.setTexturePosition(pCallbackValue.getTexturePositionX(), pCallbackValue.getTexturePositionY()); + } + }); + return tiledTextureRegion; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegionLibrary.java b/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegionLibrary.java new file mode 100644 index 0000000..47f3e8d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/region/TextureRegionLibrary.java @@ -0,0 +1,54 @@ +package org.anddev.andengine.opengl.texture.region; + +import org.anddev.andengine.util.Library; + +/** + * @author Nicolas Gramlich + * @since 11:52:26 - 20.08.2010 + */ +public class TextureRegionLibrary extends Library { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TextureRegionLibrary() { + super(); + } + + public TextureRegionLibrary(final int pInitialCapacity) { + super(pInitialCapacity); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public TextureRegion get(final int pID) { + return (TextureRegion) super.get(pID); + } + + public TiledTextureRegion getTiled(final int pID) { + return (TiledTextureRegion) this.mItems.get(pID); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/region/TiledTextureRegion.java b/AndEngine/src/org/anddev/andengine/opengl/texture/region/TiledTextureRegion.java new file mode 100644 index 0000000..a95aea2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/region/TiledTextureRegion.java @@ -0,0 +1,133 @@ +package org.anddev.andengine.opengl.texture.region; + +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.texture.region.buffer.TiledTextureRegionBuffer; + +/** + * @author Nicolas Gramlich + * @since 18:14:42 - 09.03.2010 + */ +public class TiledTextureRegion extends BaseTextureRegion { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mTileColumns; + private final int mTileRows; + private int mCurrentTileColumn; + private int mCurrentTileRow; + private final int mTileCount; + + // =========================================================== + // Constructors + // =========================================================== + + public TiledTextureRegion(final Texture pTexture, final int pTexturePositionX, final int pTexturePositionY, final int pWidth, final int pHeight, final int pTileColumns, final int pTileRows) { + super(pTexture, pTexturePositionX, pTexturePositionY, pWidth, pHeight); + this.mTileColumns = pTileColumns; + this.mTileRows = pTileRows; + this.mTileCount = this.mTileColumns * this.mTileRows; + this.mCurrentTileColumn = 0; + this.mCurrentTileRow = 0; + + this.initTextureBuffer(); + } + + @Override + protected void initTextureBuffer() { + if(this.mTileRows != 0 && this.mTileColumns != 0) { + super.initTextureBuffer(); + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public TiledTextureRegionBuffer getTextureBuffer() { + return (TiledTextureRegionBuffer) this.mTextureRegionBuffer; + } + + public int getTileCount() { + return this.mTileCount; + } + + public int getTileWidth() { + return super.getWidth() / this.mTileColumns; + } + + public int getTileHeight() { + return super.getHeight() / this.mTileRows; + } + + public int getCurrentTileColumn() { + return this.mCurrentTileColumn; + } + + public int getCurrentTileRow() { + return this.mCurrentTileRow; + } + + public int getCurrentTileIndex() { + return this.mCurrentTileRow * this.mTileColumns + this.mCurrentTileColumn; + } + + public void setCurrentTileIndex(final int pTileColumn, final int pTileRow) { + if(pTileColumn != this.mCurrentTileColumn || pTileRow != this.mCurrentTileRow) { + this.mCurrentTileColumn = pTileColumn; + this.mCurrentTileRow = pTileRow; + super.updateTextureRegionBuffer(); + } + } + + public void setCurrentTileIndex(final int pTileIndex) { + if(pTileIndex < this.mTileCount) { + final int tileColumns = this.mTileColumns; + this.setCurrentTileIndex(pTileIndex % tileColumns, pTileIndex / tileColumns); + } + } + + public float getTexturePositionOfCurrentTileX() { + return super.getTexturePositionX() + this.mCurrentTileColumn * this.getTileWidth(); + } + + public float getTexturePositionOfCurrentTileY() { + return super.getTexturePositionY() + this.mCurrentTileRow * this.getTileHeight(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public TiledTextureRegion clone() { + final TiledTextureRegion clone = new TiledTextureRegion(this.mTexture, this.getTexturePositionX(), this.getTexturePositionY(), this.getWidth(), this.getHeight(), this.mTileColumns, this.mTileRows); + clone.setCurrentTileIndex(this.mCurrentTileColumn, this.mCurrentTileRow); + return clone; + } + + @Override + protected TiledTextureRegionBuffer onCreateTextureRegionBuffer() { + return new TiledTextureRegionBuffer(this, GL11.GL_STATIC_DRAW); + } + + // =========================================================== + // Methods + // =========================================================== + + public void nextTile() { + final int tileIndex = (this.getCurrentTileIndex() + 1) % this.getTileCount(); + this.setCurrentTileIndex(tileIndex); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/BaseTextureRegionBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/BaseTextureRegionBuffer.java new file mode 100644 index 0000000..3257c46 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/BaseTextureRegionBuffer.java @@ -0,0 +1,162 @@ +package org.anddev.andengine.opengl.texture.region.buffer; + +import static org.anddev.andengine.opengl.vertex.RectangleVertexBuffer.VERTICES_PER_RECTANGLE; + +import org.anddev.andengine.opengl.buffer.BufferObject; +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.texture.region.BaseTextureRegion; +import org.anddev.andengine.opengl.util.FastFloatBuffer; + +/** + * @author Nicolas Gramlich + * @since 19:05:50 - 09.03.2010 + */ +public abstract class BaseTextureRegionBuffer extends BufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final BaseTextureRegion mTextureRegion; + private boolean mFlippedVertical; + private boolean mFlippedHorizontal; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseTextureRegionBuffer(final BaseTextureRegion pBaseTextureRegion, final int pDrawType) { + super(2 * VERTICES_PER_RECTANGLE, pDrawType); + this.mTextureRegion = pBaseTextureRegion; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public BaseTextureRegion getTextureRegion() { + return this.mTextureRegion; + } + + public boolean isFlippedHorizontal() { + return this.mFlippedHorizontal; + } + + public void setFlippedHorizontal(final boolean pFlippedHorizontal) { + if(this.mFlippedHorizontal != pFlippedHorizontal) { + this.mFlippedHorizontal = pFlippedHorizontal; + this.update(); + } + } + + public boolean isFlippedVertical() { + return this.mFlippedVertical; + } + + public void setFlippedVertical(final boolean pFlippedVertical) { + if(this.mFlippedVertical != pFlippedVertical) { + this.mFlippedVertical = pFlippedVertical; + this.update(); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract float getX1(); + + protected abstract float getY1(); + + protected abstract float getX2(); + + protected abstract float getY2(); + + // =========================================================== + // Methods + // =========================================================== + + public synchronized void update() { + final BaseTextureRegion textureRegion = this.mTextureRegion; + final Texture texture = textureRegion.getTexture(); + + if(texture == null) { + return; + } + + final int x1 = Float.floatToRawIntBits(this.getX1()); + final int y1 = Float.floatToRawIntBits(this.getY1()); + final int x2 = Float.floatToRawIntBits(this.getX2()); + final int y2 = Float.floatToRawIntBits(this.getY2()); + + final int[] bufferData = this.mBufferData; + + if(this.mFlippedVertical) { + if(this.mFlippedHorizontal) { + bufferData[0] = x2; + bufferData[1] = y2; + + bufferData[2] = x2; + bufferData[3] = y1; + + bufferData[4] = x1; + bufferData[5] = y2; + + bufferData[6] = x1; + bufferData[7] = y1; + } else { + bufferData[0] = x1; + bufferData[1] = y2; + + bufferData[2] = x1; + bufferData[3] = y1; + + bufferData[4] = x2; + bufferData[5] = y2; + + bufferData[6] = x2; + bufferData[7] = y1; + } + } else { + if(this.mFlippedHorizontal) { + bufferData[0] = x2; + bufferData[1] = y1; + + bufferData[2] = x2; + bufferData[3] = y2; + + bufferData[4] = x1; + bufferData[5] = y1; + + bufferData[6] = x1; + bufferData[7] = y2; + } else { + bufferData[0] = x1; + bufferData[1] = y1; + + bufferData[2] = x1; + bufferData[3] = y2; + + bufferData[4] = x2; + bufferData[5] = y1; + + bufferData[6] = x2; + bufferData[7] = y2; + } + } + + final FastFloatBuffer buffer = this.getFloatBuffer(); + buffer.position(0); + buffer.put(bufferData); + buffer.position(0); + + super.setHardwareBufferNeedsUpdate(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/TextureRegionBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/TextureRegionBuffer.java new file mode 100644 index 0000000..570eb8d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/TextureRegionBuffer.java @@ -0,0 +1,66 @@ +package org.anddev.andengine.opengl.texture.region.buffer; + +import org.anddev.andengine.opengl.texture.region.TextureRegion; + +public class TextureRegionBuffer extends BaseTextureRegionBuffer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TextureRegionBuffer(final TextureRegion pTextureRegion, final int pDrawType) { + super(pTextureRegion, pDrawType); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public TextureRegion getTextureRegion() { + return (TextureRegion) super.getTextureRegion(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected float getX1() { + final TextureRegion textureRegion = this.getTextureRegion(); + return (float) textureRegion.getTexturePositionX() / textureRegion.getTexture().getWidth(); + } + + @Override + protected float getX2() { + final TextureRegion textureRegion = this.getTextureRegion(); + return (float) (textureRegion.getTexturePositionX() + textureRegion.getWidth()) / textureRegion.getTexture().getWidth(); + } + + @Override + protected float getY1() { + final TextureRegion textureRegion = this.getTextureRegion(); + return (float) textureRegion.getTexturePositionY() / textureRegion.getTexture().getHeight(); + } + + @Override + protected float getY2() { + final TextureRegion textureRegion = this.getTextureRegion(); + return (float) (textureRegion.getTexturePositionY() + textureRegion.getHeight()) / textureRegion.getTexture().getHeight(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/TiledTextureRegionBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/TiledTextureRegionBuffer.java new file mode 100644 index 0000000..4ec3ca6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/region/buffer/TiledTextureRegionBuffer.java @@ -0,0 +1,70 @@ +package org.anddev.andengine.opengl.texture.region.buffer; + +import org.anddev.andengine.opengl.texture.region.TiledTextureRegion; + +/** + * @author Nicolas Gramlich + * @since 19:01:11 - 09.03.2010 + */ +public class TiledTextureRegionBuffer extends BaseTextureRegionBuffer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TiledTextureRegionBuffer(final TiledTextureRegion pTextureRegion, final int pDrawType) { + super(pTextureRegion, pDrawType); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public TiledTextureRegion getTextureRegion() { + return (TiledTextureRegion) super.getTextureRegion(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected float getX1() { + final TiledTextureRegion textureRegion = this.getTextureRegion(); + return textureRegion.getTexturePositionOfCurrentTileX() / textureRegion.getTexture().getWidth(); + } + + @Override + protected float getX2() { + final TiledTextureRegion textureRegion = this.getTextureRegion(); + return (textureRegion.getTexturePositionOfCurrentTileX() + textureRegion.getTileWidth()) / textureRegion.getTexture().getWidth(); + } + + @Override + protected float getY1() { + final TiledTextureRegion textureRegion = this.getTextureRegion(); + return textureRegion.getTexturePositionOfCurrentTileY() / textureRegion.getTexture().getHeight(); + } + + @Override + protected float getY2() { + final TiledTextureRegion textureRegion = this.getTextureRegion(); + return (textureRegion.getTexturePositionOfCurrentTileY() + textureRegion.getTileHeight()) / textureRegion.getTexture().getHeight(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/AssetTextureSource.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/AssetTextureSource.java new file mode 100644 index 0000000..b318ca5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/AssetTextureSource.java @@ -0,0 +1,117 @@ +package org.anddev.andengine.opengl.texture.source; + +import java.io.IOException; +import java.io.InputStream; + +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.StreamUtils; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.BitmapFactory; + +/** + * @author Nicolas Gramlich + * @since 12:07:52 - 09.03.2010 + */ +public class AssetTextureSource implements ITextureSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mWidth; + private final int mHeight; + + private final String mAssetPath; + private final Context mContext; + + // =========================================================== + // Constructors + // =========================================================== + + public AssetTextureSource(final Context pContext, final String pAssetPath) { + this.mContext = pContext; + this.mAssetPath = pAssetPath; + + final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); + decodeOptions.inJustDecodeBounds = true; + + InputStream in = null; + try { + in = pContext.getAssets().open(pAssetPath); + BitmapFactory.decodeStream(in, null, decodeOptions); + } catch (final IOException e) { + Debug.e("Failed loading Bitmap in AssetTextureSource. AssetPath: " + pAssetPath, e); + } finally { + StreamUtils.close(in); + } + + this.mWidth = decodeOptions.outWidth; + this.mHeight = decodeOptions.outHeight; + } + + AssetTextureSource(final Context pContext, final String pAssetPath, final int pWidth, final int pHeight) { + this.mContext = pContext; + this.mAssetPath = pAssetPath; + this.mWidth = pWidth; + this.mHeight = pHeight; + } + + @Override + public AssetTextureSource clone() { + return new AssetTextureSource(this.mContext, this.mAssetPath, this.mWidth, this.mHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int getHeight() { + return this.mHeight; + } + + @Override + public int getWidth() { + return this.mWidth; + } + + @Override + public Bitmap onLoadBitmap() { + InputStream in = null; + try { + final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); + decodeOptions.inPreferredConfig = Config.ARGB_8888; + + in = this.mContext.getAssets().open(this.mAssetPath); + return BitmapFactory.decodeStream(in, null, decodeOptions); + } catch (final IOException e) { + Debug.e("Failed loading Bitmap in AssetTextureSource. AssetPath: " + this.mAssetPath, e); + return null; + } finally { + StreamUtils.close(in); + } + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "(" + this.mAssetPath + ")"; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/EmptyBitmapTextureSource.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/EmptyBitmapTextureSource.java new file mode 100644 index 0000000..2a8c7c5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/EmptyBitmapTextureSource.java @@ -0,0 +1,71 @@ +package org.anddev.andengine.opengl.texture.source; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; + +/** + * @author Nicolas Gramlich + * @since 20:20:36 - 08.08.2010 + */ +public class EmptyBitmapTextureSource implements ITextureSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mWidth; + private final int mHeight; + + // =========================================================== + // Constructors + // =========================================================== + + public EmptyBitmapTextureSource(final int pWidth, final int pHeight) { + this.mWidth = pWidth; + this.mHeight = pHeight; + } + + @Override + public EmptyBitmapTextureSource clone() { + return new EmptyBitmapTextureSource(this.mWidth, this.mHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int getHeight() { + return this.mHeight; + } + + @Override + public int getWidth() { + return this.mWidth; + } + + @Override + public Bitmap onLoadBitmap() { + return Bitmap.createBitmap(this.mWidth, this.mHeight, Config.ARGB_8888); + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "(" + this.mWidth + " x " + this.mHeight + ")"; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/FileTextureSource.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/FileTextureSource.java new file mode 100644 index 0000000..5279584 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/FileTextureSource.java @@ -0,0 +1,116 @@ +package org.anddev.andengine.opengl.texture.source; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.StreamUtils; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.BitmapFactory; + +/** + * + * @author Nicolas Gramlich + * @since 16:39:22 - 10.08.2010 + */ +public class FileTextureSource implements ITextureSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mWidth; + private final int mHeight; + + private final File mFile; + + // =========================================================== + // Constructors + // =========================================================== + + public FileTextureSource(final File pFile) { + this.mFile = pFile; + + final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); + decodeOptions.inJustDecodeBounds = true; + + InputStream in = null; + try { + in = new FileInputStream(pFile); + BitmapFactory.decodeStream(in, null, decodeOptions); + } catch (final IOException e) { + Debug.e("Failed loading Bitmap in FileTextureSource. File: " + pFile, e); + } finally { + StreamUtils.close(in); + } + + this.mWidth = decodeOptions.outWidth; + this.mHeight = decodeOptions.outHeight; + } + + FileTextureSource(final File pFile, final int pWidth, final int pHeight) { + this.mFile = pFile; + this.mWidth = pWidth; + this.mHeight = pHeight; + } + + @Override + public FileTextureSource clone() { + return new FileTextureSource(this.mFile, this.mWidth, this.mHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int getHeight() { + return this.mHeight; + } + + @Override + public int getWidth() { + return this.mWidth; + } + + @Override + public Bitmap onLoadBitmap() { + final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); + decodeOptions.inPreferredConfig = Config.ARGB_8888; + + InputStream in = null; + try { + in = new FileInputStream(this.mFile); + return BitmapFactory.decodeStream(in, null, decodeOptions); + } catch (final IOException e) { + Debug.e("Failed loading Bitmap in FileTextureSource. File: " + this.mFile, e); + return null; + } finally { + StreamUtils.close(in); + } + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "(" + this.mFile + ")"; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/ITextureSource.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/ITextureSource.java new file mode 100644 index 0000000..e5eb9de --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/ITextureSource.java @@ -0,0 +1,24 @@ +package org.anddev.andengine.opengl.texture.source; + +import android.graphics.Bitmap; + +/** + * @author Nicolas Gramlich + * @since 12:08:52 - 09.03.2010 + */ +public interface ITextureSource extends Cloneable { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public int getWidth(); + public int getHeight(); + + public ITextureSource clone(); + + public Bitmap onLoadBitmap(); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/ResourceTextureSource.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/ResourceTextureSource.java new file mode 100644 index 0000000..01270dc --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/ResourceTextureSource.java @@ -0,0 +1,95 @@ +package org.anddev.andengine.opengl.texture.source; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.BitmapFactory; + +/** + * @author Nicolas Gramlich + * @since 15:07:23 - 09.03.2010 + */ +public class ResourceTextureSource implements ITextureSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mWidth; + private final int mHeight; + + private final int mDrawableResourceID; + private final Context mContext; + + // =========================================================== + // Constructors + // =========================================================== + + public ResourceTextureSource(final Context pContext, final int pDrawableResourceID) { + this.mContext = pContext; + this.mDrawableResourceID = pDrawableResourceID; + + final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); + decodeOptions.inJustDecodeBounds = true; +// decodeOptions.inScaled = false; // TODO Check how this behaves with drawable-""/nodpi/ldpi/mdpi/hdpi folders + + BitmapFactory.decodeResource(pContext.getResources(), pDrawableResourceID, decodeOptions); + + this.mWidth = decodeOptions.outWidth; + this.mHeight = decodeOptions.outHeight; + } + + protected ResourceTextureSource(final Context pContext, final int pDrawableResourceID, final int pWidth, final int pHeight) { + this.mContext = pContext; + this.mDrawableResourceID = pDrawableResourceID; + this.mWidth = pWidth; + this.mHeight = pHeight; + } + + @Override + public ResourceTextureSource clone() { + return new ResourceTextureSource(this.mContext, this.mDrawableResourceID, this.mWidth, this.mHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int getHeight() { + return this.mHeight; + } + + @Override + public int getWidth() { + return this.mWidth; + } + + @Override + public Bitmap onLoadBitmap() { + final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); + decodeOptions.inPreferredConfig = Config.ARGB_8888; +// decodeOptions.inScaled = false; // TODO Check how this behaves with drawable-""/nodpi/ldpi/mdpi/hdpi folders + return BitmapFactory.decodeResource(this.mContext.getResources(), this.mDrawableResourceID, decodeOptions); + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "(" + this.mDrawableResourceID + ")"; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/BaseShapeTextureSourceDecorator.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/BaseShapeTextureSourceDecorator.java new file mode 100644 index 0000000..4af3b89 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/BaseShapeTextureSourceDecorator.java @@ -0,0 +1,56 @@ +package org.anddev.andengine.opengl.texture.source.decorator; + +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.opengl.texture.source.decorator.shape.ITextureSourceDecoratorShape; + +import android.graphics.Canvas; + +/** + * @author Nicolas Gramlich + * @since 20:09:41 - 05.11.2010 + */ +public abstract class BaseShapeTextureSourceDecorator extends BaseTextureSourceDecorator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final ITextureSourceDecoratorShape mTextureSourceDecoratorShape; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseShapeTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + super(pTextureSource, pTextureSourceDecoratorOptions); + + this.mTextureSourceDecoratorShape = pTextureSourceDecoratorShape; + } + + @Override + public abstract BaseShapeTextureSourceDecorator clone(); + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onDecorateBitmap(final Canvas pCanvas){ + this.mTextureSourceDecoratorShape.onDecorateBitmap(pCanvas, this.mPaint, (this.mTextureSourceDecoratorOptions == null) ? TextureSourceDecoratorOptions.DEFAULT : this.mTextureSourceDecoratorOptions); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/BaseTextureSourceDecorator.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/BaseTextureSourceDecorator.java new file mode 100644 index 0000000..b3aa18b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/BaseTextureSourceDecorator.java @@ -0,0 +1,209 @@ +package org.anddev.andengine.opengl.texture.source.decorator; + +import org.anddev.andengine.opengl.texture.source.ITextureSource; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; + +/** + * @author Nicolas Gramlich + * @since 16:43:29 - 06.08.2010 + */ +public abstract class BaseTextureSourceDecorator implements ITextureSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final ITextureSource mTextureSource; + protected TextureSourceDecoratorOptions mTextureSourceDecoratorOptions; + protected Paint mPaint = new Paint(); + + // =========================================================== + // Constructors + // =========================================================== + + public BaseTextureSourceDecorator(final ITextureSource pTextureSource) { + this(pTextureSource, new TextureSourceDecoratorOptions()); + } + + public BaseTextureSourceDecorator(final ITextureSource pTextureSource, final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + this.mTextureSource = pTextureSource; + this.mTextureSourceDecoratorOptions = (pTextureSourceDecoratorOptions == null) ? new TextureSourceDecoratorOptions() : pTextureSourceDecoratorOptions; + this.mPaint.setAntiAlias(this.mTextureSourceDecoratorOptions.getAntiAliasing()); + } + + @Override + public abstract BaseTextureSourceDecorator clone(); + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Paint getPaint() { + return this.mPaint; + } + + public void setPaint(final Paint pPaint) { + this.mPaint = pPaint; + } + + public TextureSourceDecoratorOptions getTextureSourceDecoratorOptions() { + return this.mTextureSourceDecoratorOptions; + } + + public void setTextureSourceDecoratorOptions(final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + this.mTextureSourceDecoratorOptions = pTextureSourceDecoratorOptions; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onDecorateBitmap(final Canvas pCanvas); + + @Override + public int getWidth() { + return this.mTextureSource.getWidth(); + } + + @Override + public int getHeight() { + return this.mTextureSource.getHeight(); + } + + @Override + public Bitmap onLoadBitmap() { + final Bitmap bitmap = this.ensureLoadedBitmapIsMutable(this.mTextureSource.onLoadBitmap()); + + final Canvas canvas = new Canvas(bitmap); + this.onDecorateBitmap(canvas); + return bitmap; + } + + // =========================================================== + // Methods + // =========================================================== + + private Bitmap ensureLoadedBitmapIsMutable(final Bitmap pBitmap) { + if(pBitmap.isMutable()) { + return pBitmap; + } else { + final Bitmap mutableBitmap = pBitmap.copy(pBitmap.getConfig(), true); + pBitmap.recycle(); + return mutableBitmap; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class TextureSourceDecoratorOptions { + // =========================================================== + // Constants + // =========================================================== + + public static final TextureSourceDecoratorOptions DEFAULT = new TextureSourceDecoratorOptions(); + + // =========================================================== + // Fields + // =========================================================== + + private float mInsetLeft = 0.0f; + private float mInsetRight = 0.0f; + private float mInsetTop = 0.0f; + private float mInsetBottom = 0.0f; + + private boolean mAntiAliasing; + + // =========================================================== + // Constructors + // =========================================================== + + @Override + protected TextureSourceDecoratorOptions clone() { + final TextureSourceDecoratorOptions textureSourceDecoratorOptions = new TextureSourceDecoratorOptions(); + textureSourceDecoratorOptions.setInsets(this.mInsetLeft, this.mInsetTop, this.mInsetRight, this.mInsetBottom); + textureSourceDecoratorOptions.setAntiAliasing(this.mAntiAliasing); + return textureSourceDecoratorOptions; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean getAntiAliasing() { + return this.mAntiAliasing; + } + + public float getInsetLeft() { + return this.mInsetLeft; + } + + public float getInsetRight() { + return this.mInsetRight; + } + + public float getInsetTop() { + return this.mInsetTop; + } + + public float getInsetBottom() { + return this.mInsetBottom; + } + + public TextureSourceDecoratorOptions setAntiAliasing(final boolean pAntiAliasing) { + this.mAntiAliasing = pAntiAliasing; + return this; + } + + public TextureSourceDecoratorOptions setInsetLeft(final float pInsetLeft) { + this.mInsetLeft = pInsetLeft; + return this; + } + + public TextureSourceDecoratorOptions setInsetRight(final float pInsetRight) { + this.mInsetRight = pInsetRight; + return this; + } + + public TextureSourceDecoratorOptions setInsetTop(final float pInsetTop) { + this.mInsetTop = pInsetTop; + return this; + } + + public TextureSourceDecoratorOptions setInsetBottom(final float pInsetBottom) { + this.mInsetBottom = pInsetBottom; + return this; + } + + public TextureSourceDecoratorOptions setInsets(final float pInsets) { + return this.setInsets(pInsets, pInsets, pInsets, pInsets); + } + + public TextureSourceDecoratorOptions setInsets(final float pInsetLeft, final float pInsetTop, final float pInsetRight, final float pInsetBottom) { + this.mInsetLeft = pInsetLeft; + this.mInsetTop = pInsetTop; + this.mInsetRight = pInsetRight; + this.mInsetBottom = pInsetBottom; + return this; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/ColorKeyTextureSourceDecorator.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/ColorKeyTextureSourceDecorator.java new file mode 100644 index 0000000..d50af96 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/ColorKeyTextureSourceDecorator.java @@ -0,0 +1,72 @@ +package org.anddev.andengine.opengl.texture.source.decorator; + +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.opengl.texture.source.decorator.shape.ITextureSourceDecoratorShape; + +import android.graphics.AvoidXfermode; +import android.graphics.AvoidXfermode.Mode; +import android.graphics.Color; + +/** + * @author Nicolas Gramlich + * @since 22:16:41 - 06.08.2010 + */ +public class ColorKeyTextureSourceDecorator extends BaseShapeTextureSourceDecorator { + // =========================================================== + // Constants + // =========================================================== + + private static final int TOLERANCE_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + private final int mColorKeyColor; + private final int mTolerance; + + // =========================================================== + // Constructors + // =========================================================== + + public ColorKeyTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pColorKeyColor) { + this(pTextureSource, pTextureSourceDecoratorShape, pColorKeyColor, ColorKeyTextureSourceDecorator.TOLERANCE_DEFAULT, null); + } + + public ColorKeyTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pColorKeyColor, final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + this(pTextureSource, pTextureSourceDecoratorShape, pColorKeyColor, ColorKeyTextureSourceDecorator.TOLERANCE_DEFAULT, pTextureSourceDecoratorOptions); + } + + public ColorKeyTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pColorKeyColor, final int pTolerance) { + this(pTextureSource, pTextureSourceDecoratorShape, pColorKeyColor, pTolerance, null); + } + + public ColorKeyTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pColorKeyColor, final int pTolerance, final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + super(pTextureSource, pTextureSourceDecoratorShape, pTextureSourceDecoratorOptions); + this.mColorKeyColor = pColorKeyColor; + this.mTolerance = pTolerance; + this.mPaint.setXfermode(new AvoidXfermode(pColorKeyColor, pTolerance, Mode.TARGET)); + this.mPaint.setColor(Color.TRANSPARENT); + } + + @Override + public ColorKeyTextureSourceDecorator clone() { + return new ColorKeyTextureSourceDecorator(this.mTextureSource, this.mTextureSourceDecoratorShape, this.mColorKeyColor, this.mTolerance, this.mTextureSourceDecoratorOptions); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/FillTextureSourceDecorator.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/FillTextureSourceDecorator.java new file mode 100644 index 0000000..45a3546 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/FillTextureSourceDecorator.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.opengl.texture.source.decorator; + +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.opengl.texture.source.decorator.shape.ITextureSourceDecoratorShape; + +import android.graphics.Paint.Style; + +/** + * @author Nicolas Gramlich + * @since 18:08:00 - 05.11.2010 + */ +public class FillTextureSourceDecorator extends BaseShapeTextureSourceDecorator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final int mFillColor; + + // =========================================================== + // Constructors + // =========================================================== + + public FillTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pFillColor) { + this(pTextureSource, pTextureSourceDecoratorShape, pFillColor, null); + } + + public FillTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pFillColor, final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + super(pTextureSource, pTextureSourceDecoratorShape, pTextureSourceDecoratorOptions); + this.mFillColor = pFillColor; + + this.mPaint.setStyle(Style.FILL); + this.mPaint.setColor(pFillColor); + } + + @Override + public FillTextureSourceDecorator clone() { + return new FillTextureSourceDecorator(this.mTextureSource, this.mTextureSourceDecoratorShape, this.mFillColor, this.mTextureSourceDecoratorOptions); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/LinearGradientFillTextureSourceDecorator.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/LinearGradientFillTextureSourceDecorator.java new file mode 100644 index 0000000..1f90176 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/LinearGradientFillTextureSourceDecorator.java @@ -0,0 +1,145 @@ +package org.anddev.andengine.opengl.texture.source.decorator; + +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.opengl.texture.source.decorator.shape.ITextureSourceDecoratorShape; + +import android.graphics.LinearGradient; +import android.graphics.Paint.Style; +import android.graphics.Shader.TileMode; + +/** + * @author Nicolas Gramlich + * @since 19:21:24 - 05.11.2010 + */ +public class LinearGradientFillTextureSourceDecorator extends BaseShapeTextureSourceDecorator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final LinearGradientDirection mLinearGradientDirection; + protected final int mFromColor; + protected final int mToColor; + + // =========================================================== + // Constructors + // =========================================================== + + public LinearGradientFillTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pFromColor, final int pToColor, final LinearGradientDirection pLinearGradientDirection) { + this(pTextureSource, pTextureSourceDecoratorShape, pFromColor, pToColor, pLinearGradientDirection, null); + } + + public LinearGradientFillTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pFromColor, final int pToColor, final LinearGradientDirection pLinearGradientDirection, final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + super(pTextureSource, pTextureSourceDecoratorShape, pTextureSourceDecoratorOptions); + this.mFromColor = pFromColor; + this.mToColor = pToColor; + this.mLinearGradientDirection = pLinearGradientDirection; + + this.mPaint.setStyle(Style.FILL); + + final int width = pTextureSource.getWidth(); + final int height = pTextureSource.getHeight(); + + final float fromX = pLinearGradientDirection.getFromX() * width; + final float fromY = pLinearGradientDirection.getFromY() * height; + final float toX = pLinearGradientDirection.getToX() * width; + final float toY = pLinearGradientDirection.getToY() * height; + + this.mPaint.setShader(new LinearGradient(fromX, fromY, toX, toY, pFromColor, pToColor, TileMode.CLAMP)); + } + + @Override + public LinearGradientFillTextureSourceDecorator clone() { + return new LinearGradientFillTextureSourceDecorator(this.mTextureSource, this.mTextureSourceDecoratorShape, this.mFromColor, this.mToColor, this.mLinearGradientDirection, this.mTextureSourceDecoratorOptions); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static enum LinearGradientDirection { + // =========================================================== + // Elements + // =========================================================== + + LEFT_TO_RIGHT(0, 0, 1, 0), + RIGHT_TO_LEFT(1, 0, 0, 0), + BOTTOM_TO_TOP(0, 0, 0, 1), + TOP_TO_BOTTOM(0, 1, 0, 0), + TOPLEFT_TO_BOTTOMRIGHT(0, 0, 1, 1), + BOTTOMRIGHT_TO_TOPLEFT(1, 1, 0, 0), + TOPRIGHT_TO_BOTTOMLEFT(1, 0, 0, 1), + BOTTOMLEFT_TO_TOPRIGHT(0, 1, 1, 0); + + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mFromX; + private final int mFromY; + private final int mToX; + private final int mToY; + + // =========================================================== + // Constructors + // =========================================================== + + private LinearGradientDirection(final int pFromX, final int pFromY, final int pToX, final int pToY) { + this.mFromX = pFromX; + this.mFromY = pFromY; + this.mToX = pToX; + this.mToY = pToY; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + final int getFromX() { + return this.mFromX; + } + + final int getFromY() { + return this.mFromY; + } + + final int getToX() { + return this.mToX; + } + + final int getToY() { + return this.mToY; + } + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/OutlineTextureSourceDecorator.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/OutlineTextureSourceDecorator.java new file mode 100644 index 0000000..2c87037 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/OutlineTextureSourceDecorator.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.opengl.texture.source.decorator; + +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.opengl.texture.source.decorator.shape.ITextureSourceDecoratorShape; + +import android.graphics.Paint.Style; + +/** + * @author Nicolas Gramlich + * @since 18:07:55 - 05.11.2010 + */ +public class OutlineTextureSourceDecorator extends BaseShapeTextureSourceDecorator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final int mOutlineColor; + + // =========================================================== + // Constructors + // =========================================================== + + public OutlineTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pOutlineColor) { + this(pTextureSource, pTextureSourceDecoratorShape, pOutlineColor, null); + } + + public OutlineTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pOutlineColor, final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + super(pTextureSource, pTextureSourceDecoratorShape, pTextureSourceDecoratorOptions); + this.mOutlineColor = pOutlineColor; + + this.mPaint.setStyle(Style.STROKE); + this.mPaint.setColor(pOutlineColor); + } + + @Override + public OutlineTextureSourceDecorator clone() { + return new OutlineTextureSourceDecorator(this.mTextureSource, this.mTextureSourceDecoratorShape, this.mOutlineColor, this.mTextureSourceDecoratorOptions); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/RadialGradientFillTextureSourceDecorator.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/RadialGradientFillTextureSourceDecorator.java new file mode 100644 index 0000000..a2d5179 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/RadialGradientFillTextureSourceDecorator.java @@ -0,0 +1,118 @@ +package org.anddev.andengine.opengl.texture.source.decorator; + +import org.anddev.andengine.opengl.texture.source.ITextureSource; +import org.anddev.andengine.opengl.texture.source.decorator.shape.ITextureSourceDecoratorShape; + +import android.graphics.Paint.Style; +import android.graphics.RadialGradient; +import android.graphics.Shader.TileMode; + +/** + * @author Nicolas Gramlich + * @since 19:21:24 - 05.11.2010 + */ +public class RadialGradientFillTextureSourceDecorator extends BaseShapeTextureSourceDecorator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final RadialGradientDirection mRadialGradientDirection; + protected final int mFromColor; + protected final int mToColor; + + // =========================================================== + // Constructors + // =========================================================== + + public RadialGradientFillTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pFromColor, final int pToColor, final RadialGradientDirection pRadialGradientDirection) { + this(pTextureSource, pTextureSourceDecoratorShape, pFromColor, pToColor, pRadialGradientDirection, null); + } + + public RadialGradientFillTextureSourceDecorator(final ITextureSource pTextureSource, final ITextureSourceDecoratorShape pTextureSourceDecoratorShape, final int pFromColor, final int pToColor, final RadialGradientDirection pRadialGradientDirection, final TextureSourceDecoratorOptions pTextureSourceDecoratorOptions) { + super(pTextureSource, pTextureSourceDecoratorShape, pTextureSourceDecoratorOptions); + this.mFromColor = pFromColor; + this.mToColor = pToColor; + this.mRadialGradientDirection = pRadialGradientDirection; + + this.mPaint.setStyle(Style.FILL); + + final int width = pTextureSource.getWidth(); + final int height = pTextureSource.getHeight(); + + final float centerX = width * 0.5f; + final float centerY = height * 0.5f; + + final float radius = Math.max(centerX, centerY); + + switch(pRadialGradientDirection) { + case INSIDE_OUT: + this.mPaint.setShader(new RadialGradient(centerX, centerY, radius, pFromColor, pToColor, TileMode.CLAMP)); + break; + case OUTSIDE_IN: + this.mPaint.setShader(new RadialGradient(centerX, centerY, radius, pToColor, pFromColor, TileMode.CLAMP)); + break; + } + } + + @Override + public RadialGradientFillTextureSourceDecorator clone() { + return new RadialGradientFillTextureSourceDecorator(this.mTextureSource, this.mTextureSourceDecoratorShape, this.mFromColor, this.mToColor, this.mRadialGradientDirection, this.mTextureSourceDecoratorOptions); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static enum RadialGradientDirection { + // =========================================================== + // Elements + // =========================================================== + + INSIDE_OUT, + OUTSIDE_IN; + + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ArcTextureSourceDecoratorShape.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ArcTextureSourceDecoratorShape.java new file mode 100644 index 0000000..3709885 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ArcTextureSourceDecoratorShape.java @@ -0,0 +1,84 @@ +package org.anddev.andengine.opengl.texture.source.decorator.shape; + +import org.anddev.andengine.opengl.texture.source.decorator.BaseTextureSourceDecorator.TextureSourceDecoratorOptions; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; + +/** + * @author Nicolas Gramlich + * @since 12:52:55 - 04.01.2011 + */ +public class ArcTextureSourceDecoratorShape implements ITextureSourceDecoratorShape { + // =========================================================== + // Constants + // =========================================================== + + private static final float STARTANGLE_DEFAULT = 0; + private static final float SWEEPANGLE_DEFAULT = 360; + private static final boolean USECENTER_DEFAULT = true; + + // =========================================================== + // Fields + // =========================================================== + + private static ArcTextureSourceDecoratorShape sDefaultInstance; + + private final RectF mRectF = new RectF(); + + private final float mStartAngle; + private final float mSweepAngle; + private final boolean mUseCenter; + + // =========================================================== + // Constructors + // =========================================================== + + public ArcTextureSourceDecoratorShape() { + this(STARTANGLE_DEFAULT, SWEEPANGLE_DEFAULT, USECENTER_DEFAULT); + } + + public ArcTextureSourceDecoratorShape(final float pStartAngle, final float pSweepAngle, final boolean pUseCenter) { + this.mStartAngle = pStartAngle; + this.mSweepAngle = pSweepAngle; + this.mUseCenter = pUseCenter; + } + + @Deprecated + public static ArcTextureSourceDecoratorShape getDefaultInstance() { + if(sDefaultInstance == null) { + sDefaultInstance = new ArcTextureSourceDecoratorShape(); + } + return sDefaultInstance; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final TextureSourceDecoratorOptions pDecoratorOptions) { + final float left = pDecoratorOptions.getInsetLeft(); + final float top = pDecoratorOptions.getInsetTop(); + final float right = pCanvas.getWidth() - 1 - pDecoratorOptions.getInsetRight(); + final float bottom = pCanvas.getHeight() - 1 - pDecoratorOptions.getInsetBottom(); + + this.mRectF.set(left, top, right, bottom); + + pCanvas.drawArc(this.mRectF, this.mStartAngle, this.mSweepAngle, this.mUseCenter, pPaint); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} + diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/CircleTextureSourceDecoratorShape.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/CircleTextureSourceDecoratorShape.java new file mode 100644 index 0000000..cfa3bba --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/CircleTextureSourceDecoratorShape.java @@ -0,0 +1,67 @@ +package org.anddev.andengine.opengl.texture.source.decorator.shape; + +import org.anddev.andengine.opengl.texture.source.decorator.BaseTextureSourceDecorator.TextureSourceDecoratorOptions; + +import android.graphics.Canvas; +import android.graphics.Paint; + +/** + * @author Nicolas Gramlich + * @since 12:53:13 - 04.01.2011 + */ +public class CircleTextureSourceDecoratorShape implements ITextureSourceDecoratorShape { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static CircleTextureSourceDecoratorShape sDefaultInstance; + + // =========================================================== + // Constructors + // =========================================================== + + public CircleTextureSourceDecoratorShape() { + + } + + public static CircleTextureSourceDecoratorShape getDefaultInstance() { + if(sDefaultInstance == null) { + sDefaultInstance = new CircleTextureSourceDecoratorShape(); + } + return sDefaultInstance; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final TextureSourceDecoratorOptions pDecoratorOptions) { + final float width = pCanvas.getWidth() - pDecoratorOptions.getInsetLeft() - pDecoratorOptions.getInsetRight(); + final float height = pCanvas.getHeight() - pDecoratorOptions.getInsetTop() - pDecoratorOptions.getInsetBottom(); + + final float centerX = (pCanvas.getWidth() + pDecoratorOptions.getInsetLeft() - pDecoratorOptions.getInsetRight()) / 2; + final float centerY = (pCanvas.getHeight() + pDecoratorOptions.getInsetTop() - pDecoratorOptions.getInsetBottom()) / 2; + + final float radius = Math.min(width / 2, height / 2); + + pCanvas.drawCircle(centerX, centerY, radius, pPaint); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} + diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/EllipseTextureSourceDecoratorShape.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/EllipseTextureSourceDecoratorShape.java new file mode 100644 index 0000000..75589ea --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/EllipseTextureSourceDecoratorShape.java @@ -0,0 +1,69 @@ +package org.anddev.andengine.opengl.texture.source.decorator.shape; + +import org.anddev.andengine.opengl.texture.source.decorator.BaseTextureSourceDecorator.TextureSourceDecoratorOptions; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; + +/** + * @author Nicolas Gramlich + * @since 12:52:55 - 04.01.2011 + */ +public class EllipseTextureSourceDecoratorShape implements ITextureSourceDecoratorShape { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EllipseTextureSourceDecoratorShape sDefaultInstance; + + private final RectF mRectF = new RectF(); + + // =========================================================== + // Constructors + // =========================================================== + + public EllipseTextureSourceDecoratorShape() { + + } + + public static EllipseTextureSourceDecoratorShape getDefaultInstance() { + if(sDefaultInstance == null) { + sDefaultInstance = new EllipseTextureSourceDecoratorShape(); + } + return sDefaultInstance; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final TextureSourceDecoratorOptions pDecoratorOptions) { + final float left = pDecoratorOptions.getInsetLeft(); + final float top = pDecoratorOptions.getInsetTop(); + final float right = pCanvas.getWidth() - 1 - pDecoratorOptions.getInsetRight(); + final float bottom = pCanvas.getHeight() - 1 - pDecoratorOptions.getInsetBottom(); + + this.mRectF.set(left, top, right, bottom); + + pCanvas.drawOval(this.mRectF, pPaint); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} + diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ITextureSourceDecoratorShape.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ITextureSourceDecoratorShape.java new file mode 100644 index 0000000..52c23d1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/ITextureSourceDecoratorShape.java @@ -0,0 +1,22 @@ +package org.anddev.andengine.opengl.texture.source.decorator.shape; + +import org.anddev.andengine.opengl.texture.source.decorator.BaseTextureSourceDecorator.TextureSourceDecoratorOptions; + +import android.graphics.Canvas; +import android.graphics.Paint; + +/** + * @author Nicolas Gramlich + * @since 12:47:40 - 04.01.2011 + */ +public interface ITextureSourceDecoratorShape { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final TextureSourceDecoratorOptions pDecoratorOptions); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RectangleTextureSourceDecoratorShape.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RectangleTextureSourceDecoratorShape.java new file mode 100644 index 0000000..5fd30f1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RectangleTextureSourceDecoratorShape.java @@ -0,0 +1,58 @@ +package org.anddev.andengine.opengl.texture.source.decorator.shape; + +import org.anddev.andengine.opengl.texture.source.decorator.BaseTextureSourceDecorator.TextureSourceDecoratorOptions; + +import android.graphics.Canvas; +import android.graphics.Paint; + +public class RectangleTextureSourceDecoratorShape implements ITextureSourceDecoratorShape { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static RectangleTextureSourceDecoratorShape sDefaultInstance; + + // =========================================================== + // Constructors + // =========================================================== + + public RectangleTextureSourceDecoratorShape() { + + } + + public static RectangleTextureSourceDecoratorShape getDefaultInstance() { + if(sDefaultInstance == null) { + sDefaultInstance = new RectangleTextureSourceDecoratorShape(); + } + return sDefaultInstance; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final TextureSourceDecoratorOptions pDecoratorOptions) { + final float left = pDecoratorOptions.getInsetLeft(); + final float top = pDecoratorOptions.getInsetTop(); + final float right = pCanvas.getWidth() - 1 - pDecoratorOptions.getInsetRight(); + final float bottom = pCanvas.getHeight() - 1 - pDecoratorOptions.getInsetBottom(); + pCanvas.drawRect(left, top, right, bottom, pPaint); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +}; \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RoundedRectangleTextureSourceDecoratorShape.java b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RoundedRectangleTextureSourceDecoratorShape.java new file mode 100644 index 0000000..4acac0d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/texture/source/decorator/shape/RoundedRectangleTextureSourceDecoratorShape.java @@ -0,0 +1,78 @@ +package org.anddev.andengine.opengl.texture.source.decorator.shape; + +import org.anddev.andengine.opengl.texture.source.decorator.BaseTextureSourceDecorator.TextureSourceDecoratorOptions; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; + +/** + * @author Nicolas Gramlich + * @since 12:50:09 - 04.01.2011 + */ +public class RoundedRectangleTextureSourceDecoratorShape implements ITextureSourceDecoratorShape { + // =========================================================== + // Constants + // =========================================================== + + private static final float CORNER_RADIUS_DEFAULT = 1; + + // =========================================================== + // Fields + // =========================================================== + + private final RectF mRectF = new RectF(); + + private final float mCornerRadiusX; + private final float mCornerRadiusY; + + private static RoundedRectangleTextureSourceDecoratorShape sDefaultInstance; + + // =========================================================== + // Constructors + // =========================================================== + + public RoundedRectangleTextureSourceDecoratorShape() { + this(CORNER_RADIUS_DEFAULT, CORNER_RADIUS_DEFAULT); + } + + public RoundedRectangleTextureSourceDecoratorShape(final float pCornerRadiusX, final float pCornerRadiusY) { + this.mCornerRadiusX = pCornerRadiusX; + this.mCornerRadiusY = pCornerRadiusY; + } + + public static RoundedRectangleTextureSourceDecoratorShape getDefaultInstance() { + if(sDefaultInstance == null) { + sDefaultInstance = new RoundedRectangleTextureSourceDecoratorShape(); + } + return sDefaultInstance; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final TextureSourceDecoratorOptions pDecoratorOptions) { + final float left = pDecoratorOptions.getInsetLeft(); + final float top = pDecoratorOptions.getInsetTop(); + final float right = pCanvas.getWidth() - 1 - pDecoratorOptions.getInsetRight(); + final float bottom = pCanvas.getHeight() - 1 - pDecoratorOptions.getInsetBottom(); + + this.mRectF.set(left, top, right, bottom); + + pCanvas.drawRoundRect(this.mRectF, this.mCornerRadiusX, this.mCornerRadiusY, pPaint); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/util/FastFloatBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/util/FastFloatBuffer.java new file mode 100644 index 0000000..aee5aeb --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/util/FastFloatBuffer.java @@ -0,0 +1,209 @@ +package org.anddev.andengine.opengl.util; + +import static org.anddev.andengine.opengl.util.GLHelper.BYTES_PER_FLOAT; + +import java.lang.ref.SoftReference; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +/** + * Convenient work-around for poor {@link FloatBuffer#put(float[])} performance. + * This should become unnecessary in gingerbread, + * @see Issue 11078 + * + * @author ryanm + */ +public class FastFloatBuffer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + /** + * Use a {@link SoftReference} so that the array can be collected if + * necessary + */ + private static SoftReference sWeakIntArray = new SoftReference(new int[0]); + + /** + * Underlying data - give this to OpenGL + */ + public final ByteBuffer mByteBuffer; + private final FloatBuffer mFloatBuffer; + private final IntBuffer mIntBuffer; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * Constructs a new direct native-ordered buffer + */ + public FastFloatBuffer(final int pCapacity) { + this.mByteBuffer = ByteBuffer.allocateDirect((pCapacity * BYTES_PER_FLOAT)).order(ByteOrder.nativeOrder()); + this.mFloatBuffer = this.mByteBuffer.asFloatBuffer(); + this.mIntBuffer = this.mByteBuffer.asIntBuffer(); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * See {@link FloatBuffer#flip()} + */ + public void flip() { + this.mByteBuffer.flip(); + this.mFloatBuffer.flip(); + this.mIntBuffer.flip(); + } + + /** + * See {@link FloatBuffer#put(float)} + */ + public void put(final float f) { + final ByteBuffer byteBuffer = this.mByteBuffer; + final IntBuffer intBuffer = this.mIntBuffer; + + byteBuffer.position(byteBuffer.position() + BYTES_PER_FLOAT); + this.mFloatBuffer.put(f); + intBuffer.position(intBuffer.position() + 1); + } + + /** + * It's like {@link FloatBuffer#put(float[])}, but about 10 times faster + */ + public void put(final float[] data) { + final int length = data.length; + + int[] ia = sWeakIntArray.get(); + if(ia == null || ia.length < length) { + ia = new int[length]; + sWeakIntArray = new SoftReference(ia); + } + + for(int i = 0; i < length; i++) { + ia[i] = Float.floatToRawIntBits(data[i]); + } + + final ByteBuffer byteBuffer = this.mByteBuffer; + byteBuffer.position(byteBuffer.position() + BYTES_PER_FLOAT * length); + final FloatBuffer floatBuffer = this.mFloatBuffer; + floatBuffer.position(floatBuffer.position() + length); + this.mIntBuffer.put(ia, 0, length); + } + + /** + * For use with pre-converted data. This is 50x faster than + * {@link #put(float[])}, and 500x faster than + * {@link FloatBuffer#put(float[])}, so if you've got float[] data that + * won't change, {@link #convert(float...)} it to an int[] once and use this + * method to put it in the buffer + * + * @param data floats that have been converted with {@link Float#floatToIntBits(float)} + */ + public void put(final int[] data) { + final ByteBuffer byteBuffer = this.mByteBuffer; + byteBuffer.position(byteBuffer.position() + BYTES_PER_FLOAT * data.length); + final FloatBuffer floatBuffer = this.mFloatBuffer; + floatBuffer.position(floatBuffer.position() + data.length); + this.mIntBuffer.put(data, 0, data.length); + } + + /** + * Converts float data to a format that can be quickly added to the buffer + * with {@link #put(int[])} + * + * @param data + * @return the int-formatted data + */ + public static int[] convert(final float ... data) { + final int length = data.length; + final int[] id = new int[length]; + for(int i = 0; i < length; i++) { + id[i] = Float.floatToRawIntBits(data[i]); + } + + return id; + } + + /** + * See {@link FloatBuffer#put(FloatBuffer)} + */ + public void put(final FastFloatBuffer b) { + final ByteBuffer byteBuffer = this.mByteBuffer; + byteBuffer.put(b.mByteBuffer); + this.mFloatBuffer.position(byteBuffer.position() >> 2); + this.mIntBuffer.position(byteBuffer.position() >> 2); + } + + /** + * @return See {@link FloatBuffer#capacity()} + */ + public int capacity() { + return this.mFloatBuffer.capacity(); + } + + /** + * @return See {@link FloatBuffer#position()} + */ + public int position() { + return this.mFloatBuffer.position(); + } + + /** + * See {@link FloatBuffer#position(int)} + */ + public void position(final int p) { + this.mByteBuffer.position(p * BYTES_PER_FLOAT); + this.mFloatBuffer.position(p); + this.mIntBuffer.position(p); + } + + /** + * @return See {@link FloatBuffer#slice()} + */ + public FloatBuffer slice() { + return this.mFloatBuffer.slice(); + } + + /** + * @return See {@link FloatBuffer#remaining()} + */ + public int remaining() { + return this.mFloatBuffer.remaining(); + } + + /** + * @return See {@link FloatBuffer#limit()} + */ + public int limit() { + return this.mFloatBuffer.limit(); + } + + /** + * See {@link FloatBuffer#clear()} + */ + public void clear() { + this.mByteBuffer.clear(); + this.mFloatBuffer.clear(); + this.mIntBuffer.clear(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/util/GLHelper.java b/AndEngine/src/org/anddev/andengine/opengl/util/GLHelper.java new file mode 100644 index 0000000..7aa3ce5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/util/GLHelper.java @@ -0,0 +1,437 @@ +package org.anddev.andengine.opengl.util; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; + +import javax.microedition.khronos.opengles.GL10; +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.engine.options.RenderOptions; +import org.anddev.andengine.util.Debug; + +import android.graphics.Bitmap; +import android.opengl.GLUtils; +import android.os.Build; + +/** + * @author Nicolas Gramlich + * @since 18:00:43 - 08.03.2010 + */ +public class GLHelper { + // =========================================================== + // Constants + // =========================================================== + + public static final int BYTES_PER_FLOAT = 4; + public static final int BYTES_PER_PIXEL_RGBA = 4; + + private static final boolean IS_LITTLE_ENDIAN = (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN); + + private static final int[] HARDWARETEXTUREID_CONTAINER = new int[1]; + private static final int[] HARDWAREBUFFERID_CONTAINER = new int[1]; + + // =========================================================== + // Fields + // =========================================================== + + private static int sCurrentHardwareBufferID = -1; + private static int sCurrentHardwareTextureID = -1; + private static int sCurrentMatrix = -1; + + private static int sCurrentSourceBlendMode = -1; + private static int sCurrentDestinationBlendMode = -1; + + private static FastFloatBuffer sCurrentTextureFloatBuffer = null; + private static FastFloatBuffer sCurrentVertexFloatBuffer = null; + + private static boolean sEnableDither = true; + private static boolean sEnableLightning = true; + private static boolean sEnableDepthTest = true; + private static boolean sEnableMultisample = true; + + private static boolean sEnableScissorTest = false; + private static boolean sEnableBlend = false; + private static boolean sEnableCulling = false; + private static boolean sEnableTextures = false; + private static boolean sEnableTexCoordArray = false; + private static boolean sEnableVertexArray = false; + + private static float sLineWidth = 1; + + private static float sRed = -1; + private static float sGreen = -1; + private static float sBlue = -1; + private static float sAlpha = -1; + + public static boolean EXTENSIONS_VERTEXBUFFEROBJECTS = false; + public static boolean EXTENSIONS_DRAWTEXTURE = false; + + // =========================================================== + // Methods + // =========================================================== + + public static void reset(final GL10 pGL) { + GLHelper.sCurrentHardwareBufferID = -1; + GLHelper.sCurrentHardwareTextureID = -1; + GLHelper.sCurrentMatrix = -1; + + GLHelper.sCurrentSourceBlendMode = -1; + GLHelper.sCurrentDestinationBlendMode = -1; + + GLHelper.sCurrentTextureFloatBuffer = null; + GLHelper.sCurrentVertexFloatBuffer = null; + + GLHelper.enableDither(pGL); + GLHelper.enableLightning(pGL); + GLHelper.enableDepthTest(pGL); + GLHelper.enableMultisample(pGL); + + GLHelper.disableBlend(pGL); + GLHelper.disableCulling(pGL); + GLHelper.disableTextures(pGL); + GLHelper.disableTexCoordArray(pGL); + GLHelper.disableVertexArray(pGL); + + GLHelper.sLineWidth = 1; + + GLHelper.sRed = -1; + GLHelper.sGreen = -1; + GLHelper.sBlue = -1; + GLHelper.sAlpha = -1; + + GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS = false; + GLHelper.EXTENSIONS_DRAWTEXTURE = false; + } + + public static void enableExtensions(final GL10 pGL, final RenderOptions pRenderOptions) { + final String version = pGL.glGetString(GL10.GL_VERSION); + final String renderer = pGL.glGetString(GL10.GL_RENDERER); + final String extensions = pGL.glGetString(GL10.GL_EXTENSIONS); + + Debug.d("RENDERER: " + renderer); + Debug.d("VERSION: " + version); + Debug.d("EXTENSIONS: " + extensions); + + final boolean isOpenGL10 = version.contains("1.0"); + final boolean isSoftwareRenderer = renderer.contains("PixelFlinger"); + final boolean isVBOCapable = extensions.contains("_vertex_buffer_object"); + final boolean isDrawTextureCapable = extensions.contains("draw_texture"); + + GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS = !pRenderOptions.isDisableExtensionVertexBufferObjects() && !isSoftwareRenderer && (isVBOCapable || !isOpenGL10); + GLHelper.EXTENSIONS_DRAWTEXTURE = isDrawTextureCapable; + + GLHelper.hackBrokenDevices(); + Debug.d("EXTENSIONS_VERXTEXBUFFEROBJECTS = " + GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS); + Debug.d("EXTENSIONS_DRAWTEXTURE = " + GLHelper.EXTENSIONS_DRAWTEXTURE); + } + + private static void hackBrokenDevices() { + if (Build.PRODUCT.contains("morrison")) { + // This is the Motorola Cliq. This device LIES and says it supports + // VBOs, which it actually does not (or, more likely, the extensions string + // is correct and the GL JNI glue is broken). + GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS = false; + // TODO: if Motorola fixes this, I should switch to using the fingerprint + // (blur/morrison/morrison/morrison:1.5/CUPCAKE/091007:user/ota-rel-keys,release-keys) + // instead of the product name so that newer versions use VBOs + } + } + + public static void setColor(final GL10 pGL, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + if(pAlpha != GLHelper.sAlpha || pRed != GLHelper.sRed || pGreen != GLHelper.sGreen || pBlue != GLHelper.sBlue) { + GLHelper.sAlpha = pAlpha; + GLHelper.sRed = pRed; + GLHelper.sGreen = pGreen; + GLHelper.sBlue = pBlue; + pGL.glColor4f(pRed, pGreen, pBlue, pAlpha); + } + } + + public static void enableVertexArray(final GL10 pGL) { + if(!GLHelper.sEnableVertexArray) { + GLHelper.sEnableVertexArray = true; + pGL.glEnableClientState(GL10.GL_VERTEX_ARRAY); + } + } + public static void disableVertexArray(final GL10 pGL) { + if(GLHelper.sEnableVertexArray) { + GLHelper.sEnableVertexArray = false; + pGL.glDisableClientState(GL10.GL_VERTEX_ARRAY); + } + } + + public static void enableTexCoordArray(final GL10 pGL) { + if(!GLHelper.sEnableTexCoordArray) { + GLHelper.sEnableTexCoordArray = true; + pGL.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); + } + } + public static void disableTexCoordArray(final GL10 pGL) { + if(GLHelper.sEnableTexCoordArray) { + GLHelper.sEnableTexCoordArray = false; + pGL.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); + } + } + + public static void enableScissorTest(final GL10 pGL) { + if(!GLHelper.sEnableScissorTest) { + GLHelper.sEnableScissorTest = true; + pGL.glEnable(GL10.GL_SCISSOR_TEST); + } + } + public static void disableScissorTest(final GL10 pGL) { + if(GLHelper.sEnableScissorTest) { + GLHelper.sEnableScissorTest = false; + pGL.glDisable(GL10.GL_SCISSOR_TEST); + } + } + + public static void enableBlend(final GL10 pGL) { + if(!GLHelper.sEnableBlend) { + GLHelper.sEnableBlend = true; + pGL.glEnable(GL10.GL_BLEND); + } + } + public static void disableBlend(final GL10 pGL) { + if(GLHelper.sEnableBlend) { + GLHelper.sEnableBlend = false; + pGL.glDisable(GL10.GL_BLEND); + } + } + + public static void enableCulling(final GL10 pGL) { + if(!GLHelper.sEnableCulling) { + GLHelper.sEnableCulling = true; + pGL.glEnable(GL10.GL_CULL_FACE); + } + } + public static void disableCulling(final GL10 pGL) { + if(GLHelper.sEnableCulling) { + GLHelper.sEnableCulling = false; + pGL.glDisable(GL10.GL_CULL_FACE); + } + } + + public static void enableTextures(final GL10 pGL) { + if(!GLHelper.sEnableTextures) { + GLHelper.sEnableTextures = true; + pGL.glEnable(GL10.GL_TEXTURE_2D); + } + } + public static void disableTextures(final GL10 pGL) { + if(GLHelper.sEnableTextures) { + GLHelper.sEnableTextures = false; + pGL.glDisable(GL10.GL_TEXTURE_2D); + } + } + + public static void enableLightning(final GL10 pGL) { + if(!GLHelper.sEnableLightning) { + GLHelper.sEnableLightning = true; + pGL.glEnable(GL10.GL_LIGHTING); + } + } + public static void disableLightning(final GL10 pGL) { + if(GLHelper.sEnableLightning) { + GLHelper.sEnableLightning = false; + pGL.glDisable(GL10.GL_LIGHTING); + } + } + + public static void enableDither(final GL10 pGL) { + if(!GLHelper.sEnableDither) { + GLHelper.sEnableDither = true; + pGL.glEnable(GL10.GL_DITHER); + } + } + public static void disableDither(final GL10 pGL) { + if(GLHelper.sEnableDither) { + GLHelper.sEnableDither = false; + pGL.glDisable(GL10.GL_DITHER); + } + } + + public static void enableDepthTest(final GL10 pGL) { + if(!GLHelper.sEnableDepthTest) { + GLHelper.sEnableDepthTest = true; + pGL.glEnable(GL10.GL_DEPTH_TEST); + } + } + public static void disableDepthTest(final GL10 pGL) { + if(GLHelper.sEnableDepthTest) { + GLHelper.sEnableDepthTest = false; + pGL.glDisable(GL10.GL_DEPTH_TEST); + } + } + + public static void enableMultisample(final GL10 pGL) { + if(!GLHelper.sEnableMultisample) { + GLHelper.sEnableMultisample = true; + pGL.glEnable(GL10.GL_MULTISAMPLE); + } + } + public static void disableMultisample(final GL10 pGL) { + if(GLHelper.sEnableMultisample) { + GLHelper.sEnableMultisample = false; + pGL.glDisable(GL10.GL_MULTISAMPLE); + } + } + + public static void bindBuffer(final GL11 pGL11, final int pHardwareBufferID) { + /* Reduce unnecessary buffer switching calls. */ + if(GLHelper.sCurrentHardwareBufferID != pHardwareBufferID) { + GLHelper.sCurrentHardwareBufferID = pHardwareBufferID; + pGL11.glBindBuffer(GL11.GL_ARRAY_BUFFER, pHardwareBufferID); + } + } + + public static void deleteBuffer(final GL11 pGL11, final int pHardwareBufferID) { + GLHelper.HARDWAREBUFFERID_CONTAINER[0] = pHardwareBufferID; + pGL11.glDeleteBuffers(1, GLHelper.HARDWAREBUFFERID_CONTAINER, 0); + } + + public static void bindTexture(final GL10 pGL, final int pHardwareTextureID) { + /* Reduce unnecessary texture switching calls. */ + if(GLHelper.sCurrentHardwareTextureID != pHardwareTextureID) { + GLHelper.sCurrentHardwareTextureID = pHardwareTextureID; + pGL.glBindTexture(GL10.GL_TEXTURE_2D, pHardwareTextureID); + } + } + + public static void deleteTexture(final GL10 pGL, final int pHardwareTextureID) { + GLHelper.HARDWARETEXTUREID_CONTAINER[0] = pHardwareTextureID; + pGL.glDeleteTextures(1, GLHelper.HARDWARETEXTUREID_CONTAINER, 0); + } + + public static void texCoordPointer(final GL10 pGL, final FastFloatBuffer pTextureFloatBuffer) { + if(GLHelper.sCurrentTextureFloatBuffer != pTextureFloatBuffer) { + GLHelper.sCurrentTextureFloatBuffer = pTextureFloatBuffer; + pGL.glTexCoordPointer(2, GL10.GL_FLOAT, 0, pTextureFloatBuffer.mByteBuffer); + } + } + + public static void texCoordZeroPointer(final GL11 pGL11) { + pGL11.glTexCoordPointer(2, GL10.GL_FLOAT, 0, 0); + } + + public static void vertexPointer(final GL10 pGL, final FastFloatBuffer pVertexFloatBuffer) { + if(GLHelper.sCurrentVertexFloatBuffer != pVertexFloatBuffer) { + GLHelper.sCurrentVertexFloatBuffer = pVertexFloatBuffer; + pGL.glVertexPointer(2, GL10.GL_FLOAT, 0, pVertexFloatBuffer.mByteBuffer); + } + } + + public static void vertexZeroPointer(final GL11 pGL11) { + pGL11.glVertexPointer(2, GL10.GL_FLOAT, 0, 0); + } + + public static void blendFunction(final GL10 pGL, final int pSourceBlendMode, final int pDestinationBlendMode) { + if(GLHelper.sCurrentSourceBlendMode != pSourceBlendMode || GLHelper.sCurrentDestinationBlendMode != pDestinationBlendMode) { + GLHelper.sCurrentSourceBlendMode = pSourceBlendMode; + GLHelper.sCurrentDestinationBlendMode = pDestinationBlendMode; + pGL.glBlendFunc(pSourceBlendMode, pDestinationBlendMode); + } + } + + public static void lineWidth(final GL10 pGL, final float pLineWidth) { + if(GLHelper.sLineWidth != pLineWidth) { + GLHelper.sLineWidth = pLineWidth; + pGL.glLineWidth(pLineWidth); + } + } + + public static void switchToModelViewMatrix(final GL10 pGL) { + /* Reduce unnecessary matrix switching calls. */ + if(GLHelper.sCurrentMatrix != GL10.GL_MODELVIEW) { + GLHelper.sCurrentMatrix = GL10.GL_MODELVIEW; + pGL.glMatrixMode(GL10.GL_MODELVIEW); + } + } + + public static void switchToProjectionMatrix(final GL10 pGL) { + /* Reduce unnecessary matrix switching calls. */ + if(GLHelper.sCurrentMatrix != GL10.GL_PROJECTION) { + GLHelper.sCurrentMatrix = GL10.GL_PROJECTION; + pGL.glMatrixMode(GL10.GL_PROJECTION); + } + } + + public static void setProjectionIdentityMatrix(final GL10 pGL) { + GLHelper.switchToProjectionMatrix(pGL); + pGL.glLoadIdentity(); + } + + public static void setModelViewIdentityMatrix(final GL10 pGL) { + GLHelper.switchToModelViewMatrix(pGL); + pGL.glLoadIdentity(); + } + + public static void setShadeModelFlat(final GL10 pGL) { + pGL.glShadeModel(GL10.GL_FLAT); + } + + public static void setPerspectiveCorrectionHintFastest(final GL10 pGL) { + pGL.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); + } + + public static void bufferData(final GL11 pGL11, final ByteBuffer pByteBuffer, final int pUsage) { + pGL11.glBufferData(GL11.GL_ARRAY_BUFFER, pByteBuffer.capacity(), pByteBuffer, pUsage); + } + + /** + * Note: does not pre-multiply the alpha channel!
    + * Except that difference, same as: {@link GLUtils#texSubImage2D(int, int, int, int, Bitmap, int, int)}
    + *
    + * See topic: 'PNG loading that doesn't premultiply alpha?' + */ + public static void glTexSubImage2D(final GL10 pGL, final int target, final int level, final int xoffset, final int yoffset, final Bitmap bitmap, final int format, final int type) { + final int[] pixels = GLHelper.getPixels(bitmap); + + final Buffer pixelBuffer = GLHelper.convertARGBtoRGBABuffer(pixels); + + pGL.glTexSubImage2D(GL10.GL_TEXTURE_2D, 0, xoffset, yoffset, bitmap.getWidth(), bitmap.getHeight(), GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuffer); + } + + private static Buffer convertARGBtoRGBABuffer(final int[] pPixels) { + if(GLHelper.IS_LITTLE_ENDIAN) { + for(int i = pPixels.length - 1; i >= 0; i--) { + final int pixel = pPixels[i]; + + final int red = ((pixel >> 16) & 0xFF); + final int green = ((pixel >> 8) & 0xFF); + final int blue = ((pixel) & 0xFF); + final int alpha = (pixel >> 24); + + pPixels[i] = alpha << 24 | blue << 16 | green << 8 | red; + } + } else { + for(int i = pPixels.length - 1; i >= 0; i--) { + final int pixel = pPixels[i]; + + final int red = ((pixel >> 16) & 0xFF); + final int green = ((pixel >> 8) & 0xFF); + final int blue = ((pixel) & 0xFF); + final int alpha = (pixel >> 24); + + pPixels[i] = red << 24 | green << 16 | blue << 8 | alpha; + } + } + return IntBuffer.wrap(pPixels); + } + + public static int[] getPixels(final Bitmap pBitmap) { + final int w = pBitmap.getWidth(); + final int h = pBitmap.getHeight(); + + final int[] pixels = new int[w * h]; + pBitmap.getPixels(pixels, 0, w, 0, 0, w, h); + + return pixels; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/vertex/LineVertexBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/vertex/LineVertexBuffer.java new file mode 100644 index 0000000..87beee6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/vertex/LineVertexBuffer.java @@ -0,0 +1,60 @@ +package org.anddev.andengine.opengl.vertex; + +import org.anddev.andengine.opengl.util.FastFloatBuffer; + +/** + * @author Nicolas Gramlich + * @since 13:07:25 - 13.03.2010 + */ +public class LineVertexBuffer extends VertexBuffer { + // =========================================================== + // Constants + // =========================================================== + + public static final int VERTICES_PER_LINE = 2; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public LineVertexBuffer(final int pDrawType) { + super(2 * VERTICES_PER_LINE, pDrawType); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public synchronized void update(final float pX1, final float pY1, final float pX2, final float pY2) { + final int[] bufferData = this.mBufferData; + + bufferData[0] = Float.floatToRawIntBits(pX1); + bufferData[1] = Float.floatToRawIntBits(pY1); + + bufferData[2] = Float.floatToRawIntBits(pX2); + bufferData[3] = Float.floatToRawIntBits(pY2); + + final FastFloatBuffer buffer = this.getFloatBuffer(); + buffer.position(0); + buffer.put(bufferData); + buffer.position(0); + + super.setHardwareBufferNeedsUpdate(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/vertex/RectangleVertexBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/vertex/RectangleVertexBuffer.java new file mode 100644 index 0000000..1ccdbd2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/vertex/RectangleVertexBuffer.java @@ -0,0 +1,72 @@ +package org.anddev.andengine.opengl.vertex; + +import org.anddev.andengine.opengl.util.FastFloatBuffer; + +/** + * @author Nicolas Gramlich + * @since 13:07:25 - 13.03.2010 + */ +public class RectangleVertexBuffer extends VertexBuffer { + // =========================================================== + // Constants + // =========================================================== + + public static final int VERTICES_PER_RECTANGLE = 4; + + private static final int FLOAT_TO_RAW_INT_BITS_ZERO = Float.floatToRawIntBits(0); + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public RectangleVertexBuffer(final int pDrawType) { + super(2 * VERTICES_PER_RECTANGLE, pDrawType); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public synchronized void update(final float pWidth, final float pHeight) { + final int x = FLOAT_TO_RAW_INT_BITS_ZERO; + final int y = FLOAT_TO_RAW_INT_BITS_ZERO; + final int x2 = Float.floatToRawIntBits(pWidth); + final int y2 = Float.floatToRawIntBits(pHeight); + + final int[] bufferData = this.mBufferData; + bufferData[0] = x; + bufferData[1] = y; + + bufferData[2] = x; + bufferData[3] = y2; + + bufferData[4] = x2; + bufferData[5] = y; + + bufferData[6] = x2; + bufferData[7] = y2; + + final FastFloatBuffer buffer = this.getFloatBuffer(); + buffer.position(0); + buffer.put(bufferData); + buffer.position(0); + + super.setHardwareBufferNeedsUpdate(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/vertex/TextVertexBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/vertex/TextVertexBuffer.java new file mode 100644 index 0000000..9aa73f4 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/vertex/TextVertexBuffer.java @@ -0,0 +1,117 @@ +package org.anddev.andengine.opengl.vertex; + +import org.anddev.andengine.opengl.font.Font; +import org.anddev.andengine.opengl.font.Letter; +import org.anddev.andengine.opengl.util.FastFloatBuffer; +import org.anddev.andengine.util.HorizontalAlign; + +/** + * @author Nicolas Gramlich + * @since 18:05:08 - 07.04.2010 + */ +public class TextVertexBuffer extends VertexBuffer { + // =========================================================== + // Constants + // =========================================================== + + public static final int VERTICES_PER_CHARACTER = 6; + + // =========================================================== + // Fields + // =========================================================== + + private final HorizontalAlign mHorizontalAlign; + + // =========================================================== + // Constructors + // =========================================================== + + public TextVertexBuffer(final int pCharacterCount, final HorizontalAlign pHorizontalAlign, final int pDrawType) { + super(2 * VERTICES_PER_CHARACTER * pCharacterCount, pDrawType); + + this.mHorizontalAlign = pHorizontalAlign; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public synchronized void update(final Font font, final int pMaximumLineWidth, final int[] pWidths, final String[] pLines) { + final int[] bufferData = this.mBufferData; + int i = 0; + + final int lineHeight = font.getLineHeight(); + + final int lineCount = pLines.length; + for (int lineIndex = 0; lineIndex < lineCount; lineIndex++) { + final String line = pLines[lineIndex]; + + int lineX; + switch(this.mHorizontalAlign) { + case RIGHT: + lineX = pMaximumLineWidth - pWidths[lineIndex]; + break; + case CENTER: + lineX = (pMaximumLineWidth - pWidths[lineIndex]) >> 1; + break; + case LEFT: + default: + lineX = 0; + } + + final int lineY = lineIndex * (font.getLineHeight() + font.getLineGap()); + final int lineYBits = Float.floatToRawIntBits(lineY); + + final int lineLength = line.length(); + for (int letterIndex = 0; letterIndex < lineLength; letterIndex++) { + final Letter letter = font.getLetter(line.charAt(letterIndex)); + + final int lineY2 = lineY + lineHeight; + final int lineX2 = lineX + letter.mWidth; + + final int lineXBits = Float.floatToRawIntBits(lineX); + final int lineX2Bits = Float.floatToRawIntBits(lineX2); + final int lineY2Bits = Float.floatToRawIntBits(lineY2); + + bufferData[i++] = lineXBits; + bufferData[i++] = lineYBits; + + bufferData[i++] = lineXBits; + bufferData[i++] = lineY2Bits; + + bufferData[i++] = lineX2Bits; + bufferData[i++] = lineY2Bits; + + bufferData[i++] = lineX2Bits; + bufferData[i++] = lineY2Bits; + + bufferData[i++] = lineX2Bits; + bufferData[i++] = lineYBits; + + bufferData[i++] = lineXBits; + bufferData[i++] = lineYBits; + + lineX += letter.mAdvance; + } + } + + final FastFloatBuffer vertexFloatBuffer = this.getFloatBuffer(); + vertexFloatBuffer.position(0); + vertexFloatBuffer.put(bufferData); + vertexFloatBuffer.position(0); + + super.setHardwareBufferNeedsUpdate(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/vertex/VertexBuffer.java b/AndEngine/src/org/anddev/andengine/opengl/vertex/VertexBuffer.java new file mode 100644 index 0000000..fbe1872 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/vertex/VertexBuffer.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.opengl.vertex; + +import org.anddev.andengine.opengl.buffer.BufferObject; + +/** + * @author Nicolas Gramlich + * @since 12:16:18 - 09.03.2010 + */ +public abstract class VertexBuffer extends BufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public VertexBuffer(final int pCapacity, final int pDrawType) { + super(pCapacity, pDrawType); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/view/BaseConfigChooser.java b/AndEngine/src/org/anddev/andengine/opengl/view/BaseConfigChooser.java new file mode 100644 index 0000000..1934dd0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/view/BaseConfigChooser.java @@ -0,0 +1,70 @@ +/** + * + */ +package org.anddev.andengine.opengl.view; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLDisplay; + +/** + * @author Nicolas Gramlich + * @since 20:42:29 - 28.06.2010 + */ +abstract class BaseConfigChooser implements EGLConfigChooser { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final int[] mConfigSpec; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseConfigChooser(final int[] pConfigSpec) { + this.mConfigSpec = pConfigSpec; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + abstract EGLConfig chooseConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final EGLConfig[] pEGLConfigs); + + @Override + public EGLConfig chooseConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay) { + final int[] num_config = new int[1]; + pEGL.eglChooseConfig(pEGLDisplay, this.mConfigSpec, null, 0, num_config); + + final int numConfigs = num_config[0]; + + if(numConfigs <= 0) { + throw new IllegalArgumentException("No configs match configSpec"); + } + + final EGLConfig[] configs = new EGLConfig[numConfigs]; + pEGL.eglChooseConfig(pEGLDisplay, this.mConfigSpec, configs, numConfigs, num_config); + final EGLConfig config = this.chooseConfig(pEGL, pEGLDisplay, configs); + if(config == null) { + throw new IllegalArgumentException("No config chosen"); + } + return config; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/view/ComponentSizeChooser.java b/AndEngine/src/org/anddev/andengine/opengl/view/ComponentSizeChooser.java new file mode 100644 index 0000000..b013205 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/view/ComponentSizeChooser.java @@ -0,0 +1,86 @@ +package org.anddev.andengine.opengl.view; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLDisplay; + +/** + * @author Nicolas Gramlich + * @since 20:54:06 - 28.06.2010 + */ +public class ComponentSizeChooser extends BaseConfigChooser { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int[] mValue; + // Subclasses can adjust these values: + protected int mRedSize; + protected int mGreenSize; + protected int mBlueSize; + protected int mAlphaSize; + protected int mDepthSize; + protected int mStencilSize; + + // =========================================================== + // Constructors + // =========================================================== + + public ComponentSizeChooser(final int pRedSize, final int pGreenSize, final int pBlueSize, final int pAlphaSize, final int pDepthSize, final int pStencilSize) { + super(new int[] { EGL10.EGL_RED_SIZE, pRedSize, EGL10.EGL_GREEN_SIZE, pGreenSize, EGL10.EGL_BLUE_SIZE, pBlueSize, EGL10.EGL_ALPHA_SIZE, pAlphaSize, EGL10.EGL_DEPTH_SIZE, pDepthSize, EGL10.EGL_STENCIL_SIZE, pStencilSize, EGL10.EGL_NONE }); + this.mValue = new int[1]; + this.mRedSize = pRedSize; + this.mGreenSize = pGreenSize; + this.mBlueSize = pBlueSize; + this.mAlphaSize = pAlphaSize; + this.mDepthSize = pDepthSize; + this.mStencilSize = pStencilSize; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public EGLConfig chooseConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final EGLConfig[] pEGLConfigs) { + EGLConfig closestConfig = null; + int closestDistance = 1000; + for(final EGLConfig config : pEGLConfigs) { + final int r = this.findConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_RED_SIZE, 0); + final int g = this.findConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_GREEN_SIZE, 0); + final int b = this.findConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_BLUE_SIZE, 0); + final int a = this.findConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_ALPHA_SIZE, 0); + final int d = this.findConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_DEPTH_SIZE, 0); + final int s = this.findConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_STENCIL_SIZE, 0); + final int distance = Math.abs(r - this.mRedSize) + Math.abs(g - this.mGreenSize) + Math.abs(b - this.mBlueSize) + Math.abs(a - this.mAlphaSize) + Math.abs(d - this.mDepthSize) + Math.abs(s - this.mStencilSize); + if(distance < closestDistance) { + closestDistance = distance; + closestConfig = config; + } + } + return closestConfig; + } + + // =========================================================== + // Methods + // =========================================================== + + private int findConfigAttrib(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final EGLConfig pEGLConfig, final int pAttribute, final int pDefaultValue) { + if(pEGL.eglGetConfigAttrib(pEGLDisplay, pEGLConfig, pAttribute, this.mValue)) { + return this.mValue[0]; + } + return pDefaultValue; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/view/EGLConfigChooser.java b/AndEngine/src/org/anddev/andengine/opengl/view/EGLConfigChooser.java new file mode 100644 index 0000000..79e0fbb --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/view/EGLConfigChooser.java @@ -0,0 +1,38 @@ +package org.anddev.andengine.opengl.view; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLDisplay; + +/** + * An interface for choosing an EGLConfig configuration from a list of + * potential configurations. + *

    + * This interface must be implemented by clients wishing to call + * {@link GLSurfaceView#setEGLConfigChooser(EGLConfigChooser)} + * + * @author Nicolas Gramlich + * @since 20:53:49 - 28.06.2010 + */ +public interface EGLConfigChooser { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * Choose a configuration from the list. Implementors typically + * implement this method by calling {@link EGL10#eglChooseConfig} and + * iterating through the results. Please consult the EGL specification + * available from The Khronos Group to learn how to call + * eglChooseConfig. + * + * @param pEGL the EGL10 for the current display. + * @param pEGLDisplay the current display. + * @return the chosen configuration. + */ + public EGLConfig chooseConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/view/GLSurfaceView.java b/AndEngine/src/org/anddev/andengine/opengl/view/GLSurfaceView.java new file mode 100644 index 0000000..e31cad1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/view/GLSurfaceView.java @@ -0,0 +1,991 @@ +// ############################################################ +// ############################################################ +// +// This class is a replacement for the original GLSurfaceView, due to issue: +// http://code.google.com/p/android/issues/detail?id=2828 +// +// Reason: Two sequential Activities using a GLSurfaceView leads to a deadlock in the GLThread! +// +// ############################################################ +// ############################################################ + +package org.anddev.andengine.opengl.view; + +import java.util.ArrayList; +import java.util.concurrent.Semaphore; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGL11; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLContext; +import javax.microedition.khronos.egl.EGLDisplay; +import javax.microedition.khronos.egl.EGLSurface; +import javax.microedition.khronos.opengles.GL; +import javax.microedition.khronos.opengles.GL10; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.SurfaceHolder; +import android.view.SurfaceView; + +/** + * An implementation of SurfaceView that uses the dedicated surface for + * displaying OpenGL rendering. + *

    + * A GLSurfaceView provides the following features: + *

    + *

      + *
    • Manages a surface, which is a special piece of memory that can be + * composited into the Android view system. + *
    • Manages an EGL display, which enables OpenGL to render into a surface. + *
    • Accepts a user-provided Renderer object that does the actual rendering. + *
    • Renders on a dedicated thread to decouple rendering performance from the + * UI thread. + *
    • Supports both on-demand and continuous rendering. + *
    • Optionally wraps, traces, and/or error-checks the renderer's OpenGL + * calls. + *
    + * + *

    Using GLSurfaceView

    + *

    + * Typically you use GLSurfaceView by subclassing it and overriding one or more + * of the View system input event methods. If your application does not need to + * override event methods then GLSurfaceView can be used as-is. For the most + * part GLSurfaceView behavior is customized by calling "set" methods rather + * than by subclassing. For example, unlike a regular View, drawing is delegated + * to a separate Renderer object which is registered with the GLSurfaceView + * using the {@link #setRenderer(Renderer)} call. + *

    + *

    Initializing GLSurfaceView

    + * All you have to do to initialize a GLSurfaceView is call + * {@link #setRenderer(Renderer)}. However, if desired, you can modify the + * default behavior of GLSurfaceView by calling one or more of these methods + * before calling setRenderer: + *
      + *
    • {@link #setDebugFlags(int)} + *
    • {@link #setEGLConfigChooser(boolean)} + *
    • {@link #setEGLConfigChooser(EGLConfigChooser)} + *
    • {@link #setEGLConfigChooser(int, int, int, int, int, int)} + *
    • {@link #setGLWrapper(GLWrapper)} + *
    + *

    + *

    Choosing an EGL Configuration

    + * A given Android device may support multiple possible types of drawing + * surfaces. The available surfaces may differ in how may channels of data are + * present, as well as how many bits are allocated to each channel. Therefore, + * the first thing GLSurfaceView has to do when starting to render is choose + * what type of surface to use. + *

    + * By default GLSurfaceView chooses an available surface that's closest to a + * 16-bit R5G6B5 surface with a 16-bit depth buffer and no stencil. If you would + * prefer a different surface (for example, if you do not need a depth buffer) + * you can override the default behavior by calling one of the + * setEGLConfigChooser methods. + *

    + *

    Debug Behavior

    + * You can optionally modify the behavior of GLSurfaceView by calling one or + * more of the debugging methods {@link #setDebugFlags(int)}, and + * {@link #setGLWrapper}. These methods may be called before and/or after + * setRenderer, but typically they are called before setRenderer so that they + * take effect immediately. + *

    + *

    Setting a Renderer

    + * Finally, you must call {@link #setRenderer} to register a {@link Renderer}. + * The renderer is responsible for doing the actual OpenGL rendering. + *

    + *

    Rendering Mode

    + * Once the renderer is set, you can control whether the renderer draws + * continuously or on-demand by calling {@link #setRenderMode}. The default is + * continuous rendering. + *

    + *

    Activity Life-cycle

    + * A GLSurfaceView must be notified when the activity is paused and resumed. + * GLSurfaceView clients are required to call {@link #onPause()} when the + * activity pauses and {@link #onResume()} when the activity resumes. These + * calls allow GLSurfaceView to pause and resume the rendering thread, and also + * allow GLSurfaceView to release and recreate the OpenGL display. + *

    + *

    Handling events

    + *

    + * To handle an event you will typically subclass GLSurfaceView and override the + * appropriate method, just as you would with any other View. However, when + * handling the event, you may need to communicate with the Renderer object + * that's running in the rendering thread. You can do this using any standard + * Java cross-thread communication mechanism. In addition, one relatively easy + * way to communicate with your renderer is to call + * {@link #queueEvent(Runnable)}. For example: + * + *

    + * class MyGLSurfaceView extends GLSurfaceView {
    + * 
    + * 	private MyRenderer mMyRenderer;
    + * 
    + * 	public void start() {
    + *         mMyRenderer = ...;
    + *         setRenderer(mMyRenderer);
    + *     }
    + * 
    + * 	public boolean onKeyDown(int keyCode, KeyEvent event) {
    + * 		if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
    + * 			queueEvent(new Runnable() {
    + * 				// This method will be called on the rendering
    + * 				// thread:
    + * 				public void run() {
    + * 					mMyRenderer.handleDpadCenter();
    + * 				}
    + * 			});
    + * 			return true;
    + * 		}
    + * 		return super.onKeyDown(keyCode, event);
    + * 	}
    + * }
    + * 
    + * + */ +public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback { + // =========================================================== + // Constants + // =========================================================== + + /** + * The renderer only renders when the surface is created, or when + * {@link #requestRender} is called. + * + * @see #getRenderMode() + * @see #setRenderMode(int) + */ + public final static int RENDERMODE_WHEN_DIRTY = 0; + /** + * The renderer is called continuously to re-render the scene. + * + * @see #getRenderMode() + * @see #setRenderMode(int) + * @see #requestRender() + */ + public final static int RENDERMODE_CONTINUOUSLY = 1; + + /** + * Check glError() after every GL call and throw an exception if glError + * indicates that an error has occurred. This can be used to help track down + * which OpenGL ES call is causing an error. + * + * @see #getDebugFlags + * @see #setDebugFlags + */ + public final static int DEBUG_CHECK_GL_ERROR = 1; + + /** + * Log GL calls to the system log at "verbose" level with tag + * "GLSurfaceView". + * + * @see #getDebugFlags + * @see #setDebugFlags + */ + public final static int DEBUG_LOG_GL_CALLS = 2; + + private static final Semaphore sEglSemaphore = new Semaphore(1); + + // =========================================================== + // Fields + // =========================================================== + + private GLThread mGLThread; + private EGLConfigChooser mEGLConfigChooser; + private GLWrapper mGLWrapper; + private int mDebugFlags; + private int mRenderMode; + private Renderer mRenderer; + private int mSurfaceWidth; + private int mSurfaceHeight; + private boolean mHasSurface; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * Standard View constructor. In order to render something, you must call + * {@link #setRenderer} to register a renderer. + */ + public GLSurfaceView(final Context context) { + super(context); + this.init(); + } + + /** + * Standard View constructor. In order to render something, you must call + * {@link #setRenderer} to register a renderer. + */ + public GLSurfaceView(final Context context, final AttributeSet attrs) { + super(context, attrs); + this.init(); + } + + private void init() { + // Install a SurfaceHolder.Callback so we get notified when the + // underlying surface is created and destroyed + final SurfaceHolder holder = this.getHolder(); + holder.addCallback(this); + holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); + this.mRenderMode = RENDERMODE_CONTINUOUSLY; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + /** + * Set the glWrapper. If the glWrapper is not null, its + * {@link GLWrapper#wrap(GL)} method is called whenever a surface is + * created. A GLWrapper can be used to wrap the GL object that's passed to + * the renderer. Wrapping a GL object enables examining and modifying the + * behavior of the GL calls made by the renderer. + *

    + * Wrapping is typically used for debugging purposes. + *

    + * The default value is null. + * + * @param glWrapper + * the new GLWrapper + */ + public void setGLWrapper(final GLWrapper glWrapper) { + this.mGLWrapper = glWrapper; + } + + /** + * Set the debug flags to a new value. The value is constructed by + * OR-together zero or more of the DEBUG_CHECK_* constants. The debug flags + * take effect whenever a surface is created. The default value is zero. + * + * @param debugFlags + * the new debug flags + * @see #DEBUG_CHECK_GL_ERROR + * @see #DEBUG_LOG_GL_CALLS + */ + public void setDebugFlags(final int debugFlags) { + this.mDebugFlags = debugFlags; + } + + /** + * Get the current value of the debug flags. + * + * @return the current value of the debug flags. + */ + public int getDebugFlags() { + return this.mDebugFlags; + } + + /** + * Set the renderer associated with this view. Also starts the thread that + * will call the renderer, which in turn causes the rendering to start. + *

    + * This method should be called once and only once in the life-cycle of a + * GLSurfaceView. + *

    + * The following GLSurfaceView methods can only be called before + * setRenderer is called: + *

      + *
    • {@link #setEGLConfigChooser(boolean)} + *
    • {@link #setEGLConfigChooser(EGLConfigChooser)} + *
    • {@link #setEGLConfigChooser(int, int, int, int, int, int)} + *
    + *

    + * The following GLSurfaceView methods can only be called after + * setRenderer is called: + *

      + *
    • {@link #getRenderMode()} + *
    • {@link #onPause()} + *
    • {@link #onResume()} + *
    • {@link #queueEvent(Runnable)} + *
    • {@link #requestRender()} + *
    • {@link #setRenderMode(int)} + *
    + * + * @param renderer + * the renderer to use to perform OpenGL drawing. + */ + public void setRenderer(final Renderer renderer) { + if(this.mRenderer != null) { + throw new IllegalStateException("setRenderer has already been called for this instance."); + } + + this.mRenderer = renderer; + } + + /** + * Install a custom EGLConfigChooser. + *

    + * If this method is called, it must be called before + * {@link #setRenderer(Renderer)} is called. + *

    + * If no setEGLConfigChooser method is called, then by default the view will + * choose a config as close to 16-bit RGB as possible, with a depth buffer + * as close to 16 bits as possible. + * + * @param configChooser + */ + public void setEGLConfigChooser(final EGLConfigChooser configChooser) { + if(this.mRenderer != null) { + throw new IllegalStateException("setRenderer has already been called for this instance."); + } + this.mEGLConfigChooser = configChooser; + } + + /** + * Install a config chooser which will choose a config as close to 16-bit + * RGB as possible, with or without an optional depth buffer as close to + * 16-bits as possible. + *

    + * If this method is called, it must be called before + * {@link #setRenderer(Renderer)} is called. + *

    + * If no setEGLConfigChooser method is called, then by default the view will + * choose a config as close to 16-bit RGB as possible, with a depth buffer + * as close to 16 bits as possible. + * + * @param needDepth + */ + public void setEGLConfigChooser(final boolean needDepth) { + this.setEGLConfigChooser(new SimpleEGLConfigChooser(needDepth)); + } + + /** + * Install a config chooser which will choose a config with at least the + * specified component sizes, and as close to the specified component sizes + * as possible. + *

    + * If this method is called, it must be called before + * {@link #setRenderer(Renderer)} is called. + *

    + * If no setEGLConfigChooser method is called, then by default the view will + * choose a config as close to 16-bit RGB as possible, with a depth buffer + * as close to 16 bits as possible. + * + */ + public void setEGLConfigChooser(final int redSize, final int greenSize, final int blueSize, final int alphaSize, final int depthSize, final int stencilSize) { + this.setEGLConfigChooser(new ComponentSizeChooser(redSize, greenSize, blueSize, alphaSize, depthSize, stencilSize)); + } + + /** + * Set the rendering mode. When renderMode is RENDERMODE_CONTINUOUSLY, the + * renderer is called repeatedly to re-render the scene. When renderMode is + * RENDERMODE_WHEN_DIRTY, the renderer only rendered when the surface is + * created, or when {@link #requestRender} is called. Defaults to + * RENDERMODE_CONTINUOUSLY. + *

    + * Using RENDERMODE_WHEN_DIRTY can improve battery life and overall system + * performance by allowing the GPU and CPU to idle when the view does not + * need to be updated. + *

    + * This method can only be called after {@link #setRenderer(Renderer)} + * + * @param renderMode + * one of the RENDERMODE_X constants + * @see #RENDERMODE_CONTINUOUSLY + * @see #RENDERMODE_WHEN_DIRTY + */ + public void setRenderMode(final int renderMode) { + this.mRenderMode = renderMode; + if(this.mGLThread != null) { + this.mGLThread.setRenderMode(renderMode); + } + } + + /** + * Get the current rendering mode. May be called from any thread. Must not + * be called before a renderer has been set. + * + * @return the current rendering mode. + * @see #RENDERMODE_CONTINUOUSLY + * @see #RENDERMODE_WHEN_DIRTY + */ + public int getRenderMode() { + return this.mRenderMode; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + /** + * Request that the renderer render a frame. This method is typically used + * when the render mode has been set to {@link #RENDERMODE_WHEN_DIRTY}, so + * that frames are only rendered on demand. May be called from any thread. + * Must be called after onResume() and before onPause(). + */ + public void requestRender() { + this.mGLThread.requestRender(); + } + + /** + * This method is part of the SurfaceHolder.Callback interface, and is not + * normally called or subclassed by clients of GLSurfaceView. + */ + @Override + public void surfaceCreated(final SurfaceHolder holder) { + if(this.mGLThread != null) { + this.mGLThread.surfaceCreated(); + } + this.mHasSurface = true; + } + + /** + * This method is part of the SurfaceHolder.Callback interface, and is not + * normally called or subclassed by clients of GLSurfaceView. + */ + @Override + public void surfaceDestroyed(final SurfaceHolder holder) { + // Surface will be destroyed when we return + if(this.mGLThread != null) { + this.mGLThread.surfaceDestroyed(); + } + this.mHasSurface = false; + } + + /** + * This method is part of the SurfaceHolder.Callback interface, and is not + * normally called or subclassed by clients of GLSurfaceView. + */ + @Override + public void surfaceChanged(final SurfaceHolder holder, final int format, final int w, final int h) { + if(this.mGLThread != null) { + this.mGLThread.onWindowResize(w, h); + } + this.mSurfaceWidth = w; + this.mSurfaceHeight = h; + } + + /** + * Inform the view that the activity is paused. The owner of this view must + * call this method when the activity is paused. Calling this method will + * pause the rendering thread. Must not be called before a renderer has been + * set. + */ + public void onPause() { + this.mGLThread.onPause(); + this.mGLThread.requestExitAndWait(); + this.mGLThread = null; + } + + /** + * Inform the view that the activity is resumed. The owner of this view must + * call this method when the activity is resumed. Calling this method will + * recreate the OpenGL display and resume the rendering thread. Must not be + * called before a renderer has been set. + */ + public void onResume() { + if(this.mEGLConfigChooser == null) { + this.mEGLConfigChooser = new SimpleEGLConfigChooser(true); + } + this.mGLThread = new GLThread(this.mRenderer); + this.mGLThread.start(); + this.mGLThread.setRenderMode(this.mRenderMode); + if(this.mHasSurface) { + this.mGLThread.surfaceCreated(); + } + if(this.mSurfaceWidth > 0 && this.mSurfaceHeight > 0) { + this.mGLThread.onWindowResize(this.mSurfaceWidth, this.mSurfaceHeight); + } + this.mGLThread.onResume(); + } + + /** + * Queue a runnable to be run on the GL rendering thread. This can be used + * to communicate with the Renderer on the rendering thread. Must be called + * after onResume() and before onPause(). + * + * @param r + * the runnable to be run on the GL rendering thread. + */ + public void queueEvent(final Runnable r) { + if(this.mGLThread != null) { + this.mGLThread.queueEvent(r); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + /** + * A generic GL Thread. Takes care of initializing EGL and GL. Delegates to + * a Renderer instance to do the actual drawing. Can be configured to render + * continuously or on request. + * + */ + class GLThread extends Thread { + GLThread(final Renderer renderer) { + super(); + this.mDone = false; + this.mWidth = 0; + this.mHeight = 0; + this.mRequestRender = true; + this.mRenderMode = RENDERMODE_CONTINUOUSLY; + this.mRenderer = renderer; + this.mSizeChanged = true; + this.setName("GLThread"); + } + + @Override + public void run() { + /* + * When the android framework launches a second instance of an + * activity, the new instance's onCreate() method may be called + * before the first instance returns from onDestroy(). + * + * This semaphore ensures that only one instance at a time accesses + * EGL. + */ + try { + try { + sEglSemaphore.acquire(); + } catch (final InterruptedException e) { + return; + } + this.guardedRun(); + } catch (final InterruptedException e) { + // fall thru and exit normally + } finally { + sEglSemaphore.release(); + } + } + + private void guardedRun() throws InterruptedException { + this.mEglHelper = new EglHelper(); + this.mEglHelper.start(); + + GL10 gl = null; + boolean tellRendererSurfaceCreated = true; + boolean tellRendererSurfaceChanged = true; + + /* + * This is our main activity thread's loop, we go until asked to + * quit. + */ + while(!this.mDone) { + + /* + * Update the asynchronous state (window size) + */ + int w, h; + boolean changed; + boolean needStart = false; + synchronized (this) { + Runnable r; + while((r = this.getEvent()) != null) { + r.run(); + } + if(this.mPaused) { + this.mEglHelper.finish(); + needStart = true; + } + while(this.needToWait()) { + this.wait(); + } + if(this.mDone) { + break; + } + changed = this.mSizeChanged; + w = this.mWidth; + h = this.mHeight; + this.mSizeChanged = false; + this.mRequestRender = false; + } + if(needStart) { + this.mEglHelper.start(); + tellRendererSurfaceCreated = true; + changed = true; + } + if(changed) { + gl = (GL10) this.mEglHelper.createSurface(GLSurfaceView.this.getHolder()); + tellRendererSurfaceChanged = true; + } + if(tellRendererSurfaceCreated) { + this.mRenderer.onSurfaceCreated(gl, this.mEglHelper.mEglConfig); + tellRendererSurfaceCreated = false; + } + if(tellRendererSurfaceChanged) { + this.mRenderer.onSurfaceChanged(gl, w, h); + tellRendererSurfaceChanged = false; + } + if((w > 0) && (h > 0)) { + /* draw a frame here */ + this.mRenderer.onDrawFrame(gl); + + /* + * Once we're done with GL, we need to call swapBuffers() to + * instruct the system to display the rendered frame + */ + this.mEglHelper.swap(); + } + } + + /* + * clean-up everything... + */ + this.mEglHelper.finish(); + } + + private boolean needToWait() { + if(this.mDone) { + return false; + } + + if(this.mPaused || (!this.mHasSurface)) { + return true; + } + + if((this.mWidth > 0) && (this.mHeight > 0) && (this.mRequestRender || (this.mRenderMode == RENDERMODE_CONTINUOUSLY))) { + return false; + } + + return true; + } + + public void setRenderMode(final int renderMode) { + if(!((RENDERMODE_WHEN_DIRTY <= renderMode) && (renderMode <= RENDERMODE_CONTINUOUSLY))) { + throw new IllegalArgumentException("renderMode"); + } + synchronized (this) { + this.mRenderMode = renderMode; + if(renderMode == RENDERMODE_CONTINUOUSLY) { + this.notify(); + } + } + } + + public int getRenderMode() { + synchronized (this) { + return this.mRenderMode; + } + } + + public void requestRender() { + synchronized (this) { + this.mRequestRender = true; + this.notify(); + } + } + + public void surfaceCreated() { + synchronized (this) { + this.mHasSurface = true; + this.notify(); + } + } + + public void surfaceDestroyed() { + synchronized (this) { + this.mHasSurface = false; + this.notify(); + } + } + + public void onPause() { + synchronized (this) { + this.mPaused = true; + } + } + + public void onResume() { + synchronized (this) { + this.mPaused = false; + this.notify(); + } + } + + public void onWindowResize(final int w, final int h) { + synchronized (this) { + this.mWidth = w; + this.mHeight = h; + this.mSizeChanged = true; + this.notify(); + } + } + + public void requestExitAndWait() { + // don't call this from GLThread thread or it is a guaranteed + // deadlock! + synchronized (this) { + this.mDone = true; + this.notify(); + } + try { + this.join(); + } catch (final InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + + /** + * Queue an "event" to be run on the GL rendering thread. + * + * @param r + * the runnable to be run on the GL rendering thread. + */ + public void queueEvent(final Runnable r) { + synchronized (this) { + this.mEventQueue.add(r); + } + } + + private Runnable getEvent() { + synchronized (this) { + if(this.mEventQueue.size() > 0) { + return this.mEventQueue.remove(0); + } + + } + return null; + } + + private boolean mDone; + private boolean mPaused; + private boolean mHasSurface; + private int mWidth; + private int mHeight; + private int mRenderMode; + private boolean mRequestRender; + private final Renderer mRenderer; + private final ArrayList mEventQueue = new ArrayList(); + private EglHelper mEglHelper; + private boolean mSizeChanged; + } + + /** + * An EGL helper class. + */ + + class EglHelper { + public EglHelper() { + + } + + /** + * Initialize EGL for a given configuration spec. + * + * @param configSpec + */ + public void start() { + /* + * Get an EGL instance + */ + this.mEgl = (EGL10) EGLContext.getEGL(); + + /* + * Get to the default display. + */ + this.mEglDisplay = this.mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); + + /* + * We can now initialize EGL for that display + */ + final int[] version = new int[2]; + this.mEgl.eglInitialize(this.mEglDisplay, version); + this.mEglConfig = GLSurfaceView.this.mEGLConfigChooser.chooseConfig(this.mEgl, this.mEglDisplay); + + /* + * Create an OpenGL ES context. This must be done only once, an + * OpenGL context is a somewhat heavy object. + */ + this.mEglContext = this.mEgl.eglCreateContext(this.mEglDisplay, this.mEglConfig, EGL10.EGL_NO_CONTEXT, null); + + this.mEglSurface = null; + } + + /* + * React to the creation of a new surface by creating and returning an + * OpenGL interface that renders to that surface. + */ + public GL createSurface(final SurfaceHolder holder) { + /* + * The window size has changed, so we need to create a new surface. + */ + if(this.mEglSurface != null) { + + /* + * Unbind and destroy the old EGL surface, if there is one. + */ + this.mEgl.eglMakeCurrent(this.mEglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); + this.mEgl.eglDestroySurface(this.mEglDisplay, this.mEglSurface); + } + + /* + * Create an EGL surface we can render into. + */ + this.mEglSurface = this.mEgl.eglCreateWindowSurface(this.mEglDisplay, this.mEglConfig, holder, null); + + /* + * Before we can issue GL commands, we need to make sure the context + * is current and bound to a surface. + */ + this.mEgl.eglMakeCurrent(this.mEglDisplay, this.mEglSurface, this.mEglSurface, this.mEglContext); + + GL gl = this.mEglContext.getGL(); + if(GLSurfaceView.this.mGLWrapper != null) { + gl = GLSurfaceView.this.mGLWrapper.wrap(gl); + } + + /* Debugging disabled */ + /* + * if ((mDebugFlags & (DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS))!= + * 0) { int configFlags = 0; Writer log = null; if ((mDebugFlags & + * DEBUG_CHECK_GL_ERROR) != 0) { configFlags |= + * GLDebugHelper.CONFIG_CHECK_GL_ERROR; } if ((mDebugFlags & + * DEBUG_LOG_GL_CALLS) != 0) { log = new LogWriter(); } gl = + * GLDebugHelper.wrap(gl, configFlags, log); } + */ + return gl; + } + + /** + * Display the current render surface. + * + * @return false if the context has been lost. + */ + public boolean swap() { + this.mEgl.eglSwapBuffers(this.mEglDisplay, this.mEglSurface); + + /* + * Always check for EGL_CONTEXT_LOST, which means the context and + * all associated data were lost (For instance because the device + * went to sleep). We need to sleep until we get a new surface. + */ + return this.mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST; + } + + public void finish() { + if(this.mEglSurface != null) { + this.mEgl.eglMakeCurrent(this.mEglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); + this.mEgl.eglDestroySurface(this.mEglDisplay, this.mEglSurface); + this.mEglSurface = null; + } + if(this.mEglContext != null) { + this.mEgl.eglDestroyContext(this.mEglDisplay, this.mEglContext); + this.mEglContext = null; + } + if(this.mEglDisplay != null) { + this.mEgl.eglTerminate(this.mEglDisplay); + this.mEglDisplay = null; + } + } + + EGL10 mEgl; + EGLDisplay mEglDisplay; + EGLSurface mEglSurface; + EGLConfig mEglConfig; + EGLContext mEglContext; + } + + /** + * A generic renderer interface. + *

    + * The renderer is responsible for making OpenGL calls to render a frame. + *

    + * GLSurfaceView clients typically create their own classes that implement + * this interface, and then call {@link GLSurfaceView#setRenderer} to + * register the renderer with the GLSurfaceView. + *

    + *

    Threading

    + * The renderer will be called on a separate thread, so that rendering + * performance is decoupled from the UI thread. Clients typically need to + * communicate with the renderer from the UI thread, because that's where + * input events are received. Clients can communicate using any of the + * standard Java techniques for cross-thread communication, or they can use + * the {@link GLSurfaceView#queueEvent(Runnable)} convenience method. + *

    + *

    EGL Context Lost

    + * There are situations where the EGL rendering context will be lost. This + * typically happens when device wakes up after going to sleep. When the EGL + * context is lost, all OpenGL resources (such as textures) that are + * associated with that context will be automatically deleted. In order to + * keep rendering correctly, a renderer must recreate any lost resources + * that it still needs. The {@link #onSurfaceCreated(GL10, EGLConfig)} + * method is a convenient place to do this. + * + * + * @see #setRenderer(Renderer) + */ + public interface Renderer { + /** + * Called when the surface is created or recreated. + *

    + * Called when the rendering thread starts and whenever the EGL context + * is lost. The context will typically be lost when the Android device + * awakes after going to sleep. + *

    + * Since this method is called at the beginning of rendering, as well as + * every time the EGL context is lost, this method is a convenient place + * to put code to create resources that need to be created when the + * rendering starts, and that need to be recreated when the EGL context + * is lost. Textures are an example of a resource that you might want to + * create here. + *

    + * Note that when the EGL context is lost, all OpenGL resources + * associated with that context will be automatically deleted. You do + * not need to call the corresponding "glDelete" methods such as + * glDeleteTextures to manually delete these lost resources. + *

    + * + * @param gl + * the GL interface. Use instanceof to test if + * the interface supports GL11 or higher interfaces. + * @param config + * the EGLConfig of the created surface. Can be used to + * create matching pbuffers. + */ + void onSurfaceCreated(GL10 gl, EGLConfig config); + + /** + * Called when the surface changed size. + *

    + * Called after the surface is created and whenever the OpenGL ES + * surface size changes. + *

    + * Typically you will set your viewport here. If your camera is fixed + * then you could also set your projection matrix here: + * + *

    +		 * void onSurfaceChanged(GL10 gl, int width, int height) {
    +		 * 	gl.glViewport(0, 0, width, height);
    +		 * 	// for a fixed camera, set the projection too
    +		 * 	float ratio = (float) width / height;
    +		 * 	gl.glMatrixMode(GL10.GL_PROJECTION);
    +		 * 	gl.glLoadIdentity();
    +		 * 	gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    +		 * }
    +		 * 
    + * + * @param gl + * the GL interface. Use instanceof to test if + * the interface supports GL11 or higher interfaces. + * @param width + * @param height + */ + void onSurfaceChanged(GL10 gl, int width, int height); + + /** + * Called to draw the current frame. + *

    + * This method is responsible for drawing the current frame. + *

    + * The implementation of this method typically looks like this: + * + *

    +		 * void onDrawFrame(GL10 gl) {
    +		 * 	gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    +		 * 	//... other gl calls to render the scene ...
    +		 * }
    +		 * 
    + * + * @param gl + * the GL interface. Use instanceof to test if + * the interface supports GL11 or higher interfaces. + */ + void onDrawFrame(GL10 gl); + } +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/view/GLWrapper.java b/AndEngine/src/org/anddev/andengine/opengl/view/GLWrapper.java new file mode 100644 index 0000000..b3e95d9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/view/GLWrapper.java @@ -0,0 +1,47 @@ +package org.anddev.andengine.opengl.view; + +import javax.microedition.khronos.opengles.GL; + +/** + * An interface used to wrap a GL interface. + *

    + * Typically used for implementing debugging and tracing on top of the default + * GL interface. You would typically use this by creating your own class that + * implemented all the GL methods by delegating to another GL instance. Then you + * could add your own behavior before or after calling the delegate. All the + * GLWrapper would do was instantiate and return the wrapper GL instance: + * + *

    + * class MyGLWrapper implements GLWrapper {
    + *     GL wrap(GL gl) {
    + *         return new MyGLImplementation(gl);
    + *     }
    + *     static class MyGLImplementation implements GL,GL10,GL11,... {
    + *         ...
    + *     }
    + * }
    + * 
    + * + * @see #setGLWrapper(GLWrapper) + * + * @author Nicolas Gramlich + * @since 20:53:38 - 28.06.2010 + */ +public interface GLWrapper { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * Wraps a gl interface in another gl interface. + * + * @param pGL a GL interface that is to be wrapped. + * @return either the input argument or another GL object that wraps the + * input argument. + */ + public GL wrap(final GL pGL); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/view/LogWriter.java b/AndEngine/src/org/anddev/andengine/opengl/view/LogWriter.java new file mode 100644 index 0000000..d5bf7f7 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/view/LogWriter.java @@ -0,0 +1,73 @@ +/** + * + */ +package org.anddev.andengine.opengl.view; + +import java.io.Writer; + +import android.util.Log; + +/** + * @author Nicolas Gramlich + * @since 20:42:02 - 28.06.2010 + */ +class LogWriter extends Writer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final StringBuilder mBuilder = new StringBuilder(); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void close() { + this.flushBuilder(); + } + + @Override + public void flush() { + this.flushBuilder(); + } + + @Override + public void write(final char[] buf, final int offset, final int count) { + for(int i = 0; i < count; i++) { + final char c = buf[offset + i]; + if(c == '\n') { + this.flushBuilder(); + } else { + this.mBuilder.append(c); + } + } + } + + // =========================================================== + // Methods + // =========================================================== + + private void flushBuilder() { + if(this.mBuilder.length() > 0) { + Log.v("GLSurfaceView", this.mBuilder.toString()); + this.mBuilder.delete(0, this.mBuilder.length()); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/opengl/view/RenderSurfaceView.java b/AndEngine/src/org/anddev/andengine/opengl/view/RenderSurfaceView.java new file mode 100644 index 0000000..7363430 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/view/RenderSurfaceView.java @@ -0,0 +1,162 @@ +package org.anddev.andengine.opengl.view; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import org.anddev.andengine.engine.Engine; +import org.anddev.andengine.opengl.util.GLHelper; +import org.anddev.andengine.util.Debug; + +import android.content.Context; +import android.util.AttributeSet; + +/** + * @author Nicolas Gramlich + * @since 11:57:29 - 08.03.2010 + */ +public class RenderSurfaceView extends GLSurfaceView { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private Renderer mRenderer; + + // =========================================================== + // Constructors + // =========================================================== + + public RenderSurfaceView(final Context pContext) { + super(pContext); + } + + public RenderSurfaceView(final Context pContext, final AttributeSet pAttrs) { + super(pContext, pAttrs); + } + + public void setRenderer(final Engine pEngine) { + this.setOnTouchListener(pEngine); + this.mRenderer = new Renderer(pEngine); + this.setRenderer(this.mRenderer); + } + + /** + * @see android.view.View#measure(int, int) + */ + @Override + protected void onMeasure(final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + this.mRenderer.mEngine.getEngineOptions().getResolutionPolicy().onMeasure(this, pWidthMeasureSpec, pHeightMeasureSpec); + } + + public void setMeasuredDimensionProxy(final int pMeasuredWidth, final int pMeasuredHeight) { + this.setMeasuredDimension(pMeasuredWidth, pMeasuredHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + /** + * @author Nicolas Gramlich + * @since 11:45:59 - 08.03.2010 + */ + public static class Renderer implements GLSurfaceView.Renderer { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Engine mEngine; + + // =========================================================== + // Constructors + // =========================================================== + + public Renderer(final Engine pEngine) { + this.mEngine = pEngine; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onSurfaceChanged(final GL10 pGL, final int pWidth, final int pHeight) { + Debug.d("onSurfaceChanged: pWidth=" + pWidth + " pHeight=" + pHeight); + this.mEngine.setSurfaceSize(pWidth, pHeight); + pGL.glViewport(0, 0, pWidth, pHeight); + pGL.glLoadIdentity(); + } + + @Override + public void onSurfaceCreated(final GL10 pGL, final EGLConfig pConfig) { + Debug.d("onSurfaceCreated"); + GLHelper.reset(pGL); + + GLHelper.setPerspectiveCorrectionHintFastest(pGL); + // pGL.glEnable(GL10.GL_POLYGON_SMOOTH); + // pGL.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST); + // pGL.glEnable(GL10.GL_LINE_SMOOTH); + // pGL.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST); + // pGL.glEnable(GL10.GL_POINT_SMOOTH); + // pGL.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_NICEST); + + GLHelper.setShadeModelFlat(pGL); + + GLHelper.disableLightning(pGL); + GLHelper.disableDither(pGL); + GLHelper.disableDepthTest(pGL); + GLHelper.disableMultisample(pGL); + + GLHelper.enableBlend(pGL); + GLHelper.enableTextures(pGL); + GLHelper.enableTexCoordArray(pGL); + GLHelper.enableVertexArray(pGL); + + GLHelper.enableCulling(pGL); + pGL.glFrontFace(GL10.GL_CCW); + pGL.glCullFace(GL10.GL_BACK); + + GLHelper.enableExtensions(pGL, this.mEngine.getEngineOptions().getRenderOptions()); + } + + @Override + public void onDrawFrame(final GL10 pGL) { + try { + this.mEngine.onDrawFrame(pGL); + } catch (final InterruptedException e) { + Debug.e("GLThread interrupted!", e); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/opengl/view/SimpleEGLConfigChooser.java b/AndEngine/src/org/anddev/andengine/opengl/view/SimpleEGLConfigChooser.java new file mode 100644 index 0000000..86a37c5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/opengl/view/SimpleEGLConfigChooser.java @@ -0,0 +1,48 @@ +package org.anddev.andengine.opengl.view; + + +/** + * This class will choose a supported surface as close to RGB565 as + * possible, with or without a depth buffer. + * + * @author Nicolas Gramlich + * @since 20:53:29 - 28.06.2010 + */ +class SimpleEGLConfigChooser extends ComponentSizeChooser { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SimpleEGLConfigChooser(final boolean pWithDepthBuffer) { + super(4, 4, 4, 0, pWithDepthBuffer ? 16 : 0, 0); + // Adjust target values. This way we'll accept a 4444 or + // 555 buffer if there's no 565 buffer available. + this.mRedSize = 5; + this.mGreenSize = 6; + this.mBlueSize = 5; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/sensor/BaseSensorData.java b/AndEngine/src/org/anddev/andengine/sensor/BaseSensorData.java new file mode 100644 index 0000000..2c77924 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/BaseSensorData.java @@ -0,0 +1,65 @@ +package org.anddev.andengine.sensor; + +import java.util.Arrays; + +/** + * @author Nicolas Gramlich + * @since 16:50:44 - 10.03.2010 + */ +public class BaseSensorData { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final float[] mValues; + protected int mAccuracy; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseSensorData(final int pValueCount) { + this.mValues = new float[pValueCount]; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float[] getValues() { + return this.mValues; + } + + public void setValues(final float[] pValues) { + System.arraycopy(pValues, 0, mValues, 0, pValues.length); + } + + public void setAccuracy(final int pAccuracy) { + this.mAccuracy = pAccuracy; + } + + public int getAccuracy() { + return this.mAccuracy; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public String toString() { + return "Values: " + Arrays.toString(this.mValues); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/SensorDelay.java b/AndEngine/src/org/anddev/andengine/sensor/SensorDelay.java new file mode 100644 index 0000000..5c3bfa5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/SensorDelay.java @@ -0,0 +1,57 @@ +package org.anddev.andengine.sensor; + +import android.hardware.SensorManager; + + +/** + * @author Nicolas Gramlich + * @since 11:14:38 - 31.10.2010 + */ +public enum SensorDelay { + // =========================================================== + // Elements + // =========================================================== + + NORMAL(SensorManager.SENSOR_DELAY_NORMAL), + UI(SensorManager.SENSOR_DELAY_UI), + GAME(SensorManager.SENSOR_DELAY_GAME), + FASTEST(SensorManager.SENSOR_DELAY_FASTEST); + + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mDelay; + + // =========================================================== + // Constructors + // =========================================================== + + private SensorDelay(final int pDelay) { + this.mDelay = pDelay; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getDelay() { + return this.mDelay; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/accelerometer/AccelerometerData.java b/AndEngine/src/org/anddev/andengine/sensor/accelerometer/AccelerometerData.java new file mode 100644 index 0000000..b734e8a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/accelerometer/AccelerometerData.java @@ -0,0 +1,74 @@ +package org.anddev.andengine.sensor.accelerometer; + +import java.util.Arrays; + +import org.anddev.andengine.sensor.BaseSensorData; + +import android.hardware.SensorManager; + +/** + * @author Nicolas Gramlich + * @since 16:50:44 - 10.03.2010 + */ +public class AccelerometerData extends BaseSensorData { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public AccelerometerData() { + super(3); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getX() { + return this.mValues[SensorManager.DATA_X]; + } + + public float getY() { + return this.mValues[SensorManager.DATA_Y]; + } + + public float getZ() { + return this.mValues[SensorManager.DATA_Z]; + } + + public void setX(final float pX) { + this.mValues[SensorManager.DATA_X] = pX; + } + + public void setY(final float pY) { + this.mValues[SensorManager.DATA_Y] = pY; + } + + public void setZ(final float pZ) { + this.mValues[SensorManager.DATA_Z] = pZ; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public String toString() { + return "Accelerometer: " + Arrays.toString(this.mValues); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/accelerometer/AccelerometerSensorOptions.java b/AndEngine/src/org/anddev/andengine/sensor/accelerometer/AccelerometerSensorOptions.java new file mode 100644 index 0000000..ce9b3f3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/accelerometer/AccelerometerSensorOptions.java @@ -0,0 +1,47 @@ +package org.anddev.andengine.sensor.accelerometer; + +import org.anddev.andengine.sensor.SensorDelay; + +/** + * @author Nicolas Gramlich + * @since 11:10:34 - 31.10.2010 + */ +public class AccelerometerSensorOptions { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + final SensorDelay mSensorDelay; + + // =========================================================== + // Constructors + // =========================================================== + + public AccelerometerSensorOptions(final SensorDelay pSensorDelay) { + this.mSensorDelay = pSensorDelay; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public SensorDelay getSensorDelay() { + return this.mSensorDelay; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/accelerometer/IAccelerometerListener.java b/AndEngine/src/org/anddev/andengine/sensor/accelerometer/IAccelerometerListener.java new file mode 100644 index 0000000..eb33153 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/accelerometer/IAccelerometerListener.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.sensor.accelerometer; + +/** + * @author Nicolas Gramlich + * @since 16:58:38 - 10.03.2010 + */ +public interface IAccelerometerListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onAccelerometerChanged(final AccelerometerData pAccelerometerData); +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/location/ILocationListener.java b/AndEngine/src/org/anddev/andengine/sensor/location/ILocationListener.java new file mode 100644 index 0000000..1a499eb --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/location/ILocationListener.java @@ -0,0 +1,41 @@ +package org.anddev.andengine.sensor.location; + +import android.location.Location; +import android.location.LocationListener; +import android.os.Bundle; + +/** + * @author Nicolas Gramlich + * @since 10:39:23 - 31.10.2010 + */ +public interface ILocationListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * @see {@link LocationListener#onProviderEnabled(String)} + */ + public void onLocationProviderEnabled(); + + /** + * @see {@link LocationListener#onLocationChanged(Location)} + */ + public void onLocationChanged(final Location pLocation); + + public void onLocationLost(); + + /** + * @see {@link LocationListener#onProviderDisabled(String)} + */ + public void onLocationProviderDisabled(); + + /** + * @see {@link LocationListener#onStatusChanged(String, int, android.os.Bundle)} + */ + public void onLocationProviderStatusChanged(final LocationProviderStatus pLocationProviderStatus, final Bundle pBundle); +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/location/LocationProviderStatus.java b/AndEngine/src/org/anddev/andengine/sensor/location/LocationProviderStatus.java new file mode 100644 index 0000000..a86b103 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/location/LocationProviderStatus.java @@ -0,0 +1,43 @@ +package org.anddev.andengine.sensor.location; + +/** + * @author Nicolas Gramlich + * @since 10:55:57 - 31.10.2010 + */ +public enum LocationProviderStatus { + // =========================================================== + // Elements + // =========================================================== + + AVAILABLE, + OUT_OF_SERVICE, + TEMPORARILY_UNAVAILABLE; + + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/location/LocationSensorOptions.java b/AndEngine/src/org/anddev/andengine/sensor/location/LocationSensorOptions.java new file mode 100644 index 0000000..881f753 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/location/LocationSensorOptions.java @@ -0,0 +1,110 @@ +package org.anddev.andengine.sensor.location; + +import org.anddev.andengine.util.constants.TimeConstants; + +import android.location.Criteria; + +/** + * @author Nicolas Gramlich + * @since 11:02:12 - 31.10.2010 + */ +public class LocationSensorOptions extends Criteria { + // =========================================================== + // Constants + // =========================================================== + + private static final long MINIMUMTRIGGERTIME_DEFAULT = 1 * TimeConstants.MILLISECONDSPERSECOND; + private static final long MINIMUMTRIGGERDISTANCE_DEFAULT = 10; + + // =========================================================== + // Fields + // =========================================================== + + private boolean mEnabledOnly = true; + + private long mMinimumTriggerTime = MINIMUMTRIGGERTIME_DEFAULT; + private long mMinimumTriggerDistance = MINIMUMTRIGGERDISTANCE_DEFAULT; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * @see {@link LocationSensorOptions#setAccuracy(int)}, + * {@link LocationSensorOptions#setAltitudeRequired(boolean)}, + * {@link LocationSensorOptions#setBearingRequired(boolean)}, + * {@link LocationSensorOptions#setCostAllowed(boolean)}, + * {@link LocationSensorOptions#setEnabledOnly(boolean)}, + * {@link LocationSensorOptions#setMinimumTriggerDistance(long)}, + * {@link LocationSensorOptions#setMinimumTriggerTime(long)}, + * {@link LocationSensorOptions#setPowerRequirement(int)}, + * {@link LocationSensorOptions#setSpeedRequired(boolean)}. + */ + public LocationSensorOptions() { + + } + + /** + * @param pAccuracy + * @param pAltitudeRequired + * @param pBearingRequired + * @param pCostAllowed + * @param pPowerRequirement + * @param pSpeedRequired + * @param pEnabledOnly + * @param pMinimumTriggerTime + * @param pMinimumTriggerDistance + */ + public LocationSensorOptions(final int pAccuracy, final boolean pAltitudeRequired, final boolean pBearingRequired, final boolean pCostAllowed, final int pPowerRequirement, final boolean pSpeedRequired, final boolean pEnabledOnly, final long pMinimumTriggerTime, final long pMinimumTriggerDistance) { + this.mEnabledOnly = pEnabledOnly; + this.mMinimumTriggerTime = pMinimumTriggerTime; + this.mMinimumTriggerDistance = pMinimumTriggerDistance; + + this.setAccuracy(pAccuracy); + this.setAltitudeRequired(pAltitudeRequired); + this.setBearingRequired(pBearingRequired); + this.setCostAllowed(pCostAllowed); + this.setPowerRequirement(pPowerRequirement); + this.setSpeedRequired(pSpeedRequired); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public void setEnabledOnly(final boolean pEnabledOnly) { + this.mEnabledOnly = pEnabledOnly; + } + + public boolean isEnabledOnly() { + return this.mEnabledOnly; + } + + public long getMinimumTriggerTime() { + return this.mMinimumTriggerTime; + } + + public void setMinimumTriggerTime(final long pMinimumTriggerTime) { + this.mMinimumTriggerTime = pMinimumTriggerTime; + } + + public long getMinimumTriggerDistance() { + return this.mMinimumTriggerDistance; + } + + public void setMinimumTriggerDistance(final long pMinimumTriggerDistance) { + this.mMinimumTriggerDistance = pMinimumTriggerDistance; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/orientation/IOrientationListener.java b/AndEngine/src/org/anddev/andengine/sensor/orientation/IOrientationListener.java new file mode 100644 index 0000000..8f79329 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/orientation/IOrientationListener.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.sensor.orientation; + +/** + * @author Nicolas Gramlich + * @since 11:30:42 - 25.05.2010 + */ +public interface IOrientationListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onOrientationChanged(final OrientationData pOrientationData); +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/orientation/OrientationData.java b/AndEngine/src/org/anddev/andengine/sensor/orientation/OrientationData.java new file mode 100644 index 0000000..25d6e17 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/orientation/OrientationData.java @@ -0,0 +1,139 @@ +package org.anddev.andengine.sensor.orientation; + +import java.util.Arrays; + +import org.anddev.andengine.sensor.BaseSensorData; +import org.anddev.andengine.util.constants.MathConstants; + +import android.hardware.SensorManager; +import android.view.Surface; + +/** + * @author Nicolas Gramlich + * @since 11:30:33 - 25.05.2010 + */ +public class OrientationData extends BaseSensorData { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float[] mAccelerometerValues = new float[3]; + private final float[] mMagneticFieldValues = new float[3]; + private final float[] mRotationMatrix = new float[16]; + + private int mMagneticFieldAccuracy; + + private final int mDisplayRotation; + + // =========================================================== + // Constructors + // =========================================================== + + public OrientationData(final int mDisplayRotation) { + super(3); + + this.mDisplayRotation = mDisplayRotation; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public float getRoll() { + return super.mValues[SensorManager.DATA_Z]; + } + + public float getPitch() { + return super.mValues[SensorManager.DATA_Y]; + } + + public float getYaw() { + return super.mValues[SensorManager.DATA_X]; + } + + @Override + @Deprecated + public void setValues(final float[] pValues) { + super.setValues(pValues); + } + + @Override + @Deprecated + public void setAccuracy(final int pAccuracy) { + super.setAccuracy(pAccuracy); + } + + public void setAccelerometerValues(final float[] pValues) { + System.arraycopy(pValues, 0, this.mAccelerometerValues, 0, pValues.length); + this.updateOrientation(); + } + + public void setMagneticFieldValues(final float[] pValues) { + System.arraycopy(pValues, 0, this.mMagneticFieldValues, 0, pValues.length); + this.updateOrientation(); + } + + private void updateOrientation() { + SensorManager.getRotationMatrix(this.mRotationMatrix, null, this.mAccelerometerValues, this.mMagneticFieldValues); + + // TODO Use dont't use identical matrixes in remapCoordinateSystem, due to performance reasons. + switch(this.mDisplayRotation) { + case Surface.ROTATION_90: + SensorManager.remapCoordinateSystem(this.mRotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, this.mRotationMatrix); + break; +// case Surface.ROTATION_180: +// SensorManager.remapCoordinateSystem(this.mRotationMatrix, SensorManager.AXIS_?, SensorManager.AXIS_?, this.mRotationMatrix); +// break; +// case Surface.ROTATION_270: +// SensorManager.remapCoordinateSystem(this.mRotationMatrix, SensorManager.AXIS_?, SensorManager.AXIS_?, this.mRotationMatrix); +// break; + case Surface.ROTATION_0: + /* Nothing. */ + break; + } + + final float[] values = this.mValues; + SensorManager.getOrientation(this.mRotationMatrix, values); + + for(int i = values.length - 1; i >= 0; i--) { + values[i] = values[i] * MathConstants.RAD_TO_DEG; + } + } + + public int getAccelerometerAccuracy() { + return this.getAccuracy(); + } + + public void setAccelerometerAccuracy(final int pAccelerometerAccuracy) { + super.setAccuracy(pAccelerometerAccuracy); + } + + public int getMagneticFieldAccuracy() { + return this.mMagneticFieldAccuracy; + } + + public void setMagneticFieldAccuracy(final int pMagneticFieldAccuracy) { + this.mMagneticFieldAccuracy = pMagneticFieldAccuracy; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public String toString() { + return "Orientation: " + Arrays.toString(this.mValues); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/sensor/orientation/OrientationSensorOptions.java b/AndEngine/src/org/anddev/andengine/sensor/orientation/OrientationSensorOptions.java new file mode 100644 index 0000000..e4e2f91 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/sensor/orientation/OrientationSensorOptions.java @@ -0,0 +1,47 @@ +package org.anddev.andengine.sensor.orientation; + +import org.anddev.andengine.sensor.SensorDelay; + +/** + * @author Nicolas Gramlich + * @since 11:12:36 - 31.10.2010 + */ +public class OrientationSensorOptions { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + final SensorDelay mSensorDelay; + + // =========================================================== + // Constructors + // =========================================================== + + public OrientationSensorOptions(final SensorDelay pSensorDelay) { + this.mSensorDelay = pSensorDelay; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public SensorDelay getSensorDelay() { + return this.mSensorDelay; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/ui/IGameInterface.java b/AndEngine/src/org/anddev/andengine/ui/IGameInterface.java new file mode 100644 index 0000000..818d330 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/ui/IGameInterface.java @@ -0,0 +1,27 @@ +package org.anddev.andengine.ui; + +import org.anddev.andengine.engine.Engine; +import org.anddev.andengine.entity.scene.Scene; + +/** + * @author Nicolas Gramlich + * @since 12:03:08 - 14.03.2010 + */ +public interface IGameInterface { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public Engine onLoadEngine(); + public void onLoadResources(); + public void onUnloadResources(); + public Scene onLoadScene(); + public void onLoadComplete(); + + public void onGamePaused(); + public void onGameResumed(); +} diff --git a/AndEngine/src/org/anddev/andengine/ui/activity/BaseActivity.java b/AndEngine/src/org/anddev/andengine/ui/activity/BaseActivity.java new file mode 100644 index 0000000..a2138d9 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/ui/activity/BaseActivity.java @@ -0,0 +1,127 @@ +package org.anddev.andengine.ui.activity; + +import java.util.concurrent.Callable; + +import org.anddev.andengine.util.ActivityUtils; +import org.anddev.andengine.util.AsyncCallable; +import org.anddev.andengine.util.Callback; +import org.anddev.andengine.util.progress.ProgressCallable; + +import android.app.Activity; +import android.app.ProgressDialog; + +/** + * @author Nicolas Gramlich + * @since 18:35:28 - 29.08.2009 + */ +public abstract class BaseActivity extends Activity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * Performs a task in the background, showing a {@link ProgressDialog}, + * while the {@link Callable} is being processed. + * + * @param + * @param pTitleResID + * @param pMessageResID + * @param pErrorMessageResID + * @param pCallable + * @param pCallback + */ + protected void doAsync(final int pTitleResID, final int pMessageResID, final Callable pCallable, final Callback pCallback) { + this.doAsync(pTitleResID, pMessageResID, pCallable, pCallback, null); + } + + /** + * Performs a task in the background, showing a indeterminate {@link ProgressDialog}, + * while the {@link Callable} is being processed. + * + * @param + * @param pTitleResID + * @param pMessageResID + * @param pErrorMessageResID + * @param pCallable + * @param pCallback + * @param pExceptionCallback + */ + protected void doAsync(final int pTitleResID, final int pMessageResID, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + ActivityUtils.doAsync(this, pTitleResID, pMessageResID, pCallable, pCallback, pExceptionCallback); + } + + /** + * Performs a task in the background, showing a {@link ProgressDialog} with an ProgressBar, + * while the {@link AsyncCallable} is being processed. + * + * @param + * @param pTitleResID + * @param pMessageResID + * @param pErrorMessageResID + * @param pAsyncCallable + * @param pCallback + */ + protected void doProgressAsync(final int pTitleResID, final ProgressCallable pCallable, final Callback pCallback) { + this.doProgressAsync(pTitleResID, pCallable, pCallback, null); + } + + /** + * Performs a task in the background, showing a {@link ProgressDialog} with a ProgressBar, + * while the {@link AsyncCallable} is being processed. + * + * @param + * @param pTitleResID + * @param pMessageResID + * @param pErrorMessageResID + * @param pAsyncCallable + * @param pCallback + * @param pExceptionCallback + */ + protected void doProgressAsync(final int pTitleResID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + ActivityUtils.doProgressAsync(this, pTitleResID, pCallable, pCallback, pExceptionCallback); + } + + /** + * Performs a task in the background, showing an indeterminate {@link ProgressDialog}, + * while the {@link AsyncCallable} is being processed. + * + * @param + * @param pTitleResID + * @param pMessageResID + * @param pErrorMessageResID + * @param pAsyncCallable + * @param pCallback + * @param pExceptionCallback + */ + protected void doAsync(final int pTitleResID, final int pMessageResID, final AsyncCallable pAsyncCallable, final Callback pCallback, final Callback pExceptionCallback) { + ActivityUtils.doAsync(this, pTitleResID, pMessageResID, pAsyncCallable, pCallback, pExceptionCallback); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class CancelledException extends Exception { + private static final long serialVersionUID = -78123211381435596L; + } +} diff --git a/AndEngine/src/org/anddev/andengine/ui/activity/BaseGameActivity.java b/AndEngine/src/org/anddev/andengine/ui/activity/BaseGameActivity.java new file mode 100644 index 0000000..87bdd34 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/ui/activity/BaseGameActivity.java @@ -0,0 +1,303 @@ +package org.anddev.andengine.ui.activity; + +import static android.view.ViewGroup.LayoutParams.FILL_PARENT; + +import org.anddev.andengine.audio.music.MusicManager; +import org.anddev.andengine.audio.sound.SoundManager; +import org.anddev.andengine.engine.Engine; +import org.anddev.andengine.engine.options.EngineOptions; +import org.anddev.andengine.engine.options.WakeLockOptions; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.opengl.view.RenderSurfaceView; +import org.anddev.andengine.sensor.accelerometer.AccelerometerSensorOptions; +import org.anddev.andengine.sensor.accelerometer.IAccelerometerListener; +import org.anddev.andengine.sensor.location.ILocationListener; +import org.anddev.andengine.sensor.location.LocationSensorOptions; +import org.anddev.andengine.sensor.orientation.IOrientationListener; +import org.anddev.andengine.sensor.orientation.OrientationSensorOptions; +import org.anddev.andengine.ui.IGameInterface; +import org.anddev.andengine.util.ActivityUtils; +import org.anddev.andengine.util.Debug; + +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.media.AudioManager; +import android.os.Bundle; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; +import android.view.Gravity; +import android.widget.FrameLayout.LayoutParams; + +/** + * @author Nicolas Gramlich + * @since 11:27:06 - 08.03.2010 + */ +public abstract class BaseGameActivity extends BaseActivity implements IGameInterface { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected Engine mEngine; + private WakeLock mWakeLock; + protected RenderSurfaceView mRenderSurfaceView; + protected boolean mHasWindowFocused; + private boolean mPaused; + private boolean mGameLoaded; + + // =========================================================== + // Constructors + // =========================================================== + + @Override + protected void onCreate(final Bundle pSavedInstanceState) { + super.onCreate(pSavedInstanceState); + this.mPaused = true; + + this.mEngine = this.onLoadEngine(); + + this.applyEngineOptions(this.mEngine.getEngineOptions()); + + this.onSetContentView(); + } + + @Override + protected void onResume() { + super.onResume(); + + if(this.mPaused && this.mHasWindowFocused) { + this.doResume(); + } + } + + @Override + public void onWindowFocusChanged(final boolean pHasWindowFocus) { + super.onWindowFocusChanged(pHasWindowFocus); + + if(pHasWindowFocus) { + if(this.mPaused) { + this.doResume(); + } + this.mHasWindowFocused = true; + } else { + if(!this.mPaused) { + this.doPause(); + } + this.mHasWindowFocused = false; + } + } + + @Override + protected void onPause() { + super.onPause(); + + if(!this.mPaused) { + this.doPause(); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + this.mEngine.interruptUpdateThread(); + + this.onUnloadResources(); + } + + @Override + public void onUnloadResources() { + if(this.mEngine.getEngineOptions().needsMusic()) { + this.getMusicManager().releaseAll(); + } + if(this.mEngine.getEngineOptions().needsSound()) { + this.getSoundManager().releaseAll(); + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Engine getEngine() { + return this.mEngine; + } + + public SoundManager getSoundManager() { + return this.mEngine.getSoundManager(); + } + + public MusicManager getMusicManager() { + return this.mEngine.getMusicManager(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onGameResumed() { + + } + + @Override + public void onGamePaused() { + + } + + // =========================================================== + // Methods + // =========================================================== + + private void doResume() { + if(!this.mGameLoaded) { + this.onLoadResources(); + final Scene scene = this.onLoadScene(); + this.mEngine.onLoadComplete(scene); + this.onLoadComplete(); + this.mGameLoaded = true; + } + + this.mPaused = false; + this.acquireWakeLock(this.mEngine.getEngineOptions().getWakeLockOptions()); + this.mEngine.onResume(); + + this.mRenderSurfaceView.onResume(); + this.mEngine.start(); + this.onGameResumed(); + } + + private void doPause() { + this.mPaused = true; + this.releaseWakeLock(); + + this.mEngine.onPause(); + this.mEngine.stop(); + this.mRenderSurfaceView.onPause(); + this.onGamePaused(); + } + + public void runOnUpdateThread(final Runnable pRunnable) { + this.mEngine.runOnUpdateThread(pRunnable); + } + + protected void onSetContentView() { + this.mRenderSurfaceView = new RenderSurfaceView(this); + this.mRenderSurfaceView.setEGLConfigChooser(false); + this.mRenderSurfaceView.setRenderer(this.mEngine); + + this.setContentView(this.mRenderSurfaceView, this.createSurfaceViewLayoutParams()); + } + + private void acquireWakeLock(final WakeLockOptions pWakeLockOptions) { + if(pWakeLockOptions == WakeLockOptions.SCREEN_ON) { + ActivityUtils.keepScreenOn(this); + } else { + final PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE); + this.mWakeLock = pm.newWakeLock(pWakeLockOptions.getFlag() | PowerManager.ON_AFTER_RELEASE, "AndEngine"); + try { + this.mWakeLock.acquire(); + } catch (final SecurityException e) { + Debug.e("You have to add\n\t\nto your AndroidManifest.xml !", e); + } + } + } + + private void releaseWakeLock() { + if(this.mWakeLock != null && this.mWakeLock.isHeld()) { + this.mWakeLock.release(); + } + } + + private void applyEngineOptions(final EngineOptions pEngineOptions) { + if(pEngineOptions.isFullscreen()) { + ActivityUtils.requestFullscreen(this); + } + + if(pEngineOptions.needsMusic() || pEngineOptions.needsSound()) { + this.setVolumeControlStream(AudioManager.STREAM_MUSIC); + } + + switch(pEngineOptions.getScreenOrientation()) { + case LANDSCAPE: + this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + break; + case PORTRAIT: + this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + break; + } + } + + protected LayoutParams createSurfaceViewLayoutParams() { + final LayoutParams layoutParams = new LayoutParams(FILL_PARENT, FILL_PARENT); + layoutParams.gravity = Gravity.CENTER; + return layoutParams; + } + + protected void enableVibrator() { + this.mEngine.enableVibrator(this); + } + + /** + * @see {@link Engine#enableLocationSensor(Context, ILocationListener, LocationSensorOptions)} + */ + protected void enableLocationSensor(final ILocationListener pLocationListener, final LocationSensorOptions pLocationSensorOptions) { + this.mEngine.enableLocationSensor(this, pLocationListener, pLocationSensorOptions); + } + + /** + * @see {@link Engine#disableLocationSensor(Context)} + */ + protected void disableLocationSensor() { + this.mEngine.disableLocationSensor(this); + } + + /** + * @see {@link Engine#enableAccelerometerSensor(Context, IAccelerometerListener)} + */ + protected boolean enableAccelerometerSensor(final IAccelerometerListener pAccelerometerListener) { + return this.mEngine.enableAccelerometerSensor(this, pAccelerometerListener); + } + + /** + * @see {@link Engine#enableAccelerometerSensor(Context, IAccelerometerListener, AccelerometerSensorOptions)} + */ + protected boolean enableAccelerometerSensor(final IAccelerometerListener pAccelerometerListener, final AccelerometerSensorOptions pAccelerometerSensorOptions) { + return this.mEngine.enableAccelerometerSensor(this, pAccelerometerListener, pAccelerometerSensorOptions); + } + + /** + * @see {@link Engine#disableAccelerometerSensor(Context)} + */ + protected boolean disableAccelerometerSensor() { + return this.mEngine.disableAccelerometerSensor(this); + } + + /** + * @see {@link Engine#enableOrientationSensor(Context, IOrientationListener)} + */ + protected boolean enableOrientationSensor(final IOrientationListener pOrientationListener) { + return this.mEngine.enableOrientationSensor(this, pOrientationListener); + } + + /** + * @see {@link Engine#enableOrientationSensor(Context, IOrientationListener, OrientationSensorOptions)} + */ + protected boolean enableOrientationSensor(final IOrientationListener pOrientationListener, final OrientationSensorOptions pLocationSensorOptions) { + return this.mEngine.enableOrientationSensor(this, pOrientationListener, pLocationSensorOptions); + } + + /** + * @see {@link Engine#disableOrientationSensor(Context)} + */ + protected boolean disableOrientationSensor() { + return this.mEngine.disableOrientationSensor(this); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/ui/activity/BaseSplashActivity.java b/AndEngine/src/org/anddev/andengine/ui/activity/BaseSplashActivity.java new file mode 100644 index 0000000..1ca0d49 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/ui/activity/BaseSplashActivity.java @@ -0,0 +1,123 @@ +package org.anddev.andengine.ui.activity; + +import org.anddev.andengine.engine.Engine; +import org.anddev.andengine.engine.camera.Camera; +import org.anddev.andengine.engine.handler.timer.ITimerCallback; +import org.anddev.andengine.engine.handler.timer.TimerHandler; +import org.anddev.andengine.engine.options.EngineOptions; +import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation; +import org.anddev.andengine.engine.options.resolutionpolicy.IResolutionPolicy; +import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; +import org.anddev.andengine.entity.scene.Scene; +import org.anddev.andengine.entity.scene.SplashScene; +import org.anddev.andengine.opengl.texture.Texture; +import org.anddev.andengine.opengl.texture.TextureFactory; +import org.anddev.andengine.opengl.texture.TextureOptions; +import org.anddev.andengine.opengl.texture.region.TextureRegion; +import org.anddev.andengine.opengl.texture.region.TextureRegionFactory; +import org.anddev.andengine.opengl.texture.source.ITextureSource; + +import android.app.Activity; +import android.content.Intent; + +/** + * @author Nicolas Gramlich + * @since 08:25:31 - 03.05.2010 + */ +public abstract class BaseSplashActivity extends BaseGameActivity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private Camera mCamera; + private ITextureSource mSplashTextureSource; + private TextureRegion mLoadingScreenTextureRegion; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract ScreenOrientation getScreenOrientation(); + + protected abstract ITextureSource onGetSplashTextureSource(); + + protected abstract float getSplashDuration(); + + protected abstract Class getFollowUpActivity(); + + protected float getSplashScaleFrom() { + return 1f; + } + + protected float getSplashScaleTo() { + return 1f; + } + + @Override + public void onLoadComplete() { + } + + @Override + public Engine onLoadEngine() { + this.mSplashTextureSource = this.onGetSplashTextureSource(); + + final int width = this.mSplashTextureSource.getWidth(); + final int height = this.mSplashTextureSource.getHeight(); + + this.mCamera = this.getSplashCamera(width, height); + return new Engine(new EngineOptions(true, this.getScreenOrientation(), this.getSplashResolutionPolicy(width, height), this.mCamera)); + } + + @Override + public void onLoadResources() { + final Texture loadingScreenTexture = TextureFactory.createForTextureSourceSize(this.mSplashTextureSource, TextureOptions.BILINEAR_PREMULTIPLYALPHA); + this.mLoadingScreenTextureRegion = TextureRegionFactory.createFromSource(loadingScreenTexture, this.mSplashTextureSource, 0, 0); + + this.getEngine().getTextureManager().loadTexture(loadingScreenTexture); + } + + @Override + public Scene onLoadScene() { + final float splashDuration = this.getSplashDuration(); + + final SplashScene splashScene = new SplashScene(this.mCamera, this.mLoadingScreenTextureRegion, splashDuration, this.getSplashScaleFrom(), this.getSplashScaleTo()); + + splashScene.registerUpdateHandler(new TimerHandler(splashDuration, new ITimerCallback() { + @Override + public void onTimePassed(final TimerHandler pTimerHandler) { + BaseSplashActivity.this.startActivity(new Intent(BaseSplashActivity.this, BaseSplashActivity.this.getFollowUpActivity())); + BaseSplashActivity.this.finish(); + } + })); + + return splashScene; + } + + // =========================================================== + // Methods + // =========================================================== + + protected Camera getSplashCamera(final int pSplashwidth, final int pSplashHeight) { + return new Camera(0, 0, pSplashwidth, pSplashHeight); + } + + protected IResolutionPolicy getSplashResolutionPolicy(final int pSplashwidth, final int pSplashHeight) { + return new RatioResolutionPolicy(pSplashwidth, pSplashHeight); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/ui/activity/LayoutGameActivity.java b/AndEngine/src/org/anddev/andengine/ui/activity/LayoutGameActivity.java new file mode 100644 index 0000000..19528ca --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/ui/activity/LayoutGameActivity.java @@ -0,0 +1,50 @@ +package org.anddev.andengine.ui.activity; + +import org.anddev.andengine.opengl.view.RenderSurfaceView; + +/** + * @author Nicolas Gramlich + * @since 10:18:50 - 06.10.2010 + */ +public abstract class LayoutGameActivity extends BaseGameActivity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract int getLayoutID(); + protected abstract int getRenderSurfaceViewID(); + + @Override + protected void onSetContentView() { + super.setContentView(this.getLayoutID()); + + this.mRenderSurfaceView = (RenderSurfaceView) this.findViewById(this.getRenderSurfaceViewID()); + + this.mRenderSurfaceView.setEGLConfigChooser(false); + this.mRenderSurfaceView.setRenderer(this.mEngine); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/ui/dialog/GenericInputDialogBuilder.java b/AndEngine/src/org/anddev/andengine/ui/dialog/GenericInputDialogBuilder.java new file mode 100644 index 0000000..d3d9b1c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/ui/dialog/GenericInputDialogBuilder.java @@ -0,0 +1,120 @@ +package org.anddev.andengine.ui.dialog; + +import org.anddev.andengine.util.Callback; +import org.anddev.andengine.util.Debug; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; +import android.content.DialogInterface.OnClickListener; +import android.widget.EditText; +import android.widget.Toast; + +/** + * @author Nicolas Gramlich + * @since 09:35:55 - 14.12.2009 + */ +public abstract class GenericInputDialogBuilder { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final Callback mSuccessCallback; + protected final OnCancelListener mOnCancelListener; + protected final int mTitleResID; + protected final int mMessageResID; + protected final int mIconResID; + protected final Context mContext; + private final int mErrorResID; + private final String mDefaultText; + + // =========================================================== + // Constructors + // =========================================================== + + public GenericInputDialogBuilder(final Context pContext, final int pTitleResID, final int pMessageResID, final int pErrorResID, final int pIconResID, final Callback pSuccessCallback, final OnCancelListener pOnCancelListener){ + this(pContext, pTitleResID, pMessageResID, pErrorResID, pIconResID, "", pSuccessCallback, pOnCancelListener); + } + + public GenericInputDialogBuilder(final Context pContext, final int pTitleResID, final int pMessageResID, final int pErrorResID, final int pIconResID, final String pDefaultText, final Callback pSuccessCallback, final OnCancelListener pOnCancelListener){ + this.mContext = pContext; + this.mTitleResID = pTitleResID; + this.mMessageResID = pMessageResID; + this.mErrorResID = pErrorResID; + this.mIconResID = pIconResID; + this.mDefaultText = pDefaultText; + this.mSuccessCallback = pSuccessCallback; + this.mOnCancelListener = pOnCancelListener; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract T generateResult(final String pInput); + + // =========================================================== + // Methods + // =========================================================== + + public Dialog create() { + final EditText etInput = new EditText(this.mContext); + etInput.setText(this.mDefaultText); + + final AlertDialog.Builder ab = new AlertDialog.Builder(this.mContext); + if(this.mTitleResID != 0) { + ab.setTitle(this.mTitleResID); + } + if(this.mMessageResID != 0) { + ab.setMessage(this.mMessageResID); + } + if(this.mIconResID != 0) { + ab.setIcon(this.mIconResID); + } + + this.setView(ab, etInput); + ab.setOnCancelListener(this.mOnCancelListener) + .setPositiveButton(android.R.string.ok, new OnClickListener() { + @Override + public void onClick(final DialogInterface pDialog, final int pWhich) { + final T result; + try{ + result = GenericInputDialogBuilder.this.generateResult(etInput.getText().toString()); + } catch (final IllegalArgumentException e) { + Debug.e("Error in GenericInputDialogBuilder.generateResult()", e); + Toast.makeText(GenericInputDialogBuilder.this.mContext, GenericInputDialogBuilder.this.mErrorResID, Toast.LENGTH_SHORT).show(); + return; + } + GenericInputDialogBuilder.this.mSuccessCallback.onCallback(result); + pDialog.dismiss(); + } + }) + .setNegativeButton(android.R.string.cancel, new OnClickListener() { + @Override + public void onClick(final DialogInterface pDialog, final int pWhich) { + GenericInputDialogBuilder.this.mOnCancelListener.onCancel(pDialog); + pDialog.dismiss(); + } + }); + + return ab.create(); + } + + protected void setView(final AlertDialog.Builder pBuilder, final EditText pInputEditText) { + pBuilder.setView(pInputEditText); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/ui/dialog/StringInputDialogBuilder.java b/AndEngine/src/org/anddev/andengine/ui/dialog/StringInputDialogBuilder.java new file mode 100644 index 0000000..8a5ac82 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/ui/dialog/StringInputDialogBuilder.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.ui.dialog; + +import org.anddev.andengine.util.Callback; + +import android.content.Context; +import android.content.DialogInterface.OnCancelListener; + +/** + * @author Nicolas Gramlich + * @since 09:46:00 - 14.12.2009 + */ +public class StringInputDialogBuilder extends GenericInputDialogBuilder { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public StringInputDialogBuilder(final Context pContext, final int pTitleResID, final int pMessageResID, final int pErrorResID, final int pIconResID, final Callback pSuccessCallback, final OnCancelListener pOnCancelListener) { + super(pContext, pTitleResID, pMessageResID, pErrorResID, pIconResID, pSuccessCallback, pOnCancelListener); + } + + public StringInputDialogBuilder(final Context pContext, final int pTitleResID, final int pMessageResID, final int pErrorResID, final int pIconResID, final String pDefaultText, final Callback pSuccessCallback, final OnCancelListener pOnCancelListener) { + super(pContext, pTitleResID, pMessageResID, pErrorResID, pIconResID, pDefaultText, pSuccessCallback, pOnCancelListener); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected String generateResult(final String pInput) { + return pInput; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/ActivityUtils.java b/AndEngine/src/org/anddev/andengine/util/ActivityUtils.java new file mode 100644 index 0000000..8da5851 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/ActivityUtils.java @@ -0,0 +1,242 @@ +package org.anddev.andengine.util; + +import java.util.concurrent.Callable; + +import org.anddev.andengine.ui.activity.BaseActivity.CancelledException; +import org.anddev.andengine.util.progress.IProgressListener; +import org.anddev.andengine.util.progress.ProgressCallable; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; +import android.os.AsyncTask; +import android.view.Window; +import android.view.WindowManager; + +/** + * @author Nicolas Gramlich + * @since 18:11:54 - 07.03.2011 + */ +public class ActivityUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static void requestFullscreen(final Activity pActivity) { + final Window window = pActivity.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + window.requestFeature(Window.FEATURE_NO_TITLE); + } + + /** + * @param pActivity + * @param pScreenBrightness [0..1] + */ + public static void setScreenBrightness(final Activity pActivity, final float pScreenBrightness) { + final Window window = pActivity.getWindow(); + final WindowManager.LayoutParams windowLayoutParams = window.getAttributes(); + windowLayoutParams.screenBrightness = pScreenBrightness; + window.setAttributes(windowLayoutParams); + } + + public static void keepScreenOn(final Activity pActivity) { + pActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + + public static void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable pCallable, final Callback pCallback) { + ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, null, false); + } + + public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback) { + ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, null, false); + } + + public static void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable pCallable, final Callback pCallback, final boolean pCancelable) { + ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, null, pCancelable); + } + + public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final boolean pCancelable) { + ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, null, pCancelable); + } + + public static void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, pExceptionCallback, false); + } + + public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, pExceptionCallback, false); + } + + public static void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) { + ActivityUtils.doAsync(pContext, pContext.getString(pTitleResID), pContext.getString(pMessageResID), pCallable, pCallback, pExceptionCallback, pCancelable); + } + + public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) { + new AsyncTask() { + private ProgressDialog mPD; + private Exception mException = null; + + @Override + public void onPreExecute() { + this.mPD = ProgressDialog.show(pContext, pTitle, pMessage, true, pCancelable); + if(pCancelable) { + this.mPD.setOnCancelListener(new OnCancelListener() { + @Override + public void onCancel(final DialogInterface pDialogInterface) { + pExceptionCallback.onCallback(new CancelledException()); + pDialogInterface.dismiss(); + } + }); + } + super.onPreExecute(); + } + + @Override + public T doInBackground(final Void... params) { + try { + return pCallable.call(); + } catch (final Exception e) { + this.mException = e; + } + return null; + } + + @Override + public void onPostExecute(final T result) { + try { + this.mPD.dismiss(); + } catch (final Exception e) { + Debug.e("Error", e); + } + + if(this.isCancelled()) { + this.mException = new CancelledException(); + } + + if(this.mException == null) { + pCallback.onCallback(result); + } else { + if(pExceptionCallback == null) { + Debug.e("Error", this.mException); + } else { + pExceptionCallback.onCallback(this.mException); + } + } + + super.onPostExecute(result); + } + }.execute((Void[]) null); + } + + public static void doProgressAsync(final Context pContext, final int pTitleResID, final ProgressCallable pCallable, final Callback pCallback) { + ActivityUtils.doProgressAsync(pContext, pTitleResID, pCallable, pCallback, null); + } + + public static void doProgressAsync(final Context pContext, final int pTitleResID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + new AsyncTask() { + private ProgressDialog mPD; + private Exception mException = null; + + @Override + public void onPreExecute() { + this.mPD = new ProgressDialog(pContext); + this.mPD.setTitle(pTitleResID); + this.mPD.setIcon(android.R.drawable.ic_menu_save); + this.mPD.setIndeterminate(false); + this.mPD.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + this.mPD.show(); + super.onPreExecute(); + } + + @Override + public T doInBackground(final Void... params) { + try { + return pCallable.call(new IProgressListener() { + @Override + public void onProgressChanged(final int pProgress) { + onProgressUpdate(pProgress); + } + }); + } catch (final Exception e) { + this.mException = e; + } + return null; + } + + @Override + public void onProgressUpdate(final Integer... values) { + this.mPD.setProgress(values[0]); + } + + @Override + public void onPostExecute(final T result) { + try { + this.mPD.dismiss(); + } catch (final Exception e) { + Debug.e("Error", e); + /* Nothing. */ + } + + if(this.isCancelled()) { + this.mException = new CancelledException(); + } + + if(this.mException == null) { + pCallback.onCallback(result); + } else { + if(pExceptionCallback == null) { + Debug.e("Error", this.mException); + } else { + pExceptionCallback.onCallback(this.mException); + } + } + + super.onPostExecute(result); + } + }.execute((Void[]) null); + } + + public static void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final AsyncCallable pAsyncCallable, final Callback pCallback, final Callback pExceptionCallback) { + final ProgressDialog pd = ProgressDialog.show(pContext, pContext.getString(pTitleResID), pContext.getString(pMessageResID)); + pAsyncCallable.call(new Callback() { + @Override + public void onCallback(final T result) { + try { + pd.dismiss(); + } catch (final Exception e) { + Debug.e("Error", e); + /* Nothing. */ + } + + pCallback.onCallback(result); + } + }, pExceptionCallback); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/ArrayUtils.java b/AndEngine/src/org/anddev/andengine/util/ArrayUtils.java new file mode 100644 index 0000000..9731b01 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/ArrayUtils.java @@ -0,0 +1,39 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 22:35:42 - 01.05.2011 + */ +public class ArrayUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static T random(final T[] pArray) { + return pArray[MathUtils.random(0, pArray.length - 1)]; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/AsyncCallable.java b/AndEngine/src/org/anddev/andengine/util/AsyncCallable.java new file mode 100644 index 0000000..910aa8e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/AsyncCallable.java @@ -0,0 +1,25 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 15:00:30 - 14.05.2010 + * @param + */ +public interface AsyncCallable { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * Computes a result asynchronously, return values and exceptions are to be handled through the callbacks. + * This method is expected to return almost immediately, after starting a {@link Thread} or similar. + * + * @return computed result + * @throws Exception if unable to compute a result + */ + public void call(final Callback pCallback, final Callback pExceptionCallback); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/Base64.java b/AndEngine/src/org/anddev/andengine/util/Base64.java new file mode 100644 index 0000000..4e3957a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/Base64.java @@ -0,0 +1,759 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.anddev.andengine.util; + +import java.io.UnsupportedEncodingException; + +/** + * Utilities for encoding and decoding the Base64 representation of + * binary data. See RFCs 2045 and 3548. + */ +public class Base64 { + /** + * Default values for encoder/decoder flags. + */ + public static final int DEFAULT = 0; + + /** + * Encoder flag bit to omit the padding '=' characters at the end + * of the output (if any). + */ + public static final int NO_PADDING = 1; + + /** + * Encoder flag bit to omit all line terminators (i.e., the output + * will be on one long line). + */ + public static final int NO_WRAP = 2; + + /** + * Encoder flag bit to indicate lines should be terminated with a + * CRLF pair instead of just an LF. Has no effect if {@code + * NO_WRAP} is specified as well. + */ + public static final int CRLF = 4; + + /** + * Encoder/decoder flag bit to indicate using the "URL and + * filename safe" variant of Base64 (see RFC 3548 section 4) where + * {@code -} and {@code _} are used in place of {@code +} and + * {@code /}. + */ + public static final int URL_SAFE = 8; + + /** + * Flag to pass to {@link Base64OutputStream} to indicate that it + * should not close the output stream it is wrapping when it + * itself is closed. + */ + public static final int NO_CLOSE = 16; + + // -------------------------------------------------------- + // shared code + // -------------------------------------------------------- + + /* package */ static abstract class Coder { + public byte[] output; + public int op; + + /** + * Encode/decode another block of input data. this.output is + * provided by the caller, and must be big enough to hold all + * the coded data. On exit, this.opwill be set to the length + * of the coded data. + * + * @param finish true if this is the final call to process for + * this object. Will finalize the coder state and + * include any final bytes in the output. + * + * @return true if the input so far is good; false if some + * error has been detected in the input stream.. + */ + public abstract boolean process(byte[] input, int offset, int len, boolean finish); + + /** + * @return the maximum number of bytes a call to process() + * could produce for the given number of input bytes. This may + * be an overestimate. + */ + public abstract int maxOutputSize(int len); + } + + // -------------------------------------------------------- + // decoding + // -------------------------------------------------------- + + /** + * Decode the Base64-encoded data in input and return the data in + * a new byte array. + * + *

    The padding '=' characters at the end are considered optional, but + * if any are present, there must be the correct number of them. + * + * @param str the input String to decode, which is converted to + * bytes using the default charset + * @param flags controls certain features of the decoded output. + * Pass {@code DEFAULT} to decode standard Base64. + * + * @throws IllegalArgumentException if the input contains + * incorrect padding + */ + public static byte[] decode(final String str, final int flags) { + return Base64.decode(str.getBytes(), flags); + } + + /** + * Decode the Base64-encoded data in input and return the data in + * a new byte array. + * + *

    The padding '=' characters at the end are considered optional, but + * if any are present, there must be the correct number of them. + * + * @param input the input array to decode + * @param flags controls certain features of the decoded output. + * Pass {@code DEFAULT} to decode standard Base64. + * + * @throws IllegalArgumentException if the input contains + * incorrect padding + */ + public static byte[] decode(final byte[] input, final int flags) { + return Base64.decode(input, 0, input.length, flags); + } + + /** + * Decode the Base64-encoded data in input and return the data in + * a new byte array. + * + *

    The padding '=' characters at the end are considered optional, but + * if any are present, there must be the correct number of them. + * + * @param input the data to decode + * @param offset the position within the input array at which to start + * @param len the number of bytes of input to decode + * @param flags controls certain features of the decoded output. + * Pass {@code DEFAULT} to decode standard Base64. + * + * @throws IllegalArgumentException if the input contains + * incorrect padding + */ + public static byte[] decode(final byte[] input, final int offset, final int len, final int flags) { + // Allocate space for the most data the input could represent. + // (It could contain less if it contains whitespace, etc.) + final Decoder decoder = new Decoder(flags, new byte[len*3/4]); + + if (!decoder.process(input, offset, len, true)) { + throw new IllegalArgumentException("bad base-64"); + } + + // Maybe we got lucky and allocated exactly enough output space. + if (decoder.op == decoder.output.length) { + return decoder.output; + } + + // Need to shorten the array, so allocate a new one of the + // right size and copy. + final byte[] temp = new byte[decoder.op]; + System.arraycopy(decoder.output, 0, temp, 0, decoder.op); + return temp; + } + + /* package */ static class Decoder extends Coder { + /** + * Lookup table for turning bytes into their position in the + * Base64 alphabet. + */ + private static final int DECODE[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + }; + + /** + * Decode lookup table for the "web safe" variant (RFC 3548 + * sec. 4) where - and _ replace + and /. + */ + private static final int DECODE_WEBSAFE[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + }; + + /** Non-data values in the DECODE arrays. */ + private static final int SKIP = -1; + private static final int EQUALS = -2; + + /** + * States 0-3 are reading through the next input tuple. + * State 4 is having read one '=' and expecting exactly + * one more. + * State 5 is expecting no more data or padding characters + * in the input. + * State 6 is the error state; an error has been detected + * in the input and no future input can "fix" it. + */ + private int state; // state number (0 to 6) + private int value; + + final private int[] alphabet; + + public Decoder(final int flags, final byte[] output) { + this.output = output; + + this.alphabet = ((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE; + this.state = 0; + this.value = 0; + } + + /** + * @return an overestimate for the number of bytes {@code + * len} bytes could decode to. + */ + @Override + public int maxOutputSize(final int len) { + return len * 3/4 + 10; + } + + /** + * Decode another block of input data. + * + * @return true if the state machine is still healthy. false if + * bad base-64 data has been detected in the input stream. + */ + @Override + public boolean process(final byte[] input, final int offset, int len, final boolean finish) { + if (this.state == 6) { + return false; + } + + int p = offset; + len += offset; + + // Using local variables makes the decoder about 12% + // faster than if we manipulate the member variables in + // the loop. (Even alphabet makes a measurable + // difference, which is somewhat surprising to me since + // the member variable is final.) + int state = this.state; + int value = this.value; + int op = 0; + final byte[] output = this.output; + final int[] alphabet = this.alphabet; + + while (p < len) { + // Try the fast path: we're starting a new tuple and the + // next four bytes of the input stream are all data + // bytes. This corresponds to going through states + // 0-1-2-3-0. We expect to use this method for most of + // the data. + // + // If any of the next four bytes of input are non-data + // (whitespace, etc.), value will end up negative. (All + // the non-data values in decode are small negative + // numbers, so shifting any of them up and or'ing them + // together will result in a value with its top bit set.) + // + // You can remove this whole block and the output should + // be the same, just slower. + if (state == 0) { + while (p+4 <= len && + (value = ((alphabet[input[p] & 0xff] << 18) | + (alphabet[input[p+1] & 0xff] << 12) | + (alphabet[input[p+2] & 0xff] << 6) | + (alphabet[input[p+3] & 0xff]))) >= 0) { + output[op+2] = (byte) value; + output[op+1] = (byte) (value >> 8); + output[op] = (byte) (value >> 16); + op += 3; + p += 4; + } + if (p >= len) { + break; + } + } + + // The fast path isn't available -- either we've read a + // partial tuple, or the next four input bytes aren't all + // data, or whatever. Fall back to the slower state + // machine implementation. + + final int d = alphabet[input[p++] & 0xff]; + + switch (state) { + case 0: + if (d >= 0) { + value = d; + ++state; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 1: + if (d >= 0) { + value = (value << 6) | d; + ++state; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 2: + if (d >= 0) { + value = (value << 6) | d; + ++state; + } else if (d == EQUALS) { + // Emit the last (partial) output tuple; + // expect exactly one more padding character. + output[op++] = (byte) (value >> 4); + state = 4; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 3: + if (d >= 0) { + // Emit the output triple and return to state 0. + value = (value << 6) | d; + output[op+2] = (byte) value; + output[op+1] = (byte) (value >> 8); + output[op] = (byte) (value >> 16); + op += 3; + state = 0; + } else if (d == EQUALS) { + // Emit the last (partial) output tuple; + // expect no further data or padding characters. + output[op+1] = (byte) (value >> 2); + output[op] = (byte) (value >> 10); + op += 2; + state = 5; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 4: + if (d == EQUALS) { + ++state; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 5: + if (d != SKIP) { + this.state = 6; + return false; + } + break; + } + } + + if (!finish) { + // We're out of input, but a future call could provide + // more. + this.state = state; + this.value = value; + this.op = op; + return true; + } + + // Done reading input. Now figure out where we are left in + // the state machine and finish up. + + switch (state) { + case 0: + // Output length is a multiple of three. Fine. + break; + case 1: + // Read one extra input byte, which isn't enough to + // make another output byte. Illegal. + this.state = 6; + return false; + case 2: + // Read two extra input bytes, enough to emit 1 more + // output byte. Fine. + output[op++] = (byte) (value >> 4); + break; + case 3: + // Read three extra input bytes, enough to emit 2 more + // output bytes. Fine. + output[op++] = (byte) (value >> 10); + output[op++] = (byte) (value >> 2); + break; + case 4: + // Read one padding '=' when we expected 2. Illegal. + this.state = 6; + return false; + case 5: + // Read all the padding '='s we expected and no more. + // Fine. + break; + } + + this.state = state; + this.op = op; + return true; + } + } + + // -------------------------------------------------------- + // encoding + // -------------------------------------------------------- + + /** + * Base64-encode the given data and return a newly allocated + * String with the result. + * + * @param input the data to encode + * @param flags controls certain features of the encoded output. + * Passing {@code DEFAULT} results in output that + * adheres to RFC 2045. + */ + public static String encodeToString(final byte[] input, final int flags) { + try { + return new String(Base64.encode(input, flags), "US-ASCII"); + } catch (final UnsupportedEncodingException e) { + // US-ASCII is guaranteed to be available. + throw new AssertionError(e); + } + } + + /** + * Base64-encode the given data and return a newly allocated + * String with the result. + * + * @param input the data to encode + * @param offset the position within the input array at which to + * start + * @param len the number of bytes of input to encode + * @param flags controls certain features of the encoded output. + * Passing {@code DEFAULT} results in output that + * adheres to RFC 2045. + */ + public static String encodeToString(final byte[] input, final int offset, final int len, final int flags) { + try { + return new String(Base64.encode(input, offset, len, flags), "US-ASCII"); + } catch (final UnsupportedEncodingException e) { + // US-ASCII is guaranteed to be available. + throw new AssertionError(e); + } + } + + /** + * Base64-encode the given data and return a newly allocated + * byte[] with the result. + * + * @param input the data to encode + * @param flags controls certain features of the encoded output. + * Passing {@code DEFAULT} results in output that + * adheres to RFC 2045. + */ + public static byte[] encode(final byte[] input, final int flags) { + return Base64.encode(input, 0, input.length, flags); + } + + /** + * Base64-encode the given data and return a newly allocated + * byte[] with the result. + * + * @param input the data to encode + * @param offset the position within the input array at which to + * start + * @param len the number of bytes of input to encode + * @param flags controls certain features of the encoded output. + * Passing {@code DEFAULT} results in output that + * adheres to RFC 2045. + */ + public static byte[] encode(final byte[] input, final int offset, final int len, final int flags) { + final Encoder encoder = new Encoder(flags, null); + + // Compute the exact length of the array we will produce. + int output_len = len / 3 * 4; + + // Account for the tail of the data and the padding bytes, if any. + if (encoder.do_padding) { + if (len % 3 > 0) { + output_len += 4; + } + } else { + switch (len % 3) { + case 0: break; + case 1: output_len += 2; break; + case 2: output_len += 3; break; + } + } + + // Account for the newlines, if any. + if (encoder.do_newline && len > 0) { + output_len += (((len-1) / (3 * Encoder.LINE_GROUPS)) + 1) * + (encoder.do_cr ? 2 : 1); + } + + encoder.output = new byte[output_len]; + encoder.process(input, offset, len, true); + + assert encoder.op == output_len; + + return encoder.output; + } + + /* package */ static class Encoder extends Coder { + /** + * Emit a new line every this many output tuples. Corresponds to + * a 76-character line length (the maximum allowable according to + * RFC 2045). + */ + public static final int LINE_GROUPS = 19; + + /** + * Lookup table for turning Base64 alphabet positions (6 bits) + * into output bytes. + */ + private static final byte ENCODE[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', + }; + + /** + * Lookup table for turning Base64 alphabet positions (6 bits) + * into output bytes. + */ + private static final byte ENCODE_WEBSAFE[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', + }; + + final private byte[] tail; + /* package */ int tailLen; + private int count; + + final public boolean do_padding; + final public boolean do_newline; + final public boolean do_cr; + final private byte[] alphabet; + + public Encoder(final int flags, final byte[] output) { + this.output = output; + + this.do_padding = (flags & NO_PADDING) == 0; + this.do_newline = (flags & NO_WRAP) == 0; + this.do_cr = (flags & CRLF) != 0; + this.alphabet = ((flags & URL_SAFE) == 0) ? ENCODE : ENCODE_WEBSAFE; + + this.tail = new byte[2]; + this.tailLen = 0; + + this.count = this.do_newline ? LINE_GROUPS : -1; + } + + /** + * @return an overestimate for the number of bytes {@code + * len} bytes could encode to. + */ + @Override + public int maxOutputSize(final int len) { + return len * 8/5 + 10; + } + + @Override + public boolean process(final byte[] input, final int offset, int len, final boolean finish) { + // Using local variables makes the encoder about 9% faster. + final byte[] alphabet = this.alphabet; + final byte[] output = this.output; + int op = 0; + int count = this.count; + + int p = offset; + len += offset; + int v = -1; + + // First we need to concatenate the tail of the previous call + // with any input bytes available now and see if we can empty + // the tail. + + switch (this.tailLen) { + case 0: + // There was no tail. + break; + + case 1: + if (p+2 <= len) { + // A 1-byte tail with at least 2 bytes of + // input available now. + v = ((this.tail[0] & 0xff) << 16) | + ((input[p++] & 0xff) << 8) | + (input[p++] & 0xff); + this.tailLen = 0; + }; + break; + + case 2: + if (p+1 <= len) { + // A 2-byte tail with at least 1 byte of input. + v = ((this.tail[0] & 0xff) << 16) | + ((this.tail[1] & 0xff) << 8) | + (input[p++] & 0xff); + this.tailLen = 0; + } + break; + } + + if (v != -1) { + output[op++] = alphabet[(v >> 18) & 0x3f]; + output[op++] = alphabet[(v >> 12) & 0x3f]; + output[op++] = alphabet[(v >> 6) & 0x3f]; + output[op++] = alphabet[v & 0x3f]; + if (--count == 0) { + if (this.do_cr) { + output[op++] = '\r'; + } + output[op++] = '\n'; + count = LINE_GROUPS; + } + } + + // At this point either there is no tail, or there are fewer + // than 3 bytes of input available. + + // The main loop, turning 3 input bytes into 4 output bytes on + // each iteration. + while (p+3 <= len) { + v = ((input[p] & 0xff) << 16) | + ((input[p+1] & 0xff) << 8) | + (input[p+2] & 0xff); + output[op] = alphabet[(v >> 18) & 0x3f]; + output[op+1] = alphabet[(v >> 12) & 0x3f]; + output[op+2] = alphabet[(v >> 6) & 0x3f]; + output[op+3] = alphabet[v & 0x3f]; + p += 3; + op += 4; + if (--count == 0) { + if (this.do_cr) { + output[op++] = '\r'; + } + output[op++] = '\n'; + count = LINE_GROUPS; + } + } + + if (finish) { + // Finish up the tail of the input. Note that we need to + // consume any bytes in tail before any bytes + // remaining in input; there should be at most two bytes + // total. + + if (p-this.tailLen == len-1) { + int t = 0; + v = ((this.tailLen > 0 ? this.tail[t++] : input[p++]) & 0xff) << 4; + this.tailLen -= t; + output[op++] = alphabet[(v >> 6) & 0x3f]; + output[op++] = alphabet[v & 0x3f]; + if (this.do_padding) { + output[op++] = '='; + output[op++] = '='; + } + if (this.do_newline) { + if (this.do_cr) { + output[op++] = '\r'; + } + output[op++] = '\n'; + } + } else if (p-this.tailLen == len-2) { + int t = 0; + v = (((this.tailLen > 1 ? this.tail[t++] : input[p++]) & 0xff) << 10) | + (((this.tailLen > 0 ? this.tail[t++] : input[p++]) & 0xff) << 2); + this.tailLen -= t; + output[op++] = alphabet[(v >> 12) & 0x3f]; + output[op++] = alphabet[(v >> 6) & 0x3f]; + output[op++] = alphabet[v & 0x3f]; + if (this.do_padding) { + output[op++] = '='; + } + if (this.do_newline) { + if (this.do_cr) { + output[op++] = '\r'; + } + output[op++] = '\n'; + } + } else if (this.do_newline && op > 0 && count != LINE_GROUPS) { + if (this.do_cr) { + output[op++] = '\r'; + } + output[op++] = '\n'; + } + + assert this.tailLen == 0; + assert p == len; + } else { + // Save the leftovers in tail to be consumed on the next + // call to encodeInternal. + + if (p == len-1) { + this.tail[this.tailLen++] = input[p]; + } else if (p == len-2) { + this.tail[this.tailLen++] = input[p]; + this.tail[this.tailLen++] = input[p+1]; + } + } + + this.op = op; + this.count = count; + + return true; + } + } + + private Base64() { } // don't instantiate +} diff --git a/AndEngine/src/org/anddev/andengine/util/Base64InputStream.java b/AndEngine/src/org/anddev/andengine/util/Base64InputStream.java new file mode 100644 index 0000000..8671ed6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/Base64InputStream.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.anddev.andengine.util; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * An InputStream that does Base64 decoding on the data read through + * it. + */ +public class Base64InputStream extends FilterInputStream { + private final Base64.Coder coder; + + private static byte[] EMPTY = new byte[0]; + + private static final int BUFFER_SIZE = 2048; + private boolean eof; + private byte[] inputBuffer; + private int outputStart; + private int outputEnd; + + /** + * An InputStream that performs Base64 decoding on the data read + * from the wrapped stream. + * + * @param in the InputStream to read the source data from + * @param flags bit flags for controlling the decoder; see the + * constants in {@link Base64} + */ + public Base64InputStream(final InputStream in, final int flags) { + this(in, flags, false); + } + + /** + * Performs Base64 encoding or decoding on the data read from the + * wrapped InputStream. + * + * @param in the InputStream to read the source data from + * @param flags bit flags for controlling the decoder; see the + * constants in {@link Base64} + * @param encode true to encode, false to decode + * + * @hide + */ + public Base64InputStream(final InputStream in, final int flags, final boolean encode) { + super(in); + this.eof = false; + this.inputBuffer = new byte[BUFFER_SIZE]; + if (encode) { + this.coder = new Base64.Encoder(flags, null); + } else { + this.coder = new Base64.Decoder(flags, null); + } + this.coder.output = new byte[this.coder.maxOutputSize(BUFFER_SIZE)]; + this.outputStart = 0; + this.outputEnd = 0; + } + + @Override + public boolean markSupported() { + return false; + } + + @Override + public void mark(final int readlimit) { + throw new UnsupportedOperationException(); + } + + @Override + public void reset() { + throw new UnsupportedOperationException(); + } + + @Override + public void close() throws IOException { + this.in.close(); + this.inputBuffer = null; + } + + @Override + public int available() { + return this.outputEnd - this.outputStart; + } + + @Override + public long skip(final long n) throws IOException { + if (this.outputStart >= this.outputEnd) { + this.refill(); + } + if (this.outputStart >= this.outputEnd) { + return 0; + } + final long bytes = Math.min(n, this.outputEnd-this.outputStart); + this.outputStart += bytes; + return bytes; + } + + @Override + public int read() throws IOException { + if (this.outputStart >= this.outputEnd) { + this.refill(); + } + if (this.outputStart >= this.outputEnd) { + return -1; + } else { + return this.coder.output[this.outputStart++]; + } + } + + @Override + public int read(final byte[] b, final int off, final int len) throws IOException { + if (this.outputStart >= this.outputEnd) { + this.refill(); + } + if (this.outputStart >= this.outputEnd) { + return -1; + } + final int bytes = Math.min(len, this.outputEnd-this.outputStart); + System.arraycopy(this.coder.output, this.outputStart, b, off, bytes); + this.outputStart += bytes; + return bytes; + } + + /** + * Read data from the input stream into inputBuffer, then + * decode/encode it into the empty coder.output, and reset the + * outputStart and outputEnd pointers. + */ + private void refill() throws IOException { + if (this.eof) { + return; + } + final int bytesRead = this.in.read(this.inputBuffer); + boolean success; + if (bytesRead == -1) { + this.eof = true; + success = this.coder.process(EMPTY, 0, 0, true); + } else { + success = this.coder.process(this.inputBuffer, 0, bytesRead, false); + } + if (!success) { + throw new IOException("bad base-64"); + } + this.outputEnd = this.coder.op; + this.outputStart = 0; + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/BetaUtils.java b/AndEngine/src/org/anddev/andengine/util/BetaUtils.java new file mode 100644 index 0000000..415c15d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/BetaUtils.java @@ -0,0 +1,96 @@ +package org.anddev.andengine.util; + +import java.util.GregorianCalendar; + +import org.anddev.andengine.util.constants.Constants; + +import android.R; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.content.SharedPreferences; + + +/** + * @author Nicolas Gramlich + * @since 22:43:32 - 02.11.2010 + */ +public class BetaUtils implements Constants { + // =========================================================== + // Constants + // =========================================================== + + private static final String PREFERENCES_BETAUTILS_ID = "preferences.betautils.lastuse"; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean finishWhenExpired(final Activity pActivity, final GregorianCalendar pExpirationDate, final int pTitleResourceID, final int pMessageResourceID) { + return BetaUtils.finishWhenExpired(pActivity, pExpirationDate, pTitleResourceID, pMessageResourceID, null, null); + } + + public static boolean finishWhenExpired(final Activity pActivity, final GregorianCalendar pExpirationDate, final int pTitleResourceID, final int pMessageResourceID, final Intent pOkIntent, final Intent pCancelIntent) { + final SharedPreferences spref = SimplePreferences.getInstance(pActivity); + + final long now = System.currentTimeMillis(); + final long lastuse = Math.max(now, spref.getLong(PREFERENCES_BETAUTILS_ID, -1)); + spref.edit().putLong(PREFERENCES_BETAUTILS_ID, lastuse).commit(); + + final GregorianCalendar lastuseDate = new GregorianCalendar(); + lastuseDate.setTimeInMillis(lastuse); + + if(lastuseDate.after(pExpirationDate)){ + final Builder alertDialogBuilder = new AlertDialog.Builder(pActivity) + .setTitle(pTitleResourceID) + .setIcon(R.drawable.ic_dialog_alert) + .setMessage(pMessageResourceID); + + alertDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ + @Override + public void onClick(final DialogInterface pDialog, final int pWhich) { + if(pOkIntent != null) { + pActivity.startActivity(pOkIntent); + } + pActivity.finish(); + } + }); + alertDialogBuilder.setNegativeButton(android.R.string.cancel, new OnClickListener() { + @Override + public void onClick(final DialogInterface pDialog, final int pWhich) { + if(pCancelIntent != null) { + pActivity.startActivity(pCancelIntent); + } + pActivity.finish(); + } + }) + .create().show(); + return true; + }else{ + return false; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/Callable.java b/AndEngine/src/org/anddev/andengine/util/Callable.java new file mode 100644 index 0000000..970f414 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/Callable.java @@ -0,0 +1,23 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 20:52:44 - 03.01.2010 + */ +public interface Callable { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * Computes a result, or throws an exception if unable to do so. + * + * @return the computed result. + * @throws Exception if unable to compute a result. + */ + public T call() throws Exception; +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/Callback.java b/AndEngine/src/org/anddev/andengine/util/Callback.java new file mode 100644 index 0000000..5147706 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/Callback.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 09:40:55 - 14.12.2009S + */ +public interface Callback { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onCallback(final T pCallbackValue); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/ColorUtils.java b/AndEngine/src/org/anddev/andengine/util/ColorUtils.java new file mode 100644 index 0000000..ed52c43 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/ColorUtils.java @@ -0,0 +1,60 @@ +package org.anddev.andengine.util; + +import android.graphics.Color; + +/** + * @author Nicolas Gramlich + * @since 11:13:45 - 04.08.2010 + */ +public class ColorUtils { + // =========================================================== + // Constants + // =========================================================== + + private static final float[] HSV_TO_COLOR = new float[3]; + private static final int HSV_TO_COLOR_HUE_INDEX = 0; + private static final int HSV_TO_COLOR_SATURATION_INDEX = 1; + private static final int HSV_TO_COLOR_VALUE_INDEX = 2; + + private static final int COLOR_FLOAT_TO_INT_FACTOR = 255; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + /** + * @param pHue [0 .. 360) + * @param pSaturation [0...1] + * @param pValue [0...1] + */ + public static int HSVToColor(final float pHue, final float pSaturation, final float pValue) { + HSV_TO_COLOR[HSV_TO_COLOR_HUE_INDEX] = pHue; + HSV_TO_COLOR[HSV_TO_COLOR_SATURATION_INDEX] = pSaturation; + HSV_TO_COLOR[HSV_TO_COLOR_VALUE_INDEX] = pValue; + return Color.HSVToColor(HSV_TO_COLOR); + } + + public static int RGBToColor(final float pRed, final float pGreen, final float pBlue) { + return Color.rgb((int)(pRed * COLOR_FLOAT_TO_INT_FACTOR), (int)(pGreen * COLOR_FLOAT_TO_INT_FACTOR), (int)(pBlue * COLOR_FLOAT_TO_INT_FACTOR)); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/DataUtils.java b/AndEngine/src/org/anddev/andengine/util/DataUtils.java new file mode 100644 index 0000000..6f013dd --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/DataUtils.java @@ -0,0 +1,39 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 15:01:49 - 20.03.2011 + */ +public class DataUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public static int unsignedByteToInt(final byte bByte) { + return bByte & 0xFF; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/Debug.java b/AndEngine/src/org/anddev/andengine/util/Debug.java new file mode 100644 index 0000000..9f86739 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/Debug.java @@ -0,0 +1,142 @@ +package org.anddev.andengine.util; + +import org.anddev.andengine.util.constants.Constants; + +import android.util.Log; + +/** + * @author Nicolas Gramlich + * @since 13:29:16 - 08.03.2010 + */ +public class Debug implements Constants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static String sDebugTag = DEBUGTAG; + private static DebugLevel sDebugLevel = DebugLevel.VERBOSE; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public static String getDebugTag() { + return Debug.sDebugTag; + } + + public static void setDebugTag(final String pDebugTag) { + Debug.sDebugTag = pDebugTag; + } + + public static DebugLevel getDebugLevel() { + return Debug.sDebugLevel; + } + + public static void setDebugLevel(final DebugLevel pDebugLevel) { + if(pDebugLevel == null) { + throw new IllegalArgumentException("pDebugLevel must not be null!"); + } + Debug.sDebugLevel = pDebugLevel; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static void v(final String pMessage) { + Debug.v(pMessage, null); + } + + public static void v(final String pMessage, final Throwable pThrowable) { + if(sDebugLevel.isSameOrLessThan(DebugLevel.VERBOSE)) { + Log.v(sDebugTag, pMessage, pThrowable); + } + } + + public static void d(final String pMessage) { + Debug.d(pMessage, null); + } + + public static void d(final String pMessage, final Throwable pThrowable) { + if(sDebugLevel.isSameOrLessThan(DebugLevel.DEBUG)) { + Log.d(sDebugTag, pMessage, pThrowable); + } + } + + public static void i(final String pMessage) { + Debug.i(pMessage, null); + } + + public static void i(final String pMessage, final Throwable pThrowable) { + if(sDebugLevel.isSameOrLessThan(DebugLevel.INFO)) { + Log.i(sDebugTag, pMessage, pThrowable); + } + } + + public static void w(final String pMessage) { + Debug.w(pMessage, null); + } + + public static void w(final Throwable pThrowable) { + Debug.w(sDebugTag, pThrowable); + } + + public static void w(final String pMessage, final Throwable pThrowable) { + if(sDebugLevel.isSameOrLessThan(DebugLevel.WARNING)) { + if(pThrowable == null) { + Log.w(sDebugTag, pMessage, new Exception()); + } else { + Log.w(sDebugTag, pMessage, pThrowable); + } + } + } + + public static void e(final String pMessage) { + Debug.e(pMessage, null); + } + + public static void e(final Throwable pThrowable) { + Debug.e(sDebugTag, pThrowable); + } + + public static void e(final String pMessage, final Throwable pThrowable) { + if(sDebugLevel.isSameOrLessThan(DebugLevel.ERROR)) { + if(pThrowable == null) { + Log.e(sDebugTag, pMessage, new Exception()); + } else { + Log.e(sDebugTag, pMessage, pThrowable); + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static enum DebugLevel implements Comparable { + NONE, + ERROR, + WARNING, + INFO, + DEBUG, + VERBOSE; + + public static DebugLevel ALL = DebugLevel.VERBOSE; + + private boolean isSameOrLessThan(final DebugLevel pDebugLevel) { + return this.compareTo(pDebugLevel) >= 0; + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/FileUtils.java b/AndEngine/src/org/anddev/andengine/util/FileUtils.java new file mode 100644 index 0000000..32301b6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/FileUtils.java @@ -0,0 +1,159 @@ +package org.anddev.andengine.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; + +import android.content.Context; +import android.os.Environment; + +/** + * @author Nicolas Gramlich + * @since 13:53:33 - 20.06.2010 + */ +public class FileUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static void copyToExternalStorage(final Context pContext, final int pSourceResourceID, final String pFilename) throws FileNotFoundException { + FileUtils.copyToExternalStorage(pContext, pContext.getResources().openRawResource(pSourceResourceID), pFilename); + } + + public static void copyToExternalStorage(final Context pContext, final String pSourceAssetPath, final String pFilename) throws IOException { + FileUtils.copyToExternalStorage(pContext, pContext.getAssets().open(pSourceAssetPath), pFilename); + } + + public static void copyToExternalStorage(final Context pContext, final InputStream pInputStream, final String pFilename) throws FileNotFoundException { + if (FileUtils.isExternalStorageWriteable()) { + final String absoluteFilePath = FileUtils.getAbsolutePathOnExternalStorage(pContext, pFilename); + StreamUtils.copyAndClose(pInputStream, new FileOutputStream(absoluteFilePath)); + } else { + throw new IllegalStateException("External Storage is not writeable."); + } + } + + public static boolean isFileExistingOnExternalStorage(final Context pContext, final String pFilename) { + if (FileUtils.isExternalStorageReadable()) { + final String absoluteFilePath = FileUtils.getAbsolutePathOnExternalStorage(pContext, pFilename); + final File file = new File(absoluteFilePath); + return file.exists()&& file.isFile(); + } else { + throw new IllegalStateException("External Storage is not readable."); + } + } + + public static boolean isDirectoryExistingOnExternalStorage(final Context pContext, final String pDirectory) { + if (FileUtils.isExternalStorageReadable()) { + final String absoluteFilePath = FileUtils.getAbsolutePathOnExternalStorage(pContext, pDirectory); + final File file = new File(absoluteFilePath); + return file.exists() && file.isDirectory(); + } else { + throw new IllegalStateException("External Storage is not readable."); + } + } + + public static boolean ensureDirectoriesExistOnExternalStorage(final Context pContext, final String pDirectory) { + if(FileUtils.isDirectoryExistingOnExternalStorage(pContext, pDirectory)) { + return true; + } + + if (FileUtils.isExternalStorageWriteable()) { + final String absoluteDirectoryPath = FileUtils.getAbsolutePathOnExternalStorage(pContext, pDirectory); + return new File(absoluteDirectoryPath).mkdirs(); + } else { + throw new IllegalStateException("External Storage is not writeable."); + } + } + + public static InputStream openOnExternalStorage(final Context pContext, final String pFilename) throws FileNotFoundException { + final String absoluteFilePath = FileUtils.getAbsolutePathOnExternalStorage(pContext, pFilename); + return new FileInputStream(absoluteFilePath); + } + + public static String[] getDirectoryListOnExternalStorage(final Context pContext, final String pFilename) throws FileNotFoundException { + final String absoluteFilePath = FileUtils.getAbsolutePathOnExternalStorage(pContext, pFilename); + return new File(absoluteFilePath).list(); + } + + public static String[] getDirectoryListOnExternalStorage(final Context pContext, final String pFilename, final FilenameFilter pFilenameFilter) throws FileNotFoundException { + final String absoluteFilePath = FileUtils.getAbsolutePathOnExternalStorage(pContext, pFilename); + return new File(absoluteFilePath).list(pFilenameFilter); + } + + public static String getAbsolutePathOnExternalStorage(final Context pContext, final String pFilename) { + return Environment.getExternalStorageDirectory() + "/Android/data/" + pContext.getApplicationInfo().packageName + "/files/" + pFilename; + } + + public static boolean isExternalStorageWriteable() { + return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); + } + + public static boolean isExternalStorageReadable() { + final String state = Environment.getExternalStorageState(); + return state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_MOUNTED_READ_ONLY); + } + + public static void copyFile(final File pIn, final File pOut) throws IOException { + final FileInputStream fis = new FileInputStream(pIn); + final FileOutputStream fos = new FileOutputStream(pOut); + try { + StreamUtils.copy(fis, fos); + } finally { + StreamUtils.close(fis); + StreamUtils.close(fos); + } + } + + /** + * Deletes all files and sub-directories under dir. Returns + * true if all deletions were successful. If a deletion fails, the method + * stops attempting to delete and returns false. + * + * @param pFileOrDirectory + * @return + */ + public static boolean deleteDirectory(final File pFileOrDirectory) { + if(pFileOrDirectory.isDirectory()) { + final String[] children = pFileOrDirectory.list(); + final int childrenCount = children.length; + for(int i = 0; i < childrenCount; i++) { + final boolean success = FileUtils.deleteDirectory(new File(pFileOrDirectory, children[i])); + if(!success) { + return false; + } + } + } + + // The directory is now empty so delete it + return pFileOrDirectory.delete(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/HorizontalAlign.java b/AndEngine/src/org/anddev/andengine/util/HorizontalAlign.java new file mode 100644 index 0000000..5ef20cd --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/HorizontalAlign.java @@ -0,0 +1,43 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 10:47:33 - 11.05.2010 + */ +public enum HorizontalAlign { + // =========================================================== + // Elements + // =========================================================== + + LEFT, + CENTER, + RIGHT; + + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/IMatcher.java b/AndEngine/src/org/anddev/andengine/util/IMatcher.java new file mode 100644 index 0000000..dff0419 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/IMatcher.java @@ -0,0 +1,18 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 12:32:22 - 26.12.2010 + */ +public interface IMatcher { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean matches(final T pObject); +} + diff --git a/AndEngine/src/org/anddev/andengine/util/Library.java b/AndEngine/src/org/anddev/andengine/util/Library.java new file mode 100644 index 0000000..431b9c6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/Library.java @@ -0,0 +1,65 @@ +package org.anddev.andengine.util; + +import android.util.SparseArray; + +/** + * @author Nicolas Gramlich + * @since 11:51:29 - 20.08.2010 + * @param + */ +public class Library { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final SparseArray mItems; + + // =========================================================== + // Constructors + // =========================================================== + + public Library() { + this.mItems = new SparseArray(); + } + + public Library(final int pInitialCapacity) { + this.mItems = new SparseArray(pInitialCapacity); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public void put(final int pID, final T pItem) { + final T existingItem = this.mItems.get(pID); + if(existingItem == null) { + this.mItems.put(pID, pItem); + } else { + throw new IllegalArgumentException("ID: '" + pID + "' is already associated with item: '" + existingItem.toString() + "'."); + } + } + + public void remove(final int pID) { + this.mItems.remove(pID); + } + + public T get(final int pID) { + return this.mItems.get(pID); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/ListUtils.java b/AndEngine/src/org/anddev/andengine/util/ListUtils.java new file mode 100644 index 0000000..e6b27c0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/ListUtils.java @@ -0,0 +1,43 @@ +package org.anddev.andengine.util; + +import java.util.ArrayList; + +/** + * @author Nicolas Gramlich + * @since 12:43:39 - 11.03.2010 + */ +public class ListUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static ArrayList toList(final T pElement) { + final ArrayList out = new ArrayList(); + out.add(pElement); + return out; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/MathUtils.java b/AndEngine/src/org/anddev/andengine/util/MathUtils.java new file mode 100644 index 0000000..3c257df --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/MathUtils.java @@ -0,0 +1,207 @@ +package org.anddev.andengine.util; + +import java.util.Random; + +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Nicolas Gramlich + * @since 20:42:15 - 17.12.2009 + */ +public class MathUtils implements MathConstants { + // =========================================================== + // Constants + // =========================================================== + + public static Random RANDOM = new Random(System.nanoTime()); + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static float atan2(final float dY, final float dX) { + return (float)Math.atan2(dY, dX); + } + + public static final float radToDeg(final float pRad) { + return RAD_TO_DEG * pRad; + } + + public static final float degToRad(final float pDegree) { + return DEG_TO_RAD * pDegree; + } + + public static final int randomSign() { + if(RANDOM.nextBoolean()) { + return 1; + } else { + return -1; + } + } + + public static final float random(final float pMin, final float pMax) { + return pMin + RANDOM.nextFloat() * (pMax - pMin); + } + + /** + * @param pMin inclusive! + * @param pMax inclusive! + * @return + */ + public static final int random(final int pMin, final int pMax) { + return pMin + RANDOM.nextInt(pMax - pMin + 1); + } + + public static final boolean isPowerOfTwo(final int n) { + return ((n != 0) && (n & (n - 1)) == 0); + } + + public static final int nextPowerOfTwo(final int n) { + int k = n; + + if (k == 0) { + return 1; + } + + k--; + + for (int i = 1; i < 32; i <<= 1) { + k = k | k >> i; + } + + return k + 1; + } + + public static final int sum(final int[] pValues) { + int sum = 0; + for(int i = pValues.length - 1; i >= 0; i--) { + sum += pValues[i]; + } + + return sum; + } + + public static final void arraySumInternal(final int[] pValues) { + final int valueCount = pValues.length; + for(int i = 1; i < valueCount; i++) { + pValues[i] = pValues[i-1] + pValues[i]; + } + } + + public static final void arraySumInternal(final long[] pValues) { + final int valueCount = pValues.length; + for(int i = 1; i < valueCount; i++) { + pValues[i] = pValues[i-1] + pValues[i]; + } + } + + public static final void arraySumInternal(final long[] pValues, final long pFactor) { + pValues[0] = pValues[0] * pFactor; + final int valueCount = pValues.length; + for(int i = 1; i < valueCount; i++) { + pValues[i] = pValues[i-1] + pValues[i] * pFactor; + } + } + + public static final void arraySumInto(final long[] pValues, final long[] pTargetValues, final long pFactor) { + pTargetValues[0] = pValues[0] * pFactor; + final int valueCount = pValues.length; + for(int i = 1; i < valueCount; i++) { + pTargetValues[i] = pTargetValues[i-1] + pValues[i] * pFactor; + } + } + + public static final float arraySum(final float[] pValues) { + float sum = 0; + final int valueCount = pValues.length; + for(int i = 0; i < valueCount; i++) { + sum += pValues[i]; + } + return sum; + } + + public static final float arrayAverage(final float[] pValues) { + return MathUtils.arraySum(pValues) / pValues.length; + } + + public static float[] rotateAroundCenter(final float[] pVertices, final float pRotation, final float pRotationCenterX, final float pRotationCenterY) { + if(pRotation != 0) { + final float rotationRad = MathUtils.degToRad(pRotation); + final float sinRotationRad = FloatMath.sin(rotationRad); + final float cosRotationInRad = FloatMath.cos(rotationRad); + + for(int i = pVertices.length - 2; i >= 0; i -= 2) { + final float pX = pVertices[i]; + final float pY = pVertices[i + 1]; + pVertices[i] = pRotationCenterX + (cosRotationInRad * (pX - pRotationCenterX) - sinRotationRad * (pY - pRotationCenterY)); + pVertices[i + 1] = pRotationCenterY + (sinRotationRad * (pX - pRotationCenterX) + cosRotationInRad * (pY - pRotationCenterY)); + } + } + return pVertices; + } + + public static float[] scaleAroundCenter(final float[] pVertices, final float pScaleX, final float pScaleY, final float pScaleCenterX, final float pScaleCenterY) { + if(pScaleX != 1 || pScaleY != 1) { + for(int i = pVertices.length - 2; i >= 0; i -= 2) { + pVertices[i] = pScaleCenterX + (pVertices[i] - pScaleCenterX) * pScaleX; + pVertices[i + 1] = pScaleCenterY + (pVertices[i + 1] - pScaleCenterY) * pScaleY; + } + } + + return pVertices; + } + + public static float[] rotateAndScaleAroundCenter(final float[] pVertices, final float pRotation, final float pRotationCenterX, final float pRotationCenterY, final float pScaleX, final float pScaleY, final float pScaleCenterX, final float pScaleCenterY) { + MathUtils.rotateAroundCenter(pVertices, pRotation, pRotationCenterX, pRotationCenterY); + return MathUtils.scaleAroundCenter(pVertices, pScaleX, pScaleY, pScaleCenterX, pScaleCenterY); + } + + public static float[] revertScaleAroundCenter(final float[] pVertices, final float pScaleX, final float pScaleY, final float pScaleCenterX, final float pScaleCenterY) { + return MathUtils.scaleAroundCenter(pVertices, 1 / pScaleX, 1 / pScaleY, pScaleCenterX, pScaleCenterY); + } + + public static float[] revertRotateAroundCenter(final float[] pVertices, final float pRotation, final float pRotationCenterX, final float pRotationCenterY) { + return MathUtils.rotateAroundCenter(pVertices, -pRotation, pRotationCenterX, pRotationCenterY); + } + + public static float[] revertRotateAndScaleAroundCenter(final float[] pVertices, final float pRotation, final float pRotationCenterX, final float pRotationCenterY, final float pScaleX, final float pScaleY, final float pScaleCenterX, final float pScaleCenterY) { + MathUtils.revertScaleAroundCenter(pVertices, pScaleX, pScaleY, pScaleCenterX, pScaleCenterY); + return MathUtils.revertRotateAroundCenter(pVertices, pRotation, pRotationCenterX, pRotationCenterY); + } + + public static int bringToBounds(final int pMinValue, final int pMaxValue, final int pValue) { + return Math.max(pMinValue, Math.min(pMaxValue, pValue)); + } + + public static float bringToBounds(final float pMinValue, final float pMaxValue, final float pValue) { + return Math.max(pMinValue, Math.min(pMaxValue, pValue)); + } + + public static float distance(final float pX1, final float pY1, final float pX2, final float pY2){ + final float dX = pX2 - pX1; + final float dY = pY2 - pY1; + return FloatMath.sqrt((dX * dX) + (dY * dY)); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/MultiKey.java b/AndEngine/src/org/anddev/andengine/util/MultiKey.java new file mode 100644 index 0000000..c0f139d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/MultiKey.java @@ -0,0 +1,89 @@ +package org.anddev.andengine.util; + +import java.util.Arrays; + +public class MultiKey { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 4465448607415788805L; + + // =========================================================== + // Fields + // =========================================================== + + private final K[] mKeys; + private final int mCachedHashCode; + + // =========================================================== + // Constructors + // =========================================================== + + public MultiKey(final K... pKeys) { + this.mKeys = pKeys; + + this.mCachedHashCode = MultiKey.hash(pKeys); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public K[] getKeys() { + return this.mKeys; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean equals(final Object pOther) { + if(pOther == this) { + return true; + } + if(pOther instanceof MultiKey) { + final MultiKey otherMultiKey = (MultiKey) pOther; + return Arrays.equals(this.mKeys, otherMultiKey.mKeys); + } + return false; + } + + public static int hash(final Object ... pKeys) { + int hashCode = 0; + for(final Object key : pKeys) { + if(key != null) { + hashCode ^= key.hashCode(); + } + } + return hashCode; + } + + + @Override + public int hashCode() { + return this.mCachedHashCode; + } + + @Override + public String toString() { + return "MultiKey" + Arrays.asList(this.mKeys).toString(); + } + + // =========================================================== + // Methods + // =========================================================== + + public K getKey(final int pIndex) { + return this.mKeys[pIndex]; + } + + public int size() { + return this.mKeys.length; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/MultiKeyHashMap.java b/AndEngine/src/org/anddev/andengine/util/MultiKeyHashMap.java new file mode 100644 index 0000000..3a515f0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/MultiKeyHashMap.java @@ -0,0 +1,75 @@ +package org.anddev.andengine.util; + +import java.util.HashMap; +import java.util.Iterator; + +/** + * @author Nicolas Gramlich + * @since 16:54:24 - 07.11.2010 + */ +public class MultiKeyHashMap extends HashMap, V> { + // =========================================================== + // Constants + // ========================================================== + + private static final long serialVersionUID = -6262447639526561122L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public V get(final K ... pKeys) { + final int hashCode = MultiKey.hash(pKeys); + + final Iterator, V>> it = this.entrySet().iterator(); + while(it.hasNext()) { + final Entry, V> entry = it.next(); + final MultiKey entryKey = entry.getKey(); + if (entryKey.hashCode() == hashCode && this.isEqualKey(entryKey.getKeys(), pKeys)) { + return entry.getValue(); + } + } + return null; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + private boolean isEqualKey(final K[] pKeysA, final K[] pKeysB) { + if (pKeysA.length != pKeysB.length) { + return false; + } else { + for (int i = 0; i < pKeysA.length; i++) { + final K keyA = pKeysA[i]; + final K keyB = pKeysB[i]; + if(keyA == null) { + if(keyB != null) { + return false; + } + } else { + if(!keyA.equals(keyB)) { + return false; + } + } + } + } + return true; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/ParameterCallable.java b/AndEngine/src/org/anddev/andengine/util/ParameterCallable.java new file mode 100644 index 0000000..478a0bd --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/ParameterCallable.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 23:40:42 - 27.12.2010 + */ +public interface ParameterCallable { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void call(final T pParameter); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/ProbabilityGenerator.java b/AndEngine/src/org/anddev/andengine/util/ProbabilityGenerator.java new file mode 100644 index 0000000..9c66515 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/ProbabilityGenerator.java @@ -0,0 +1,109 @@ +package org.anddev.andengine.util; + +import java.util.ArrayList; + +public class ProbabilityGenerator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mProbabilitySum; + private final ArrayList> mEntries = new ArrayList>(); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void add(final float pFactor, final T ... pElements){ + this.mProbabilitySum += pFactor; + this.mEntries.add(new Entry(pFactor, pElements)); + } + + public T next() { + float random = MathUtils.random(0, this.mProbabilitySum); + + final ArrayList> factors = this.mEntries; + + for(int i = factors.size() - 1; i >= 0; i--){ + final Entry entry = factors.get(i); + random -= entry.mFactor; + if(random <= 0){ + return entry.getReturnValue(); + } + } + + final Entry lastEntry = factors.get(factors.size() - 1); + return lastEntry.getReturnValue(); + } + + public void clear() { + this.mProbabilitySum = 0; + this.mEntries.clear(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + private static class Entry { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + public final float mFactor; + public final T[] mData; + + // =========================================================== + // Constructors + // =========================================================== + + public Entry(final float pFactor, final T[] pData){ + this.mFactor = pFactor; + this.mData = pData; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public T getReturnValue() { + if(this.mData.length == 1){ + return this.mData[0]; + }else{ + return ArrayUtils.random(mData); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/SAXUtils.java b/AndEngine/src/org/anddev/andengine/util/SAXUtils.java new file mode 100644 index 0000000..14007e5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/SAXUtils.java @@ -0,0 +1,152 @@ +package org.anddev.andengine.util; + +import org.xml.sax.Attributes; + +/** + * @author Nicolas Gramlich + * @since 22:02:09 - 21.07.2010 + */ +public class SAXUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static String getAttribute(final Attributes pAttributes, final String pAttributeName, final String pDefaultValue) { + final String value = pAttributes.getValue("", pAttributeName); + return (value != null) ? value : pDefaultValue; + } + + public static String getAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { + final String value = pAttributes.getValue("", pAttributeName); + if(value != null) { + return value; + } else { + throw new IllegalArgumentException("No value found for attribute: '" + pAttributeName + "'"); + } + } + + public static boolean getBooleanAttribute(final Attributes pAttributes, final String pAttributeName, final boolean pDefaultValue) { + final String value = pAttributes.getValue("", pAttributeName); + return (value != null) ? Boolean.parseBoolean(value) : pDefaultValue; + } + + public static boolean getBooleanAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { + return Boolean.parseBoolean(SAXUtils.getAttributeOrThrow(pAttributes, pAttributeName)); + } + + public static byte getByteAttribute(final Attributes pAttributes, final String pAttributeName, final byte pDefaultValue) { + final String value = pAttributes.getValue("", pAttributeName); + return (value != null) ? Byte.parseByte(value) : pDefaultValue; + } + + public static byte getByteAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { + return Byte.parseByte(SAXUtils.getAttributeOrThrow(pAttributes, pAttributeName)); + } + + + public static short getShortAttribute(final Attributes pAttributes, final String pAttributeName, final short pDefaultValue) { + final String value = pAttributes.getValue("", pAttributeName); + return (value != null) ? Short.parseShort(value) : pDefaultValue; + } + + public static short getShortAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { + return Short.parseShort(SAXUtils.getAttributeOrThrow(pAttributes, pAttributeName)); + } + + + public static int getIntAttribute(final Attributes pAttributes, final String pAttributeName, final int pDefaultValue) { + final String value = pAttributes.getValue("", pAttributeName); + return (value != null) ? Integer.parseInt(value) : pDefaultValue; + } + + public static int getIntAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { + return Integer.parseInt(SAXUtils.getAttributeOrThrow(pAttributes, pAttributeName)); + } + + + public static long getLongAttribute(final Attributes pAttributes, final String pAttributeName, final long pDefaultValue) { + final String value = pAttributes.getValue("", pAttributeName); + return (value != null) ? Long.parseLong(value) : pDefaultValue; + } + + public static long getLongAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { + return Long.parseLong(SAXUtils.getAttributeOrThrow(pAttributes, pAttributeName)); + } + + + public static float getFloatAttribute(final Attributes pAttributes, final String pAttributeName, final float pDefaultValue) { + final String value = pAttributes.getValue("", pAttributeName); + return (value != null) ? Float.parseFloat(value) : pDefaultValue; + } + + public static float getFloatAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { + return Float.parseFloat(SAXUtils.getAttributeOrThrow(pAttributes, pAttributeName)); + } + + + public static double getDoubleAttribute(final Attributes pAttributes, final String pAttributeName, final double pDefaultValue) { + final String value = pAttributes.getValue("", pAttributeName); + return (value != null) ? Double.parseDouble(value) : pDefaultValue; + } + + public static double getDoubleAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { + return Double.parseDouble(SAXUtils.getAttributeOrThrow(pAttributes, pAttributeName)); + } + + + public static void appendAttribute(final StringBuilder pStringBuilder, final String pName, final boolean pValue) { + SAXUtils.appendAttribute(pStringBuilder, pName, String.valueOf(pValue)); + } + + public static void appendAttribute(final StringBuilder pStringBuilder, final String pName, final byte pValue) { + SAXUtils.appendAttribute(pStringBuilder, pName, String.valueOf(pValue)); + } + + public static void appendAttribute(final StringBuilder pStringBuilder, final String pName, final short pValue) { + SAXUtils.appendAttribute(pStringBuilder, pName, String.valueOf(pValue)); + } + + public static void appendAttribute(final StringBuilder pStringBuilder, final String pName, final int pValue) { + SAXUtils.appendAttribute(pStringBuilder, pName, String.valueOf(pValue)); + } + + public static void appendAttribute(final StringBuilder pStringBuilder, final String pName, final long pValue) { + SAXUtils.appendAttribute(pStringBuilder, pName, String.valueOf(pValue)); + } + + public static void appendAttribute(final StringBuilder pStringBuilder, final String pName, final float pValue) { + SAXUtils.appendAttribute(pStringBuilder, pName, String.valueOf(pValue)); + } + + public static void appendAttribute(final StringBuilder pStringBuilder, final String pName, final double pValue) { + SAXUtils.appendAttribute(pStringBuilder, pName, String.valueOf(pValue)); + } + + public static void appendAttribute(final StringBuilder pStringBuilder, final String pName, final String pValue) { + pStringBuilder.append(' ').append(pName).append('=').append('\"').append(pValue).append('\"'); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/SimplePreferences.java b/AndEngine/src/org/anddev/andengine/util/SimplePreferences.java new file mode 100644 index 0000000..4680019 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/SimplePreferences.java @@ -0,0 +1,78 @@ +package org.anddev.andengine.util; + +import org.anddev.andengine.util.constants.Constants; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; + +/** + * @author Nicolas Gramlich + * @since 18:55:12 - 02.08.2010 + */ +public class SimplePreferences implements Constants { + // =========================================================== + // Constants + // =========================================================== + + private static final String PREFERENCES_NAME = null; + + // =========================================================== + // Fields + // =========================================================== + + private static SharedPreferences INSTANCE; + private static Editor EDITORINSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + public static SharedPreferences getInstance(final Context ctx) { + if(SimplePreferences.INSTANCE == null) { + SimplePreferences.INSTANCE = ctx.getSharedPreferences(SimplePreferences.PREFERENCES_NAME, Context.MODE_PRIVATE); + } + return SimplePreferences.INSTANCE; + } + + public static Editor getEditorInstance(final Context ctx) { + if(SimplePreferences.EDITORINSTANCE == null) { + SimplePreferences.EDITORINSTANCE = SimplePreferences.getInstance(ctx).edit(); + } + return SimplePreferences.EDITORINSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static int incrementAccessCount(final Context pCtx, final String pKey) { + return SimplePreferences.incrementAccessCount(pCtx, pKey, 1); + } + + public static int incrementAccessCount(final Context pCtx, final String pKey, final int pIncrement) { + final SharedPreferences prefs = SimplePreferences.getInstance(pCtx); + final int accessCount = prefs.getInt(pKey, 0); + + final int newAccessCount = accessCount + pIncrement; + prefs.edit().putInt(pKey, newAccessCount).commit(); + + return newAccessCount; + } + + public static int getAccessCount(final Context pCtx, final String pKey) { + return SimplePreferences.getInstance(pCtx).getInt(pKey, 0); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/SmartList.java b/AndEngine/src/org/anddev/andengine/util/SmartList.java new file mode 100644 index 0000000..3005635 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/SmartList.java @@ -0,0 +1,112 @@ +package org.anddev.andengine.util; + +import java.util.ArrayList; + +/** + * @author Nicolas Gramlich + * @since 22:20:08 - 27.12.2010 + */ +public class SmartList extends ArrayList { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = -8335986399182700102L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SmartList() { + + } + + public SmartList(final int pCapacity) { + super(pCapacity); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + /** + * @param pItem the item to remove. + * @param pParameterCallable to be called with the removed item, if it was removed. + */ + public boolean remove(final T pItem, final ParameterCallable pParameterCallable) { + final boolean removed = this.remove(pItem); + if(removed) { + pParameterCallable.call(pItem); + } + return removed; + } + + public T remove(final IMatcher pMatcher) { + for(int i = 0; i < this.size(); i++) { + if(pMatcher.matches(this.get(i))) { + return this.remove(i); + } + } + return null; + } + + public boolean removeAll(final IMatcher pMatcher) { + boolean result = false; + for(int i = this.size() - 1; i >= 0; i--) { + if(pMatcher.matches(this.get(i))) { + this.remove(i); + result = true; + } + } + return result; + } + + /** + * @param pMatcher to find the items. + * @param pParameterCallable to be called with each matched item after it was removed. + */ + public boolean removeAll(final IMatcher pMatcher, final ParameterCallable pParameterCallable) { + boolean result = false; + for(int i = this.size() - 1; i >= 0; i--) { + if(pMatcher.matches(this.get(i))) { + final T removed = this.remove(i); + pParameterCallable.call(removed); + result = true; + } + } + return result; + } + + public void clear(final ParameterCallable pParameterCallable) { + for(int i = this.size() - 1; i >= 0; i--) { + final T removed = this.remove(i); + pParameterCallable.call(removed); + } + } + + public T find(final IMatcher pMatcher) { + for(int i = this.size() - 1; i >= 0; i--) { + final T item = this.get(i); + if(pMatcher.matches(item)) { + return item; + } + } + return null; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/SocketUtils.java b/AndEngine/src/org/anddev/andengine/util/SocketUtils.java new file mode 100644 index 0000000..226ac2a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/SocketUtils.java @@ -0,0 +1,62 @@ +package org.anddev.andengine.util; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author Nicolas Gramlich + * @since 14:42:15 - 18.09.2009 + */ +public class SocketUtils { + // =========================================================== + // Constants + // =========================================================== + + public static final String SOCKETEXCEPTION_MESSAGE_SOCKET_CLOSED = "socket closed"; + public static final String SOCKETEXCEPTION_MESSAGE_SOCKET_IS_CLOSED = "Socket is closed"; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static void closeSocket(final Socket pSocket) { + if(pSocket != null && !pSocket.isClosed()) { + try { + pSocket.close(); + } catch (final IOException e) { + Debug.e(e); + } + } + } + + public static void closeSocket(final ServerSocket pSocket) { + if(pSocket != null && !pSocket.isClosed()) { + try { + pSocket.close(); + } catch (final IOException e) { + Debug.e(e); + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/StreamUtils.java b/AndEngine/src/org/anddev/andengine/util/StreamUtils.java new file mode 100644 index 0000000..0de86e4 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/StreamUtils.java @@ -0,0 +1,161 @@ +package org.anddev.andengine.util; + +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.util.Scanner; + +/** + * @author Nicolas Gramlich + * @since 15:48:56 - 03.09.2009 + */ +public class StreamUtils { + // =========================================================== + // Constants + // =========================================================== + + public static final int IO_BUFFER_SIZE = 8 * 1024; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static final String readFully(final InputStream pInputStream) throws IOException { + final StringBuilder sb = new StringBuilder(); + final Scanner sc = new Scanner(pInputStream); + while(sc.hasNextLine()){ + sb.append(sc.nextLine()); + } + return sb.toString(); + } + + public static byte[] streamToBytes(final InputStream pInputStream) throws IOException { + return StreamUtils.streamToBytes(pInputStream, -1); + } + + public static byte[] streamToBytes(final InputStream pInputStream, final int pReadLimit) throws IOException { + final ByteArrayOutputStream os = new ByteArrayOutputStream(Math.min(pReadLimit, IO_BUFFER_SIZE)); + StreamUtils.copy(pInputStream, os, pReadLimit); + return os.toByteArray(); + } + + public static void copy(final InputStream pInputStream, final OutputStream pOutputStream) throws IOException { + StreamUtils.copy(pInputStream, pOutputStream, -1); + } + + public static boolean copyAndClose(final InputStream pInputStream, final OutputStream pOutputStream) { + try { + StreamUtils.copy(pInputStream, pOutputStream, -1); + return true; + } catch (final IOException e) { + return false; + } finally { + StreamUtils.close(pInputStream); + StreamUtils.close(pOutputStream); + } + } + + /** + * Copy the content of the input stream into the output stream, using a temporary + * byte array buffer whose size is defined by {@link #IO_BUFFER_SIZE}. + * + * @param pInputStream The input stream to copy from. + * @param pOutputStream The output stream to copy to. + * @param pByteLimit not more than so much bytes to read, or unlimited if smaller than 0. + * + * @throws IOException If any error occurs during the copy. + */ + public static void copy(final InputStream pInputStream, final OutputStream pOutputStream, final long pByteLimit) throws IOException { + final byte[] b = new byte[IO_BUFFER_SIZE]; + long pBytesLeftToRead = pByteLimit; + int read; + if(pByteLimit < 0){ + while ((read = pInputStream.read(b)) != -1) { + pOutputStream.write(b, 0, read); + } + }else{ + while ((read = pInputStream.read(b)) != -1) { + if(pBytesLeftToRead > read){ + pOutputStream.write(b, 0, read); + pBytesLeftToRead -= read; + } else { + pOutputStream.write(b, 0, (int)pBytesLeftToRead); + break; + } + } + } + pOutputStream.flush(); + } + + /** + * Closes the specified stream. + * + * @param pCloseable The stream to close. + */ + public static void close(final Closeable pCloseable) { + if (pCloseable != null) { + try { + pCloseable.close(); + } catch (final IOException e) { + e.printStackTrace(); + } + } + } + + /** + * Flushes and closes the specified stream. + * + * @param pOutputStream The stream to close. + */ + public static void flushCloseStream(final OutputStream pOutputStream) { + if (pOutputStream != null) { + try { + pOutputStream.flush(); + } catch (final IOException e) { + e.printStackTrace(); + } finally { + StreamUtils.close(pOutputStream); + } + } + } + + /** + * Flushes and closes the specified stream. + * + * @param pWriter The Writer to close. + */ + public static void flushCloseWriter(final Writer pWriter) { + if (pWriter != null) { + try { + pWriter.flush(); + } catch (final IOException e) { + e.printStackTrace(); + } finally { + StreamUtils.close(pWriter); + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/StringUtils.java b/AndEngine/src/org/anddev/andengine/util/StringUtils.java new file mode 100644 index 0000000..e7eb6d8 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/StringUtils.java @@ -0,0 +1,109 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 19:01:08 - 03.04.2010 + */ +public class StringUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static String padFront(final String pString, final char pPadChar, final int pLength) { + final int padCount = pLength - pString.length(); + if(padCount <= 0) { + return pString; + } else { + final StringBuilder sb = new StringBuilder(); + + for(int i = padCount - 1; i >= 0; i--) { + sb.append(pPadChar); + } + sb.append(pString); + + return sb.toString(); + } + } + + public static int countOccurrences(final String pString, final char pCharacter) { + int count = 0; + + int lastOccurrence = pString.indexOf(pCharacter, 0); + + while (lastOccurrence != -1) { + count++; + lastOccurrence = pString.indexOf(pCharacter, lastOccurrence + 1); + } + + return count; + } + + /** + * Split a String by a Character, i.e. Split lines by using '\n'.
    + * Same behavior as String.split("" + pCharacter); . + * + * @param pString + * @param pCharacter + * @return + */ + public static String[] split(final String pString, final char pCharacter) { + return StringUtils.split(pString, pCharacter, null); + } + + /** + * Split a String by a Character, i.e. Split lines by using '\n'.
    + * Same behavior as String.split("" + pCharacter); . + * + * @param pString + * @param pCharacter + * @param pReuse tries to reuse the String[] if the length is the same as the length needed. + * @return + */ + public static String[] split(final String pString, final char pCharacter, final String[] pReuse) { + final int partCount = StringUtils.countOccurrences(pString, pCharacter) + 1; + + final boolean reuseable = pReuse != null && pReuse.length == partCount; + final String[] out = (reuseable) ? pReuse : new String[partCount]; + + if(partCount == 0) { + out[0] = pString; + } else { + int from = 0; + int to; + + for (int i = 0; i < partCount - 1; i++) { + to = pString.indexOf(pCharacter, from); + out[i] = pString.substring(from, to); + from = to + 1; + } + + out[partCount - 1] = pString.substring(from, pString.length()); + } + + return out; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/SystemUtils.java b/AndEngine/src/org/anddev/andengine/util/SystemUtils.java new file mode 100644 index 0000000..aa33695 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/SystemUtils.java @@ -0,0 +1,213 @@ +package org.anddev.andengine.util; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.Scanner; +import java.util.regex.MatchResult; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; + +/** + * @author Nicolas Gramlich + * @since 15:50:31 - 14.07.2010 + */ +public class SystemUtils { + // =========================================================== + // Constants + // =========================================================== + + private static final String BOGOMIPS_PATTERN = "BogoMIPS[\\s]*:[\\s]*(\\d+\\.\\d+)[\\s]*\n"; + private static final String MEMTOTAL_PATTERN = "MemTotal[\\s]*:[\\s]*(\\d+)[\\s]*kB\n"; + private static final String MEMFREE_PATTERN = "MemFree[\\s]*:[\\s]*(\\d+)[\\s]*kB\n"; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean hasSystemFeature(final Context pContext, final String pFeature) { + try { + final Method PackageManager_hasSystemFeatures = PackageManager.class.getMethod("hasSystemFeature", new Class[] { String.class }); + return (PackageManager_hasSystemFeatures == null) ? false : (Boolean) PackageManager_hasSystemFeatures.invoke(pContext.getPackageManager(), pFeature); + } catch (final Throwable t) { + return false; + } + } + + /** + * @param pBuildVersionCode taken from {@link Build.VERSION_CODES}. + */ + public static boolean isAndroidVersionOrHigher(final int pBuildVersionCode) { + return Integer.parseInt(Build.VERSION.SDK) >= pBuildVersionCode; + } + + public static float getCPUBogoMips() throws SystemUtilsException { + final MatchResult matchResult = SystemUtils.matchSystemFile("/proc/cpuinfo", BOGOMIPS_PATTERN, 1000); + + try { + if(matchResult.groupCount() > 0) { + return Float.parseFloat(matchResult.group(1)); + } else { + throw new SystemUtilsException(); + } + } catch (final NumberFormatException e) { + throw new SystemUtilsException(e); + } + } + + /** + * @return in kiloBytes. + * @throws SystemUtilsException + */ + public static int getMemoryTotal() throws SystemUtilsException { + final MatchResult matchResult = SystemUtils.matchSystemFile("/proc/meminfo", MEMTOTAL_PATTERN, 1000); + + try { + if(matchResult.groupCount() > 0) { + return Integer.parseInt(matchResult.group(1)); + } else { + throw new SystemUtilsException(); + } + } catch (final NumberFormatException e) { + throw new SystemUtilsException(e); + } + } + + /** + * @return in kiloBytes. + * @throws SystemUtilsException + */ + public static int getMemoryFree() throws SystemUtilsException { + final MatchResult matchResult = SystemUtils.matchSystemFile("/proc/meminfo", MEMFREE_PATTERN, 1000); + + try { + if(matchResult.groupCount() > 0) { + return Integer.parseInt(matchResult.group(1)); + } else { + throw new SystemUtilsException(); + } + } catch (final NumberFormatException e) { + throw new SystemUtilsException(e); + } + } + + /** + * @return in kiloHertz. + * @throws SystemUtilsException + */ + public static int getCPUFrequencyCurrent() throws SystemUtilsException { + return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"); + } + + /** + * @return in kiloHertz. + * @throws SystemUtilsException + */ + public static int getCPUFrequencyMin() throws SystemUtilsException { + return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"); + } + + /** + * @return in kiloHertz. + * @throws SystemUtilsException + */ + public static int getCPUFrequencyMax() throws SystemUtilsException { + return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"); + } + + /** + * @return in kiloHertz. + * @throws SystemUtilsException + */ + public static int getCPUFrequencyMinScaling() throws SystemUtilsException { + return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq"); + } + + /** + * @return in kiloHertz. + * @throws SystemUtilsException + */ + public static int getCPUFrequencyMaxScaling() throws SystemUtilsException { + return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"); + } + + private static MatchResult matchSystemFile(final String pSystemFile, final String pPattern, final int pHorizon) throws SystemUtilsException { + InputStream in = null; + try { + final Process process = new ProcessBuilder(new String[] { "/system/bin/cat", pSystemFile }).start(); + + in = process.getInputStream(); + final Scanner scanner = new Scanner(in); + + final boolean matchFound = scanner.findWithinHorizon(pPattern, pHorizon) != null; + if(matchFound) { + return scanner.match(); + } else { + throw new SystemUtilsException(); + } + } catch (final IOException e) { + throw new SystemUtilsException(e); + } finally { + StreamUtils.close(in); + } + } + + private static int readSystemFileAsInt(final String pSystemFile) throws SystemUtilsException { + InputStream in = null; + try { + final Process process = new ProcessBuilder(new String[] { "/system/bin/cat", pSystemFile }).start(); + + in = process.getInputStream(); + final String content = StreamUtils.readFully(in); + return Integer.parseInt(content); + } catch (final IOException e) { + throw new SystemUtilsException(e); + } catch (final NumberFormatException e) { + throw new SystemUtilsException(e); + } finally { + StreamUtils.close(in); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class SystemUtilsException extends Exception { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = -7256483361095147596L; + + // =========================================================== + // Methods + // =========================================================== + + public SystemUtilsException() { + + } + + public SystemUtilsException(final Throwable pThrowable) { + super(pThrowable); + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/TimeUtils.java b/AndEngine/src/org/anddev/andengine/util/TimeUtils.java new file mode 100644 index 0000000..fd8edc3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/TimeUtils.java @@ -0,0 +1,56 @@ +package org.anddev.andengine.util; + +import org.anddev.andengine.util.constants.TimeConstants; + +/** + * @author Nicolas Gramlich + * @since 22:48:49 - 04.04.2011 + */ +public class TimeUtils implements TimeConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static String formatSeconds(final int pSecondsTotal) { + return formatSeconds(pSecondsTotal, new StringBuilder()); + } + + public static String formatSeconds(final int pSecondsTotal, final StringBuilder pStringBuilder) { + final int minutes = pSecondsTotal / SECONDSPERMINUTE; + final int seconds = pSecondsTotal % SECONDSPERMINUTE; + + pStringBuilder.append(minutes); + pStringBuilder.append(':'); + + if(seconds < 10) { + pStringBuilder.append('0'); + } + pStringBuilder.append(seconds); + + return pStringBuilder.toString(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/Transformation.java b/AndEngine/src/org/anddev/andengine/util/Transformation.java new file mode 100644 index 0000000..58acc4b --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/Transformation.java @@ -0,0 +1,229 @@ +package org.anddev.andengine.util; + +import android.util.FloatMath; + + +/** + *

    This class is basically a java-space replacement for the native {@link android.graphics.Matrix} class.

    + * + *

    Math taken from senocular.com.

    + * + * This class represents an affine transformation with the following matrix: + *
     [ a , b , 0 ]
    + * [ c , d , 0 ]
    + * [ tx, ty, 1 ]
    + * where: + *
      + *
    • a is the x scale
    • + *
    • b is the y skew
    • + *
    • c is the x skew
    • + *
    • d is the y scale
    • + *
    • tx is the x translation
    • + *
    • ty is the y translation
    • + *
    + * + *

    TODO Think if that caching of Transformation through the TransformationPool really needs to be thread-safe or if one simple reused static Transform object is enough.

    + * + * @author Nicolas Gramlich + * @since 15:47:18 - 23.12.2010 + */ +public class Transformation { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float a; /* x scale */ + private float b; /* y skew */ + private float c; /* x skew */ + private float d; /* y scale */ + private float tx; /* x translation */ + private float ty; /* y translation */ + + // =========================================================== + // Constructors + // =========================================================== + + public Transformation() { + this.a = 1.0f; + this.d = 1.0f; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public String toString() { + return "Transformation{[" + this.a + ", " + this.c + ", " + this.tx + "][" + this.b + ", " + this.d + ", " + this.ty + "][0.0, 0.0, 1.0]}"; + } + + // =========================================================== + // Methods + // =========================================================== + + public void reset() { + this.setToIdentity(); + } + + public void setToIdentity() { + this.a = 1.0f; + this.d = 1.0f; + + this.b = 0.0f; + this.c = 0.0f; + this.tx = 0.0f; + this.ty = 0.0f; + } + + public void preTranslate(final float pX, final float pY) { + final Transformation transformation = TransformationPool.obtain(); + this.preConcat(transformation.setToTranslate(pX, pY)); + TransformationPool.recycle(transformation); + } + + public void postTranslate(final float pX, final float pY) { + final Transformation transformation = TransformationPool.obtain(); + this.postConcat(transformation.setToTranslate(pX, pY)); + TransformationPool.recycle(transformation); + } + + public Transformation setToTranslate(final float pX, final float pY) { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.tx = pX; + this.ty = pY; + + return this; + } + + public void preScale(final float pScaleX, final float pScaleY) { + final Transformation transformation = TransformationPool.obtain(); + this.preConcat(transformation.setToScale(pScaleX, pScaleY)); + TransformationPool.recycle(transformation); + } + + public void postScale(final float pScaleX, final float pScaleY) { + final Transformation transformation = TransformationPool.obtain(); + this.postConcat(transformation.setToScale(pScaleX, pScaleY)); + TransformationPool.recycle(transformation); + } + + public Transformation setToScale(final float pScaleX, final float pScaleY) { + this.a = pScaleX; + this.b = 0; + this.c = 0; + this.d = pScaleY; + this.tx = 0; + this.ty = 0; + + return this; + } + + public void preRotate(final float pAngle) { + final Transformation transformation = TransformationPool.obtain(); + this.preConcat(transformation.setToRotate(pAngle)); + TransformationPool.recycle(transformation); + } + + public void postRotate(final float pAngle) { + final Transformation transformation = TransformationPool.obtain(); + this.postConcat(transformation.setToRotate(pAngle)); + TransformationPool.recycle(transformation); + } + + public Transformation setToRotate(final float pAngle) { + final float angleRad = MathUtils.degToRad(pAngle); + + final float sin = FloatMath.sin(angleRad); + final float cos = FloatMath.cos(angleRad); + + this.a = cos; + this.b = sin; + this.c = -sin; + this.d = cos; + this.tx = 0; + this.ty = 0; + + return this; + } + + public void postConcat(final Transformation pTransformation) { + final float a1 = this.a; + final float a2 = pTransformation.a; + + final float b1 = this.b; + final float b2 = pTransformation.b; + + final float c1 = this.c; + final float c2 = pTransformation.c; + + final float d1 = this.d; + final float d2 = pTransformation.d; + + final float tx1 = this.tx; + final float tx2 = pTransformation.tx; + + final float ty1 = this.ty; + final float ty2 = pTransformation.ty; + + this.a = a1 * a2 + b1 * c2; + this.b = a1 * b2 + b1 * d2; + this.c = c1 * a2 + d1 * c2; + this.d = c1 * b2 + d1 * d2; + this.tx = tx1 * a2 + ty1 * c2 + tx2; + this.ty = tx1 * b2 + ty1 * d2 + ty2; + } + + public void preConcat(final Transformation pTransformation) { + final float a1 = pTransformation.a; + final float a2 = this.a; + + final float b1 = pTransformation.b; + final float b2 = this.b; + + final float c1 = pTransformation.c; + final float c2 = this.c; + + final float d1 = pTransformation.d; + final float d2 = this.d; + + final float tx1 = pTransformation.tx; + final float tx2 = this.tx; + + final float ty1 = pTransformation.ty; + final float ty2 = this.ty; + + this.a = a1 * a2 + b1 * c2; + this.b = a1 * b2 + b1 * d2; + this.c = c1 * a2 + d1 * c2; + this.d = c1 * b2 + d1 * d2; + this.tx = tx1 * a2 + ty1 * c2 + tx2; + this.ty = tx1 * b2 + ty1 * d2 + ty2; + } + + public void transform(final float[] pVertices) { + int count = pVertices.length / 2; + int i = 0; + int j = 0; + while(--count >= 0) { + final float x = pVertices[i++]; + final float y = pVertices[i++]; + pVertices[j++] = x * this.a + y * this.c + this.tx; + pVertices[j++] = x * this.b + y * this.d + this.ty; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/TransformationPool.java b/AndEngine/src/org/anddev/andengine/util/TransformationPool.java new file mode 100644 index 0000000..f8390b5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/TransformationPool.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.util; + +import org.anddev.andengine.util.pool.GenericPool; + +/** + * @author Nicolas Gramlich + * @since 23:07:53 - 23.02.2011 + */ +public class TransformationPool { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static final GenericPool POOL = new GenericPool() { + @Override + protected Transformation onAllocatePoolItem() { + return new Transformation(); + } + }; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public static Transformation obtain() { + return POOL.obtainPoolItem(); + } + + public static void recycle(final Transformation pTransformation) { + pTransformation.setToIdentity(); + POOL.recyclePoolItem(pTransformation); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/VerticalAlign.java b/AndEngine/src/org/anddev/andengine/util/VerticalAlign.java new file mode 100644 index 0000000..936c1e6 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/VerticalAlign.java @@ -0,0 +1,43 @@ +package org.anddev.andengine.util; + +/** + * @author Nicolas Gramlich + * @since 15:15:23 - 24.07.2010 + */ +public enum VerticalAlign { + // =========================================================== + // Elements + // =========================================================== + + TOP, + CENTER, + BOTTOM; + + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/ViewUtils.java b/AndEngine/src/org/anddev/andengine/util/ViewUtils.java new file mode 100644 index 0000000..2004439 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/ViewUtils.java @@ -0,0 +1,48 @@ +package org.anddev.andengine.util; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * @author Nicolas Gramlich + * @since 20:55:35 - 08.09.2009 + */ +public class ViewUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static View inflate(final Context pContext, final int pLayoutID){ + return LayoutInflater.from(pContext).inflate(pLayoutID, null); + } + + public static View inflate(final Context pContext, final int pLayoutID, final ViewGroup pViewGroup){ + return LayoutInflater.from(pContext).inflate(pLayoutID, pViewGroup, true); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/cache/RectangleVertexBufferCache.java b/AndEngine/src/org/anddev/andengine/util/cache/RectangleVertexBufferCache.java new file mode 100644 index 0000000..cb3fdb4 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/cache/RectangleVertexBufferCache.java @@ -0,0 +1,70 @@ +package org.anddev.andengine.util.cache; + +import javax.microedition.khronos.opengles.GL11; + +import org.anddev.andengine.opengl.buffer.BufferObjectManager; +import org.anddev.andengine.opengl.vertex.RectangleVertexBuffer; +import org.anddev.andengine.util.MultiKey; +import org.anddev.andengine.util.MultiKeyHashMap; + +/** + * @author Nicolas Gramlich + * @since 21:10:05 - 09.01.2011 + */ +public class RectangleVertexBufferCache { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mDrawType; + + private final MultiKeyHashMap mRectangleVertexBufferCache = new MultiKeyHashMap(); + + // =========================================================== + // Constructors + // =========================================================== + + public RectangleVertexBufferCache() { + this(GL11.GL_STATIC_DRAW); + } + + public RectangleVertexBufferCache(final int pDrawType) { + this.mDrawType = pDrawType; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public RectangleVertexBuffer get(final int pWidth, final int pHeight) { + final RectangleVertexBuffer cachedRectangleVertexBuffer = this.mRectangleVertexBufferCache.get(pWidth, pHeight); + if(cachedRectangleVertexBuffer != null) { + return cachedRectangleVertexBuffer; + } else { + return this.put(pWidth, pHeight, new RectangleVertexBuffer(this.mDrawType)); + } + } + + public RectangleVertexBuffer put(final int pWidth, final int pHeight, final RectangleVertexBuffer pRectangleVertexBuffer) { + pRectangleVertexBuffer.update(pWidth, pHeight); + BufferObjectManager.getActiveInstance().loadBufferObject(pRectangleVertexBuffer); + this.mRectangleVertexBufferCache.put(new MultiKey(pWidth, pHeight), pRectangleVertexBuffer); + return pRectangleVertexBuffer; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/constants/ColorConstants.java b/AndEngine/src/org/anddev/andengine/util/constants/ColorConstants.java new file mode 100644 index 0000000..7976359 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/constants/ColorConstants.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.util.constants; + +/** + * @author Nicolas Gramlich + * @since 10:21:46 - 19.07.2010 + */ +public interface ColorConstants { + // =========================================================== + // Final Fields + // =========================================================== + + public static final float COLOR_FACTOR_INT_TO_FLOAT = 255.0f; + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/constants/Constants.java b/AndEngine/src/org/anddev/andengine/util/constants/Constants.java new file mode 100644 index 0000000..c783d5c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/constants/Constants.java @@ -0,0 +1,20 @@ +package org.anddev.andengine.util.constants; + +/** + * @author Nicolas Gramlich + * @since 13:52:21 - 08.03.2010 + */ +public interface Constants { + // =========================================================== + // Final Fields + // =========================================================== + + public static final String DEBUGTAG = "AndEngine"; + + public static final int VERTEX_INDEX_X = 0; + public static final int VERTEX_INDEX_Y = 1; + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/constants/MIMETypes.java b/AndEngine/src/org/anddev/andengine/util/constants/MIMETypes.java new file mode 100644 index 0000000..9659806 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/constants/MIMETypes.java @@ -0,0 +1,19 @@ +package org.anddev.andengine.util.constants; + +/** + * @author Nicolas Gramlich + * @since 14:58:20 - 10.01.2011 + */ +public interface MIMETypes { + // =========================================================== + // Final Fields + // =========================================================== + + public static final String JPEG = "image/jpeg"; + public static final String GIF = "image/gif"; + public static final String PNG = "image/png"; + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/constants/MathConstants.java b/AndEngine/src/org/anddev/andengine/util/constants/MathConstants.java new file mode 100644 index 0000000..6c478a4 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/constants/MathConstants.java @@ -0,0 +1,23 @@ +package org.anddev.andengine.util.constants; + +/** + * @author Nicolas Gramlich + * @since 16:49:25 - 26.07.2010 + */ +public interface MathConstants { + // =========================================================== + // Final Fields + // =========================================================== + + public static final float PI = (float) Math.PI; + + public static float PI_TWICE = PI * 2.0f; + public static float PI_HALF = PI * 0.5f; + + public static final float DEG_TO_RAD = PI / 180.0f; + public static final float RAD_TO_DEG = 180.0f / PI; + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/constants/TimeConstants.java b/AndEngine/src/org/anddev/andengine/util/constants/TimeConstants.java new file mode 100644 index 0000000..f56dd8f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/constants/TimeConstants.java @@ -0,0 +1,37 @@ +package org.anddev.andengine.util.constants; + +/** + * @author Nicolas Gramlich + * @since 16:49:25 - 26.07.2010 + */ +public interface TimeConstants { + // =========================================================== + // Final Fields + // =========================================================== + + public static final int MONTHSPERYEAR = 12; + + public static final int DAYSPERWEEK = 7; + + public static final int DAYSPERMONTH = 30; + + public static final int HOURSPERDAY = 24; + + public static final int MINUTESPERHOUR = 60; + + public static final int SECONDSPERMINUTE = 60; + public static final int SECONDSPERHOUR = SECONDSPERMINUTE * MINUTESPERHOUR; + public static final int SECONDSPERDAY = SECONDSPERHOUR * HOURSPERDAY; + public static final int SECONDSPERWEEK = SECONDSPERDAY * DAYSPERWEEK; + public static final int SECONDSPERMONTH = SECONDSPERDAY * DAYSPERMONTH; + public static final int SECONDSPERYEAR = SECONDSPERMONTH * MONTHSPERYEAR; + + public static final int MILLISECONDSPERSECOND = 1000; + + public static final long NANOSECONDSPERSECOND = 1000000000; + public static final long NANOSECONDSPERMILLISECOND = NANOSECONDSPERSECOND / MILLISECONDSPERSECOND; + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/levelstats/LevelStatsDBConnector.java b/AndEngine/src/org/anddev/andengine/util/levelstats/LevelStatsDBConnector.java new file mode 100644 index 0000000..19ecc53 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/levelstats/LevelStatsDBConnector.java @@ -0,0 +1,131 @@ +package org.anddev.andengine.util.levelstats; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.anddev.andengine.util.Callback; +import org.anddev.andengine.util.Debug; +import org.anddev.andengine.util.MathUtils; +import org.anddev.andengine.util.SimplePreferences; +import org.anddev.andengine.util.StreamUtils; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; + +import android.content.Context; +import android.content.SharedPreferences; + +/** + * @author Nicolas Gramlich + * @since 21:13:55 - 18.10.2010 + */ +public class LevelStatsDBConnector { + // =========================================================== + // Constants + // =========================================================== + + private static final String PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_ID = "preferences.levelstatsdbconnector.playerid"; + + // =========================================================== + // Fields + // =========================================================== + + private final String mSecret; + private final String mSubmitURL; + private final int mPlayerID; + + // =========================================================== + // Constructors + // =========================================================== + + public LevelStatsDBConnector(final Context pContext, final String pSecret, final String pSubmitURL) { + this.mSecret = pSecret; + this.mSubmitURL = pSubmitURL; + + final SharedPreferences simplePreferences = SimplePreferences.getInstance(pContext); + final int playerID = simplePreferences.getInt(PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_ID, -1); + if(playerID != -1) { + this.mPlayerID = playerID; + } else { + this.mPlayerID = MathUtils.random(1000000000, Integer.MAX_VALUE); + SimplePreferences.getEditorInstance(pContext).putInt(PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_ID, this.mPlayerID).commit(); + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public void submitAsync(final int pLevelID, final boolean pSolved, final int pSecondsElapsed) { + this.submitAsync(pLevelID, pSolved, pSecondsElapsed, null); + } + + public void submitAsync(final int pLevelID, final boolean pSolved, final int pSecondsElapsed, final Callback pCallback) { + new Thread(new Runnable() { + @Override + public void run() { + try{ + /* Create a new HttpClient and Post Header. */ + final HttpClient httpClient = new DefaultHttpClient(); + final HttpPost httpPost = new HttpPost(LevelStatsDBConnector.this.mSubmitURL); + + /* Append POST data. */ + final List nameValuePairs = new ArrayList(4); + + nameValuePairs.add(new BasicNameValuePair("level_id", String.valueOf(pLevelID))); + nameValuePairs.add(new BasicNameValuePair("solved", (pSolved) ? "1" : "0")); + nameValuePairs.add(new BasicNameValuePair("secondsplayed", String.valueOf(pSecondsElapsed))); + nameValuePairs.add(new BasicNameValuePair("player_id", String.valueOf(LevelStatsDBConnector.this.mPlayerID))); + nameValuePairs.add(new BasicNameValuePair("secret", String.valueOf(LevelStatsDBConnector.this.mSecret))); + + httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); + + /* Execute HTTP Post Request. */ + final HttpResponse httpResponse = httpClient.execute(httpPost); + + final int statusCode = httpResponse.getStatusLine().getStatusCode(); + if(statusCode == HttpStatus.SC_OK) { + final String response = StreamUtils.readFully(httpResponse.getEntity().getContent()); + + if(response.equals("")) { + if(pCallback != null) { + pCallback.onCallback(true); + } + } else { + if(pCallback != null) { + pCallback.onCallback(false); + } + } + } else { + if(pCallback != null) { + pCallback.onCallback(false); + } + } + }catch(final IOException e) { + Debug.e(e); + if(pCallback != null) { + pCallback.onCallback(false); + } + } + } + }).start(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/BaseDoubleValueSpanModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/BaseDoubleValueSpanModifier.java new file mode 100644 index 0000000..d59a9c3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/BaseDoubleValueSpanModifier.java @@ -0,0 +1,78 @@ +package org.anddev.andengine.util.modifier; + +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 10:51:46 - 03.09.2010 + * @param + */ +public abstract class BaseDoubleValueSpanModifier extends BaseSingleValueSpanModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mFromValueB; + private final float mValueSpanB; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseDoubleValueSpanModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB) { + this(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, null, IEaseFunction.DEFAULT); + } + + public BaseDoubleValueSpanModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final IEaseFunction pEaseFunction) { + this(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, null, pEaseFunction); + } + + public BaseDoubleValueSpanModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final IModifierListener pModifierListener) { + this(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, pModifierListener, IEaseFunction.DEFAULT); + } + + public BaseDoubleValueSpanModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final IModifierListener pModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromValueA, pToValueA, pModifierListener, pEaseFunction); + this.mFromValueB = pFromValueB; + this.mValueSpanB = pToValueB - pFromValueB; + } + + protected BaseDoubleValueSpanModifier(final BaseDoubleValueSpanModifier pBaseDoubleValueSpanModifier) { + super(pBaseDoubleValueSpanModifier); + this.mFromValueB = pBaseDoubleValueSpanModifier.mFromValueB; + this.mValueSpanB = pBaseDoubleValueSpanModifier.mValueSpanB; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onSetInitialValues(final T pItem, final float pValueA, final float pValueB); + protected abstract void onSetValues(final T pItem, final float pPercentageDone, final float pValueA, final float pValueB); + + @Override + protected void onSetInitialValue(final T pItem, final float pValueA) { + this.onSetInitialValues(pItem, pValueA, this.mFromValueB); + } + + @Override + protected void onSetValue(final T pItem, final float pPercentageDone, final float pValueA) { + this.onSetValues(pItem, pPercentageDone, pValueA, this.mFromValueB + pPercentageDone * this.mValueSpanB); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/BaseDurationModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/BaseDurationModifier.java new file mode 100644 index 0000000..d8e4df3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/BaseDurationModifier.java @@ -0,0 +1,103 @@ +package org.anddev.andengine.util.modifier; + + +/** + * @author Nicolas Gramlich + * @since 10:48:13 - 03.09.2010 + * @param + */ +public abstract class BaseDurationModifier extends BaseModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private float mTotalSecondsElapsed; + protected final float mDuration; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseDurationModifier() { + this(-1, null); + } + + public BaseDurationModifier(final float pDuration) { + this(pDuration, null); + } + + public BaseDurationModifier(final float pDuration, final IModifierListener pModifierListener) { + super(pModifierListener); + this.mDuration = pDuration; + } + + protected BaseDurationModifier(final BaseDurationModifier pBaseModifier) { + this(pBaseModifier.mDuration, pBaseModifier.mModifierListener); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + protected float getTotalSecondsElapsed() { + return this.mTotalSecondsElapsed; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getDuration() { + return this.mDuration; + } + + protected abstract void onManagedUpdate(final float pSecondsElapsed, final T pItem); + + protected abstract void onManagedInitialize(final T pItem); + + @Override + public final void onUpdate(final float pSecondsElapsed, final T pItem) { + if(!this.mFinished){ + if(this.mTotalSecondsElapsed == 0) { + this.onManagedInitialize(pItem); + } + + final float secondsToElapse; + if(this.mTotalSecondsElapsed + pSecondsElapsed < this.mDuration) { + secondsToElapse = pSecondsElapsed; + } else { + secondsToElapse = this.mDuration - this.mTotalSecondsElapsed; + } + + this.mTotalSecondsElapsed += secondsToElapse; + this.onManagedUpdate(secondsToElapse, pItem); + + if(this.mDuration != -1 && this.mTotalSecondsElapsed >= this.mDuration) { + this.mTotalSecondsElapsed = this.mDuration; + this.mFinished = true; + if(this.mModifierListener != null) { + this.mModifierListener.onModifierFinished(this, pItem); + } + } + } + } + + @Override + public void reset() { + this.mFinished = false; + this.mTotalSecondsElapsed = 0; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/BaseModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/BaseModifier.java new file mode 100644 index 0000000..9c909a3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/BaseModifier.java @@ -0,0 +1,81 @@ +package org.anddev.andengine.util.modifier; + + +/** + * @author Nicolas Gramlich + * @since 10:47:23 - 03.09.2010 + * @param + */ +public abstract class BaseModifier implements IModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected boolean mFinished; + private boolean mRemoveWhenFinished = true; + protected IModifierListener mModifierListener; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseModifier() { + this((IModifierListener)null); + } + + public BaseModifier(final IModifierListener pModifierListener) { + this.mModifierListener = pModifierListener; + } + + protected BaseModifier(final BaseModifier pBaseModifier) { + this(pBaseModifier.mModifierListener); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isFinished() { + return this.mFinished; + } + + @Override + public final boolean isRemoveWhenFinished() { + return this.mRemoveWhenFinished; + } + + @Override + public final void setRemoveWhenFinished(final boolean pRemoveWhenFinished) { + this.mRemoveWhenFinished = pRemoveWhenFinished; + } + + @Override + public IModifierListener getModifierListener() { + return this.mModifierListener; + } + + @Override + public void setModifierListener(final IModifierListener pModifierListener) { + this.mModifierListener = pModifierListener; + } + + @Override + public abstract IModifier clone(); + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/BaseSingleValueChangeModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/BaseSingleValueChangeModifier.java new file mode 100644 index 0000000..a5f41cc --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/BaseSingleValueChangeModifier.java @@ -0,0 +1,65 @@ +package org.anddev.andengine.util.modifier; + + +/** + * @author Nicolas Gramlich + * @since 10:49:51 - 03.09.2010 + * @param + */ +public abstract class BaseSingleValueChangeModifier extends BaseDurationModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mValueChangePerSecond; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseSingleValueChangeModifier(final float pDuration, final float pValueChange) { + this(pDuration, pValueChange, null); + } + + public BaseSingleValueChangeModifier(final float pDuration, final float pValueChange, final IModifierListener pModifierListener) { + super(pDuration, pModifierListener); + this.mValueChangePerSecond = pValueChange / pDuration; + } + + protected BaseSingleValueChangeModifier(final BaseSingleValueChangeModifier pBaseSingleValueChangeModifier) { + super(pBaseSingleValueChangeModifier); + this.mValueChangePerSecond = pBaseSingleValueChangeModifier.mValueChangePerSecond; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onChangeValue(final T pItem, final float pValue); + + @Override + protected void onManagedInitialize(final T pItem) { + + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed, final T pItem) { + this.onChangeValue(pItem, this.mValueChangePerSecond * pSecondsElapsed); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/BaseSingleValueSpanModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/BaseSingleValueSpanModifier.java new file mode 100644 index 0000000..952214e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/BaseSingleValueSpanModifier.java @@ -0,0 +1,83 @@ +package org.anddev.andengine.util.modifier; + +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 23:29:22 - 19.03.2010 + */ +public abstract class BaseSingleValueSpanModifier extends BaseDurationModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mFromValue; + private final float mValueSpan; + + protected final IEaseFunction mEaseFunction; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseSingleValueSpanModifier(final float pDuration, final float pFromValue, final float pToValue) { + this(pDuration, pFromValue, pToValue, null, IEaseFunction.DEFAULT); + } + + public BaseSingleValueSpanModifier(final float pDuration, final float pFromValue, final float pToValue, final IEaseFunction pEaseFunction) { + this(pDuration, pFromValue, pToValue, null, pEaseFunction); + } + + public BaseSingleValueSpanModifier(final float pDuration, final float pFromValue, final float pToValue, final IModifierListener pModifierListener) { + this(pDuration, pFromValue, pToValue, IEaseFunction.DEFAULT); + } + + public BaseSingleValueSpanModifier(final float pDuration, final float pFromValue, final float pToValue, final IModifierListener pModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pModifierListener); + this.mFromValue = pFromValue; + this.mValueSpan = pToValue - pFromValue; + this.mEaseFunction = pEaseFunction; + } + + protected BaseSingleValueSpanModifier(final BaseSingleValueSpanModifier pBaseSingleValueSpanModifier) { + super(pBaseSingleValueSpanModifier); + this.mFromValue = pBaseSingleValueSpanModifier.mFromValue; + this.mValueSpan = pBaseSingleValueSpanModifier.mValueSpan; + this.mEaseFunction = pBaseSingleValueSpanModifier.mEaseFunction; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onSetInitialValue(final T pItem, final float pValue); + protected abstract void onSetValue(final T pItem, final float pPercentageDone, final float pValue); + + @Override + protected void onManagedInitialize(final T pItem) { + this.onSetInitialValue(pItem, this.mFromValue); + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed, final T pItem) { + final float percentageDone = this.mEaseFunction.getPercentageDone(this.getTotalSecondsElapsed(), this.mDuration, 0, 1); + + this.onSetValue(pItem, percentageDone, this.mFromValue + percentageDone * this.mValueSpan); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/BaseTripleValueSpanModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/BaseTripleValueSpanModifier.java new file mode 100644 index 0000000..006fd4d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/BaseTripleValueSpanModifier.java @@ -0,0 +1,70 @@ +package org.anddev.andengine.util.modifier; + +import org.anddev.andengine.util.modifier.ease.IEaseFunction; + +/** + * @author Nicolas Gramlich + * @since 10:52:31 - 03.09.2010 + * @param + */ +public abstract class BaseTripleValueSpanModifier extends BaseDoubleValueSpanModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final float mFromValueC; + private final float mValueSpanC; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseTripleValueSpanModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final float pFromValueC, final float pToValueC, final IEaseFunction pEaseFunction) { + this(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, pFromValueC, pToValueC, null, pEaseFunction); + } + + public BaseTripleValueSpanModifier(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final float pFromValueC, final float pToValueC, final IModifierListener pModifierListener, final IEaseFunction pEaseFunction) { + super(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, pModifierListener, pEaseFunction); + this.mFromValueC = pFromValueC; + this.mValueSpanC = pToValueC - pFromValueC; + } + + protected BaseTripleValueSpanModifier(final BaseTripleValueSpanModifier pBaseTripleValueSpanModifier) { + super(pBaseTripleValueSpanModifier); + this.mFromValueC = pBaseTripleValueSpanModifier.mFromValueC; + this.mValueSpanC = pBaseTripleValueSpanModifier.mValueSpanC; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract void onSetInitialValues(final T pItem, final float pValueA, final float pValueB, final float pValueC); + protected abstract void onSetValues(final T pItem, final float pPerctentageDone, final float pValueA, final float pValueB, final float pValueC); + + @Override + protected void onSetInitialValues(final T pItem, final float pValueA, final float pValueB) { + this.onSetInitialValues(pItem, pValueA, pValueB, this.mFromValueC); + } + + @Override + protected void onSetValues(final T pItem, final float pPercentageDone, final float pValueA, final float pValueB) { + this.onSetValues(pItem, pPercentageDone, pValueA, pValueB, this.mFromValueC + pPercentageDone * this.mValueSpanC); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/IModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/IModifier.java new file mode 100644 index 0000000..1c827d3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/IModifier.java @@ -0,0 +1,47 @@ +package org.anddev.andengine.util.modifier; + + +/** + * @author Nicolas Gramlich + * @since 11:17:50 - 19.03.2010 + */ +public interface IModifier extends Cloneable { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void reset(); + + public boolean isFinished(); + public boolean isRemoveWhenFinished(); + public void setRemoveWhenFinished(final boolean pRemoveWhenFinished); + + public IModifier clone(); + + public float getDuration(); + + public void onUpdate(final float pSecondsElapsed, final T pItem); + + public IModifierListener getModifierListener(); + public void setModifierListener(final IModifierListener pModifierListener); + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface IModifierListener { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onModifierFinished(final IModifier pModifier, final T pItem); + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/LoopModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/LoopModifier.java new file mode 100644 index 0000000..f545904 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/LoopModifier.java @@ -0,0 +1,138 @@ +package org.anddev.andengine.util.modifier; + + +/** + * @author Nicolas Gramlich + * @since 11:18:37 - 03.09.2010 + * @param + */ +public class LoopModifier extends BaseModifier { + // =========================================================== + // Constants + // =========================================================== + + public static final int LOOP_CONTINUOUS = -1; + + // =========================================================== + // Fields + // =========================================================== + + private final float mDuration; + + private final IModifier mModifier; + + private ILoopModifierListener mLoopModifierListener; + + private final int mInitialLoopCount; + private int mLoopCount; + + // =========================================================== + // Constructors + // =========================================================== + + public LoopModifier(final IModifier pModifier) { + this(null, LOOP_CONTINUOUS, pModifier); + } + + public LoopModifier(final int pLoopCount, final IModifier pModifier) { + this(null, pLoopCount, pModifier); + } + + public LoopModifier(final IModifierListener pModifierListener, final int pLoopCount, final IModifier pModifier) { + this(pModifierListener, pLoopCount, null, pModifier); + } + + public LoopModifier(final IModifierListener pModifierListener, final int pLoopCount, final ILoopModifierListener pLoopModifierListener, final IModifier pModifier) { + super(pModifierListener); + this.mLoopModifierListener = pLoopModifierListener; + this.mModifier = pModifier; + this.mInitialLoopCount = pLoopCount; + this.mLoopCount = pLoopCount; + this.mDuration = pLoopCount == LOOP_CONTINUOUS ? Float.POSITIVE_INFINITY : pModifier.getDuration() * pLoopCount; // TODO Check if POSITIVE_INFINITY works correct with i.e. SequenceModifier + + pModifier.setModifierListener(new InternalModifierListener()); + } + + protected LoopModifier(final LoopModifier pLoopModifier) { + this(pLoopModifier.mModifierListener, pLoopModifier.mInitialLoopCount, pLoopModifier.mModifier.clone()); + } + + @Override + public LoopModifier clone(){ + return new LoopModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public ILoopModifierListener getLoopModifierListener() { + return this.mLoopModifierListener; + } + + public void setLoopModifierListener(final ILoopModifierListener pLoopModifierListener) { + this.mLoopModifierListener = pLoopModifierListener; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getDuration() { + return this.mDuration; + } + + @Override + public void onUpdate(final float pSecondsElapsed, final T pItem) { + if(!this.mFinished) { + this.mModifier.onUpdate(pSecondsElapsed, pItem); + } + } + + @Override + public void reset() { + this.mLoopCount = this.mInitialLoopCount; + + this.mModifier.reset(); + } + + // =========================================================== + // Methods + // =========================================================== + + public void onHandleLoopFinished(final T pItem) { + if(this.mLoopModifierListener != null) { + this.mLoopModifierListener.onLoopFinished(this, this.mLoopCount); + } + + if(this.mInitialLoopCount == LOOP_CONTINUOUS) { + this.mModifier.reset(); + } else { + this.mLoopCount--; + if(this.mLoopCount < 0) { + this.mFinished = true; + if(this.mModifierListener != null) { + this.mModifierListener.onModifierFinished(this, pItem); + } + } else { + this.mModifier.reset(); + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface ILoopModifierListener { + public void onLoopFinished(final LoopModifier pLoopModifier, final int pLoopsRemaining); + } + + private class InternalModifierListener implements IModifierListener { + @Override + public void onModifierFinished(final IModifier pModifier, final T pItem) { + LoopModifier.this.onHandleLoopFinished(pItem); + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ModifierList.java b/AndEngine/src/org/anddev/andengine/util/modifier/ModifierList.java new file mode 100644 index 0000000..36d75ed --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ModifierList.java @@ -0,0 +1,80 @@ +package org.anddev.andengine.util.modifier; + +import java.util.ArrayList; + +import org.anddev.andengine.engine.handler.IUpdateHandler; +import org.anddev.andengine.util.SmartList; + +/** + * @author Nicolas Gramlich + * @since 14:34:57 - 03.09.2010 + */ +public class ModifierList extends SmartList> implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 1610345592534873475L; + + // =========================================================== + // Fields + // =========================================================== + + private final T mTarget; + + // =========================================================== + // Constructors + // =========================================================== + + public ModifierList(final T pTarget) { + this.mTarget = pTarget; + } + + public ModifierList(final T pTarget, final int pCapacity){ + super(pCapacity); + this.mTarget = pTarget; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public T getTarget() { + return this.mTarget; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + final ArrayList> modifiers = this; + final int modifierCount = this.size(); + if(modifierCount > 0) { + for(int i = modifierCount - 1; i >= 0; i--) { + final IModifier modifier = modifiers.get(i); + modifier.onUpdate(pSecondsElapsed, this.mTarget); + if(modifier.isFinished() && modifier.isRemoveWhenFinished()) { + modifiers.remove(i); + } + } + } + } + + @Override + public void reset() { + final ArrayList> modifiers = this; + for(int i = modifiers.size() - 1; i >= 0; i--) { + modifiers.get(i).reset(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ParallelModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/ParallelModifier.java new file mode 100644 index 0000000..54b5d15 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ParallelModifier.java @@ -0,0 +1,125 @@ +package org.anddev.andengine.util.modifier; + +import org.anddev.andengine.util.modifier.util.ModifierUtils; + +/** + * @author Nicolas Gramlich + * @since 11:21:22 - 03.09.2010 + * @param + */ +public class ParallelModifier extends BaseModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final IModifier[] mModifiers; + + private final float mDuration; + + private boolean mFinishedCached; + + // =========================================================== + // Constructors + // =========================================================== + + public ParallelModifier(final IModifier ... pModifiers) throws IllegalArgumentException { + this(null, pModifiers); + } + + public ParallelModifier(final IModifierListener pModifierListener, final IModifier ... pModifiers) throws IllegalArgumentException { + super(pModifierListener); + if(pModifiers.length == 0) { + throw new IllegalArgumentException("pModifiers must not be empty!"); + } + + this.mModifiers = pModifiers; + + final IModifier shapeModifierWithLongestDuration = ModifierUtils.getModifierWithLongestDuration(pModifiers); + this.mDuration = shapeModifierWithLongestDuration.getDuration(); + shapeModifierWithLongestDuration.setModifierListener(new InternalModifierListener()); + } + + @SuppressWarnings("unchecked") + protected ParallelModifier(final ParallelModifier pParallelModifier) { + super(pParallelModifier.mModifierListener); + + final IModifier[] otherModifiers = pParallelModifier.mModifiers; + this.mModifiers = new IModifier[otherModifiers.length]; + + final IModifier[] shapeModifiers = this.mModifiers; + for(int i = shapeModifiers.length - 1; i >= 0; i--) { + shapeModifiers[i] = otherModifiers[i].clone(); + } + + final IModifier shapeModifierWithLongestDuration = ModifierUtils.getModifierWithLongestDuration(shapeModifiers); + this.mDuration = shapeModifierWithLongestDuration.getDuration(); + shapeModifierWithLongestDuration.setModifierListener(new InternalModifierListener()); + } + + @Override + public ParallelModifier clone(){ + return new ParallelModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getDuration() { + return this.mDuration; + } + + @Override + public void onUpdate(final float pSecondsElapsed, final T pItem) { + this.mFinishedCached = false; + + final IModifier[] shapeModifiers = this.mModifiers; + for(int i = shapeModifiers.length - 1; i >= 0; i--) { + shapeModifiers[i].onUpdate(pSecondsElapsed, pItem); + + if(this.mFinishedCached) { + return; + } + } + + this.mFinishedCached = false; + } + + @Override + public void reset() { + this.mFinished = false; + + final IModifier[] shapeModifiers = this.mModifiers; + for(int i = shapeModifiers.length - 1; i >= 0; i--) { + shapeModifiers[i].reset(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + private class InternalModifierListener implements IModifierListener { + @Override + public void onModifierFinished(final IModifier pModifier, final T pItem) { + ParallelModifier.this.mFinished = true; + ParallelModifier.this.mFinishedCached = true; + if(ParallelModifier.this.mModifierListener != null) { + ParallelModifier.this.mModifierListener.onModifierFinished(ParallelModifier.this, pItem); + } + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/SequenceModifier.java b/AndEngine/src/org/anddev/andengine/util/modifier/SequenceModifier.java new file mode 100644 index 0000000..ae3fac0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/SequenceModifier.java @@ -0,0 +1,151 @@ +package org.anddev.andengine.util.modifier; + +import org.anddev.andengine.util.modifier.util.ModifierUtils; + + +/** + * @author Nicolas Gramlich + * @since 19:39:25 - 19.03.2010 + */ +public class SequenceModifier extends BaseModifier { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private ISubSequenceModifierListener mSubSequenceModifierListener; + + private final IModifier[] mSubSequenceModifiers; + private int mCurrentSubSequenceModifier; + + private final float mDuration; + + // =========================================================== + // Constructors + // =========================================================== + + public SequenceModifier(final IModifier ... pModifiers) throws IllegalArgumentException { + this(null, pModifiers); + } + + public SequenceModifier(final IModifierListener pModifierListener, final IModifier ... pModifiers) throws IllegalArgumentException { + this(pModifierListener, null, pModifiers); + } + + public SequenceModifier(final IModifierListener pModifierListener, final ISubSequenceModifierListener pSubSequenceModifierListener, final IModifier ... pModifiers) throws IllegalArgumentException { + super(pModifierListener); + if (pModifiers.length == 0) { + throw new IllegalArgumentException("pModifiers must not be empty!"); + } + + this.mSubSequenceModifierListener = pSubSequenceModifierListener; + this.mSubSequenceModifiers = pModifiers; + + this.mDuration = ModifierUtils.getSequenceDurationOfModifier(pModifiers); + + pModifiers[0].setModifierListener(new InternalModifierListener()); + } + + @SuppressWarnings("unchecked") + protected SequenceModifier(final SequenceModifier pSequenceModifier) { + super(pSequenceModifier.mModifierListener); + this.mSubSequenceModifierListener = pSequenceModifier.mSubSequenceModifierListener; + + this.mDuration = pSequenceModifier.mDuration; + + final IModifier[] otherModifiers = pSequenceModifier.mSubSequenceModifiers; + this.mSubSequenceModifiers = new IModifier[otherModifiers.length]; + + final IModifier[] shapeModifiers = this.mSubSequenceModifiers; + for(int i = shapeModifiers.length - 1; i >= 0; i--) { + shapeModifiers[i] = otherModifiers[i].clone(); + } + + shapeModifiers[0].setModifierListener(new InternalModifierListener()); + } + + @Override + public SequenceModifier clone(){ + return new SequenceModifier(this); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public ISubSequenceModifierListener getSubSequenceModifierListener() { + return this.mSubSequenceModifierListener; + } + + public void setSubSequenceModifierListener(final ISubSequenceModifierListener pSubSequenceModifierListener) { + this.mSubSequenceModifierListener = pSubSequenceModifierListener; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getDuration() { + return this.mDuration; + } + + @Override + public void onUpdate(final float pSecondsElapsed, final T pItem) { + if(!this.mFinished) { + this.mSubSequenceModifiers[this.mCurrentSubSequenceModifier].onUpdate(pSecondsElapsed, pItem); + } + } + + @Override + public void reset() { + this.mCurrentSubSequenceModifier = 0; + this.mFinished = false; + + final IModifier[] shapeModifiers = this.mSubSequenceModifiers; + for(int i = shapeModifiers.length - 1; i >= 0; i--) { + shapeModifiers[i].reset(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + private void onHandleModifierFinished(final InternalModifierListener pInternalModifierListener, final IModifier pModifier, final T pItem) { + this.mCurrentSubSequenceModifier++; + + if(this.mCurrentSubSequenceModifier < this.mSubSequenceModifiers.length) { + final IModifier nextSubSequenceModifier = this.mSubSequenceModifiers[this.mCurrentSubSequenceModifier]; + nextSubSequenceModifier.setModifierListener(pInternalModifierListener); + + if(this.mSubSequenceModifierListener != null) { + this.mSubSequenceModifierListener.onSubSequenceFinished(pModifier, pItem, this.mCurrentSubSequenceModifier); + } + } else { + this.mFinished = true; + + if(this.mModifierListener != null) { + this.mModifierListener.onModifierFinished(this, pItem); + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public interface ISubSequenceModifierListener { + public void onSubSequenceFinished(final IModifier pModifier, final T pItem, final int pIndex); + } + + private class InternalModifierListener implements IModifierListener { + @Override + public void onModifierFinished(final IModifier pModifier, final T pItem) { + SequenceModifier.this.onHandleModifierFinished(this, pModifier, pItem); + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackIn.java new file mode 100644 index 0000000..2086f8c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackIn.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseBackIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseBackIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseBackIn() { + + } + + public static EaseBackIn getInstance() { + if(null == INSTANCE) { + INSTANCE = new EaseBackIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * (pSecondsElapsed /= pDuration) * pSecondsElapsed * ((1.70158f + 1) * pSecondsElapsed - 1.70158f) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackInOut.java new file mode 100644 index 0000000..838fa4f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackInOut.java @@ -0,0 +1,58 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseBackInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseBackInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseBackInOut() { + + } + + public static EaseBackInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseBackInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + float s = 1.70158f; + if((pSecondsElapsed /= pDuration * 0.5f) < 1) { + return pMaxValue * 0.5f * (pSecondsElapsed * pSecondsElapsed * (((s *= (1.525f)) + 1) * pSecondsElapsed - s)) + pMinValue; + } + + return pMaxValue / 2 * ((pSecondsElapsed -= 2) * pSecondsElapsed * (((s *= (1.525f)) + 1) * pSecondsElapsed + s) + 2) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackOut.java new file mode 100644 index 0000000..f2254d2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBackOut.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseBackOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseBackOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseBackOut() { + + } + + public static EaseBackOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseBackOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * ((pSecondsElapsed = pSecondsElapsed / pDuration - 1) * pSecondsElapsed * ((1.70158f + 1) * pSecondsElapsed + 1.70158f) + 1) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceIn.java new file mode 100644 index 0000000..1bddb98 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceIn.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseBounceIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseBounceIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseBounceIn() { + + } + + public static EaseBounceIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseBounceIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue - EaseBounceOut.getInstance().getPercentageDone(pDuration - pSecondsElapsed, pDuration, 0, pMaxValue) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceInOut.java new file mode 100644 index 0000000..3d7075d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceInOut.java @@ -0,0 +1,57 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseBounceInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseBounceInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseBounceInOut() { + + } + + public static EaseBounceInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseBounceInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if(pSecondsElapsed < pDuration * 0.5) { + return EaseBounceIn.getInstance().getPercentageDone(pSecondsElapsed * 2, pDuration, 0, pMaxValue) * 0.5f + pMinValue; + } else { + return EaseBounceOut.getInstance().getPercentageDone(pSecondsElapsed * 2 - pDuration, pDuration, 0, pMaxValue) * 0.5f + pMaxValue * 0.5f + pMinValue; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceOut.java new file mode 100644 index 0000000..8bf486e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseBounceOut.java @@ -0,0 +1,61 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseBounceOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseBounceOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseBounceOut() { + + } + + public static EaseBounceOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseBounceOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if((pSecondsElapsed /= pDuration) < (1 / 2.75)) { + return pMaxValue * (7.5625f * pSecondsElapsed * pSecondsElapsed) + pMinValue; + } else if(pSecondsElapsed < (2 / 2.75)) { + return pMaxValue * (7.5625f * (pSecondsElapsed -= (1.5f / 2.75f)) * pSecondsElapsed + 0.75f) + pMinValue; + } else if(pSecondsElapsed < (2.5 / 2.75)) { + return pMaxValue * (7.5625f * (pSecondsElapsed -= (2.25f / 2.75f)) * pSecondsElapsed + 0.9375f) + pMinValue; + } else { + return pMaxValue * (7.5625f * (pSecondsElapsed -= (2.625f / 2.75f)) * pSecondsElapsed + 0.984375f) + pMinValue; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularIn.java new file mode 100644 index 0000000..67603ec --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularIn.java @@ -0,0 +1,54 @@ +package org.anddev.andengine.util.modifier.ease; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseCircularIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseCircularIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseCircularIn() { + } + + public static EaseCircularIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseCircularIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return (-pMaxValue * (FloatMath.sqrt(1 - (pSecondsElapsed /= pDuration) * pSecondsElapsed) - 1.0f) + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularInOut.java new file mode 100644 index 0000000..93aaa50 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularInOut.java @@ -0,0 +1,58 @@ +package org.anddev.andengine.util.modifier.ease; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseCircularInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseCircularInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseCircularInOut() { + } + + public static EaseCircularInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseCircularInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if((pSecondsElapsed /= pDuration * 0.5) < 1) { + return (float) (-pMaxValue * 0.5 * (FloatMath.sqrt(1 - pSecondsElapsed * pSecondsElapsed) - 1) + pMinValue); + } + + return (float) (pMaxValue * 0.5 * (FloatMath.sqrt(1 - (pSecondsElapsed -= 2) * pSecondsElapsed) + 1) + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularOut.java new file mode 100644 index 0000000..6d09faa --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCircularOut.java @@ -0,0 +1,54 @@ +package org.anddev.andengine.util.modifier.ease; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseCircularOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseCircularOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseCircularOut() { + } + + public static EaseCircularOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseCircularOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return (pMaxValue * FloatMath.sqrt(1 - (pSecondsElapsed = pSecondsElapsed / pDuration - 1) * pSecondsElapsed) + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicIn.java new file mode 100644 index 0000000..74e093d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicIn.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseCubicIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseCubicIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseCubicIn() { + } + + public static EaseCubicIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseCubicIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * (pSecondsElapsed /= pDuration) * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicInOut.java new file mode 100644 index 0000000..afdb373 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicInOut.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseCubicInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseCubicInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseCubicInOut() { + } + + public static EaseCubicInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseCubicInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if((pSecondsElapsed /= pDuration * 0.5f) < 1) { + return pMaxValue * 0.5f * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + return pMaxValue * 0.5f * ((pSecondsElapsed -= 2) * pSecondsElapsed * pSecondsElapsed + 2) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicOut.java new file mode 100644 index 0000000..d4928cf --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseCubicOut.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseCubicOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseCubicOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseCubicOut() { + } + + public static EaseCubicOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseCubicOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * ((pSecondsElapsed = pSecondsElapsed / pDuration - 1) * pSecondsElapsed * pSecondsElapsed + 1) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticIn.java new file mode 100644 index 0000000..3878b70 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticIn.java @@ -0,0 +1,74 @@ +package org.anddev.andengine.util.modifier.ease; + +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseElasticIn implements IEaseFunction, MathConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseElasticIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseElasticIn() { + } + + public static EaseElasticIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseElasticIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + float s; + float p = 0.0f; + float a = 0.0f; + if(pSecondsElapsed == 0) { + return pMinValue; + } + if((pSecondsElapsed /= pDuration) == 1) { + return pMinValue + pMaxValue; + } + if(p == 0) { + p = pDuration * 0.3f; + } + if(a == 0 || (pMaxValue > 0 && a < pMaxValue) || (pMaxValue < 0 && a < -pMaxValue)) { + a = pMaxValue; + s = p / 4; + } else { + s = (float) (p / PI_TWICE * Math.asin(pMaxValue / a)); + } + return (float) (-(a * Math.pow(2, 10 * (pSecondsElapsed -= 1)) * FloatMath.sin((pSecondsElapsed * pDuration - s) * PI_TWICE / p)) + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticInOut.java new file mode 100644 index 0000000..7e26d9c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticInOut.java @@ -0,0 +1,77 @@ +package org.anddev.andengine.util.modifier.ease; + +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseElasticInOut implements IEaseFunction, MathConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseElasticInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseElasticInOut() { + } + + public static EaseElasticInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseElasticInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + float s; + float p = 0.0f; + float a = 0.0f; + if(pSecondsElapsed == 0) { + return pMinValue; + } + if((pSecondsElapsed /= pDuration * 0.5) == 2) { + return pMinValue + pMaxValue; + } + if(p == 0) { + p = pDuration * (0.3f * 1.5f); + } + if(a == 0 || (pMaxValue > 0 && a < pMaxValue) || (pMaxValue < 0 && a < -pMaxValue)) { + a = pMaxValue; + s = p / 4; + } else { + s = (float) (p / PI_TWICE * Math.asin(pMaxValue / a)); + } + if(pSecondsElapsed < 1) { + return (float) (-0.5 * (a * Math.pow(2, 10 * (pSecondsElapsed -= 1)) * FloatMath.sin((pSecondsElapsed * pDuration - s) * PI_TWICE / p)) + pMinValue); + } + return (float) (a * Math.pow(2, -10 * (pSecondsElapsed -= 1)) * FloatMath.sin((pSecondsElapsed * pDuration - s) * PI_TWICE / p) * .5 + pMaxValue + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticOut.java new file mode 100644 index 0000000..be5b830 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseElasticOut.java @@ -0,0 +1,74 @@ +package org.anddev.andengine.util.modifier.ease; + +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseElasticOut implements IEaseFunction, MathConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseElasticOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseElasticOut() { + } + + public static EaseElasticOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseElasticOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + float s; + float p = 0.0f; + float a = 0.0f; + if(pSecondsElapsed == 0) { + return pMinValue; + } + if((pSecondsElapsed /= pDuration) == 1) { + return pMinValue + pMaxValue; + } + if(p == 0) { + p = pDuration * 0.3f; + } + if(a == 0 || (pMaxValue > 0 && a < pMaxValue) || (pMaxValue < 0 && a < -pMaxValue)) { + a = pMaxValue; + s = p / 4; + } else { + s = (float) (p / PI_TWICE * Math.asin(pMaxValue / a)); + } + return (float) (a * Math.pow(2, -10 * pSecondsElapsed) * FloatMath.sin((pSecondsElapsed * pDuration - s) * PI_TWICE / p) + pMaxValue + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialIn.java new file mode 100644 index 0000000..025aec3 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialIn.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseExponentialIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseExponentialIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseExponentialIn() { + } + + public static EaseExponentialIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseExponentialIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return (float) ((pSecondsElapsed == 0) ? pMinValue : pMaxValue * Math.pow(2, 10 * (pSecondsElapsed / pDuration - 1)) + pMinValue - pMaxValue * 0.001f); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialInOut.java new file mode 100644 index 0000000..1495602 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialInOut.java @@ -0,0 +1,61 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseExponentialInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseExponentialInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseExponentialInOut() { + } + + public static EaseExponentialInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseExponentialInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if(pSecondsElapsed == 0) { + return pMinValue; + } + if(pSecondsElapsed == pDuration) { + return pMinValue + pMaxValue; + } + if((pSecondsElapsed /= pDuration * 0.5f) < 1) { + return (float) (pMaxValue * 0.5f * Math.pow(2, 10 * (pSecondsElapsed - 1)) + pMinValue); + } + return (float) (pMaxValue * 0.5f * (-Math.pow(2, -10 * --pSecondsElapsed) + 2) + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialOut.java new file mode 100644 index 0000000..b88220a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseExponentialOut.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseExponentialOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseExponentialOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseExponentialOut() { + } + + public static EaseExponentialOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseExponentialOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return (float) ((pSecondsElapsed == pDuration) ? pMinValue + pMaxValue : pMaxValue * (-Math.pow(2, -10 * pSecondsElapsed / pDuration) + 1) + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseLinear.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseLinear.java new file mode 100644 index 0000000..020b6a2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseLinear.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:50:40 - 26.07.2010 + */ +public class EaseLinear implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseLinear INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseLinear() { + } + + public static EaseLinear getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseLinear(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * pSecondsElapsed / pDuration + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadIn.java new file mode 100644 index 0000000..43ac06f --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadIn.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuadIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuadIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuadIn() { + } + + public static EaseQuadIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuadIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * (pSecondsElapsed /= pDuration) * pSecondsElapsed + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadInOut.java new file mode 100644 index 0000000..db08618 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadInOut.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuadInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuadInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuadInOut() { + } + + public static EaseQuadInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuadInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if((pSecondsElapsed /= pDuration * 0.5f) < 1) { + return pMaxValue * 0.5f * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + return -pMaxValue * 0.5f * ((--pSecondsElapsed) * (pSecondsElapsed - 2) - 1) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadOut.java new file mode 100644 index 0000000..9a9d283 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuadOut.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuadOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuadOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuadOut() { + } + + public static EaseQuadOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuadOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return -pMaxValue * (pSecondsElapsed /= pDuration) * (pSecondsElapsed - 2) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartIn.java new file mode 100644 index 0000000..828330e --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartIn.java @@ -0,0 +1,53 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuartIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuartIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuartIn() { + + } + + public static EaseQuartIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuartIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * (pSecondsElapsed /= pDuration) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartInOut.java new file mode 100644 index 0000000..121fc10 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartInOut.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuartInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuartInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuartInOut() { + } + + public static EaseQuartInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuartInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if((pSecondsElapsed /= pDuration * 0.5f) < 1) { + return pMaxValue * 0.5f * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + return -pMaxValue * 0.5f * ((pSecondsElapsed -= 2) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed - 2) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartOut.java new file mode 100644 index 0000000..84dbd5a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuartOut.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuartOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuartOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuartOut() { + } + + public static EaseQuartOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuartOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return -pMaxValue * ((pSecondsElapsed = pSecondsElapsed / pDuration - 1) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed - 1) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintIn.java new file mode 100644 index 0000000..9ac61c0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintIn.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuintIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuintIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuintIn() { + } + + public static EaseQuintIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuintIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * (pSecondsElapsed /= pDuration) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintInOut.java new file mode 100644 index 0000000..05b90b7 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintInOut.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuintInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuintInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuintInOut() { + } + + public static EaseQuintInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuintInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if((pSecondsElapsed /= pDuration * 0.5f) < 1) { + return pMaxValue * 0.5f * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + return pMaxValue * 0.5f * ((pSecondsElapsed -= 2) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + 2) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintOut.java new file mode 100644 index 0000000..f8ecd45 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseQuintOut.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseQuintOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseQuintOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseQuintOut() { + } + + public static EaseQuintOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseQuintOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * ((pSecondsElapsed = pSecondsElapsed / pDuration - 1) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + 1) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineIn.java new file mode 100644 index 0000000..7cc8dc8 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineIn.java @@ -0,0 +1,56 @@ +package org.anddev.andengine.util.modifier.ease; + +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseSineIn implements IEaseFunction, MathConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseSineIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseSineIn() { + } + + public static EaseSineIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseSineIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return (-pMaxValue * FloatMath.cos(pSecondsElapsed / pDuration * PI_HALF) + pMaxValue + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineInOut.java new file mode 100644 index 0000000..7adb16a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineInOut.java @@ -0,0 +1,56 @@ +package org.anddev.andengine.util.modifier.ease; + +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseSineInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseSineInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseSineInOut() { + } + + public static EaseSineInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseSineInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return (-pMaxValue * 0.5f * (FloatMath.cos(MathConstants.PI * pSecondsElapsed / pDuration) - 1) + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineOut.java new file mode 100644 index 0000000..7d56592 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseSineOut.java @@ -0,0 +1,56 @@ +package org.anddev.andengine.util.modifier.ease; + +import org.anddev.andengine.util.constants.MathConstants; + +import android.util.FloatMath; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseSineOut implements IEaseFunction, MathConstants { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseSineOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseSineOut() { + } + + public static EaseSineOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseSineOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return (pMaxValue * FloatMath.sin(pSecondsElapsed / pDuration * PI_HALF) + pMinValue); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongIn.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongIn.java new file mode 100644 index 0000000..5c8d900 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongIn.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseStrongIn implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseStrongIn INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseStrongIn() { + } + + public static EaseStrongIn getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseStrongIn(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * (pSecondsElapsed /= pDuration) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongInOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongInOut.java new file mode 100644 index 0000000..70883e0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongInOut.java @@ -0,0 +1,55 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseStrongInOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseStrongInOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseStrongInOut() { + } + + public static EaseStrongInOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseStrongInOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + if((pSecondsElapsed /= pDuration * 0.5f) < 1) { + return pMaxValue * 0.5f * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + pMinValue; + } + return pMaxValue * 0.5f * ((pSecondsElapsed -= 2) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + 2) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongOut.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongOut.java new file mode 100644 index 0000000..8ffc229 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/EaseStrongOut.java @@ -0,0 +1,52 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 16:52:11 - 26.07.2010 + */ +public class EaseStrongOut implements IEaseFunction { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static EaseStrongOut INSTANCE; + + // =========================================================== + // Constructors + // =========================================================== + + private EaseStrongOut() { + } + + public static EaseStrongOut getInstance() { + if(INSTANCE == null) { + INSTANCE = new EaseStrongOut(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getPercentageDone(float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue) { + return pMaxValue * ((pSecondsElapsed = pSecondsElapsed / pDuration - 1) * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed * pSecondsElapsed + 1) + pMinValue; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/ease/IEaseFunction.java b/AndEngine/src/org/anddev/andengine/util/modifier/ease/IEaseFunction.java new file mode 100644 index 0000000..4bea2bd --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/ease/IEaseFunction.java @@ -0,0 +1,19 @@ +package org.anddev.andengine.util.modifier.ease; + +/** + * @author Gil, Nicolas Gramlich + * @since 17:13:17 - 26.07.2010 + */ +public interface IEaseFunction { + // =========================================================== + // Final Fields + // =========================================================== + + public static final IEaseFunction DEFAULT = EaseLinear.getInstance(); + + // =========================================================== + // Methods + // =========================================================== + + public abstract float getPercentageDone(final float pSecondsElapsed, final float pDuration, final float pMinValue, final float pMaxValue); +} diff --git a/AndEngine/src/org/anddev/andengine/util/modifier/util/ModifierUtils.java b/AndEngine/src/org/anddev/andengine/util/modifier/util/ModifierUtils.java new file mode 100644 index 0000000..2ccf115 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/modifier/util/ModifierUtils.java @@ -0,0 +1,62 @@ +package org.anddev.andengine.util.modifier.util; + +import org.anddev.andengine.util.modifier.IModifier; + +/** + * @author Nicolas Gramlich + * @since 11:16:36 - 03.09.2010 + */ +public class ModifierUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static IModifier getModifierWithLongestDuration(final IModifier[] pModifiers){ + IModifier out = null; + float longestDuration = Float.MIN_VALUE; + + for(int i = pModifiers.length - 1; i >= 0; i--) { + final float duration = pModifiers[i].getDuration(); + if(duration > longestDuration) { + longestDuration = duration; + out = pModifiers[i]; + } + } + + return out; + } + + public static float getSequenceDurationOfModifier(final IModifier[] pModifiers){ + float duration = Float.MIN_VALUE; + + for(int i = pModifiers.length - 1; i >= 0; i--) { + duration += pModifiers[i].getDuration(); + } + + return duration; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/Direction.java b/AndEngine/src/org/anddev/andengine/util/path/Direction.java new file mode 100644 index 0000000..284127a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/Direction.java @@ -0,0 +1,74 @@ +package org.anddev.andengine.util.path; + +/** + * @author Nicolas Gramlich + * @since 15:19:11 - 17.08.2010 + */ +public enum Direction { + // =========================================================== + // Elements + // =========================================================== + + UP(0, -1), DOWN(0, 1), LEFT(-1, 0), RIGHT(1, 0); + + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mDeltaX; + private final int mDeltaY; + + // =========================================================== + // Constructors + // =========================================================== + + private Direction(final int pDeltaX, final int pDeltaY) { + this.mDeltaX = pDeltaX; + this.mDeltaY = pDeltaY; + } + + public static Direction fromDelta(final int pDeltaX, final int pDeltaY) { + if(pDeltaX == 0) { + if(pDeltaY == 1) { + return DOWN; + } else if(pDeltaY == -1) { + return UP; + } + } else if (pDeltaY == 0) { + if(pDeltaX == 1) { + return RIGHT; + } else if(pDeltaX == -1) { + return LEFT; + } + } + throw new IllegalArgumentException(); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getDeltaX() { + return this.mDeltaX; + } + + public int getDeltaY() { + return this.mDeltaY; + } + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/IPathFinder.java b/AndEngine/src/org/anddev/andengine/util/path/IPathFinder.java new file mode 100644 index 0000000..f582752 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/IPathFinder.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.util.path; + +/** + * @author Nicolas Gramlich + * @since 22:57:13 - 16.08.2010 + */ +public interface IPathFinder { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + public Path findPath(final T pEntity, final int pMaxCost, final int pFromTileColumn, final int pFromTileRow, final int pToTileColumn, final int pToTileRow); +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/ITiledMap.java b/AndEngine/src/org/anddev/andengine/util/path/ITiledMap.java new file mode 100644 index 0000000..120a8c2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/ITiledMap.java @@ -0,0 +1,24 @@ +package org.anddev.andengine.util.path; + +/** + * @author Nicolas Gramlich + * @since 23:00:24 - 16.08.2010 + */ +public interface ITiledMap { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + public int getTileColumns(); + public int getTileRows(); + + public void onTileVisitedByPathFinder(final int pTileColumn, int pTileRow); + + public boolean isTileBlocked(final T pEntity, final int pTileColumn, final int pTileRow); + + public float getStepCost(final T pEntity, final int pFromTileColumn, final int pFromTileRow, final int pToTileColumn, final int pToTileRow); +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/Path.java b/AndEngine/src/org/anddev/andengine/util/path/Path.java new file mode 100644 index 0000000..85b3b79 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/Path.java @@ -0,0 +1,187 @@ +package org.anddev.andengine.util.path; + +import java.util.ArrayList; + +public class Path { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ArrayList mSteps = new ArrayList(); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getLength() { + return this.mSteps.size(); + } + + public Step getStep(final int pIndex) { + return this.mSteps.get(pIndex); + } + + public Direction getDirectionToPreviousStep(final int pIndex) { + if(pIndex == 0) { + return null; + } else { + final int dX = this.getTileColumn(pIndex - 1) - this.getTileColumn(pIndex); + final int dY = this.getTileRow(pIndex - 1) - this.getTileRow(pIndex); + return Direction.fromDelta(dX, dY); + } + } + + public Direction getDirectionToNextStep(final int pIndex) { + if(pIndex == this.getLength() - 1) { + return null; + } else { + final int dX = this.getTileColumn(pIndex + 1) - this.getTileColumn(pIndex); + final int dY = this.getTileRow(pIndex + 1) - this.getTileRow(pIndex); + return Direction.fromDelta(dX, dY); + } + } + + public int getTileColumn(final int pIndex) { + return this.getStep(pIndex).getTileColumn(); + } + + public int getTileRow(final int pIndex) { + return this.getStep(pIndex).getTileRow(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void append(final int pTileColumn, final int pTileRow) { + this.append(new Step(pTileColumn, pTileRow)); + } + + public void append(final Step pStep) { + this.mSteps.add(pStep); + } + + public void prepend(final int pTileColumn, final int pTileRow) { + this.prepend(new Step(pTileColumn, pTileRow)); + } + + public void prepend(final Step pStep) { + this.mSteps.add(0, pStep); + } + + public boolean contains(final int pTileColumn, final int pTileRow) { + final ArrayList steps = this.mSteps; + for(int i = steps.size() - 1; i >= 0; i--) { + final Step step = steps.get(i); + if(step.getTileColumn() == pTileColumn && step.getTileRow() == pTileRow) { + return true; + } + } + return false; + } + + public int getFromTileRow() { + return this.getTileRow(0); + } + + public int getFromTileColumn() { + return this.getTileColumn(0); + } + + public int getToTileRow() { + return this.getTileRow(this.mSteps.size() - 1); + } + + public int getToTileColumn() { + return this.getTileColumn(this.mSteps.size() - 1); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public class Step { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mTileColumn; + private final int mTileRow; + + // =========================================================== + // Constructors + // =========================================================== + + public Step(final int pTileColumn, final int pTileRow) { + this.mTileColumn = pTileColumn; + this.mTileRow = pTileRow; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getTileColumn() { + return this.mTileColumn; + } + + public int getTileRow() { + return this.mTileRow; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int hashCode() { + return this.mTileColumn << 16 + this.mTileRow; + } + + @Override + public boolean equals(final Object pOther) { + if(this == pOther) { + return true; + } + if(pOther == null) { + return false; + } + if(this.getClass() != pOther.getClass()) { + return false; + } + final Step other = (Step) pOther; + if(this.mTileColumn != other.mTileColumn) { + return false; + } + if(this.mTileRow != other.mTileRow) { + return false; + } + return true; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } + +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/astar/AStarPathFinder.java b/AndEngine/src/org/anddev/andengine/util/path/astar/AStarPathFinder.java new file mode 100644 index 0000000..5e4d8eb --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/astar/AStarPathFinder.java @@ -0,0 +1,252 @@ +package org.anddev.andengine.util.path.astar; + +import java.util.ArrayList; +import java.util.Collections; + +import org.anddev.andengine.util.path.IPathFinder; +import org.anddev.andengine.util.path.ITiledMap; +import org.anddev.andengine.util.path.Path; + +/** + * @author Nicolas Gramlich + * @since 23:16:17 - 16.08.2010 + */ +public class AStarPathFinder implements IPathFinder { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ArrayList mVisitedNodes = new ArrayList(); + private final ArrayList mOpenNodes = new ArrayList(); + + private final ITiledMap mTiledMap; + private final int mMaxSearchDepth; + + private final Node[][] mNodes; + private final boolean mAllowDiagonalMovement; + + private final IAStarHeuristic mAStarHeuristic; + + // =========================================================== + // Constructors + // =========================================================== + + public AStarPathFinder(final ITiledMap pTiledMap, final int pMaxSearchDepth, final boolean pAllowDiagonalMovement) { + this(pTiledMap, pMaxSearchDepth, pAllowDiagonalMovement, new EuclideanHeuristic()); + } + + public AStarPathFinder(final ITiledMap pTiledMap, final int pMaxSearchDepth, final boolean pAllowDiagonalMovement, final IAStarHeuristic pAStarHeuristic) { + this.mAStarHeuristic = pAStarHeuristic; + this.mTiledMap = pTiledMap; + this.mMaxSearchDepth = pMaxSearchDepth; + this.mAllowDiagonalMovement = pAllowDiagonalMovement; + + this.mNodes = new Node[pTiledMap.getTileRows()][pTiledMap.getTileColumns()]; + final Node[][] nodes = this.mNodes; + for(int x = pTiledMap.getTileColumns() - 1; x >= 0; x--) { + for(int y = pTiledMap.getTileRows() - 1; y >= 0; y--) { + nodes[y][x] = new Node(x, y); + } + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public Path findPath(final T pEntity, final int pMaxCost, final int pFromTileColumn, final int pFromTileRow, final int pToTileColumn, final int pToTileRow) { + final ITiledMap tiledMap = this.mTiledMap; + if(tiledMap.isTileBlocked(pEntity, pToTileColumn, pToTileRow)) { + return null; + } + + /* Drag some fields to local variables. */ + final ArrayList openNodes = this.mOpenNodes; + final ArrayList visitedNodes = this.mVisitedNodes; + + final Node[][] nodes = this.mNodes; + final Node fromNode = nodes[pFromTileRow][pFromTileColumn]; + final Node toNode = nodes[pToTileRow][pToTileColumn]; + + final IAStarHeuristic aStarHeuristic = this.mAStarHeuristic; + final boolean allowDiagonalMovement = this.mAllowDiagonalMovement; + final int maxSearchDepth = this.mMaxSearchDepth; + + /* Initialize algorithm. */ + fromNode.mCost = 0; + fromNode.mDepth = 0; + toNode.mParent = null; + + visitedNodes.clear(); + + openNodes.clear(); + openNodes.add(fromNode); + + int currentDepth = 0; + while(currentDepth < maxSearchDepth && !openNodes.isEmpty()) { + /* The first Node in the open list is the one with the lowest cost. */ + final Node current = openNodes.remove(0); + if(current == toNode) { + break; + } + + visitedNodes.add(current); + + /* Loop over all neighbors of this tile. */ + for(int dX = -1; dX <= 1; dX++) { + for(int dY = -1; dY <= 1; dY++) { + if((dX == 0) && (dY == 0)) { + continue; + } + + if(!allowDiagonalMovement) { + if((dX != 0) && (dY != 0)) { + continue; + } + } + + final int neighborTileColumn = dX + current.mTileColumn; + final int neighborTileRow = dY + current.mTileRow; + + if(!this.isTileBlocked(pEntity, pFromTileColumn, pFromTileRow, neighborTileColumn, neighborTileRow)) { + final float neighborCost = current.mCost + tiledMap.getStepCost(pEntity, current.mTileColumn, current.mTileRow, neighborTileColumn, neighborTileRow); + final Node neighbor = nodes[neighborTileRow][neighborTileColumn]; + tiledMap.onTileVisitedByPathFinder(neighborTileColumn, neighborTileRow); + + /* Re-evaluate if there is a better path. */ + if(neighborCost < neighbor.mCost) { + // TODO Is this ever possible with AStar ?? + if(openNodes.contains(neighbor)) { + openNodes.remove(neighbor); + } + if(visitedNodes.contains(neighbor)) { + visitedNodes.remove(neighbor); + } + } + + if(!openNodes.contains(neighbor) && !(visitedNodes.contains(neighbor))) { + neighbor.mCost = neighborCost; + if(neighbor.mCost <= pMaxCost) { + neighbor.mExpectedRestCost = aStarHeuristic.getExpectedRestCost(tiledMap, pEntity, neighborTileColumn, neighborTileRow, pToTileColumn, pToTileRow); + currentDepth = Math.max(currentDepth, neighbor.setParent(current)); + openNodes.add(neighbor); + + /* Ensure always the node with the lowest cost+heuristic + * will be used next, simply by sorting. */ + Collections.sort(openNodes); + } + } + } + } + } + } + + /* Check if a path was found. */ + if(toNode.mParent == null) { + return null; + } + + /* Traceback path. */ + final Path path = new Path(); + Node tmp = nodes[pToTileRow][pToTileColumn]; + while(tmp != fromNode) { + path.prepend(tmp.mTileColumn, tmp.mTileRow); + tmp = tmp.mParent; + } + path.prepend(pFromTileColumn, pFromTileRow); + + return path; + } + + // =========================================================== + // Methods + // =========================================================== + + protected boolean isTileBlocked(final T pEntity, final int pFromTileColumn, final int pFromTileRow, final int pToTileColumn, final int pToTileRow) { + if((pToTileColumn < 0) || (pToTileRow < 0) || (pToTileColumn >= this.mTiledMap.getTileColumns()) || (pToTileRow >= this.mTiledMap.getTileRows())) { + return true; + } else if((pFromTileColumn == pToTileColumn) && (pFromTileRow == pToTileRow)) { + return true; + } + + return this.mTiledMap.isTileBlocked(pEntity, pToTileColumn, pToTileRow); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + private static class Node implements Comparable { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + Node mParent; + int mDepth; + + final int mTileColumn; + final int mTileRow; + + float mCost; + float mExpectedRestCost; + + // =========================================================== + // Constructors + // =========================================================== + + public Node(final int pTileColumn, final int pTileRow) { + this.mTileColumn = pTileColumn; + this.mTileRow = pTileRow; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int setParent(final Node parent) { + this.mDepth = parent.mDepth + 1; + this.mParent = parent; + + return this.mDepth; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int compareTo(final Node pOther) { + final float totalCost = this.mExpectedRestCost + this.mCost; + final float totalCostOther = pOther.mExpectedRestCost + pOther.mCost; + + if (totalCost < totalCostOther) { + return -1; + } else if (totalCost > totalCostOther) { + return 1; + } else { + return 0; + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/astar/EuclideanHeuristic.java b/AndEngine/src/org/anddev/andengine/util/path/astar/EuclideanHeuristic.java new file mode 100644 index 0000000..216818a --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/astar/EuclideanHeuristic.java @@ -0,0 +1,47 @@ +package org.anddev.andengine.util.path.astar; + +import org.anddev.andengine.util.path.ITiledMap; + +import android.util.FloatMath; + +/** + * @author Nicolas Gramlich + * @since 22:58:01 - 16.08.2010 + */ +public class EuclideanHeuristic implements IAStarHeuristic { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getExpectedRestCost(final ITiledMap pTileMap, final T pEntity, final int pTileFromX, final int pTileFromY, final int pTileToX, final int pTileToY) { + final float dX = pTileToX - pTileFromX; + final float dY = pTileToY - pTileFromY; + + return FloatMath.sqrt(dX * dX + dY * dY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/astar/IAStarHeuristic.java b/AndEngine/src/org/anddev/andengine/util/path/astar/IAStarHeuristic.java new file mode 100644 index 0000000..6e48886 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/astar/IAStarHeuristic.java @@ -0,0 +1,19 @@ +package org.anddev.andengine.util.path.astar; + +import org.anddev.andengine.util.path.ITiledMap; + +/** + * @author Nicolas Gramlich + * @since 22:59:20 - 16.08.2010 + */ +public interface IAStarHeuristic { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + public float getExpectedRestCost(final ITiledMap pTiledMap, final T pEntity, final int pFromTileColumn, final int pFromTileRow, final int pToTileColumn, final int pToTileRow); +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/astar/ManhattanHeuristic.java b/AndEngine/src/org/anddev/andengine/util/path/astar/ManhattanHeuristic.java new file mode 100644 index 0000000..6fff053 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/astar/ManhattanHeuristic.java @@ -0,0 +1,42 @@ +package org.anddev.andengine.util.path.astar; + +import org.anddev.andengine.util.path.ITiledMap; + +/** + * @author Nicolas Gramlich + * @since 22:58:01 - 16.08.2010 + */ +public class ManhattanHeuristic implements IAStarHeuristic { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getExpectedRestCost(final ITiledMap pTiledMap, final T pEntity, final int pTileFromX, final int pTileFromY, final int pTileToX, final int pTileToY) { + return Math.abs(pTileFromX - pTileToX) + Math.abs(pTileToX - pTileToY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/path/astar/NullHeuristic.java b/AndEngine/src/org/anddev/andengine/util/path/astar/NullHeuristic.java new file mode 100644 index 0000000..7aef043 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/path/astar/NullHeuristic.java @@ -0,0 +1,42 @@ +package org.anddev.andengine.util.path.astar; + +import org.anddev.andengine.util.path.ITiledMap; + +/** + * @author Nicolas Gramlich + * @since 22:58:01 - 16.08.2010 + */ +public class NullHeuristic implements IAStarHeuristic { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public float getExpectedRestCost(final ITiledMap pTiledMap, final T pEntity, final int pTileFromX, final int pTileFromY, final int pTileToX, final int pTileToY) { + return 0; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolItem.java b/AndEngine/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolItem.java new file mode 100644 index 0000000..81fd1cf --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolItem.java @@ -0,0 +1,48 @@ +package org.anddev.andengine.util.pool; + +import org.anddev.andengine.entity.IEntity; + +/** + * @author Nicolas Gramlich + * @since 00:53:22 - 28.08.2010 + */ +public class EntityDetachRunnablePoolItem extends RunnablePoolItem { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected IEntity mEntity; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public void setEntity(final IEntity pEntity) { + this.mEntity = pEntity; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void run() { + this.mEntity.detachSelf(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolUpdateHandler.java b/AndEngine/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolUpdateHandler.java new file mode 100644 index 0000000..b4658a1 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/EntityDetachRunnablePoolUpdateHandler.java @@ -0,0 +1,40 @@ +package org.anddev.andengine.util.pool; + +/** + * @author Nicolas Gramlich + * @since 23:16:25 - 31.08.2010 + */ +public class EntityDetachRunnablePoolUpdateHandler extends RunnablePoolUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected EntityDetachRunnablePoolItem onAllocatePoolItem() { + return new EntityDetachRunnablePoolItem(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/pool/GenericPool.java b/AndEngine/src/org/anddev/andengine/util/pool/GenericPool.java new file mode 100644 index 0000000..59b5531 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/GenericPool.java @@ -0,0 +1,132 @@ +package org.anddev.andengine.util.pool; + +import java.util.Collections; +import java.util.Stack; + +import org.anddev.andengine.util.Debug; + +/** + * @author Valentin Milea + * @author Nicolas Gramlich + * + * @since 22:19:55 - 31.08.2010 + * @param + */ +public abstract class GenericPool { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Stack mAvailableItems = new Stack(); + private int mUnrecycledCount; + private final int mGrowth; + + // =========================================================== + // Constructors + // =========================================================== + + public GenericPool() { + this(0); + } + + public GenericPool(final int pInitialSize) { + this(pInitialSize, 1); + } + + public GenericPool(final int pInitialSize, final int pGrowth) { + if(pGrowth < 0) { + throw new IllegalArgumentException("pGrowth must be at least 0!"); + } + + this.mGrowth = pGrowth; + + if(pInitialSize > 0) { + this.batchAllocatePoolItems(pInitialSize); + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public synchronized int getUnrecycledCount() { + return this.mUnrecycledCount; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract T onAllocatePoolItem(); + + // =========================================================== + // Methods + // =========================================================== + + protected void onHandleRecycleItem(final T pItem) { + + } + + protected T onHandleAllocatePoolItem() { + return this.onAllocatePoolItem(); + } + + protected void onHandleObtainItem(final T pItem) { + + } + + public synchronized void batchAllocatePoolItems(final int pCount) { + final Stack availableItems = this.mAvailableItems; + for(int i = pCount - 1; i >= 0; i--) { + availableItems.push(this.onHandleAllocatePoolItem()); + } + } + + public synchronized T obtainPoolItem() { + final T item; + + if(this.mAvailableItems.size() > 0) { + item = this.mAvailableItems.pop(); + } else { + if(this.mGrowth == 1) { + item = this.onHandleAllocatePoolItem(); + } else { + this.batchAllocatePoolItems(this.mGrowth); + item = this.mAvailableItems.pop(); + } + Debug.i(this.getClass().getName() + "<" + item.getClass().getSimpleName() +"> was exhausted, with " + this.mUnrecycledCount + " item not yet recycled. Allocated " + this.mGrowth + " more."); + } + this.onHandleObtainItem(item); + + this.mUnrecycledCount++; + return item; + } + + public synchronized void recyclePoolItem(final T pItem) { + if(pItem == null) { + throw new IllegalArgumentException("Cannot recycle null item!"); + } + + this.onHandleRecycleItem(pItem); + + this.mAvailableItems.push(pItem); + + this.mUnrecycledCount--; + + if(this.mUnrecycledCount < 0) { + Debug.e("More items recycled than obtained!"); + } + } + + public synchronized void shufflePoolItems() { + Collections.shuffle(this.mAvailableItems); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/pool/MultiPool.java b/AndEngine/src/org/anddev/andengine/util/pool/MultiPool.java new file mode 100644 index 0000000..ab27c8c --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/MultiPool.java @@ -0,0 +1,59 @@ +package org.anddev.andengine.util.pool; + +import android.util.SparseArray; + +/** + * @author Nicolas Gramlich + * @since 10:13:26 - 02.03.2011 + */ +public class MultiPool { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final SparseArray> mPools = new SparseArray>(); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void registerPool(final int pID, final GenericPool pPool) { + this.mPools.put(pID, pPool); + } + + public T obtainPoolItem(final int pID) { + final GenericPool pool = this.mPools.get(pID); + if(pool == null) { + return null; + } else { + return pool.obtainPoolItem(); + } + } + + public void recyclePoolItem(final int pID, final T pItem) { + final GenericPool pool = this.mPools.get(pID); + if(pool != null) { + pool.recyclePoolItem(pItem); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/pool/Pool.java b/AndEngine/src/org/anddev/andengine/util/pool/Pool.java new file mode 100644 index 0000000..8cae4b2 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/Pool.java @@ -0,0 +1,92 @@ +package org.anddev.andengine.util.pool; + + +/** + * @author Valentin Milea + * @author Nicolas Gramlich + * + * @since 23:00:21 - 21.08.2010 + * @param + */ +public abstract class Pool extends GenericPool{ + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public Pool() { + super(); + } + + public Pool(final int pInitialSize) { + super(pInitialSize); + } + + public Pool(final int pInitialSize, final int pGrowth) { + super(pInitialSize, pGrowth); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected T onHandleAllocatePoolItem() { + final T poolItem = super.onHandleAllocatePoolItem(); + poolItem.mParent = this; + return poolItem; + } + + @Override + protected void onHandleObtainItem(final T pPoolItem) { + pPoolItem.mRecycled = false; + pPoolItem.onObtain(); + } + + @Override + protected void onHandleRecycleItem(final T pPoolItem) { + pPoolItem.onRecycle(); + pPoolItem.mRecycled = true; + } + + @Override + public synchronized void recyclePoolItem(final T pPoolItem) { + if(pPoolItem.mParent == null) { + throw new IllegalArgumentException("PoolItem not assigned to a pool!"); + } else if(!pPoolItem.isFromPool(this)) { + throw new IllegalArgumentException("PoolItem from another pool!"); + } else if(pPoolItem.isRecycled()) { + throw new IllegalArgumentException("PoolItem already recycled!"); + } + + super.recyclePoolItem(pPoolItem); + } + + // =========================================================== + // Methods + // =========================================================== + + public synchronized boolean ownsPoolItem(final T pPoolItem) { + return pPoolItem.mParent == this; + } + + @SuppressWarnings("unchecked") + void recycle(final PoolItem pPoolItem) { + this.recyclePoolItem((T) pPoolItem); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/pool/PoolItem.java b/AndEngine/src/org/anddev/andengine/util/pool/PoolItem.java new file mode 100644 index 0000000..77e336d --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/PoolItem.java @@ -0,0 +1,68 @@ +package org.anddev.andengine.util.pool; + +/** + * @author Valentin Milea + * @author Nicolas Gramlich + * + * @since 23:02:47 - 21.08.2010 + */ +public abstract class PoolItem { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + Pool mParent; + boolean mRecycled = true; + + // =========================================================== + // Constructors + // =========================================================== + + public Pool getParent() { + return this.mParent; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isRecycled() { + return this.mRecycled; + } + + public boolean isFromPool(final Pool pPool) { + return pPool == this.mParent; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + protected void onRecycle() { + + } + + protected void onObtain() { + + } + + public void recycle() { + if(this.mParent == null) { + throw new IllegalStateException("Item already recycled!"); + } + + this.mParent.recycle(this); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/pool/PoolUpdateHandler.java b/AndEngine/src/org/anddev/andengine/util/pool/PoolUpdateHandler.java new file mode 100644 index 0000000..a9a1d26 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/PoolUpdateHandler.java @@ -0,0 +1,129 @@ +package org.anddev.andengine.util.pool; + +import java.util.ArrayList; + +import org.anddev.andengine.engine.handler.IUpdateHandler; + +/** + * @author Valentin Milea + * @author Nicolas Gramlich + * + * @since 23:02:58 - 21.08.2010 + * @param + */ +public abstract class PoolUpdateHandler implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Pool mPool; + private final ArrayList mScheduledPoolItems = new ArrayList(); + + // =========================================================== + // Constructors + // =========================================================== + + public PoolUpdateHandler() { + this.mPool = new Pool() { + @Override + protected T onAllocatePoolItem() { + return PoolUpdateHandler.this.onAllocatePoolItem(); + } + }; + } + + public PoolUpdateHandler(final int pInitialPoolSize) { + this.mPool = new Pool(pInitialPoolSize) { + @Override + protected T onAllocatePoolItem() { + return PoolUpdateHandler.this.onAllocatePoolItem(); + } + }; + } + + public PoolUpdateHandler(final int pInitialPoolSize, final int pGrowth) { + this.mPool = new Pool(pInitialPoolSize, pGrowth) { + @Override + protected T onAllocatePoolItem() { + return PoolUpdateHandler.this.onAllocatePoolItem(); + } + }; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + protected abstract T onAllocatePoolItem(); + + protected abstract void onHandlePoolItem(final T pPoolItem); + + @Override + public void onUpdate(final float pSecondsElapsed) { + final ArrayList scheduledPoolItems = this.mScheduledPoolItems; + + synchronized (scheduledPoolItems) { + final int count = scheduledPoolItems.size(); + + if(count > 0) { + final Pool pool = this.mPool; + T item; + + for(int i = 0; i < count; i++) { + item = scheduledPoolItems.get(i); + this.onHandlePoolItem(item); + pool.recyclePoolItem(item); + } + + scheduledPoolItems.clear(); + } + } + } + + @Override + public void reset() { + final ArrayList scheduledPoolItems = this.mScheduledPoolItems; + synchronized (scheduledPoolItems) { + final int count = scheduledPoolItems.size(); + + final Pool pool = this.mPool; + for(int i = count - 1; i >= 0; i--) { + pool.recyclePoolItem(scheduledPoolItems.get(i)); + } + + scheduledPoolItems.clear(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + public T obtainPoolItem() { + return this.mPool.obtainPoolItem(); + } + + public void postPoolItem(final T pPoolItem) { + synchronized (this.mScheduledPoolItems) { + if(pPoolItem == null) { + throw new IllegalArgumentException("PoolItem already recycled!"); + } else if(!this.mPool.ownsPoolItem(pPoolItem)) { + throw new IllegalArgumentException("PoolItem from another pool!"); + } + + this.mScheduledPoolItems.add(pPoolItem); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/pool/RunnablePoolItem.java b/AndEngine/src/org/anddev/andengine/util/pool/RunnablePoolItem.java new file mode 100644 index 0000000..1550fe5 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/RunnablePoolItem.java @@ -0,0 +1,35 @@ +package org.anddev.andengine.util.pool; + +/** + * @author Nicolas Gramlich + * @since 23:46:50 - 27.08.2010 + */ +public abstract class RunnablePoolItem extends PoolItem implements Runnable { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/pool/RunnablePoolUpdateHandler.java b/AndEngine/src/org/anddev/andengine/util/pool/RunnablePoolUpdateHandler.java new file mode 100644 index 0000000..266c972 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/pool/RunnablePoolUpdateHandler.java @@ -0,0 +1,54 @@ +package org.anddev.andengine.util.pool; + +/** + * @author Valentin Milea + * @author Nicolas Gramlich + * + * @since 23:03:58 - 21.08.2010 + * @param + */ +public abstract class RunnablePoolUpdateHandler extends PoolUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public RunnablePoolUpdateHandler() { + + } + + public RunnablePoolUpdateHandler(final int pInitialPoolSize) { + super(pInitialPoolSize); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected abstract T onAllocatePoolItem(); + + @Override + protected void onHandlePoolItem(final T pRunnablePoolItem) { + pRunnablePoolItem.run(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/src/org/anddev/andengine/util/progress/IProgressListener.java b/AndEngine/src/org/anddev/andengine/util/progress/IProgressListener.java new file mode 100644 index 0000000..60debcf --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/progress/IProgressListener.java @@ -0,0 +1,17 @@ +package org.anddev.andengine.util.progress; + + +public interface IProgressListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * @param pProgress between 0 and 100. + */ + public void onProgressChanged(final int pProgress); +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/progress/ProgressCallable.java b/AndEngine/src/org/anddev/andengine/util/progress/ProgressCallable.java new file mode 100644 index 0000000..21599d0 --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/progress/ProgressCallable.java @@ -0,0 +1,24 @@ +package org.anddev.andengine.util.progress; + + +/** + * @author Nicolas Gramlich + * @since 20:52:44 - 03.01.2010 + */ +public interface ProgressCallable { + // =========================================================== + // Final Fields + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * Computes a result, or throws an exception if unable to do so. + * @param pProgressListener + * @return computed result + * @throws Exception if unable to compute a result + */ + public T call(final IProgressListener pProgressListener) throws Exception; +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/progress/ProgressMonitor.java b/AndEngine/src/org/anddev/andengine/util/progress/ProgressMonitor.java new file mode 100644 index 0000000..bfd10ea --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/progress/ProgressMonitor.java @@ -0,0 +1,82 @@ +package org.anddev.andengine.util.progress; + +/** + * @author Nicolas Gramlich + * @since 18:07:35 - 09.07.2009 + */ +public class ProgressMonitor implements IProgressListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ProgressMonitor mParentProgressMonitor; + private final IProgressListener mListener; + + private int mSubMonitorRangeFrom = 0; + private int mSubMonitorRangeTo = 100; + + private int mProgress = 0; + + // =========================================================== + // Constructors + // =========================================================== + + public ProgressMonitor(final IProgressListener pListener) { + this.mListener = pListener; + this.mParentProgressMonitor = null; + } + + public ProgressMonitor(final ProgressMonitor pParent){ + this.mListener = null; + this.mParentProgressMonitor = pParent; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public ProgressMonitor getParentProgressMonitor() { + return this.mParentProgressMonitor; + } + + public int getProgress() { + return this.mProgress; + } + + public void setSubMonitorRange(final int pSubMonitorRangeFrom, final int pSubMonitorRangeTo) { + this.mSubMonitorRangeFrom = pSubMonitorRangeFrom; + this.mSubMonitorRangeTo = pSubMonitorRangeTo; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + /** + * @param pProgress between 0 and 100. + */ + @Override + public void onProgressChanged(final int pProgress){ + this.mProgress = pProgress; + if(this.mParentProgressMonitor != null) { + this.mParentProgressMonitor.onSubProgressChanged(pProgress); + } else { + this.mListener.onProgressChanged(pProgress); + } + } + + private void onSubProgressChanged(final int pSubProgress){ + final int subRange = this.mSubMonitorRangeTo- this.mSubMonitorRangeFrom; + final int subProgressInRange = this.mSubMonitorRangeFrom + (int)(subRange * pSubProgress / 100f); + + if(this.mParentProgressMonitor != null) { + this.mParentProgressMonitor.onSubProgressChanged(subProgressInRange); + }else{ + this.mListener.onProgressChanged(subProgressInRange); + } + } +} diff --git a/AndEngine/src/org/anddev/andengine/util/sort/InsertionSorter.java b/AndEngine/src/org/anddev/andengine/util/sort/InsertionSorter.java new file mode 100644 index 0000000..8a93eeb --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/sort/InsertionSorter.java @@ -0,0 +1,71 @@ +package org.anddev.andengine.util.sort; + +import java.util.Comparator; +import java.util.List; + +/** + * @author Nicolas Gramlich + * @since 14:14:31 - 06.08.2010 + * @param + */ +public class InsertionSorter extends Sorter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void sort(final T[] pArray, final int pStart, final int pEnd, final Comparator pComparator) { + for(int i = pStart + 1; i < pEnd; i++) { + final T current = pArray[i]; + T prev = pArray[i - 1]; + if(pComparator.compare(current, prev) < 0) { + int j = i; + do { + pArray[j--] = prev; + } while(j > pStart && pComparator.compare(current, prev = pArray[j - 1]) < 0); + pArray[j] = current; + } + } + return; + } + + @Override + public void sort(final List pList, final int pStart, final int pEnd, final Comparator pComparator) { + for(int i = pStart + 1; i < pEnd; i++) { + final T current = pList.get(i); + T prev = pList.get(i - 1); + if(pComparator.compare(current, prev) < 0) { + int j = i; + do { + pList.set(j--, prev); + } while(j > pStart && pComparator.compare(current, prev = pList.get(j - 1)) < 0); + pList.set(j, current); + } + } + return; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/AndEngine/src/org/anddev/andengine/util/sort/Sorter.java b/AndEngine/src/org/anddev/andengine/util/sort/Sorter.java new file mode 100644 index 0000000..25a21bc --- /dev/null +++ b/AndEngine/src/org/anddev/andengine/util/sort/Sorter.java @@ -0,0 +1,51 @@ +package org.anddev.andengine.util.sort; + +import java.util.Comparator; +import java.util.List; + +/** + * @author Nicolas Gramlich + * @since 14:14:39 - 06.08.2010 + * @param + */ +public abstract class Sorter { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public abstract void sort(final T[] pArray, final int pStart, final int pEnd, final Comparator pComparator); + + public abstract void sort(final List pList, final int pStart, final int pEnd, final Comparator pComparator); + + // =========================================================== + // Methods + // =========================================================== + + public final void sort(final T[] pArray, final Comparator pComparator){ + this.sort(pArray, 0, pArray.length, pComparator); + } + + public final void sort(final List pList, final Comparator pComparator){ + this.sort(pList, 0, pList.size(), pComparator); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/AndEngine/uml/andengine_classdiagram.png b/AndEngine/uml/andengine_classdiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9690ad35c0f2d1c87188d3fa8519c718fa53eb GIT binary patch literal 34363 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 YxRVB7ECic03j_SfNhwQ~i5my~FHX?_aR2}S literal 0 HcmV?d00001 diff --git a/AndEngine/uml/andengine_classdiagram.ucls b/AndEngine/uml/andengine_classdiagram.ucls new file mode 100644 index 0000000..1b8bb9e --- /dev/null +++ b/AndEngine/uml/andengine_classdiagram.ucls @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file
  • t#4B{DS{rz!Xl)?Y>x*zUX3)%4+-KoIxnwB)Q1 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