From 1a2cb755e2d8b9d59178f36702f6dff7235b9088 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Tue, 2 Sep 2014 23:13:40 -0300 Subject: [PATCH] 3D Physics and Other Stuff -=-=-=-=-=-=-=-=-=-=-=-=-= -New Vehicle (Based on Bullet's RaycastVehicle) - Vehiclebody/VehicleWheel. Demo will come soon, old vehicle (CarBody) will go away soon too. -A lot of fixes to the 3D physics engine -Added KinematicBody with demo -Fixed the space query API for 2D (demo will come soon). 3D is WIP. -Fixed long-standing bug with body_enter/body_exit for Area and Area2D -Performance variables now includes physics (active bodies, collision pairs and islands) -Ability to see what's inside of instanced scenes! -Fixed Blend Shapes (no bs+skeleton yet) -Added an Android JavaClassWrapper singleton for using Android native classes directly from GDScript. This is very Alpha! --- SConstruct | 5 +- core/global_constants.cpp | 29 +- core/math/vector3.h | 16 + core/variant_call.cpp | 5 + core/variant_op.cpp | 34 + demos/2d/platformer/stage.xml | 23 +- demos/3d/kinematic_char/cubelib.res | Bin 0 -> 11431 bytes demos/3d/kinematic_char/cubio.gd | 96 ++ demos/3d/kinematic_char/engine.cfg | 17 + demos/3d/kinematic_char/follow_camera.gd | 92 ++ demos/3d/kinematic_char/kinebody3d.png | Bin 0 -> 6078 bytes demos/3d/kinematic_char/level.scn | Bin 0 -> 15257 bytes demos/3d/kinematic_char/purple_wood.tex | Bin 0 -> 173520 bytes demos/3d/kinematic_char/purplecube.scn | Bin 0 -> 9808 bytes demos/3d/kinematic_char/twood.tex | Bin 0 -> 168054 bytes demos/3d/kinematic_char/white_wood.tex | Bin 0 -> 169001 bytes drivers/gles2/rasterizer_gles2.cpp | 37 +- main/performance.cpp | 25 +- main/performance.h | 6 + platform/android/SCsub | 4 +- .../src/com/android/godot/GodotPaymentV3.java | 8 +- platform/android/java_class_wrapper.cpp | 1332 +++++++++++++++++ platform/android/java_class_wrapper.h | 168 +++ platform/android/java_glue.cpp | 5 + platform/iphone/app_delegate.mm | 4 + platform/iphone/in_app_store.h | 2 + platform/iphone/in_app_store.mm | 31 +- platform/windows/detect.py | 3 +- platform/windows/os_windows.cpp | 102 +- platform/windows/os_windows.h | 4 + scene/2d/physics_body_2d.cpp | 2 +- scene/3d/physics_body.cpp | 579 +++++-- scene/3d/physics_body.h | 93 +- scene/3d/vehicle_body.cpp | 214 ++- scene/3d/vehicle_body.h | 45 +- scene/gui/tree.cpp | 2 +- scene/register_scene_types.cpp | 1 + servers/audio/sample_manager_sw.cpp | 2 +- servers/physics/area_sw.h | 2 +- servers/physics/body_pair_sw.cpp | 12 +- servers/physics/body_sw.cpp | 107 +- servers/physics/body_sw.h | 5 +- servers/physics/collision_object_sw.cpp | 1 + servers/physics/collision_object_sw.h | 5 +- servers/physics/collision_solver_sat.cpp | 485 +++++- servers/physics/collision_solver_sat.h | 2 +- servers/physics/collision_solver_sw.cpp | 131 +- servers/physics/collision_solver_sw.h | 6 +- servers/physics/gjk_epa.cpp | 61 +- servers/physics/gjk_epa.h | 40 +- servers/physics/physics_server_sw.cpp | 98 +- servers/physics/physics_server_sw.h | 21 +- servers/physics/shape_sw.cpp | 16 +- servers/physics/shape_sw.h | 845 ++++++----- servers/physics/space_sw.cpp | 313 +++- servers/physics/space_sw.h | 19 +- servers/physics/step_sw.cpp | 17 +- servers/physics_2d/area_2d_sw.h | 2 +- .../physics_2d/collision_solver_2d_sat.cpp | 4 +- servers/physics_2d/physics_2d_server_sw.cpp | 32 + servers/physics_2d/physics_2d_server_sw.h | 7 + servers/physics_2d/shape_2d_sw.h | 1 + servers/physics_2d/space_2d_sw.cpp | 13 +- servers/physics_2d/space_2d_sw.h | 12 + servers/physics_2d/step_2d_sw.cpp | 4 + servers/physics_2d_server.cpp | 235 ++- servers/physics_2d_server.h | 65 +- servers/physics_server.cpp | 117 +- servers/physics_server.h | 87 +- servers/register_server_types.cpp | 1 + tools/collada/collada.cpp | 3 + tools/editor/icons/icon_instance_options.png | Bin 0 -> 523 bytes .../io_plugins/editor_import_collada.cpp | 9 +- tools/editor/plugins/baked_light_baker.cpp | 2 +- tools/editor/property_editor.cpp | 18 + tools/editor/scene_tree_dock.cpp | 49 +- tools/editor/scene_tree_dock.h | 1 + tools/editor/scene_tree_editor.cpp | 87 +- tools/editor/scene_tree_editor.h | 11 + tools/editor/spatial_editor_gizmos.cpp | 69 + tools/editor/spatial_editor_gizmos.h | 15 + tools/pck/pck_packer.cpp | 1 + 82 files changed, 5161 insertions(+), 856 deletions(-) create mode 100644 demos/3d/kinematic_char/cubelib.res create mode 100644 demos/3d/kinematic_char/cubio.gd create mode 100644 demos/3d/kinematic_char/engine.cfg create mode 100644 demos/3d/kinematic_char/follow_camera.gd create mode 100644 demos/3d/kinematic_char/kinebody3d.png create mode 100644 demos/3d/kinematic_char/level.scn create mode 100644 demos/3d/kinematic_char/purple_wood.tex create mode 100644 demos/3d/kinematic_char/purplecube.scn create mode 100644 demos/3d/kinematic_char/twood.tex create mode 100644 demos/3d/kinematic_char/white_wood.tex create mode 100644 platform/android/java_class_wrapper.cpp create mode 100644 platform/android/java_class_wrapper.h create mode 100644 tools/editor/icons/icon_instance_options.png diff --git a/SConstruct b/SConstruct index 4ec27b7ea46..de7256f6bc6 100644 --- a/SConstruct +++ b/SConstruct @@ -205,8 +205,9 @@ for p in platform_list: flag_list = platform_flags[p] for f in flag_list: - env[f[0]] = f[1] - print(f[0]+":"+f[1]) + if not (f[0] in ARGUMENTS): # allow command line to override platform flags + env[f[0]] = f[1] + print(f[0]+":"+f[1]) env.module_list=[] diff --git a/core/global_constants.cpp b/core/global_constants.cpp index efa72b6547b..ae4abc627d3 100644 --- a/core/global_constants.cpp +++ b/core/global_constants.cpp @@ -445,15 +445,26 @@ static _GlobalConstant _global_constants[]={ BIND_GLOBAL_CONSTANT( ERR_BUG ), ///< a bug in the software certainly happened ), due to a double check failing or unexpected behavior. BIND_GLOBAL_CONSTANT( ERR_WTF ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_NONE ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_RANGE ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_EXP_RANGE ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_ENUM ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_LENGTH ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_FLAGS ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_FILE ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_DIR ), - BIND_GLOBAL_CONSTANT( PROPERTY_HINT_RESOURCE_TYPE ), + + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_NONE ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_RANGE ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_EXP_RANGE ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_ENUM ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_EXP_EASING ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_LENGTH ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_KEY_ACCEL ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_FLAGS ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_ALL_FLAGS ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_FILE ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_DIR ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_GLOBAL_FILE ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_GLOBAL_DIR ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_RESOURCE_TYPE ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_MULTILINE_TEXT ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_COLOR_NO_ALPHA ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_IMAGE_COMPRESS_LOSSY ), + BIND_GLOBAL_CONSTANT( PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS ), + BIND_GLOBAL_CONSTANT( PROPERTY_USAGE_STORAGE ), BIND_GLOBAL_CONSTANT( PROPERTY_USAGE_STORAGE ), diff --git a/core/math/vector3.h b/core/math/vector3.h index 959f7cd0a8e..d2f24088291 100644 --- a/core/math/vector3.h +++ b/core/math/vector3.h @@ -111,6 +111,12 @@ struct Vector3 { _FORCE_INLINE_ real_t distance_to(const Vector3& p_b) const; _FORCE_INLINE_ real_t distance_squared_to(const Vector3& p_b) const; + + + _FORCE_INLINE_ Vector3 slide(const Vector3& p_vec) const; + _FORCE_INLINE_ Vector3 reflect(const Vector3& p_vec) const; + + /* Operators */ _FORCE_INLINE_ Vector3& operator+=(const Vector3& p_v); @@ -368,6 +374,16 @@ void Vector3::zero() { x=y=z=0; } +Vector3 Vector3::slide(const Vector3& p_vec) const { + + return p_vec - *this * this->dot(p_vec); +} +Vector3 Vector3::reflect(const Vector3& p_vec) const { + + return p_vec - *this * this->dot(p_vec) * 2.0; + +} + #endif #endif // VECTOR3_H diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 2697e6f7a7a..8fbccc87aed 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -331,6 +331,9 @@ static void _call_##m_type##_##m_method(Variant& r_ret,Variant& p_self,const Var VCALL_LOCALMEM0R(Vector3, abs); VCALL_LOCALMEM1R(Vector3, distance_to); VCALL_LOCALMEM1R(Vector3, distance_squared_to); + VCALL_LOCALMEM1R(Vector3, slide); + VCALL_LOCALMEM1R(Vector3, reflect); + VCALL_LOCALMEM0R(Plane,normalized); VCALL_LOCALMEM0R(Plane,center); @@ -1236,6 +1239,8 @@ _VariantCall::addfunc(Variant::m_vtype,Variant::m_ret,_SCS(#m_method),VCALL(m_cl ADDFUNC0(VECTOR3,VECTOR3,Vector3,abs,varray()); ADDFUNC1(VECTOR3,REAL,Vector3,distance_to,VECTOR3,"b",varray()); ADDFUNC1(VECTOR3,REAL,Vector3,distance_squared_to,VECTOR3,"b",varray()); + ADDFUNC1(VECTOR3,VECTOR3,Vector3,slide,VECTOR3,"by",varray()); + ADDFUNC1(VECTOR3,VECTOR3,Vector3,reflect,VECTOR3,"by",varray()); ADDFUNC0(PLANE,PLANE,Plane,normalized,varray()); ADDFUNC0(PLANE,VECTOR3,Plane,center,varray()); diff --git a/core/variant_op.cpp b/core/variant_op.cpp index 6c2667c7e91..9c489c5ef2e 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -1145,6 +1145,7 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) if (p_value.type!=Variant::VECTOR3) return; + if (p_index.get_type()==Variant::STRING) { //scalar name @@ -1181,6 +1182,24 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) v->set_axis(index,p_value); return; } + } else if (p_index.get_type()==Variant::STRING) { + + const String *str=reinterpret_cast(p_index._data._mem); + Matrix3 *v=_data._matrix3; + + if (*str=="x") { + valid=true; + v->set_axis(0,p_value); + return; + } else if (*str=="y" ) { + valid=true; + v->set_axis(1,p_value); + return; + } else if (*str=="z" ) { + valid=true; + v->set_axis(2,p_value); + return; + } } } break; @@ -2021,6 +2040,21 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const { valid=true; return v->get_axis(index); } + } else if (p_index.get_type()==Variant::STRING) { + + const String *str=reinterpret_cast(p_index._data._mem); + const Matrix3 *v=_data._matrix3; + + if (*str=="x") { + valid=true; + return v->get_axis(0); + } else if (*str=="y" ) { + valid=true; + return v->get_axis(1); + } else if (*str=="z" ) { + valid=true; + return v->get_axis(2); + } } } break; diff --git a/demos/2d/platformer/stage.xml b/demos/2d/platformer/stage.xml index 6a112e02aa5..78d0f9ae2c2 100644 --- a/demos/2d/platformer/stage.xml +++ b/demos/2d/platformer/stage.xml @@ -1,19 +1,20 @@ - + - + "names" - + "stage" "Node" + "_import_path" "__meta__" "tile_map" "TileMap" @@ -28,7 +29,9 @@ "quadrant_size" "tile_set" "tile_data" - "collision_layers" + "collision/friction" + "collision/bounce" + "collision/layers" "coins" "coin" "Area2D" @@ -140,6 +143,7 @@ 66 "variants" + "" "__editor_plugin_states__" @@ -164,7 +168,7 @@ "use_snap" False "ofs" - 418.81, 615.088 + -177.089, 415.221 "snap" 10 @@ -318,7 +322,7 @@ 4236.75, 541.058 4172.75, 541.058 - 236.879, 1051.15 + 251.684, 1045.6 1451.86, 742.969 0, 140 @@ -349,16 +353,15 @@ -202 358 -10 - "" 2 - 14 + 7 14.769231 - "This is a simple demo on how to make a platformer game with Godot. This version uses physics and the 2D physics engine for motion and collision. The demo also shows the benefits of using the scene system, where coins, enemies and the player are edited separatedly and instanced in the stage. To edit the base tiles for the tileset, open the tileset_edit.xml file and follow instructions. " + "This is a simple demo on how to make a platformer game with Godot.This version uses physics and the 2D physics engine for motion and collision.The demo also shows the benefits of using the scene system, where coins,enemies and the player are edited separatedly and instanced in the stage.To edit the base tiles for the tileset, open the tileset_edit.xml file and follow instructions." 0 -1 "nodes" - -1, -1, 1, 0, -1, 1, 2, 0, 0, 0, 0, 4, 3, -1, 13, 5, 1, 6, 2, 7, 2, 8, 3, 9, 4, 10, 5, 11, 6, 12, 7, 13, 8, 14, 9, 15, 10, 16, 11, 2, 12, 0, 0, 0, 1, 17, -1, 1, 2, 13, 0, 2, 0, 19, 18, 14, 1, 9, 15, 0, 2, 0, 19, 20, 14, 1, 9, 16, 0, 2, 0, 19, 21, 14, 1, 9, 17, 0, 2, 0, 19, 22, 14, 1, 9, 18, 0, 2, 0, 19, 23, 14, 1, 9, 19, 0, 2, 0, 19, 24, 14, 1, 9, 20, 0, 2, 0, 19, 25, 14, 1, 9, 21, 0, 2, 0, 19, 26, 14, 1, 9, 22, 0, 2, 0, 19, 27, 14, 1, 9, 23, 0, 2, 0, 19, 28, 14, 1, 9, 24, 0, 2, 0, 19, 29, 14, 1, 9, 25, 0, 2, 0, 19, 30, 14, 1, 9, 26, 0, 2, 0, 19, 31, 14, 1, 9, 27, 0, 2, 0, 19, 32, 14, 1, 9, 28, 0, 2, 0, 19, 33, 14, 1, 9, 29, 0, 2, 0, 19, 34, 14, 1, 9, 30, 0, 2, 0, 19, 35, 14, 1, 9, 31, 0, 2, 0, 19, 36, 14, 1, 9, 32, 0, 2, 0, 19, 37, 14, 1, 9, 33, 0, 2, 0, 19, 38, 14, 1, 9, 34, 0, 2, 0, 19, 39, 14, 1, 9, 35, 0, 2, 0, 19, 40, 14, 1, 9, 36, 0, 2, 0, 19, 41, 14, 1, 9, 37, 0, 2, 0, 19, 42, 14, 1, 9, 38, 0, 2, 0, 19, 43, 14, 1, 9, 39, 0, 2, 0, 19, 44, 14, 1, 9, 40, 0, 2, 0, 19, 45, 14, 1, 9, 41, 0, 2, 0, 19, 46, 14, 1, 9, 42, 0, 2, 0, 19, 47, 14, 1, 9, 43, 0, 2, 0, 19, 48, 14, 1, 9, 44, 0, 2, 0, 19, 49, 14, 1, 9, 45, 0, 2, 0, 19, 50, 14, 1, 9, 46, 0, 2, 0, 19, 51, 14, 1, 9, 47, 0, 2, 0, 19, 52, 14, 1, 9, 48, 0, 2, 0, 19, 53, 14, 1, 9, 49, 0, 2, 0, 19, 54, 14, 1, 9, 50, 0, 2, 0, 19, 55, 14, 1, 9, 51, 0, 2, 0, 19, 56, 14, 1, 9, 52, 0, 2, 0, 19, 57, 14, 1, 9, 53, 0, 2, 0, 19, 58, 14, 1, 9, 54, 0, 2, 0, 19, 59, 14, 1, 9, 55, 0, 2, 0, 19, 60, 14, 1, 9, 56, 0, 0, 0, 62, 61, 57, 1, 9, 58, 0, 0, 0, 1, 63, -1, 0, 0, 46, 0, 65, 64, 59, 3, 9, 60, 66, 61, 67, 62, 0, 46, 0, 65, 68, 59, 3, 9, 63, 66, 64, 67, 65, 0, 46, 0, 65, 69, 59, 3, 9, 66, 66, 67, 67, 65, 0, 46, 0, 65, 70, 68, 1, 9, 69, 0, 0, 0, 72, 71, -1, 6, 73, 70, 74, 3, 75, 1, 76, 71, 77, 1, 78, 3, 0, 0, 0, 1, 79, -1, 0, 0, 52, 0, 62, 80, 72, 1, 9, 73, 0, 52, 0, 62, 81, 72, 1, 9, 74, 0, 52, 0, 62, 82, 72, 1, 9, 75, 0, 52, 0, 62, 83, 72, 1, 9, 76, 0, 52, 0, 62, 84, 72, 1, 9, 77, 0, 52, 0, 62, 85, 72, 1, 9, 78, 0, 52, 0, 62, 86, 72, 1, 9, 79, 0, 52, 0, 62, 87, 72, 1, 9, 80, 0, 52, 0, 62, 88, 72, 1, 9, 81, 0, 52, 0, 62, 89, 72, 1, 9, 82, 0, 52, 0, 62, 90, 72, 1, 9, 83, 0, 0, 0, 92, 91, 84, 0, 0, 0, 0, 93, 93, -1, 29, 5, 1, 6, 2, 7, 2, 8, 3, 94, 85, 95, 86, 96, 87, 97, 88, 98, 89, 99, 89, 100, 89, 101, 89, 102, 1, 103, 1, 104, 90, 105, 2, 106, 5, 107, 91, 108, 2, 109, 92, 110, 5, 111, 3, 112, 3, 113, 93, 114, 94, 115, 94, 116, 1, 117, 3, 118, 95, 0 + -1, -1, 1, 0, -1, 2, 2, 0, 3, 1, 0, 0, 0, 5, 4, -1, 16, 2, 0, 6, 2, 7, 3, 8, 3, 9, 4, 10, 5, 11, 6, 12, 7, 13, 8, 14, 9, 15, 10, 16, 11, 17, 3, 18, 6, 19, 12, 3, 13, 0, 0, 0, 1, 20, -1, 2, 2, 0, 3, 14, 0, 2, 0, 22, 21, 15, 1, 10, 16, 0, 2, 0, 22, 23, 15, 1, 10, 17, 0, 2, 0, 22, 24, 15, 1, 10, 18, 0, 2, 0, 22, 25, 15, 1, 10, 19, 0, 2, 0, 22, 26, 15, 1, 10, 20, 0, 2, 0, 22, 27, 15, 1, 10, 21, 0, 2, 0, 22, 28, 15, 1, 10, 22, 0, 2, 0, 22, 29, 15, 1, 10, 23, 0, 2, 0, 22, 30, 15, 1, 10, 24, 0, 2, 0, 22, 31, 15, 1, 10, 25, 0, 2, 0, 22, 32, 15, 1, 10, 26, 0, 2, 0, 22, 33, 15, 1, 10, 27, 0, 2, 0, 22, 34, 15, 1, 10, 28, 0, 2, 0, 22, 35, 15, 1, 10, 29, 0, 2, 0, 22, 36, 15, 1, 10, 30, 0, 2, 0, 22, 37, 15, 1, 10, 31, 0, 2, 0, 22, 38, 15, 1, 10, 32, 0, 2, 0, 22, 39, 15, 1, 10, 33, 0, 2, 0, 22, 40, 15, 1, 10, 34, 0, 2, 0, 22, 41, 15, 1, 10, 35, 0, 2, 0, 22, 42, 15, 1, 10, 36, 0, 2, 0, 22, 43, 15, 1, 10, 37, 0, 2, 0, 22, 44, 15, 1, 10, 38, 0, 2, 0, 22, 45, 15, 1, 10, 39, 0, 2, 0, 22, 46, 15, 1, 10, 40, 0, 2, 0, 22, 47, 15, 1, 10, 41, 0, 2, 0, 22, 48, 15, 1, 10, 42, 0, 2, 0, 22, 49, 15, 1, 10, 43, 0, 2, 0, 22, 50, 15, 1, 10, 44, 0, 2, 0, 22, 51, 15, 1, 10, 45, 0, 2, 0, 22, 52, 15, 1, 10, 46, 0, 2, 0, 22, 53, 15, 1, 10, 47, 0, 2, 0, 22, 54, 15, 1, 10, 48, 0, 2, 0, 22, 55, 15, 1, 10, 49, 0, 2, 0, 22, 56, 15, 1, 10, 50, 0, 2, 0, 22, 57, 15, 1, 10, 51, 0, 2, 0, 22, 58, 15, 1, 10, 52, 0, 2, 0, 22, 59, 15, 1, 10, 53, 0, 2, 0, 22, 60, 15, 1, 10, 54, 0, 2, 0, 22, 61, 15, 1, 10, 55, 0, 2, 0, 22, 62, 15, 1, 10, 56, 0, 2, 0, 22, 63, 15, 1, 10, 57, 0, 0, 0, 65, 64, 58, 1, 10, 59, 0, 0, 0, 1, 66, -1, 1, 2, 0, 0, 46, 0, 68, 67, 60, 3, 10, 61, 69, 62, 70, 63, 0, 46, 0, 68, 71, 60, 3, 10, 64, 69, 65, 70, 66, 0, 46, 0, 68, 72, 60, 3, 10, 67, 69, 68, 70, 66, 0, 46, 0, 68, 73, 69, 1, 10, 70, 0, 0, 0, 75, 74, -1, 7, 2, 0, 76, 71, 77, 4, 78, 2, 79, 72, 80, 2, 81, 4, 0, 0, 0, 1, 82, -1, 1, 2, 0, 0, 52, 0, 65, 83, 73, 1, 10, 74, 0, 52, 0, 65, 84, 73, 1, 10, 75, 0, 52, 0, 65, 85, 73, 1, 10, 76, 0, 52, 0, 65, 86, 73, 1, 10, 77, 0, 52, 0, 65, 87, 73, 1, 10, 78, 0, 52, 0, 65, 88, 73, 1, 10, 79, 0, 52, 0, 65, 89, 73, 1, 10, 80, 0, 52, 0, 65, 90, 73, 1, 10, 81, 0, 52, 0, 65, 91, 73, 1, 10, 82, 0, 52, 0, 65, 92, 73, 1, 10, 83, 0, 52, 0, 65, 93, 73, 1, 10, 84, 0, 0, 0, 95, 94, 85, 0, 0, 0, 0, 96, 96, -1, 30, 2, 0, 6, 2, 7, 3, 8, 3, 9, 4, 97, 86, 98, 87, 99, 88, 100, 89, 101, 0, 102, 0, 103, 0, 104, 0, 105, 2, 106, 2, 107, 90, 108, 3, 109, 6, 110, 91, 111, 3, 112, 92, 113, 6, 114, 4, 115, 4, 116, 93, 117, 94, 118, 94, 119, 2, 120, 4, 121, 95, 0 "conns" diff --git a/demos/3d/kinematic_char/cubelib.res b/demos/3d/kinematic_char/cubelib.res new file mode 100644 index 0000000000000000000000000000000000000000..66b999d78d62d4e697f875f7eaea4891f5f4f928 GIT binary patch literal 11431 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 XHE!QI65!P$_Drg4s_oUdMfv{%a)t4v literal 0 HcmV?d00001 diff --git a/demos/3d/kinematic_char/cubio.gd b/demos/3d/kinematic_char/cubio.gd new file mode 100644 index 00000000000..6f12e39db7b --- /dev/null +++ b/demos/3d/kinematic_char/cubio.gd @@ -0,0 +1,96 @@ + +extends KinematicBody + +# member variables here, example: +# var a=2 +# var b="textvar" + +var g = -9.8 +var vel = Vector3() +const MAX_SPEED = 5 +const JUMP_SPEED = 7 +const ACCEL= 2 +const DEACCEL= 4 +const MAX_SLOPE_ANGLE = 30 + +func _fixed_process(delta): + + var dir = Vector3() #where does the player intend to walk to + var cam_xform = get_node("target/camera").get_global_transform() + + if (Input.is_action_pressed("move_forward")): + dir+=-cam_xform.basis[2] + if (Input.is_action_pressed("move_backwards")): + dir+=cam_xform.basis[2] + if (Input.is_action_pressed("move_left")): + dir+=-cam_xform.basis[0] + if (Input.is_action_pressed("move_right")): + dir+=cam_xform.basis[0] + + dir.y=0 + dir=dir.normalized() + + vel.y+=delta*g + + var hvel = vel + hvel.y=0 + + var target = dir*MAX_SPEED + var accel + if (dir.dot(hvel) >0): + accel=ACCEL + else: + accel=DEACCEL + + hvel = hvel.linear_interpolate(target,accel*delta) + + vel.x=hvel.x; + vel.z=hvel.z + + var motion = vel*delta + motion=move(vel*delta) + + var on_floor = false + var original_vel = vel + + + var floor_velocity=Vector2() + + var attempts=4 + + while(is_colliding() and attempts): + var n=get_collision_normal() + + if ( rad2deg(acos(n.dot( Vector3(0,1,0)))) < MAX_SLOPE_ANGLE ): + #if angle to the "up" vectors is < angle tolerance + #char is on floor + floor_velocity=get_collider_velocity() + on_floor=true + + motion = n.slide(motion) + vel = n.slide(vel) + if (original_vel.dot(vel) > 0): + #do not allow to slide towads the opposite direction we were coming from + motion=move(motion) + if (motion.length()<0.001): + break + attempts-=1 + + if (on_floor and floor_velocity!=Vector3()): + move(floor_velocity*delta) + + if (on_floor and Input.is_action_pressed("jump")): + vel.y=JUMP_SPEED + + var crid = get_node("../elevator1").get_rid() +# print(crid," : ",PS.body_get_state(crid,PS.BODY_STATE_TRANSFORM)) + +func _ready(): + # Initalization here + set_fixed_process(true) + pass + + +func _on_tcube_body_enter( body ): + get_node("../ty").show() + pass # replace with function body diff --git a/demos/3d/kinematic_char/engine.cfg b/demos/3d/kinematic_char/engine.cfg new file mode 100644 index 00000000000..b3060b65e03 --- /dev/null +++ b/demos/3d/kinematic_char/engine.cfg @@ -0,0 +1,17 @@ +[application] + +name="Kinematic Character 3D" +main_scene="res://level.scn" +icon="res://kinebody3d.png" + +[input] + +move_forward=[key(Up)] +move_left=[key(Left)] +move_right=[key(Right)] +move_backwards=[key(Down)] +jump=[key(Space)] + +[rasterizer] + +shadow_filter=3 diff --git a/demos/3d/kinematic_char/follow_camera.gd b/demos/3d/kinematic_char/follow_camera.gd new file mode 100644 index 00000000000..0b9ff9bbb2d --- /dev/null +++ b/demos/3d/kinematic_char/follow_camera.gd @@ -0,0 +1,92 @@ + +extends Camera + +# member variables here, example: +# var a=2 +# var b="textvar" + +var collision_exception=[] +export var min_distance=0.5 +export var max_distance=4.0 +export var angle_v_adjust=0.0 +export var autoturn_ray_aperture=25 +export var autoturn_speed=50 +var max_height = 2.0 +var min_height = 0 + +func _fixed_process(dt): + var target = get_parent().get_global_transform().origin + var pos = get_global_transform().origin + var up = Vector3(0,1,0) + + var delta = pos - target + + #regular delta follow + + #check ranges + + if (delta.length() < min_distance): + delta = delta.normalized() * min_distance + elif (delta.length() > max_distance): + delta = delta.normalized() * max_distance + + #check upper and lower height + if ( delta.y > max_height): + delta.y = max_height + if ( delta.y < min_height): + delta.y = min_height + + #check autoturn + + var ds = PhysicsServer.space_get_direct_state( get_world().get_space() ) + + + var col_left = ds.intersect_ray(target,target+Matrix3(up,deg2rad(autoturn_ray_aperture)).xform(delta),collision_exception) + var col = ds.intersect_ray(target,target,collision_exception) + var col_right = ds.intersect_ray(target,target+Matrix3(up,deg2rad(-autoturn_ray_aperture)).xform(delta),collision_exception) + + if (col!=null): + #if main ray was occluded, get camera closer, this is the worst case scenario + delta = col.position - target + elif (col_left!=null and col_right==null): + #if only left ray is occluded, turn the camera around to the right + delta = Matrix3(up,deg2rad(-dt*autoturn_speed)).xform(delta) + elif (col_left==null and col_right!=null): + #if only right ray is occluded, turn the camera around to the left + delta = Matrix3(up,deg2rad(dt*autoturn_speed)).xform(delta) + else: + #do nothing otherwise, left and right are occluded but center is not, so do not autoturn + pass + + #apply lookat + pos = target + delta + + look_at_from_pos(pos,target,up) + + #turn a little up or down + var t = get_transform() + t.basis = Matrix3(t.basis[0],deg2rad(angle_v_adjust)) * t.basis + set_transform(t) + + + +func _ready(): + +#find collision exceptions for ray + var node = self + while(node): + if (node extends RigidBody): + collision_exception.append(node.get_rid()) + break + else: + node=node.get_parent() + # Initalization here + set_fixed_process(true) + #this detaches the camera transform from the parent spatial node + set_as_toplevel(true) + + + + + + diff --git a/demos/3d/kinematic_char/kinebody3d.png b/demos/3d/kinematic_char/kinebody3d.png new file mode 100644 index 0000000000000000000000000000000000000000..41f0edb2461af600833adfb51d2db0e326ed5624 GIT binary patch literal 6078 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 Eg3m~M4*&oF literal 0 HcmV?d00001 diff --git a/demos/3d/kinematic_char/level.scn b/demos/3d/kinematic_char/level.scn new file mode 100644 index 0000000000000000000000000000000000000000..785db19adcb23d2cd704a65a4c4a7619901bce41 GIT binary patch literal 15257 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

e-U%0k=*st5pP*;OfuP%@e0wBgPms8P)H79I^) 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

I4KAlw?Uq_s?yi8rQzn2}t)| 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 literal 0 HcmV?d00001 diff --git a/demos/3d/kinematic_char/purplecube.scn b/demos/3d/kinematic_char/purplecube.scn new file mode 100644 index 0000000000000000000000000000000000000000..ab758366fdbbd77c372a8ee00ab02a10e60a4624 GIT binary patch literal 9808 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 literal 0 HcmV?d00001 diff --git a/demos/3d/kinematic_char/twood.tex b/demos/3d/kinematic_char/twood.tex new file mode 100644 index 0000000000000000000000000000000000000000..65c1bd043ca7c1ae5c77d832f61ec73ad3b6a5a3 GIT binary patch literal 168054 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

F9 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 literal 0 HcmV?d00001 diff --git a/demos/3d/kinematic_char/white_wood.tex b/demos/3d/kinematic_char/white_wood.tex new file mode 100644 index 0000000000000000000000000000000000000000..e003442e70c665f2fb17aca84c7b11fac25902d4 GIT binary patch literal 169001 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
{8^C;268g%gNk!acM_QlF$JFDo*-R;K^c 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 zb-zY^h5x}morph_target_count!=p_blend_shapes.size() ); + if (mesh->morph_target_count) { + //validate format for morphs + for(int i=0;iarray_len=array_len; surface->format=format; surface->primitive=p_primitive; + surface->morph_target_count=mesh->morph_target_count; surface->configured_format=0; + surface->mesh=mesh; if (keep_copies) { surface->data=p_arrays; surface->morph_data=p_blend_shapes; @@ -1735,6 +1754,17 @@ void RasterizerGLES2::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive, surface->index_array_local = (uint8_t*)memalloc(index_array_len*surface->array[VS::ARRAY_INDEX].size); index_array_ptr=(uint8_t*)surface->index_array_local; } + + if (mesh->morph_target_count) { + + surface->morph_targets_local = memnew_arr(Surface::MorphTarget,mesh->morph_target_count); + for(int i=0;imorph_target_count;i++) { + + surface->morph_targets_local[i].array=memnew_arr(uint8_t,surface->local_stride*surface->array_len); + surface->morph_targets_local[i].configured_format=surface->morph_format; + _surface_set_arrays(surface,surface->morph_targets_local[i].array,NULL,p_blend_shapes[i],false); + } + } } @@ -4946,8 +4976,11 @@ Error RasterizerGLES2::_setup_geometry(const Geometry *p_geometry, const Materia /* compute morphs */ + if (p_morphs && surf->morph_target_count && can_copy_to_local) { + + base = skinned_buffer; stride=surf->local_stride; @@ -7773,9 +7806,9 @@ void RasterizerGLES2::free(const RID& p_rid) { for(int i=0;imorph_target_count;i++) { - memfree(surface->morph_targets_local[i].array); + memdelete_arr(surface->morph_targets_local[i].array); } - memfree(surface->morph_targets_local); + memdelete_arr(surface->morph_targets_local); surface->morph_targets_local=NULL; } diff --git a/main/performance.cpp b/main/performance.cpp index 81db7ae1fae..9999cc0ae0d 100644 --- a/main/performance.cpp +++ b/main/performance.cpp @@ -29,6 +29,8 @@ #include "performance.h" #include "os/os.h" #include "servers/visual_server.h" +#include "servers/physics_2d_server.h" +#include "servers/physics_server.h" #include "message_queue.h" #include "scene/main/scene_main_loop.h" Performance *Performance::singleton=NULL; @@ -61,6 +63,13 @@ void Performance::_bind_methods() { BIND_CONSTANT( RENDER_VIDEO_MEM_USED ); BIND_CONSTANT( RENDER_TEXTURE_MEM_USED ); BIND_CONSTANT( RENDER_VERTEX_MEM_USED ); + BIND_CONSTANT( PHYSICS_2D_ACTIVE_OBJECTS ); + BIND_CONSTANT( PHYSICS_2D_COLLISION_PAIRS ); + BIND_CONSTANT( PHYSICS_2D_ISLAND_COUNT ); + BIND_CONSTANT( PHYSICS_3D_ACTIVE_OBJECTS ); + BIND_CONSTANT( PHYSICS_3D_COLLISION_PAIRS ); + BIND_CONSTANT( PHYSICS_3D_ISLAND_COUNT ); + BIND_CONSTANT( MONITOR_MAX ); } @@ -90,7 +99,14 @@ String Performance::get_monitor_name(Monitor p_monitor) const { "video/video_mem", "video/texure_mem", "video/vertex_mem", - "render/mem_max" + "video/video_mem_max", + "physics_2d/active_objects", + "physics_2d/collision_pairs", + "physics_2d/islands", + "physics_3d/active_objects", + "physics_3d/collision_pairs", + "physics_3d/islands", + }; return names[p_monitor]; @@ -133,6 +149,13 @@ float Performance::get_monitor(Monitor p_monitor) const { case RENDER_TEXTURE_MEM_USED: return VS::get_singleton()->get_render_info(VS::INFO_TEXTURE_MEM_USED); case RENDER_VERTEX_MEM_USED: return VS::get_singleton()->get_render_info(VS::INFO_VERTEX_MEM_USED); case RENDER_USAGE_VIDEO_MEM_TOTAL: return VS::get_singleton()->get_render_info(VS::INFO_USAGE_VIDEO_MEM_TOTAL); + case PHYSICS_2D_ACTIVE_OBJECTS: return Physics2DServer::get_singleton()->get_process_info(Physics2DServer::INFO_ACTIVE_OBJECTS); + case PHYSICS_2D_COLLISION_PAIRS: return Physics2DServer::get_singleton()->get_process_info(Physics2DServer::INFO_COLLISION_PAIRS); + case PHYSICS_2D_ISLAND_COUNT: return Physics2DServer::get_singleton()->get_process_info(Physics2DServer::INFO_ISLAND_COUNT); + case PHYSICS_3D_ACTIVE_OBJECTS: return PhysicsServer::get_singleton()->get_process_info(PhysicsServer::INFO_ACTIVE_OBJECTS); + case PHYSICS_3D_COLLISION_PAIRS: return PhysicsServer::get_singleton()->get_process_info(PhysicsServer::INFO_COLLISION_PAIRS); + case PHYSICS_3D_ISLAND_COUNT: return PhysicsServer::get_singleton()->get_process_info(PhysicsServer::INFO_ISLAND_COUNT); + default: {} } diff --git a/main/performance.h b/main/performance.h index db453d0156f..1879ba39eb8 100644 --- a/main/performance.h +++ b/main/performance.h @@ -69,6 +69,12 @@ public: RENDER_TEXTURE_MEM_USED, RENDER_VERTEX_MEM_USED, RENDER_USAGE_VIDEO_MEM_TOTAL, + PHYSICS_2D_ACTIVE_OBJECTS, + PHYSICS_2D_COLLISION_PAIRS, + PHYSICS_2D_ISLAND_COUNT, + PHYSICS_3D_ACTIVE_OBJECTS, + PHYSICS_3D_COLLISION_PAIRS, + PHYSICS_3D_ISLAND_COUNT, //physics MONITOR_MAX }; diff --git a/platform/android/SCsub b/platform/android/SCsub index 8e61b7d8e0e..4d6f14dbdec 100644 --- a/platform/android/SCsub +++ b/platform/android/SCsub @@ -15,7 +15,9 @@ android_files = [ 'audio_driver_jandroid.cpp', 'ifaddrs_android.cpp', 'android_native_app_glue.c', - 'java_glue.cpp' + 'java_glue.cpp', + 'java_class_wrapper.cpp' + ] #env.Depends('#core/math/vector3.h', 'vector3_psp.h') diff --git a/platform/android/java/src/com/android/godot/GodotPaymentV3.java b/platform/android/java/src/com/android/godot/GodotPaymentV3.java index a459f8e15cc..0fd102ac55b 100644 --- a/platform/android/java/src/com/android/godot/GodotPaymentV3.java +++ b/platform/android/java/src/com/android/godot/GodotPaymentV3.java @@ -64,15 +64,15 @@ public class GodotPaymentV3 extends Godot.SingletonBase { public void callbackSuccess(String ticket, String signature){ - Log.d(this.getClass().getName(), "PRE-Send callback to purchase success"); +// Log.d(this.getClass().getName(), "PRE-Send callback to purchase success"); GodotLib.callobject(purchaseCallbackId, "purchase_success", new Object[]{ticket, signature}); - Log.d(this.getClass().getName(), "POST-Send callback to purchase success"); +// Log.d(this.getClass().getName(), "POST-Send callback to purchase success"); } public void callbackSuccessProductMassConsumed(String ticket, String signature, String sku){ - Log.d(this.getClass().getName(), "PRE-Send callback to consume success"); +// Log.d(this.getClass().getName(), "PRE-Send callback to consume success"); GodotLib.calldeferred(purchaseCallbackId, "consume_success", new Object[]{ticket, signature, sku}); - Log.d(this.getClass().getName(), "POST-Send callback to consume success"); +// Log.d(this.getClass().getName(), "POST-Send callback to consume success"); } public void callbackSuccessNoUnconsumedPurchases(){ diff --git a/platform/android/java_class_wrapper.cpp b/platform/android/java_class_wrapper.cpp new file mode 100644 index 00000000000..d4cf848484e --- /dev/null +++ b/platform/android/java_class_wrapper.cpp @@ -0,0 +1,1332 @@ +#include "java_class_wrapper.h" +#include "thread_jandroid.h" + + +bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error,Variant& ret) { + + Map >::Element *M=methods.find(p_method); + if (!M) + return false; + + JNIEnv *env = ThreadAndroid::get_env(); + + MethodInfo *method=NULL; + for (List::Element *E=M->get().front();E;E=E->next()) { + + if (!p_instance && !E->get()._static) { + r_error.error=Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL; + continue; + } + + int pc = E->get().param_types.size(); + if (pc>p_argcount) { + + r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; + r_error.argument=pc; + continue; + } + if (pcget().param_types.ptr(); + bool valid=true; + + for(int i=0;iget_type()!=Variant::BOOL) + arg_expected=Variant::BOOL; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_BYTE: + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_CHAR: + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_SHORT: + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_INT: + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_LONG: + case ARG_TYPE_BYTE: + case ARG_TYPE_CHAR: + case ARG_TYPE_SHORT: + case ARG_TYPE_INT: + case ARG_TYPE_LONG: { + + if (!p_args[i]->is_num()) + arg_expected=Variant::INT; + + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_FLOAT: + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_DOUBLE: + case ARG_TYPE_FLOAT: + case ARG_TYPE_DOUBLE: { + + if (!p_args[i]->is_num()) + arg_expected=Variant::REAL; + + } break; + case ARG_TYPE_STRING: { + + if (p_args[i]->get_type()!=Variant::STRING) + arg_expected=Variant::STRING; + + } break; + case ARG_TYPE_CLASS: { + + if (p_args[i]->get_type()!=Variant::OBJECT) + arg_expected=Variant::OBJECT; + else { + + Ref ref = *p_args[i]; + if (!ref.is_null()) { + if (ref->cast_to() ) { + + Ref jo=ref; + //could be faster + jclass c = env->FindClass(E->get().param_sigs[i].operator String().utf8().get_data()); + if (!c || !env->IsInstanceOf(jo->instance,c)) { + + arg_expected=Variant::OBJECT; + } else { + //ok + } + } else { + arg_expected=Variant::OBJECT; + } + + } + } + + } break; + default: { + + if (p_args[i]->get_type()!=Variant::ARRAY) + arg_expected=Variant::ARRAY; + + } break; + + } + + if (arg_expected!=Variant::NIL) { + r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument=i; + r_error.expected=arg_expected; + valid=false; + break; + + } + + } + if (!valid) + continue; + + + method=&E->get(); + break; + + } + + if (!method) + return true; //no version convinces + + + + r_error.error=Variant::CallError::CALL_OK; + + jvalue *argv=NULL; + + if (method->param_types.size()) { + + argv=(jvalue*)alloca( sizeof(jvalue)*method->param_types.size() ); + } + + List to_free; + for(int i=0;iparam_types.size();i++) { + + switch(method->param_types[i]) { + case ARG_TYPE_VOID: { + //can't happen + argv[i].l=NULL; //I hope this works + } break; + + case ARG_TYPE_BOOLEAN: { + argv[i].z=*p_args[i]; + } break; + case ARG_TYPE_BYTE: { + argv[i].b=*p_args[i]; + } break; + case ARG_TYPE_CHAR: { + argv[i].c=*p_args[i]; + } break; + case ARG_TYPE_SHORT: { + argv[i].s=*p_args[i]; + } break; + case ARG_TYPE_INT: { + argv[i].i=*p_args[i]; + } break; + case ARG_TYPE_LONG: { + argv[i].j=*p_args[i]; + } break; + case ARG_TYPE_FLOAT: { + argv[i].f=*p_args[i]; + } break; + case ARG_TYPE_DOUBLE: { + argv[i].d=*p_args[i]; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_BOOLEAN: { + jclass bclass = env->FindClass("java/lang/Boolean"); + jmethodID ctor = env->GetMethodID(bclass, "", "(Z)V"); + jvalue val; + val.z = (bool)(*p_args[i]); + jobject obj = env->NewObjectA(bclass, ctor, &val); + argv[i].l = obj; + to_free.push_back(obj); + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_BYTE: { + jclass bclass = env->FindClass("java/lang/Byte"); + jmethodID ctor = env->GetMethodID(bclass, "", "(B)V"); + jvalue val; + val.b = (int)(*p_args[i]); + jobject obj = env->NewObjectA(bclass, ctor, &val); + argv[i].l = obj; + to_free.push_back(obj); + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_CHAR: { + jclass bclass = env->FindClass("java/lang/Character"); + jmethodID ctor = env->GetMethodID(bclass, "", "(C)V"); + jvalue val; + val.c = (int)(*p_args[i]); + jobject obj = env->NewObjectA(bclass, ctor, &val); + argv[i].l = obj; + to_free.push_back(obj); + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_SHORT: { + jclass bclass = env->FindClass("java/lang/Short"); + jmethodID ctor = env->GetMethodID(bclass, "", "(S)V"); + jvalue val; + val.s = (int)(*p_args[i]); + jobject obj = env->NewObjectA(bclass, ctor, &val); + argv[i].l = obj; + to_free.push_back(obj); + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_INT: { + jclass bclass = env->FindClass("java/lang/Integer"); + jmethodID ctor = env->GetMethodID(bclass, "", "(I)V"); + jvalue val; + val.i = (int)(*p_args[i]); + jobject obj = env->NewObjectA(bclass, ctor, &val); + argv[i].l = obj; + to_free.push_back(obj); + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_LONG: { + jclass bclass = env->FindClass("java/lang/Long"); + jmethodID ctor = env->GetMethodID(bclass, "", "(J)V"); + jvalue val; + val.j = (int64_t)(*p_args[i]); + jobject obj = env->NewObjectA(bclass, ctor, &val); + argv[i].l = obj; + to_free.push_back(obj); + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_FLOAT: { + jclass bclass = env->FindClass("java/lang/Float"); + jmethodID ctor = env->GetMethodID(bclass, "", "(F)V"); + jvalue val; + val.f = (float)(*p_args[i]); + jobject obj = env->NewObjectA(bclass, ctor, &val); + argv[i].l = obj; + to_free.push_back(obj); + } break; + case ARG_NUMBER_CLASS_BIT|ARG_TYPE_DOUBLE: { + jclass bclass = env->FindClass("java/lang/Double"); + jmethodID ctor = env->GetMethodID(bclass, "", "(D)V"); + jvalue val; + val.d = (double)(*p_args[i]); + jobject obj = env->NewObjectA(bclass, ctor, &val); + argv[i].l = obj; + to_free.push_back(obj); + } break; + case ARG_TYPE_STRING: { + String s = *p_args[i]; + jstring jStr = env->NewStringUTF(s.utf8().get_data()); + argv[i].l=jStr; + to_free.push_back(jStr); + } break; + case ARG_TYPE_CLASS: { + + Ref jo=*p_args[i]; + if (jo.is_valid()) { + + argv[i].l=jo->instance; + } else { + argv[i].l=NULL; //I hope this works + } + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: { + + Array arr = *p_args[i]; + jbooleanArray a = env->NewBooleanArray(arr.size()); + for(int j=0;jSetBooleanArrayRegion(a,j,1,&val); + } + argv[i].l=a; + to_free.push_back(a); + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_BYTE: { + + Array arr = *p_args[i]; + jbyteArray a = env->NewByteArray(arr.size()); + for(int j=0;jSetByteArrayRegion(a,j,1,&val); + } + argv[i].l=a; + to_free.push_back(a); + + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_CHAR: { + + Array arr = *p_args[i]; + jcharArray a = env->NewCharArray(arr.size()); + for(int j=0;jSetCharArrayRegion(a,j,1,&val); + } + argv[i].l=a; + to_free.push_back(a); + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_SHORT: { + + Array arr = *p_args[i]; + jshortArray a = env->NewShortArray(arr.size()); + for(int j=0;jSetShortArrayRegion(a,j,1,&val); + } + argv[i].l=a; + to_free.push_back(a); + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_INT: { + + Array arr = *p_args[i]; + jintArray a = env->NewIntArray(arr.size()); + for(int j=0;jSetIntArrayRegion(a,j,1,&val); + } + argv[i].l=a; + to_free.push_back(a); + } break; + case ARG_ARRAY_BIT|ARG_TYPE_LONG: { + Array arr = *p_args[i]; + jlongArray a = env->NewLongArray(arr.size()); + for(int j=0;jSetLongArrayRegion(a,j,1,&val); + } + argv[i].l=a; + to_free.push_back(a); + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_FLOAT: { + + Array arr = *p_args[i]; + jfloatArray a = env->NewFloatArray(arr.size()); + for(int j=0;jSetFloatArrayRegion(a,j,1,&val); + } + argv[i].l=a; + to_free.push_back(a); + + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: { + + Array arr = *p_args[i]; + jdoubleArray a = env->NewDoubleArray(arr.size()); + for(int j=0;jSetDoubleArrayRegion(a,j,1,&val); + } + argv[i].l=a; + to_free.push_back(a); + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_STRING: { + + Array arr = *p_args[i]; + jobjectArray a = env->NewObjectArray(arr.size(),env->FindClass("java/lang/String"),NULL); + for(int j=0;jNewStringUTF(s.utf8().get_data()); + env->SetObjectArrayElement(a,j,jStr); + to_free.push_back(jStr); + } + + argv[i].l=a; + to_free.push_back(a); + } break; + case ARG_ARRAY_BIT|ARG_TYPE_CLASS: { + + argv[i].l=NULL; + } break; + } + } + + r_error.error=Variant::CallError::CALL_OK; + bool success=true; + + switch(method->return_type) { + + + case ARG_TYPE_VOID: { + if (method->_static) { + env->CallStaticVoidMethodA(_class,method->method,argv); + } else { + env->CallVoidMethodA(p_instance->instance,method->method,argv); + } + ret=Variant(); + + } break; + case ARG_TYPE_BOOLEAN: { + if (method->_static) { + ret=env->CallStaticBooleanMethodA(_class,method->method,argv); + } else { + ret=env->CallBooleanMethodA(p_instance->instance,method->method,argv); + } + } break; + case ARG_TYPE_BYTE: { + if (method->_static) { + ret=env->CallStaticByteMethodA(_class,method->method,argv); + } else { + ret=env->CallByteMethodA(p_instance->instance,method->method,argv); + } + } break; + case ARG_TYPE_CHAR: { + + if (method->_static) { + ret=env->CallStaticCharMethodA(_class,method->method,argv); + } else { + ret=env->CallCharMethodA(p_instance->instance,method->method,argv); + } + } break; + case ARG_TYPE_SHORT: { + + if (method->_static) { + ret=env->CallStaticShortMethodA(_class,method->method,argv); + } else { + ret=env->CallShortMethodA(p_instance->instance,method->method,argv); + } + + } break; + case ARG_TYPE_INT: { + + if (method->_static) { + ret=env->CallStaticIntMethodA(_class,method->method,argv); + } else { + ret=env->CallIntMethodA(p_instance->instance,method->method,argv); + } + + } break; + case ARG_TYPE_LONG: { + + if (method->_static) { + ret=env->CallStaticLongMethodA(_class,method->method,argv); + } else { + ret=env->CallLongMethodA(p_instance->instance,method->method,argv); + } + + } break; + case ARG_TYPE_FLOAT: { + + if (method->_static) { + ret=env->CallStaticFloatMethodA(_class,method->method,argv); + } else { + ret=env->CallFloatMethodA(p_instance->instance,method->method,argv); + } + + } break; + case ARG_TYPE_DOUBLE: { + + if (method->_static) { + ret=env->CallStaticDoubleMethodA(_class,method->method,argv); + } else { + ret=env->CallDoubleMethodA(p_instance->instance,method->method,argv); + } + + } break; + default: { + + jobject obj; + if (method->_static) { + obj=env->CallStaticObjectMethodA(_class,method->method,argv); + } else { + obj=env->CallObjectMethodA(p_instance->instance,method->method,argv); + } + + if (!obj) { + ret=Variant(); + } else { + + if (!_convert_object_to_variant(env, obj, ret,method->return_type)) { + ret=Variant(); + r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; + success=false; + } + env->DeleteLocalRef(obj); + } + + } break; + + } + + for(List::Element *E=to_free.front();E;E=E->next()) { + env->DeleteLocalRef(E->get()); + } + + return success; +} + +Variant JavaClass::call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error) { + + Variant ret; + bool found = _call_method(NULL,p_method,p_args,p_argcount,r_error,ret); + if (found) { + return ret; + } + + return Reference::call(p_method,p_args,p_argcount,r_error); +} + +JavaClass::JavaClass() { + + +} + +///////////////////// + +Variant JavaObject::call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error){ + + + return Variant(); +} + +JavaObject::JavaObject(const Ref& p_base,jobject *p_instance) { + + +} + +JavaObject::~JavaObject(){ + + +} + + +//////////////////// + +void JavaClassWrapper::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("wrap:JavaClass","name"),&JavaClassWrapper::wrap); +} + + +bool JavaClassWrapper::_get_type_sig(JNIEnv *env,jobject obj,uint32_t& sig,String&strsig) { + + jstring name2 = (jstring)env->CallObjectMethod(obj, Class_getName); + String str_type = env->GetStringUTFChars( name2, NULL ); + print_line("name: "+str_type); + env->DeleteLocalRef(name2); + uint32_t t=0; + + if (str_type.begins_with("[")) { + + t=JavaClass::ARG_ARRAY_BIT; + strsig="["; + str_type=str_type.substr(1,str_type.length()-1); + if (str_type.begins_with("[")) { + print_line("Nested arrays not supported for type: "+str_type); + return false; + } + if (str_type.begins_with("L")) { + str_type=str_type.substr(1,str_type.length()-2); //ok it's a class + } + } + + if (str_type=="void" || str_type=="V") { + t|=JavaClass::ARG_TYPE_VOID; + strsig+="V"; + } else if (str_type=="boolean" || str_type=="Z") { + t|=JavaClass::ARG_TYPE_BOOLEAN; + strsig+="Z"; + } else if (str_type=="byte" || str_type=="B") { + t|=JavaClass::ARG_TYPE_BYTE; + strsig+="B"; + } else if (str_type=="char" || str_type=="C") { + t|=JavaClass::ARG_TYPE_CHAR; + strsig+="C"; + } else if (str_type=="short" || str_type=="S") { + t|=JavaClass::ARG_TYPE_SHORT; + strsig+="S"; + } else if (str_type=="int" || str_type=="I") { + t|=JavaClass::ARG_TYPE_INT; + strsig+="I"; + } else if (str_type=="long" || str_type=="J") { + t|=JavaClass::ARG_TYPE_LONG; + strsig+="J"; + } else if (str_type=="float" || str_type=="F") { + t|=JavaClass::ARG_TYPE_FLOAT; + strsig+="F"; + } else if (str_type=="double" || str_type=="D") { + t|=JavaClass::ARG_TYPE_DOUBLE; + strsig+="D"; + } else if (str_type=="java.lang.String") { + t|=JavaClass::ARG_TYPE_STRING; + strsig+="Ljava/lang/String;"; + } else if (str_type=="java.lang.Boolean") { + t|=JavaClass::ARG_TYPE_BOOLEAN|JavaClass::ARG_NUMBER_CLASS_BIT; + strsig+="Ljava/lang/Boolean;"; + } else if (str_type=="java.lang.Byte") { + t|=JavaClass::ARG_TYPE_BYTE|JavaClass::ARG_NUMBER_CLASS_BIT; + strsig+="Ljava/lang/Byte;"; + } else if (str_type=="java.lang.Character") { + t|=JavaClass::ARG_TYPE_CHAR|JavaClass::ARG_NUMBER_CLASS_BIT; + strsig+="Ljava/lang/Character;"; + } else if (str_type=="java.lang.Short") { + t|=JavaClass::ARG_TYPE_SHORT|JavaClass::ARG_NUMBER_CLASS_BIT; + strsig+="Ljava/lang/Short;"; + } else if (str_type=="java.lang.Integer") { + t|=JavaClass::ARG_TYPE_INT|JavaClass::ARG_NUMBER_CLASS_BIT; + strsig+="Ljava/lang/Integer;"; + } else if (str_type=="java.lang.Long") { + t|=JavaClass::ARG_TYPE_LONG|JavaClass::ARG_NUMBER_CLASS_BIT; + strsig+="Ljava/lang/Long;"; + } else if (str_type=="java.lang.Float") { + t|=JavaClass::ARG_TYPE_FLOAT|JavaClass::ARG_NUMBER_CLASS_BIT; + strsig+="Ljava/lang/Float;"; + } else if (str_type=="java.lang.Double") { + t|=JavaClass::ARG_TYPE_DOUBLE|JavaClass::ARG_NUMBER_CLASS_BIT; + strsig+="Ljava/lang/Double;"; + } else { + //a class likely + strsig+="L"+str_type.replace(".","/")+";"; + t|=JavaClass::ARG_TYPE_CLASS; + } + + sig=t; + + + return true; + +} + +bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& var,uint32_t p_sig) { + + if (!obj) { + var=Variant(); //seems null is just null... + return true; + } + + + switch(p_sig) { + + case ARG_TYPE_VOID: { + + return Variant(); + } break; + case ARG_TYPE_BOOLEAN|ARG_NUMBER_CLASS_BIT: { + + var = env->CallBooleanMethod(obj, JavaClassWrapper::singleton->Boolean_booleanValue); + return true; + } break; + case ARG_TYPE_BYTE|ARG_NUMBER_CLASS_BIT: { + + var = env->CallByteMethod(obj, JavaClassWrapper::singleton->Byte_byteValue); + return true; + + } break; + case ARG_TYPE_CHAR|ARG_NUMBER_CLASS_BIT: { + + var = env->CallCharMethod(obj, JavaClassWrapper::singleton->Character_characterValue); + return true; + + } break; + case ARG_TYPE_SHORT|ARG_NUMBER_CLASS_BIT: { + + var = env->CallShortMethod(obj, JavaClassWrapper::singleton->Short_shortValue); + return true; + + } break; + case ARG_TYPE_INT|ARG_NUMBER_CLASS_BIT: { + + var = env->CallIntMethod(obj, JavaClassWrapper::singleton->Integer_integerValue); + return true; + + } break; + case ARG_TYPE_LONG|ARG_NUMBER_CLASS_BIT: { + + var = env->CallLongMethod(obj, JavaClassWrapper::singleton->Long_longValue); + return true; + + } break; + case ARG_TYPE_FLOAT|ARG_NUMBER_CLASS_BIT: { + + var = env->CallFloatMethod(obj, JavaClassWrapper::singleton->Float_floatValue); + return true; + + } break; + case ARG_TYPE_DOUBLE|ARG_NUMBER_CLASS_BIT: { + + var = env->CallDoubleMethod(obj, JavaClassWrapper::singleton->Double_doubleValue); + return true; + } break; + case ARG_TYPE_STRING: { + + var = String::utf8(env->GetStringUTFChars( (jstring)obj, NULL )); + return true; + } break; + case ARG_TYPE_CLASS: { + + return false; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_VOID: { + + var = Array(); // ? + return true; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetBooleanArrayRegion((jbooleanArray)arr,0,1,&val); + ret.push_back(val); + } + + var=ret; + return true; + + } break; + case ARG_ARRAY_BIT|ARG_TYPE_BYTE: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetByteArrayRegion((jbyteArray)arr,0,1,&val); + ret.push_back(val); + } + + var=ret; + return true; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_CHAR: { + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetCharArrayRegion((jcharArray)arr,0,1,&val); + ret.push_back(val); + } + + var=ret; + return true; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_SHORT: { + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetShortArrayRegion((jshortArray)arr,0,1,&val); + ret.push_back(val); + } + + var=ret; + return true; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_INT: { + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetIntArrayRegion((jintArray)arr,0,1,&val); + ret.push_back(val); + } + + var=ret; + return true; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_LONG: { + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetLongArrayRegion((jlongArray)arr,0,1,&val); + ret.push_back(val); + } + + var=ret; + return true; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_FLOAT: { + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetFloatArrayRegion((jfloatArray)arr,0,1,&val); + ret.push_back(val); + } + + var=ret; + return true; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: { + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetDoubleArrayRegion((jdoubleArray)arr,0,1,&val); + ret.push_back(val); + } + + var=ret; + return true; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + bool val = env->CallBooleanMethod(o, JavaClassWrapper::singleton->Boolean_booleanValue); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + + } break; + case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_BYTE: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + int val = env->CallByteMethod(o, JavaClassWrapper::singleton->Byte_byteValue); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_CHAR: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + int val = env->CallCharMethod(o, JavaClassWrapper::singleton->Character_characterValue); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_SHORT: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + int val = env->CallShortMethod(o, JavaClassWrapper::singleton->Short_shortValue); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_INT: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + int val = env->CallIntMethod(o, JavaClassWrapper::singleton->Integer_integerValue); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_LONG: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + int64_t val = env->CallLongMethod(o, JavaClassWrapper::singleton->Long_longValue); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_FLOAT: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + float val = env->CallFloatMethod(o, JavaClassWrapper::singleton->Float_floatValue); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + } break; + case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: { + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + double val = env->CallDoubleMethod(o, JavaClassWrapper::singleton->Double_doubleValue); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + } break; + + case ARG_ARRAY_BIT|ARG_TYPE_STRING: { + + Array ret; + jobjectArray arr = (jobjectArray)obj; + + int count = env->GetArrayLength(arr); + + for (int i=0; iGetObjectArrayElement(arr, i); + if (!o) + ret.push_back(Variant()); + else { + String val = String::utf8(env->GetStringUTFChars( (jstring)o, NULL )); + ret.push_back(val); + + } + env->DeleteLocalRef(o); + } + + var=ret; + return true; + } break; + case ARG_ARRAY_BIT|ARG_TYPE_CLASS: { + + } break; + } + + return false; + +} + + +Ref JavaClassWrapper::wrap(const String& p_class) { + + if (class_cache.has(p_class)) + return class_cache[p_class]; + + + JNIEnv *env = ThreadAndroid::get_env(); + + jclass bclass = env->FindClass(p_class.utf8().get_data()); + ERR_FAIL_COND_V(!bclass,Ref()); + + //jmethodID getDeclaredMethods = env->GetMethodID(bclass,"getDeclaredMethods", "()[Ljava/lang/reflect/Method;"); + + //ERR_FAIL_COND_V(!getDeclaredMethods,Ref()); + + jobjectArray methods = (jobjectArray)env->CallObjectMethod(bclass, getDeclaredMethods); + + ERR_FAIL_COND_V(!methods,Ref()); + + + Ref java_class = memnew( JavaClass ); + + int count = env->GetArrayLength(methods); + + for (int i=0; iGetObjectArrayElement(methods, i); + ERR_CONTINUE(!obj); + + + jstring name = (jstring)env->CallObjectMethod(obj, getName); + String str_method = env->GetStringUTFChars( name, NULL ); + env->DeleteLocalRef(name); + + Vector params; + + jint mods = env->CallIntMethod(obj,getModifiers); + + if (!(mods&0x0001)) { + env->DeleteLocalRef(obj); + continue; //not public bye + } + + + + jobjectArray param_types = (jobjectArray)env->CallObjectMethod(obj, getParameterTypes); + int count2=env->GetArrayLength(param_types); + + if (!java_class->methods.has(str_method)) { + java_class->methods[str_method]=List(); + } + + JavaClass::MethodInfo mi; + mi._static = (mods&0x8)!=0; + bool valid=true; + String signature="("; + + for(int j=0;jGetObjectArrayElement(param_types, j); + String strsig; + uint32_t sig=0; + if (!_get_type_sig(env,obj2,sig,strsig)) { + valid=false; + env->DeleteLocalRef(obj2); + break; + } + signature+=strsig; + mi.param_types.push_back(sig); + mi.param_sigs.push_back(strsig); + env->DeleteLocalRef(obj2); + + } + + if (!valid) { + print_line("Method Can't be bound (unsupported arguments): "+p_class+"::"+str_method); + env->DeleteLocalRef(obj); + env->DeleteLocalRef(param_types); + continue; + } + + signature+=")"; + + jobject return_type = (jobject)env->CallObjectMethod(obj, getReturnType); + + + String strsig; + uint32_t sig=0; + if (!_get_type_sig(env,return_type,sig,strsig)) { + print_line("Method Can't be bound (unsupported return type): "+p_class+"::"+str_method); + env->DeleteLocalRef(obj); + env->DeleteLocalRef(param_types); + env->DeleteLocalRef(return_type); + continue; + } + + signature+=strsig; + mi.return_type=sig; + + print_line("METHOD: "+str_method+" SIG: "+signature+" static: "+itos(mi._static)); + + bool discard=false; + + for(List::Element *E=java_class->methods[str_method].front();E;E=E->next()) { + + float new_likeliness=0; + float existing_likeliness=0; + + if (E->get().param_types.size()!=mi.param_types.size()) + continue; + bool valid=true; + for(int j=0;jget().param_types.size();j++) { + + Variant::Type _new; + float new_l; + Variant::Type existing; + float existing_l; + JavaClass::_convert_to_variant_type(E->get().param_types[j],existing,existing_l); + JavaClass::_convert_to_variant_type(mi.param_types[j],_new,new_l); + if (_new!=existing) { + valid=false; + break; + } + new_likeliness+=new_l; + existing_likeliness=existing_l; + + } + + if (!valid) + continue; + + if (new_likeliness>existing_likeliness) { + java_class->methods[str_method].erase(E); + print_line("replace old"); + break; + } else { + discard=true; + print_line("old is better"); + } + + + } + + if (!discard) { + if (mi._static) + mi.method = env->GetStaticMethodID(bclass, str_method.utf8().get_data(), signature.utf8().get_data()); + else + mi.method = env->GetMethodID(bclass, str_method.utf8().get_data(), signature.utf8().get_data()); + + ERR_CONTINUE(!mi.method); + + java_class->methods[str_method].push_back(mi); + } + + env->DeleteLocalRef(obj); + env->DeleteLocalRef(param_types); + env->DeleteLocalRef(return_type); + + + + + //args[i] = _jobject_to_variant(env, obj); +// print_line("\targ"+itos(i)+": "+Variant::get_type_name(args[i].get_type())); + + }; + + env->DeleteLocalRef(methods); + + jobjectArray fields = (jobjectArray)env->CallObjectMethod(bclass, getFields); + + count = env->GetArrayLength(fields); + + for (int i=0; iGetObjectArrayElement(fields, i); + ERR_CONTINUE(!obj); + + jstring name = (jstring)env->CallObjectMethod(obj, Field_getName); + String str_field = env->GetStringUTFChars( name, NULL ); + env->DeleteLocalRef(name); + print_line("FIELD: "+str_field); + int mods = env->CallIntMethod(obj,Field_getModifiers); + if ((mods&0x8) && (mods&0x10) && (mods&0x1)) { //static final public! + + jobject objc = env->CallObjectMethod(obj, Field_get,NULL); + if (objc) { + + + uint32_t sig; + String strsig; + jclass cl = env->GetObjectClass(objc); + if (JavaClassWrapper::_get_type_sig(env,cl,sig,strsig)) { + + if ((sig&JavaClass::ARG_TYPE_MASK)<=JavaClass::ARG_TYPE_STRING) { + + Variant value; + if (JavaClass::_convert_object_to_variant(env,objc,value,sig)) { + + java_class->constant_map[str_field]=value; + } + } + } + + env->DeleteLocalRef(cl); + } + + + env->DeleteLocalRef(objc); + + } + env->DeleteLocalRef(obj); + } + + env->DeleteLocalRef(fields); + + + return Ref(); +} + +JavaClassWrapper *JavaClassWrapper::singleton=NULL; + +JavaClassWrapper::JavaClassWrapper(jobject p_activity) { + + singleton=this; + + JNIEnv *env = ThreadAndroid::get_env(); + + jclass activityClass = env->FindClass("com/android/godot/Godot"); + jmethodID getClassLoader = env->GetMethodID(activityClass,"getClassLoader", "()Ljava/lang/ClassLoader;"); + classLoader = env->CallObjectMethod(p_activity, getClassLoader); + classLoader=(jclass)env->NewGlobalRef(classLoader); + jclass classLoaderClass = env->FindClass("java/lang/ClassLoader"); + findClass = env->GetMethodID(classLoaderClass, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); + + jclass bclass = env->FindClass("java/lang/Class"); + getDeclaredMethods = env->GetMethodID(bclass,"getDeclaredMethods", "()[Ljava/lang/reflect/Method;"); + getFields = env->GetMethodID(bclass,"getFields", "()[Ljava/lang/reflect/Field;"); + Class_getName = env->GetMethodID(bclass,"getName", "()Ljava/lang/String;"); + // + bclass = env->FindClass("java/lang/reflect/Method"); + getParameterTypes = env->GetMethodID(bclass,"getParameterTypes", "()[Ljava/lang/Class;"); + getReturnType = env->GetMethodID(bclass,"getReturnType", "()Ljava/lang/Class;"); + getName = env->GetMethodID(bclass,"getName", "()Ljava/lang/String;"); + getModifiers = env->GetMethodID(bclass,"getModifiers", "()I"); + /// + bclass = env->FindClass("java/lang/reflect/Field"); + Field_getName = env->GetMethodID(bclass,"getName", "()Ljava/lang/String;"); + Field_getModifiers = env->GetMethodID(bclass,"getModifiers", "()I"); + Field_get = env->GetMethodID(bclass,"get", "(Ljava/lang/Object;)Ljava/lang/Object;"); + // each + bclass = env->FindClass("java/lang/Boolean"); + Boolean_booleanValue = env->GetMethodID(bclass, "booleanValue", "()Z"); + + bclass = env->FindClass("java/lang/Byte"); + Byte_byteValue = env->GetMethodID(bclass, "byteValue", "()B"); + + bclass = env->FindClass("java/lang/Character"); + Character_characterValue = env->GetMethodID(bclass, "charValue", "()C"); + + bclass = env->FindClass("java/lang/Short"); + Short_shortValue = env->GetMethodID(bclass, "shortValue", "()S"); + + bclass = env->FindClass("java/lang/Integer"); + Integer_integerValue = env->GetMethodID(bclass, "intValue", "()I"); + + bclass = env->FindClass("java/lang/Long"); + Long_longValue = env->GetMethodID(bclass, "longValue", "()J"); + + bclass = env->FindClass("java/lang/Float"); + Float_floatValue = env->GetMethodID(bclass, "floatValue", "()F"); + + bclass = env->FindClass("java/lang/Double"); + Double_doubleValue = env->GetMethodID(bclass, "doubleValue", "()D"); + + +} diff --git a/platform/android/java_class_wrapper.h b/platform/android/java_class_wrapper.h new file mode 100644 index 00000000000..d5d8bd5be8c --- /dev/null +++ b/platform/android/java_class_wrapper.h @@ -0,0 +1,168 @@ +#ifndef JAVA_CLASS_WRAPPER_H +#define JAVA_CLASS_WRAPPER_H + +#include "reference.h" +#include +#include + +class JavaObject; + +class JavaClass : public Reference { + + OBJ_TYPE(JavaClass,Reference); + + enum ArgumentType { + + ARG_TYPE_VOID, + ARG_TYPE_BOOLEAN, + ARG_TYPE_BYTE, + ARG_TYPE_CHAR, + ARG_TYPE_SHORT, + ARG_TYPE_INT, + ARG_TYPE_LONG, + ARG_TYPE_FLOAT, + ARG_TYPE_DOUBLE, + ARG_TYPE_STRING, //special case + ARG_TYPE_CLASS, + ARG_ARRAY_BIT=1<<16, + ARG_NUMBER_CLASS_BIT=1<<17, + ARG_TYPE_MASK=(1<<16)-1 + }; + + + Map constant_map; + + struct MethodInfo { + + bool _static; + Vector param_types; + Vector param_sigs; + uint32_t return_type; + jmethodID method; + + }; + + _FORCE_INLINE_ static void _convert_to_variant_type(int p_sig, Variant::Type& r_type, float& likelyhood) { + + likelyhood=1.0; + r_type=Variant::NIL; + + switch(p_sig) { + + case ARG_TYPE_VOID: r_type=Variant::NIL; break; + case ARG_TYPE_BOOLEAN|ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_BOOLEAN: r_type=Variant::BOOL; break; + case ARG_TYPE_BYTE|ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_BYTE: r_type=Variant::INT; likelyhood=0.1; break; + case ARG_TYPE_CHAR|ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_CHAR: r_type=Variant::INT; likelyhood=0.2; break; + case ARG_TYPE_SHORT|ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_SHORT: r_type=Variant::INT; likelyhood=0.3; break; + case ARG_TYPE_INT|ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_INT: r_type=Variant::INT; likelyhood=1.0; break; + case ARG_TYPE_LONG|ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_LONG: r_type=Variant::INT; likelyhood=0.5; break; + case ARG_TYPE_FLOAT|ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_FLOAT: r_type=Variant::REAL; likelyhood=1.0; break; + case ARG_TYPE_DOUBLE|ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_DOUBLE: r_type=Variant::REAL; likelyhood=0.5; break; + case ARG_TYPE_STRING: r_type=Variant::STRING; break; + case ARG_TYPE_CLASS: r_type=Variant::OBJECT; break; + case ARG_ARRAY_BIT|ARG_TYPE_VOID: r_type=Variant::NIL; break; + case ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: r_type=Variant::ARRAY; break; + case ARG_ARRAY_BIT|ARG_TYPE_BYTE: r_type=Variant::RAW_ARRAY; likelyhood=1.0; break; + case ARG_ARRAY_BIT|ARG_TYPE_CHAR: r_type=Variant::RAW_ARRAY; likelyhood=0.5; break; + case ARG_ARRAY_BIT|ARG_TYPE_SHORT: r_type=Variant::INT_ARRAY; likelyhood=0.3; break; + case ARG_ARRAY_BIT|ARG_TYPE_INT: r_type=Variant::INT_ARRAY; likelyhood=1.0; break; + case ARG_ARRAY_BIT|ARG_TYPE_LONG: r_type=Variant::INT_ARRAY; likelyhood=0.5; break; + case ARG_ARRAY_BIT|ARG_TYPE_FLOAT: r_type=Variant::REAL_ARRAY; likelyhood=1.0; break; + case ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: r_type=Variant::REAL_ARRAY; likelyhood=0.5; break; + case ARG_ARRAY_BIT|ARG_TYPE_STRING: r_type=Variant::STRING_ARRAY; break; + case ARG_ARRAY_BIT|ARG_TYPE_CLASS: r_type=Variant::ARRAY; break; + } + } + + _FORCE_INLINE_ static bool _convert_object_to_variant(JNIEnv * env, jobject obj, Variant& var,uint32_t p_sig); + + + + bool _call_method(JavaObject* p_instance,const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error,Variant& ret); + +friend class JavaClassWrapper; + Map > methods; + jclass _class; + +public: + + virtual Variant call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error); + + JavaClass(); + +}; + + +class JavaObject : public Reference { + + OBJ_TYPE(JavaObject,Reference); + + Ref base_class; +friend class JavaClass; + + jobject instance; + +public: + + virtual Variant call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error); + + JavaObject(const Ref& p_base,jobject *p_instance); + ~JavaObject(); + +}; + + +class JavaClassWrapper : public Object { + + OBJ_TYPE(JavaClassWrapper,Object); + + + Map > class_cache; +friend class JavaClass; + jclass activityClass; + jmethodID findClass; + jmethodID getDeclaredMethods; + jmethodID getFields; + jmethodID getParameterTypes; + jmethodID getReturnType; + jmethodID getModifiers; + jmethodID getName; + jmethodID Class_getName; + jmethodID Field_getName; + jmethodID Field_getModifiers; + jmethodID Field_get; + jmethodID Boolean_booleanValue; + jmethodID Byte_byteValue; + jmethodID Character_characterValue; + jmethodID Short_shortValue; + jmethodID Integer_integerValue; + jmethodID Long_longValue; + jmethodID Float_floatValue; + jmethodID Double_doubleValue; + jobject classLoader; + + bool _get_type_sig(JNIEnv *env, jobject obj, uint32_t& sig, String&strsig); + + static JavaClassWrapper *singleton; + +protected: + + static void _bind_methods(); +public: + + static JavaClassWrapper *get_singleton() { return singleton; } + + Ref wrap(const String& p_class); + + JavaClassWrapper(jobject p_activity=NULL); +}; + +#endif // JAVA_CLASS_WRAPPER_H diff --git a/platform/android/java_glue.cpp b/platform/android/java_glue.cpp index ae8174c35a2..fdc6f1207d4 100644 --- a/platform/android/java_glue.cpp +++ b/platform/android/java_glue.cpp @@ -38,7 +38,10 @@ #include "globals.h" #include "thread_jandroid.h" #include "core/os/keyboard.h" +#include "java_class_wrapper.h" + +static JavaClassWrapper *java_class_wrapper=NULL; static OS_Android *os_android=NULL; @@ -934,6 +937,8 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_step(JNIEnv * env, jobjec // ugly hack to initialize the rest of the engine // because of the way android forces you to do everything with threads + java_class_wrapper = memnew( JavaClassWrapper(_godot_instance )); + Globals::get_singleton()->add_singleton(Globals::Singleton("JavaClassWrapper",java_class_wrapper)); _initialize_java_modules(); Main::setup2(); diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm index 9ba95ff0c56..9877e09ade7 100644 --- a/platform/iphone/app_delegate.mm +++ b/platform/iphone/app_delegate.mm @@ -257,18 +257,21 @@ static int frame_count = 0; - (void)applicationDidEnterBackground:(UIApplication *)application { printf("********************* did enter background\n"); + OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); [view_controller.view stopAnimation]; } - (void)applicationWillEnterForeground:(UIApplication *)application { printf("********************* did enter foreground\n"); + //OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); [view_controller.view startAnimation]; } - (void) applicationWillResignActive:(UIApplication *)application { printf("********************* will resign active\n"); + //OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); [view_controller.view stopAnimation]; // FIXME: pause seems to be recommended elsewhere } @@ -279,6 +282,7 @@ static int frame_count = 0; printf("********************* mobile app tracker found\n"); [MobileAppTracker measureSession]; #endif + OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); [view_controller.view startAnimation]; // FIXME: resume seems to be recommended elsewhere } diff --git a/platform/iphone/in_app_store.h b/platform/iphone/in_app_store.h index dba1a1a5a12..656d126eada 100644 --- a/platform/iphone/in_app_store.h +++ b/platform/iphone/in_app_store.h @@ -49,6 +49,8 @@ public: int get_pending_event_count(); Variant pop_pending_event(); + void finish_transaction(String product_id); + void set_auto_finish_transaction(bool b); void _post_event(Variant p_event); void _record_purchase(String product_id); diff --git a/platform/iphone/in_app_store.mm b/platform/iphone/in_app_store.mm index 9b932d147b8..f3640c30766 100644 --- a/platform/iphone/in_app_store.mm +++ b/platform/iphone/in_app_store.mm @@ -32,8 +32,12 @@ extern "C" { #import +#import }; +bool auto_finish_transactions = true; +NSMutableDictionary* pending_transactions = [NSMutableDictionary dictionary]; + @interface SKProduct (LocalizedPrice) @property (nonatomic, readonly) NSString *localizedPrice; @end @@ -63,6 +67,8 @@ void InAppStore::_bind_methods() { ObjectTypeDB::bind_method(_MD("get_pending_event_count"),&InAppStore::get_pending_event_count); ObjectTypeDB::bind_method(_MD("pop_pending_event"),&InAppStore::pop_pending_event); + ObjectTypeDB::bind_method(_MD("finish_transaction"),&InAppStore::finish_transaction); + ObjectTypeDB::bind_method(_MD("set_auto_finish_transaction"),&InAppStore::set_auto_finish_transaction); }; @interface ProductsDelegate : NSObject { @@ -162,11 +168,13 @@ Error InAppStore::request_product_info(Variant p_params) { case SKPaymentTransactionStatePurchased: { printf("status purchased!\n"); String pid = String::utf8([transaction.payment.productIdentifier UTF8String]); + String transactionId = String::utf8([transaction.transactionIdentifier UTF8String]); InAppStore::get_singleton()->_record_purchase(pid); Dictionary ret; ret["type"] = "purchase"; ret["result"] = "ok"; ret["product_id"] = pid; + ret["transaction_id"] = transactionId; NSData* receipt = nil; int sdk_version = 6; @@ -207,7 +215,13 @@ Error InAppStore::request_product_info(Variant p_params) { ret["receipt"] = receipt_ret; InAppStore::get_singleton()->_post_event(ret); - [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; + + if (auto_finish_transactions){ + [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; + } + else{ + [pending_transactions setObject:transaction forKey:transaction.payment.productIdentifier]; + } } break; case SKPaymentTransactionStateFailed: { printf("status transaction failed!\n"); @@ -290,11 +304,26 @@ InAppStore* InAppStore::get_singleton() { InAppStore::InAppStore() { ERR_FAIL_COND(instance != NULL); instance = this; + auto_finish_transactions = false; TransObserver* observer = [[TransObserver alloc] init]; [[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; + //pending_transactions = [NSMutableDictionary dictionary]; }; +void InAppStore::finish_transaction(String product_id){ + NSString* prod_id = [NSString stringWithCString:product_id.utf8().get_data() encoding:NSUTF8StringEncoding]; + + if ([pending_transactions objectForKey:prod_id]){ + [[SKPaymentQueue defaultQueue] finishTransaction:[pending_transactions objectForKey:prod_id]]; + [pending_transactions removeObjectForKey:prod_id]; + } +}; + +void InAppStore::set_auto_finish_transaction(bool b){ + auto_finish_transactions = b; +} + InAppStore::~InAppStore() { }; diff --git a/platform/windows/detect.py b/platform/windows/detect.py index 0e21540e13c..b866dd2ec3b 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -51,7 +51,7 @@ def get_flags(): return [ ('freetype','builtin'), #use builtin freetype - ('openssl','builtin'), #use builtin openssl + ('openssl','builtin'), #use builtin openssl ] @@ -166,6 +166,7 @@ def configure(env): env.Append(CCFLAGS=['-O3','-ffast-math','-fomit-frame-pointer','-msse2']) env['OBJSUFFIX'] = "_opt"+env['OBJSUFFIX'] env['LIBSUFFIX'] = "_opt"+env['LIBSUFFIX'] + env.Append(LINKFLAGS=['-Wl,--subsystem,windows']) elif (env["target"]=="release_debug"): env.Append(CCFLAGS=['-O2','-DDEBUG_ENABLED']) diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 778609950e8..5e57827c68e 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -206,6 +206,54 @@ bool OS_Windows::can_draw() const { return !minimized; }; +#define MI_WP_SIGNATURE 0xFF515700 +#define SIGNATURE_MASK 0xFFFFFF00 +#define IsPenEvent(dw) (((dw) & SIGNATURE_MASK) == MI_WP_SIGNATURE) + + +void OS_Windows::_touch_event(int idx, UINT uMsg, WPARAM wParam, LPARAM lParam) { + + InputEvent event; + event.type = InputEvent::SCREEN_TOUCH; + event.ID=++last_id; + event.screen_touch.index = idx; + + switch (uMsg) { + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: { + + event.screen_touch.pressed = true; + } break; + + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: { + event.screen_touch.pressed = false; + } break; + }; + + event.screen_touch.x=GET_X_LPARAM(lParam); + event.screen_touch.y=GET_Y_LPARAM(lParam); + + if (main_loop) { + input->parse_input_event(event); + } +}; + +void OS_Windows::_drag_event(int idx,UINT uMsg, WPARAM wParam, LPARAM lParam) { + + InputEvent event; + event.type = InputEvent::SCREEN_DRAG; + event.ID=++last_id; + event.screen_drag.index = idx; + + event.screen_drag.x=GET_X_LPARAM(lParam); + event.screen_drag.y=GET_Y_LPARAM(lParam); + + if (main_loop) + input->parse_input_event(event); +}; LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -270,28 +318,41 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { } case WM_MOUSELEAVE: { - old_invalid=true; - outside=true; + old_invalid=true; + outside=true; } break; case WM_MOUSEMOVE: { - if (outside) { + if (outside) { - CursorShape c=cursor_shape; - cursor_shape=CURSOR_MAX; - set_cursor_shape(c); - outside=false; + CursorShape c=cursor_shape; + cursor_shape=CURSOR_MAX; + set_cursor_shape(c); + outside=false; + + //Once-Off notification, must call again.... + TRACKMOUSEEVENT tme; + tme.cbSize=sizeof(TRACKMOUSEEVENT); + tme.dwFlags=TME_LEAVE; + tme.hwndTrack=hWnd; + tme.dwHoverTime=HOVER_DEFAULT; + TrackMouseEvent(&tme); + + } + + LPARAM extra = GetMessageExtraInfo(); + if (IsPenEvent(extra)) { + + int idx = extra & 0x7f; + _drag_event(idx, uMsg, wParam, lParam); + if (idx != 0) { + return 0; + }; + // fallthrough for mouse event + }; - //Once-Off notification, must call again.... - TRACKMOUSEEVENT tme; - tme.cbSize=sizeof(TRACKMOUSEEVENT); - tme.dwFlags=TME_LEAVE; - tme.hwndTrack=hWnd; - tme.dwHoverTime=HOVER_DEFAULT; - TrackMouseEvent(&tme); - } InputEvent event; event.type=InputEvent::MOUSE_MOTION; event.ID=++last_id; @@ -360,6 +421,17 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { /*case WM_XBUTTONDOWN: case WM_XBUTTONUP: */{ + LPARAM extra = GetMessageExtraInfo(); + if (IsPenEvent(extra)) { + + int idx = extra & 0x7f; + _touch_event(idx, uMsg, wParam, lParam); + if (idx != 0) { + return 0; + }; + // fallthrough for mouse event + }; + InputEvent event; event.type=InputEvent::MOUSE_BUTTON; event.ID=++last_id; diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index c9eb475e1a1..1a41b9d77da 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -160,6 +160,10 @@ class OS_Windows : public OS { void _post_dpad(DWORD p_dpad, int p_device, bool p_pressed); + void _drag_event(int idx,UINT uMsg, WPARAM wParam, LPARAM lParam); + void _touch_event(int idx, UINT uMsg, WPARAM wParam, LPARAM lParam); + + // functions used by main to initialize/deintialize the OS protected: virtual int get_video_driver_count() const; diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index ecd147afded..47d78399b67 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -803,7 +803,7 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) { //print_line("margin: "+rtos(margin)); do { - //fill exclude list.. + //motion recover for(int i=0;ibody_set_layer_mask(get_rid(),p_mask); +} + +uint32_t PhysicsBody::get_layer_mask() const { + + return layer_mask; +} + +void PhysicsBody::_bind_methods() { + ObjectTypeDB::bind_method(_MD("set_layer_mask","mask"),&PhysicsBody::set_layer_mask); + ObjectTypeDB::bind_method(_MD("get_layer_mask"),&PhysicsBody::get_layer_mask); + ADD_PROPERTY(PropertyInfo(Variant::INT,"layers",PROPERTY_HINT_ALL_FLAGS),_SCS("set_layer_mask"),_SCS("get_layer_mask")); +} + + PhysicsBody::PhysicsBody(PhysicsServer::BodyMode p_mode) : CollisionObject( PhysicsServer::get_singleton()->body_create(p_mode), false) { + layer_mask=1; + +} +void StaticBody::set_friction(real_t p_friction){ + + ERR_FAIL_COND(p_friction<0 || p_friction>1); + + friction=p_friction; + PhysicsServer::get_singleton()->body_set_param(get_rid(),PhysicsServer::BODY_PARAM_FRICTION,friction); + +} +real_t StaticBody::get_friction() const{ + + return friction; +} + +void StaticBody::set_bounce(real_t p_bounce){ + + ERR_FAIL_COND(p_bounce<0 || p_bounce>1); + + bounce=p_bounce; + PhysicsServer::get_singleton()->body_set_param(get_rid(),PhysicsServer::BODY_PARAM_BOUNCE,bounce); + +} +real_t StaticBody::get_bounce() const{ + + return bounce; } void StaticBody::set_constant_linear_velocity(const Vector3& p_vel) { @@ -86,131 +132,36 @@ Vector3 StaticBody::get_constant_angular_velocity() const { } -void StaticBody::_state_notify(Object *p_object) { - - if (!pre_xform) - return; - - PhysicsDirectBodyState *p2d = (PhysicsDirectBodyState*)p_object; - setting=true; - - Transform new_xform = p2d->get_transform(); - *pre_xform=new_xform; - set_ignore_transform_notification(true); - set_global_transform(new_xform); - set_ignore_transform_notification(false); - - setting=false; - - -} - -void StaticBody::_update_xform() { - - if (!pre_xform || !pending) - return; - - setting=true; - - - Transform new_xform = get_global_transform(); //obtain the new one - - //set_block_transform_notify(true); - set_ignore_transform_notification(true); - PhysicsServer::get_singleton()->body_set_state(get_rid(),PhysicsServer::BODY_STATE_TRANSFORM,*pre_xform); //then simulate motion! - set_global_transform(*pre_xform); //but restore state to previous one in both visual and physics - set_ignore_transform_notification(false); - - PhysicsServer::get_singleton()->body_static_simulate_motion(get_rid(),new_xform); //then simulate motion! - - setting=false; - pending=false; - -} - -void StaticBody::_notification(int p_what) { - - switch(p_what) { - - case NOTIFICATION_ENTER_SCENE: { - - if (pre_xform) - *pre_xform = get_global_transform(); - pending=false; - } break; - case NOTIFICATION_TRANSFORM_CHANGED: { - - if (simulating_motion && !pending && is_inside_scene() && !setting && !get_scene()->is_editor_hint()) { - - call_deferred(SceneStringNames::get_singleton()->_update_xform); - pending=true; - } - - } break; - } - - -} - -void StaticBody::set_simulate_motion(bool p_enable) { - - if (p_enable==simulating_motion) - return; - simulating_motion=p_enable; - - if (p_enable) { - pre_xform = memnew( Transform ); - if (is_inside_scene()) - *pre_xform=get_transform(); -// query = PhysicsServer::get_singleton()->query_create(this,"_state_notify",Variant()); - // PhysicsServer::get_singleton()->query_body_direct_state(query,get_rid()); - PhysicsServer::get_singleton()->body_set_force_integration_callback(get_rid(),this,"_state_notify"); - - } else { - memdelete( pre_xform ); - pre_xform=NULL; - PhysicsServer::get_singleton()->body_set_force_integration_callback(get_rid(),NULL,StringName()); - pending=false; - } -} - -bool StaticBody::is_simulating_motion() const { - - return simulating_motion; -} void StaticBody::_bind_methods() { - ObjectTypeDB::bind_method(_MD("set_simulate_motion","enabled"),&StaticBody::set_simulate_motion); - ObjectTypeDB::bind_method(_MD("is_simulating_motion"),&StaticBody::is_simulating_motion); - ObjectTypeDB::bind_method(_MD("_update_xform"),&StaticBody::_update_xform); - ObjectTypeDB::bind_method(_MD("_state_notify"),&StaticBody::_state_notify); ObjectTypeDB::bind_method(_MD("set_constant_linear_velocity","vel"),&StaticBody::set_constant_linear_velocity); ObjectTypeDB::bind_method(_MD("set_constant_angular_velocity","vel"),&StaticBody::set_constant_angular_velocity); ObjectTypeDB::bind_method(_MD("get_constant_linear_velocity"),&StaticBody::get_constant_linear_velocity); ObjectTypeDB::bind_method(_MD("get_constant_angular_velocity"),&StaticBody::get_constant_angular_velocity); - ADD_PROPERTY(PropertyInfo(Variant::BOOL,"simulate_motion"),_SCS("set_simulate_motion"),_SCS("is_simulating_motion")); + ObjectTypeDB::bind_method(_MD("set_friction","friction"),&StaticBody::set_friction); + ObjectTypeDB::bind_method(_MD("get_friction"),&StaticBody::get_friction); + + ObjectTypeDB::bind_method(_MD("set_bounce","bounce"),&StaticBody::set_bounce); + ObjectTypeDB::bind_method(_MD("get_bounce"),&StaticBody::get_bounce); + + ADD_PROPERTY( PropertyInfo(Variant::REAL,"friction",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_friction"),_SCS("get_friction")); + ADD_PROPERTY( PropertyInfo(Variant::REAL,"bounce",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_bounce"),_SCS("get_bounce")); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3,"constant_linear_velocity"),_SCS("set_constant_linear_velocity"),_SCS("get_constant_linear_velocity")); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3,"constant_angular_velocity"),_SCS("set_constant_angular_velocity"),_SCS("get_constant_angular_velocity")); } StaticBody::StaticBody() : PhysicsBody(PhysicsServer::BODY_MODE_STATIC) { - simulating_motion=false; - pre_xform=NULL; - setting=false; - pending=false; - //constant_angular_velocity=0; - + bounce=0; + friction=1; } StaticBody::~StaticBody() { - if (pre_xform) - memdelete(pre_xform); - //if (query.is_valid()) - // PhysicsServer::get_singleton()->free(query); + } @@ -768,4 +719,418 @@ RigidBody::~RigidBody() { } +////////////////////////////////////////////////////// +////////////////////////// + + +Variant KinematicBody::_get_collider() const { + + ObjectID oid=get_collider(); + if (oid==0) + return Variant(); + Object *obj = ObjectDB::get_instance(oid); + if (!obj) + return Variant(); + + Reference *ref = obj->cast_to(); + if (ref) { + return Ref(ref); + } + + return obj; +} + + +bool KinematicBody::_ignores_mode(PhysicsServer::BodyMode p_mode) const { + + switch(p_mode) { + case PhysicsServer::BODY_MODE_STATIC: return !collide_static; + case PhysicsServer::BODY_MODE_KINEMATIC: return !collide_kinematic; + case PhysicsServer::BODY_MODE_RIGID: return !collide_rigid; + case PhysicsServer::BODY_MODE_CHARACTER: return !collide_character; + } + + return true; +} + +Vector3 KinematicBody::move(const Vector3& p_motion) { + + //give me back regular physics engine logic + //this is madness + //and most people using this function will think + //what it does is simpler than using physics + //this took about a week to get right.. + //but is it right? who knows at this point.. + + + colliding=false; + ERR_FAIL_COND_V(!is_inside_scene(),Vector3()); + PhysicsDirectSpaceState *dss = PhysicsServer::get_singleton()->space_get_direct_state(get_world()->get_space()); + ERR_FAIL_COND_V(!dss,Vector3()); + const int max_shapes=32; + Vector3 sr[max_shapes*2]; + int res_shapes; + + Set exclude; + exclude.insert(get_rid()); + + + //recover first + int recover_attempts=4; + + bool collided=false; + uint32_t mask=0; + if (collide_static) + mask|=PhysicsDirectSpaceState::TYPE_MASK_STATIC_BODY; + if (collide_kinematic) + mask|=PhysicsDirectSpaceState::TYPE_MASK_KINEMATIC_BODY; + if (collide_rigid) + mask|=PhysicsDirectSpaceState::TYPE_MASK_RIGID_BODY; + if (collide_character) + mask|=PhysicsDirectSpaceState::TYPE_MASK_CHARACTER_BODY; + +// print_line("motion: "+p_motion+" margin: "+rtos(margin)); + + //print_line("margin: "+rtos(margin)); + + float m = margin; + //m=0.001; + + do { + + //motion recover + for(int i=0;icollide_shape(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i),m,sr,max_shapes,res_shapes,exclude,get_layer_mask(),mask)) { + collided=true; + } + + } + + + + if (!collided) + break; + + //print_line("have to recover"); + Vector3 recover_motion; + bool all_outside=true; + for(int j=0;j<8;j++) { + for(int i=0;i "+b); +#if 0 + float d = a.distance_to(b); + + //if (dCMP_EPSILON) { + Vector3 norm = (b-a).normalized(); + if (dist>margin*0.5) + all_outside=false; + float adv = norm.dot(recover_motion); + //print_line(itos(i)+" dist: "+rtos(dist)+" adv: "+rtos(adv)); + recover_motion+=norm*MAX(dist-adv,0)*0.4; + } +#endif + + } + } + + + if (recover_motion==Vector3()) { + collided=false; + break; + } + + //print_line("**** RECOVER: "+recover_motion); + + Transform gt = get_global_transform(); + gt.origin+=recover_motion; + set_global_transform(gt); + + recover_attempts--; + + if (all_outside) + break; + + } while (recover_attempts); + + + //move second + float safe = 1.0; + float unsafe = 1.0; + int best_shape=-1; + + PhysicsDirectSpaceState::ShapeRestInfo rest; + + //print_line("pos: "+get_global_transform().origin); + //print_line("motion: "+p_motion); + + + for(int i=0;icast_motion(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i), p_motion,0, lsafe,lunsafe,exclude,get_layer_mask(),mask,&lrest); + //print_line("shape: "+itos(i)+" travel:"+rtos(ltravel)); + if (!valid) { + safe=0; + unsafe=0; + best_shape=i; //sadly it's the best + //print_line("initial stuck"); + + break; + } + if (lsafe==1.0) { + //print_line("initial free"); + continue; + } + if (lsafe < safe) { + + //print_line("initial at "+rtos(lsafe)); + safe=lsafe; + safe=MAX(0,lsafe-0.01); + unsafe=lunsafe; + best_shape=i; + rest=lrest; + } + } + + + //print_line("best shape: "+itos(best_shape)+" motion "+p_motion); + + if (safe>=1) { + //not collided + colliding=false; + } else { + + colliding=true; + + if (true || (safe==0 && unsafe==0)) { //use it always because it's more precise than GJK + //no advance, use rest info from collision + Transform ugt = get_global_transform(); + ugt.origin+=p_motion*unsafe; + + PhysicsDirectSpaceState::ShapeRestInfo rest_info; + bool c2 = dss->rest_info(get_shape(best_shape)->get_rid(), ugt*get_shape_transform(best_shape), m,&rest,exclude,get_layer_mask(),mask); + if (!c2) { + //should not happen, but floating point precision is so weird.. + colliding=false; + } + + // print_line("Rest Travel: "+rest.normal); + + } + + if (colliding) { + + collision=rest.point; + normal=rest.normal; + collider=rest.collider_id; + collider_vel=rest.linear_velocity; + } + } + + Vector3 motion=p_motion*safe; + //if (colliding) + // motion+=normal*0.001; + Transform gt = get_global_transform(); + gt.origin+=motion; + set_global_transform(gt); + + return p_motion-motion; + +} + +Vector3 KinematicBody::move_to(const Vector3& p_position) { + + return move(p_position-get_global_transform().origin); +} + +bool KinematicBody::can_move_to(const Vector3& p_position, bool p_discrete) { + + ERR_FAIL_COND_V(!is_inside_scene(),false); + PhysicsDirectSpaceState *dss = PhysicsServer::get_singleton()->space_get_direct_state(get_world()->get_space()); + ERR_FAIL_COND_V(!dss,false); + + uint32_t mask=0; + if (collide_static) + mask|=PhysicsDirectSpaceState::TYPE_MASK_STATIC_BODY; + if (collide_kinematic) + mask|=PhysicsDirectSpaceState::TYPE_MASK_KINEMATIC_BODY; + if (collide_rigid) + mask|=PhysicsDirectSpaceState::TYPE_MASK_RIGID_BODY; + if (collide_character) + mask|=PhysicsDirectSpaceState::TYPE_MASK_CHARACTER_BODY; + + Vector3 motion = p_position-get_global_transform().origin; + Transform xform=get_global_transform(); + + if (true || p_discrete) { + + xform.origin+=motion; + motion=Vector3(); + } + + Set exclude; + exclude.insert(get_rid()); + + //fill exclude list.. + for(int i=0;iintersect_shape(get_shape(i)->get_rid(), xform * get_shape_transform(i),0,NULL,0,exclude,get_layer_mask(),mask); + if (col) + return false; + } + + return true; +} + +bool KinematicBody::is_colliding() const { + + ERR_FAIL_COND_V(!is_inside_scene(),false); + + return colliding; +} +Vector3 KinematicBody::get_collision_pos() const { + + ERR_FAIL_COND_V(!colliding,Vector3()); + return collision; + +} +Vector3 KinematicBody::get_collision_normal() const { + + ERR_FAIL_COND_V(!colliding,Vector3()); + return normal; + +} + +Vector3 KinematicBody::get_collider_velocity() const { + + return collider_vel; +} + +ObjectID KinematicBody::get_collider() const { + + ERR_FAIL_COND_V(!colliding,0); + return collider; +} + +void KinematicBody::set_collide_with_static_bodies(bool p_enable) { + + collide_static=p_enable; +} +bool KinematicBody::can_collide_with_static_bodies() const { + + return collide_static; +} + +void KinematicBody::set_collide_with_rigid_bodies(bool p_enable) { + + collide_rigid=p_enable; + +} +bool KinematicBody::can_collide_with_rigid_bodies() const { + + + return collide_rigid; +} + +void KinematicBody::set_collide_with_kinematic_bodies(bool p_enable) { + + collide_kinematic=p_enable; + +} +bool KinematicBody::can_collide_with_kinematic_bodies() const { + + return collide_kinematic; +} + +void KinematicBody::set_collide_with_character_bodies(bool p_enable) { + + collide_character=p_enable; +} +bool KinematicBody::can_collide_with_character_bodies() const { + + return collide_character; +} + +void KinematicBody::set_collision_margin(float p_margin) { + + margin=p_margin; +} + +float KinematicBody::get_collision_margin() const{ + + return margin; +} + +void KinematicBody::_bind_methods() { + + + ObjectTypeDB::bind_method(_MD("move","rel_vec"),&KinematicBody::move); + ObjectTypeDB::bind_method(_MD("move_to","position"),&KinematicBody::move_to); + + ObjectTypeDB::bind_method(_MD("can_move_to","position"),&KinematicBody::can_move_to); + + ObjectTypeDB::bind_method(_MD("is_colliding"),&KinematicBody::is_colliding); + + ObjectTypeDB::bind_method(_MD("get_collision_pos"),&KinematicBody::get_collision_pos); + ObjectTypeDB::bind_method(_MD("get_collision_normal"),&KinematicBody::get_collision_normal); + ObjectTypeDB::bind_method(_MD("get_collider_velocity"),&KinematicBody::get_collider_velocity); + ObjectTypeDB::bind_method(_MD("get_collider:Object"),&KinematicBody::_get_collider); + + + ObjectTypeDB::bind_method(_MD("set_collide_with_static_bodies","enable"),&KinematicBody::set_collide_with_static_bodies); + ObjectTypeDB::bind_method(_MD("can_collide_with_static_bodies"),&KinematicBody::can_collide_with_static_bodies); + + ObjectTypeDB::bind_method(_MD("set_collide_with_kinematic_bodies","enable"),&KinematicBody::set_collide_with_kinematic_bodies); + ObjectTypeDB::bind_method(_MD("can_collide_with_kinematic_bodies"),&KinematicBody::can_collide_with_kinematic_bodies); + + ObjectTypeDB::bind_method(_MD("set_collide_with_rigid_bodies","enable"),&KinematicBody::set_collide_with_rigid_bodies); + ObjectTypeDB::bind_method(_MD("can_collide_with_rigid_bodies"),&KinematicBody::can_collide_with_rigid_bodies); + + ObjectTypeDB::bind_method(_MD("set_collide_with_character_bodies","enable"),&KinematicBody::set_collide_with_character_bodies); + ObjectTypeDB::bind_method(_MD("can_collide_with_character_bodies"),&KinematicBody::can_collide_with_character_bodies); + + ObjectTypeDB::bind_method(_MD("set_collision_margin","pixels"),&KinematicBody::set_collision_margin); + ObjectTypeDB::bind_method(_MD("get_collision_margin","pixels"),&KinematicBody::get_collision_margin); + + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collide_with/static"),_SCS("set_collide_with_static_bodies"),_SCS("can_collide_with_static_bodies")); + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collide_with/kinematic"),_SCS("set_collide_with_kinematic_bodies"),_SCS("can_collide_with_kinematic_bodies")); + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collide_with/rigid"),_SCS("set_collide_with_rigid_bodies"),_SCS("can_collide_with_rigid_bodies")); + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collide_with/character"),_SCS("set_collide_with_character_bodies"),_SCS("can_collide_with_character_bodies")); + ADD_PROPERTY( PropertyInfo(Variant::REAL,"collision/margin",PROPERTY_HINT_RANGE,"0.001,256,0.001"),_SCS("set_collision_margin"),_SCS("get_collision_margin")); + + +} + +KinematicBody::KinematicBody() : PhysicsBody(PhysicsServer::BODY_MODE_KINEMATIC){ + + collide_static=true; + collide_rigid=true; + collide_kinematic=true; + collide_character=true; + + colliding=false; + collider=0; + margin=0.001; +} +KinematicBody::~KinematicBody() { + + +} + diff --git a/scene/3d/physics_body.h b/scene/3d/physics_body.h index 616288e1f6e..0b7a389449d 100644 --- a/scene/3d/physics_body.h +++ b/scene/3d/physics_body.h @@ -38,8 +38,10 @@ class PhysicsBody : public CollisionObject { OBJ_TYPE(PhysicsBody,CollisionObject); + uint32_t layer_mask; protected: + static void _bind_methods(); void _notification(int p_what); PhysicsBody(PhysicsServer::BodyMode p_mode); public: @@ -48,6 +50,10 @@ public: virtual Vector3 get_angular_velocity() const; virtual float get_inverse_mass() const; + void set_layer_mask(uint32_t p_mask); + uint32_t get_layer_mask() const; + + PhysicsBody(); }; @@ -56,25 +62,26 @@ class StaticBody : public PhysicsBody { OBJ_TYPE(StaticBody,PhysicsBody); - Transform *pre_xform; - //RID query; - bool setting; - bool pending; - bool simulating_motion; Vector3 constant_linear_velocity; Vector3 constant_angular_velocity; - void _update_xform(); - void _state_notify(Object *p_object); + + real_t bounce; + real_t friction; + protected: - void _notification(int p_what); static void _bind_methods(); public: - void set_simulate_motion(bool p_enable); - bool is_simulating_motion() const; + + void set_friction(real_t p_friction); + real_t get_friction() const; + + void set_bounce(real_t p_bounce); + real_t get_bounce() const; + void set_constant_linear_velocity(const Vector3& p_vel); void set_constant_angular_velocity(const Vector3& p_vel); @@ -237,4 +244,70 @@ public: VARIANT_ENUM_CAST(RigidBody::Mode); VARIANT_ENUM_CAST(RigidBody::AxisLock); + + + + + +class KinematicBody : public PhysicsBody { + + OBJ_TYPE(KinematicBody,PhysicsBody); + + float margin; + bool collide_static; + bool collide_rigid; + bool collide_kinematic; + bool collide_character; + + bool colliding; + Vector3 collision; + Vector3 normal; + Vector3 collider_vel; + ObjectID collider; + + + Variant _get_collider() const; + + _FORCE_INLINE_ bool _ignores_mode(PhysicsServer::BodyMode) const; +protected: + + static void _bind_methods(); +public: + + enum { + SLIDE_FLAG_FLOOR, + SLIDE_FLAG_WALL, + SLIDE_FLAG_ROOF + }; + + Vector3 move(const Vector3& p_motion); + Vector3 move_to(const Vector3& p_position); + + bool can_move_to(const Vector3& p_position,bool p_discrete=false); + bool is_colliding() const; + Vector3 get_collision_pos() const; + Vector3 get_collision_normal() const; + Vector3 get_collider_velocity() const; + ObjectID get_collider() const; + + void set_collide_with_static_bodies(bool p_enable); + bool can_collide_with_static_bodies() const; + + void set_collide_with_rigid_bodies(bool p_enable); + bool can_collide_with_rigid_bodies() const; + + void set_collide_with_kinematic_bodies(bool p_enable); + bool can_collide_with_kinematic_bodies() const; + + void set_collide_with_character_bodies(bool p_enable); + bool can_collide_with_character_bodies() const; + + void set_collision_margin(float p_margin); + float get_collision_margin() const; + + KinematicBody(); + ~KinematicBody(); + +}; + #endif // PHYSICS_BODY__H diff --git a/scene/3d/vehicle_body.cpp b/scene/3d/vehicle_body.cpp index 7680c1d56c8..07abd1dcd29 100644 --- a/scene/3d/vehicle_body.cpp +++ b/scene/3d/vehicle_body.cpp @@ -125,19 +125,161 @@ void VehicleWheel::_update(PhysicsDirectBodyState *s) { } } +void VehicleWheel::set_radius(float p_radius) { + + m_wheelRadius=p_radius; + update_gizmo(); +} + +float VehicleWheel::get_radius() const{ + + return m_wheelRadius; +} + +void VehicleWheel::set_suspension_rest_length(float p_length){ + + m_suspensionRestLength=p_length; + update_gizmo(); +} +float VehicleWheel::get_suspension_rest_length() const{ + + return m_suspensionRestLength; +} + +void VehicleWheel::set_suspension_travel(float p_length){ + + m_maxSuspensionTravelCm=p_length/0.01; +} +float VehicleWheel::get_suspension_travel() const{ + + return m_maxSuspensionTravelCm*0.01; +} + +void VehicleWheel::set_suspension_stiffness(float p_value){ + + m_suspensionStiffness=p_value; +} +float VehicleWheel::get_suspension_stiffness() const{ + + return m_suspensionStiffness; +} + +void VehicleWheel::set_suspension_max_force(float p_value){ + + m_maxSuspensionForce=p_value; +} +float VehicleWheel::get_suspension_max_force() const{ + + return m_maxSuspensionForce; +} + +void VehicleWheel::set_damping_compression(float p_value){ + + m_wheelsDampingCompression=p_value; +} +float VehicleWheel::get_damping_compression() const{ + + return m_wheelsDampingRelaxation; +} + +void VehicleWheel::set_damping_relaxation(float p_value){ + + m_wheelsDampingRelaxation=p_value; +} +float VehicleWheel::get_damping_relaxation() const{ + + return m_wheelsDampingRelaxation; +} + +void VehicleWheel::set_friction_slip(float p_value) { + + m_frictionSlip=p_value; +} +float VehicleWheel::get_friction_slip() const{ + + return m_frictionSlip; +} + + void VehicleWheel::_bind_methods() { + ObjectTypeDB::bind_method(_MD("set_radius","length"),&VehicleWheel::set_radius); + ObjectTypeDB::bind_method(_MD("get_radius"),&VehicleWheel::get_radius); + ObjectTypeDB::bind_method(_MD("set_suspension_rest_length","length"),&VehicleWheel::set_suspension_rest_length); + ObjectTypeDB::bind_method(_MD("get_suspension_rest_length"),&VehicleWheel::get_suspension_rest_length); + + ObjectTypeDB::bind_method(_MD("set_suspension_travel","length"),&VehicleWheel::set_suspension_travel); + ObjectTypeDB::bind_method(_MD("get_suspension_travel"),&VehicleWheel::get_suspension_travel); + + ObjectTypeDB::bind_method(_MD("set_suspension_stiffness","length"),&VehicleWheel::set_suspension_stiffness); + ObjectTypeDB::bind_method(_MD("get_suspension_stiffness"),&VehicleWheel::get_suspension_stiffness); + + ObjectTypeDB::bind_method(_MD("set_suspension_max_force","length"),&VehicleWheel::set_suspension_max_force); + ObjectTypeDB::bind_method(_MD("get_suspension_max_force"),&VehicleWheel::get_suspension_max_force); + + + ObjectTypeDB::bind_method(_MD("set_damping_compression","length"),&VehicleWheel::set_damping_compression); + ObjectTypeDB::bind_method(_MD("get_damping_compression"),&VehicleWheel::get_damping_compression); + + ObjectTypeDB::bind_method(_MD("set_damping_relaxation","length"),&VehicleWheel::set_damping_relaxation); + ObjectTypeDB::bind_method(_MD("get_damping_relaxation"),&VehicleWheel::get_damping_relaxation); + + ObjectTypeDB::bind_method(_MD("set_use_as_traction","enable"),&VehicleWheel::set_use_as_traction); + ObjectTypeDB::bind_method(_MD("is_used_as_traction"),&VehicleWheel::is_used_as_traction); + + ObjectTypeDB::bind_method(_MD("set_use_as_steering","enable"),&VehicleWheel::set_use_as_steering); + ObjectTypeDB::bind_method(_MD("is_used_as_steering"),&VehicleWheel::is_used_as_steering); + + ObjectTypeDB::bind_method(_MD("set_friction_slip","length"),&VehicleWheel::set_friction_slip); + ObjectTypeDB::bind_method(_MD("get_friction_slip"),&VehicleWheel::get_friction_slip); + + + ADD_PROPERTY(PropertyInfo(Variant::BOOL,"type/traction"),_SCS("set_use_as_traction"),_SCS("is_used_as_traction")); + ADD_PROPERTY(PropertyInfo(Variant::BOOL,"type/steering"),_SCS("set_use_as_steering"),_SCS("is_used_as_steering")); + ADD_PROPERTY(PropertyInfo(Variant::REAL,"wheel/radius"),_SCS("set_radius"),_SCS("get_radius")); + ADD_PROPERTY(PropertyInfo(Variant::REAL,"wheel/rest_length"),_SCS("set_suspension_rest_length"),_SCS("get_suspension_rest_length")); + ADD_PROPERTY(PropertyInfo(Variant::REAL,"wheel/friction_slip"),_SCS("set_friction_slip"),_SCS("get_friction_slip")); + ADD_PROPERTY(PropertyInfo(Variant::REAL,"suspension/travel"),_SCS("set_suspension_travel"),_SCS("get_suspension_travel")); + ADD_PROPERTY(PropertyInfo(Variant::REAL,"suspension/stiffness"),_SCS("set_suspension_stiffness"),_SCS("get_suspension_stiffness")); + ADD_PROPERTY(PropertyInfo(Variant::REAL,"suspension/max_force"),_SCS("set_suspension_max_force"),_SCS("get_suspension_max_force")); + ADD_PROPERTY(PropertyInfo(Variant::REAL,"damping/compression"),_SCS("set_damping_compression"),_SCS("get_damping_compression")); + ADD_PROPERTY(PropertyInfo(Variant::REAL,"damping/relaxation"),_SCS("set_damping_relaxation"),_SCS("get_damping_relaxation")); + +} + + +void VehicleWheel::set_use_as_traction(bool p_enable) { + + engine_traction=p_enable; +} + +bool VehicleWheel::is_used_as_traction() const{ + + return engine_traction; +} + + +void VehicleWheel::set_use_as_steering(bool p_enabled){ + + steers=p_enabled; +} + +bool VehicleWheel::is_used_as_steering() const{ + + return steers; } VehicleWheel::VehicleWheel() { + steers=false; + engine_traction=false; m_steering = real_t(0.); - m_engineForce = real_t(0.); + //m_engineForce = real_t(0.); m_rotation = real_t(0.); m_deltaRotation = real_t(0.); m_brake = real_t(0.); @@ -172,6 +314,7 @@ void VehicleBody::_update_wheel_transform(VehicleWheel& wheel ,PhysicsDirectBody //} wheel.m_raycastInfo.m_hardPointWS = chassisTrans.xform( wheel.m_chassisConnectionPointCS ); + //wheel.m_raycastInfo.m_hardPointWS+=s->get_linear_velocity()*s->get_step(); wheel.m_raycastInfo.m_wheelDirectionWS = chassisTrans.get_basis().xform( wheel.m_wheelDirectionCS).normalized(); wheel.m_raycastInfo.m_wheelAxleWS = chassisTrans.get_basis().xform( wheel.m_wheelAxleCS ).normalized(); } @@ -189,12 +332,16 @@ void VehicleBody::_update_wheel(int p_idx,PhysicsDirectBodyState *s) { // up.normalize(); //rotate around steering over de wheelAxleWS - real_t steering = wheel.m_steering; + real_t steering = wheel.steers?m_steeringValue:0.0; + //print_line(itos(p_idx)+": "+rtos(steering)); Matrix3 steeringMat(up,steering); Matrix3 rotatingMat(right,-wheel.m_rotation); +// if (p_idx==1) +// print_line("steeringMat " +steeringMat); + Matrix3 basis2( right[0],up[0],fwd[0], right[1],up[1],fwd[1], @@ -202,9 +349,11 @@ void VehicleBody::_update_wheel(int p_idx,PhysicsDirectBodyState *s) { ); wheel.m_worldTransform.set_basis(steeringMat * rotatingMat * basis2); + //wheel.m_worldTransform.set_basis(basis2 * (steeringMat * rotatingMat)); wheel.m_worldTransform.set_origin( wheel.m_raycastInfo.m_hardPointWS + wheel.m_raycastInfo.m_wheelDirectionWS * wheel.m_raycastInfo.m_suspensionLength ); + } @@ -221,9 +370,10 @@ real_t VehicleBody::_ray_cast(int p_idx,PhysicsDirectBodyState *s) { real_t raylen = wheel.m_suspensionRestLength+wheel.m_wheelRadius; Vector3 rayvector = wheel.m_raycastInfo.m_wheelDirectionWS * (raylen); - const Vector3& source = wheel.m_raycastInfo.m_hardPointWS; + Vector3 source = wheel.m_raycastInfo.m_hardPointWS; wheel.m_raycastInfo.m_contactPointWS = source + rayvector; const Vector3& target = wheel.m_raycastInfo.m_contactPointWS; + source-=wheel.m_wheelRadius * wheel.m_raycastInfo.m_wheelDirectionWS; real_t param = real_t(0.); @@ -552,9 +702,10 @@ void VehicleBody::_update_friction(PhysicsDirectBodyState *s) { //const btTransform& wheelTrans = getWheelTransformWS( i ); - Matrix3 wheelBasis0 = wheelInfo.get_global_transform().basis; + Matrix3 wheelBasis0 = wheelInfo.m_worldTransform.basis;//get_global_transform().basis; + m_axle[i] = wheelBasis0.get_axis(Vector3::AXIS_X); - m_axle[i] = wheelInfo.m_raycastInfo.m_wheelAxleWS; + //m_axle[i] = wheelInfo.m_raycastInfo.m_wheelAxleWS; const Vector3& surfNormalWS = wheelInfo.m_raycastInfo.m_contactNormalWS; real_t proj = m_axle[i].dot(surfNormalWS); @@ -592,9 +743,9 @@ void VehicleBody::_update_friction(PhysicsDirectBodyState *s) { if (wheelInfo.m_raycastInfo.m_isInContact) { - if (wheelInfo.m_engineForce != 0.f) + if (engine_force != 0.f) { - rollingFriction = wheelInfo.m_engineForce* s->get_step(); + rollingFriction = engine_force* s->get_step(); } else { real_t defaultRollingFrictionImpulse = 0.f; @@ -721,9 +872,11 @@ void VehicleBody::_direct_state_changed(Object *p_state) { _update_wheel(i,s); } + for(int i=0;iset_transform(s->get_transform().inverse() * wheels[i]->m_worldTransform); } _update_suspension(s); @@ -808,6 +961,35 @@ real_t VehicleBody::get_friction() const{ return friction; } +void VehicleBody::set_engine_force(float p_force) { + + engine_force=p_force; +} + +float VehicleBody::get_engine_force() const{ + + return engine_force; +} + +void VehicleBody::set_brake(float p_brake){ + + brake=p_brake; +} +float VehicleBody::get_brake() const{ + + return brake; +} + +void VehicleBody::set_steering(float p_steering){ + + m_steeringValue=p_steering; +} +float VehicleBody::get_steering() const{ + + return m_steeringValue; +} + + void VehicleBody::_bind_methods(){ ObjectTypeDB::bind_method(_MD("set_mass","mass"),&VehicleBody::set_mass); @@ -816,8 +998,20 @@ void VehicleBody::_bind_methods(){ ObjectTypeDB::bind_method(_MD("set_friction","friction"),&VehicleBody::set_friction); ObjectTypeDB::bind_method(_MD("get_friction"),&VehicleBody::get_friction); + ObjectTypeDB::bind_method(_MD("set_engine_force","engine_force"),&VehicleBody::set_engine_force); + ObjectTypeDB::bind_method(_MD("get_engine_force"),&VehicleBody::get_engine_force); + + ObjectTypeDB::bind_method(_MD("set_brake","brake"),&VehicleBody::set_brake); + ObjectTypeDB::bind_method(_MD("get_brake"),&VehicleBody::get_brake); + + ObjectTypeDB::bind_method(_MD("set_steering","steering"),&VehicleBody::set_steering); + ObjectTypeDB::bind_method(_MD("get_steering"),&VehicleBody::get_steering); + ObjectTypeDB::bind_method(_MD("_direct_state_changed"),&VehicleBody::_direct_state_changed); + ADD_PROPERTY( PropertyInfo(Variant::REAL,"motion/engine_force",PROPERTY_HINT_RANGE,"0.01,1024.0,0.01"),_SCS("set_engine_force"),_SCS("get_engine_force")); + ADD_PROPERTY( PropertyInfo(Variant::REAL,"motion/brake",PROPERTY_HINT_RANGE,"0.01,1024.0,0.01"),_SCS("set_brake"),_SCS("get_brake")); + ADD_PROPERTY( PropertyInfo(Variant::REAL,"motion/steering",PROPERTY_HINT_RANGE,"0.01,1024.0,0.01"),_SCS("set_steering"),_SCS("get_steering")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"body/mass",PROPERTY_HINT_RANGE,"0.01,65536,0.01"),_SCS("set_mass"),_SCS("get_mass")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"body/friction",PROPERTY_HINT_RANGE,"0.01,1,0.01"),_SCS("set_friction"),_SCS("get_friction")); @@ -833,8 +1027,11 @@ VehicleBody::VehicleBody() : PhysicsBody(PhysicsServer::BODY_MODE_RIGID) { m_currentVehicleSpeedKmHour = real_t(0.); m_steeringValue = real_t(0.); + engine_force=0; + brake=0; + + - mass=1; friction=1; ccd=false; @@ -842,5 +1039,6 @@ VehicleBody::VehicleBody() : PhysicsBody(PhysicsServer::BODY_MODE_RIGID) { exclude.insert(get_rid()); PhysicsServer::get_singleton()->body_set_force_integration_callback(get_rid(),this,"_direct_state_changed"); + set_mass(40); } diff --git a/scene/3d/vehicle_body.h b/scene/3d/vehicle_body.h index 97137da6998..285cca142d9 100644 --- a/scene/3d/vehicle_body.h +++ b/scene/3d/vehicle_body.h @@ -14,6 +14,8 @@ friend class VehicleBody; Transform m_worldTransform; Transform local_xform; + bool engine_traction; + bool steers; Vector3 m_chassisConnectionPointCS; //const @@ -39,7 +41,7 @@ friend class VehicleBody; real_t m_rotation; real_t m_deltaRotation; real_t m_rollInfluence; - real_t m_engineForce; + //real_t m_engineForce; real_t m_brake; real_t m_clippedInvContactDotSuspension; @@ -69,6 +71,35 @@ protected: public: + void set_radius(float p_radius); + float get_radius() const; + + void set_suspension_rest_length(float p_length); + float get_suspension_rest_length() const; + + void set_suspension_travel(float p_length); + float get_suspension_travel() const; + + void set_suspension_stiffness(float p_value); + float get_suspension_stiffness() const; + + void set_suspension_max_force(float p_value); + float get_suspension_max_force() const; + + void set_damping_compression(float p_value); + float get_damping_compression() const; + + void set_damping_relaxation(float p_value); + float get_damping_relaxation() const; + + void set_friction_slip(float p_value); + float get_friction_slip() const; + + void set_use_as_traction(bool p_enable); + bool is_used_as_traction() const; + + void set_use_as_steering(bool p_enabled); + bool is_used_as_steering() const; VehicleWheel(); @@ -82,6 +113,9 @@ class VehicleBody : public PhysicsBody { real_t mass; real_t friction; + float engine_force; + float brake; + Vector3 linear_velocity; Vector3 angular_velocity; bool ccd; @@ -135,6 +169,15 @@ public: void set_friction(real_t p_friction); real_t get_friction() const; + void set_engine_force(float p_engine_force); + float get_engine_force() const; + + void set_brake(float p_force); + float get_brake() const; + + void set_steering(float p_steering); + float get_steering() const; + VehicleBody(); }; diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index fb85f0c6b79..25f04379ef7 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -2787,7 +2787,7 @@ int Tree::get_item_offset(TreeItem *p_item) const { ofs+=compute_item_height(it)+cache.vseparation; - if (it->childs) { + if (it->childs && !it->collapsed) { it=it->childs; diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index f7d6a246e66..02fed25883d 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -401,6 +401,7 @@ void register_scene_types() { ObjectTypeDB::register_virtual_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); + ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); diff --git a/servers/audio/sample_manager_sw.cpp b/servers/audio/sample_manager_sw.cpp index 5a5aa1a34c1..29564fe018a 100644 --- a/servers/audio/sample_manager_sw.cpp +++ b/servers/audio/sample_manager_sw.cpp @@ -139,7 +139,7 @@ void SampleManagerMallocSW::sample_set_data(RID p_sample, const DVector DVector::Read buffer_r=p_buffer.read(); const uint8_t *src = buffer_r.ptr(); uint8_t *dst = (uint8_t*)s->data; - print_line("set data: "+itos(s->length_bytes)); + //print_line("set data: "+itos(s->length_bytes)); for(int i=0;ilength_bytes;i++) { diff --git a/servers/physics/area_sw.h b/servers/physics/area_sw.h index 3e39dc3bb60..569195d2c33 100644 --- a/servers/physics/area_sw.h +++ b/servers/physics/area_sw.h @@ -70,7 +70,7 @@ class AreaSW : public CollisionObjectSW{ return area_shape < p_key.area_shape; } else - return body_shape < p_key.area_shape; + return body_shape < p_key.body_shape; } else return rid < p_key.rid; diff --git a/servers/physics/body_pair_sw.cpp b/servers/physics/body_pair_sw.cpp index c50bfac472e..3c838367c2c 100644 --- a/servers/physics/body_pair_sw.cpp +++ b/servers/physics/body_pair_sw.cpp @@ -29,7 +29,7 @@ #include "body_pair_sw.h" #include "collision_solver_sw.h" #include "space_sw.h" - +#include "os/os.h" /* #define NO_ACCUMULATE_IMPULSES @@ -174,6 +174,11 @@ void BodyPairSW::validate_contacts() { bool BodyPairSW::setup(float p_step) { + //cannot collide + if (A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC)) { + collided=false; + return false; + } offset_B = B->get_transform().get_origin() - A->get_transform().get_origin(); @@ -197,10 +202,6 @@ bool BodyPairSW::setup(float p_step) { return false; - //cannot collide - if (A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC)) { - return false; - } real_t max_penetration = space->get_contact_max_allowed_penetration(); @@ -217,6 +218,7 @@ bool BodyPairSW::setup(float p_step) { } + real_t inv_dt = 1.0/p_step; for(int i=0;i0?(1.0/mass):0; _set_static(false); - simulated_motion=false; //jic } break; case PhysicsServer::BODY_MODE_CHARACTER: { _inv_mass=mass>0?(1.0/mass):0; _set_static(false); - simulated_motion=false; //jic } break; } @@ -235,13 +233,19 @@ void BodySW::set_state(PhysicsServer::BodyState p_state, const Variant& p_varian case PhysicsServer::BODY_STATE_TRANSFORM: { - if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC) { + if (mode==PhysicsServer::BODY_MODE_KINEMATIC) { + new_transform=p_variant; + //wakeup_neighbours(); + set_active(true); + + } else if (mode==PhysicsServer::BODY_MODE_STATIC) { _set_transform(p_variant); _set_inv_transform(get_transform().affine_inverse()); wakeup_neighbours(); } else { Transform t = p_variant; t.orthonormalize(); + new_transform=get_transform(); //used as old to compute motion _set_transform(t); _set_inv_transform(get_transform().inverse()); @@ -353,7 +357,7 @@ void BodySW::_compute_area_gravity(const AreaSW *p_area) { void BodySW::integrate_forces(real_t p_step) { - if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC) + if (mode==PhysicsServer::BODY_MODE_STATIC) return; AreaSW *current_area = get_space()->get_default_area(); @@ -374,28 +378,56 @@ void BodySW::integrate_forces(real_t p_step) { _compute_area_gravity(current_area); density=current_area->get_density(); - if (!omit_force_integration) { - //overriden by direct state query + Vector3 motion; + bool do_motion=false; - Vector3 force=gravity*mass; - force+=applied_force; - Vector3 torque=applied_torque; + if (mode==PhysicsServer::BODY_MODE_KINEMATIC) { - real_t damp = 1.0 - p_step * density; + //compute motion, angular and etc. velocities from prev transform + linear_velocity = (new_transform.origin - get_transform().origin)/p_step; - if (damp<0) // reached zero in the given time - damp=0; + //compute a FAKE angular velocity, not so easy + Matrix3 rot=new_transform.basis.orthonormalized().transposed() * get_transform().basis.orthonormalized(); + Vector3 axis; + float angle; - real_t angular_damp = 1.0 - p_step * density * get_space()->get_body_angular_velocity_damp_ratio(); + rot.get_axis_and_angle(axis,angle); + axis.normalize(); + angular_velocity=axis.normalized() * (angle/p_step); - if (angular_damp<0) // reached zero in the given time - angular_damp=0; + motion = new_transform.origin - get_transform().origin; + do_motion=true; - linear_velocity*=damp; - angular_velocity*=angular_damp; + } else { + if (!omit_force_integration) { + //overriden by direct state query + + Vector3 force=gravity*mass; + force+=applied_force; + Vector3 torque=applied_torque; + + real_t damp = 1.0 - p_step * density; + + if (damp<0) // reached zero in the given time + damp=0; + + real_t angular_damp = 1.0 - p_step * density * get_space()->get_body_angular_velocity_damp_ratio(); + + if (angular_damp<0) // reached zero in the given time + angular_damp=0; + + linear_velocity*=damp; + angular_velocity*=angular_damp; + + linear_velocity+=_inv_mass * force * p_step; + angular_velocity+=_inv_inertia_tensor.xform(torque)*p_step; + } + + if (continuous_cd) { + motion=linear_velocity*p_step; + do_motion=true; + } - linear_velocity+=_inv_mass * force * p_step; - angular_velocity+=_inv_inertia_tensor.xform(torque)*p_step; } applied_force=Vector3(); @@ -406,8 +438,11 @@ void BodySW::integrate_forces(real_t p_step) { biased_angular_velocity=Vector3(); biased_linear_velocity=Vector3(); - if (continuous_cd) //shapes temporarily extend for raycast - _update_shapes_with_motion(linear_velocity*p_step); + + if (do_motion) {//shapes temporarily extend for raycast + _update_shapes_with_motion(motion); + } + current_area=NULL; // clear the area, so it is set in the next frame contact_count=0; @@ -419,9 +454,16 @@ void BodySW::integrate_velocities(real_t p_step) { if (mode==PhysicsServer::BODY_MODE_STATIC) return; + if (fi_callback) + get_space()->body_add_to_state_query_list(&direct_state_query_list); + if (mode==PhysicsServer::BODY_MODE_KINEMATIC) { - if (fi_callback) - get_space()->body_add_to_state_query_list(&direct_state_query_list); + + _set_transform(new_transform,false); + _set_inv_transform(new_transform.affine_inverse()); ; + if (linear_velocity==Vector3() && angular_velocity==Vector3()) + set_active(false); //stopped moving, deactivate + return; } @@ -475,14 +517,13 @@ void BodySW::integrate_velocities(real_t p_step) { _update_inertia_tensor(); - if (fi_callback) { - - get_space()->body_add_to_state_query_list(&direct_state_query_list); - } + //if (fi_callback) { + // get_space()->body_add_to_state_query_list(&direct_state_query_list); + // } - +/* void BodySW::simulate_motion(const Transform& p_xform,real_t p_step) { Transform inv_xform = p_xform.affine_inverse(); @@ -514,6 +555,7 @@ void BodySW::simulate_motion(const Transform& p_xform,real_t p_step) { } +*/ void BodySW::wakeup_neighbours() { @@ -562,12 +604,7 @@ void BodySW::call_queries() { } - if (simulated_motion) { - // linear_velocity=Vector3(); - // angular_velocity=0; - simulated_motion=false; - } } @@ -634,7 +671,7 @@ BodySW::BodySW() : CollisionObjectSW(TYPE_BODY), active_list(this), inertia_upda _set_static(false); density=0; contact_count=0; - simulated_motion=false; + still_time=0; continuous_cd=false; can_sleep=false; diff --git a/servers/physics/body_sw.h b/servers/physics/body_sw.h index 8d30069777b..f627c412313 100644 --- a/servers/physics/body_sw.h +++ b/servers/physics/body_sw.h @@ -71,11 +71,12 @@ class BodySW : public CollisionObjectSW { VSet exceptions; bool omit_force_integration; bool active; - bool simulated_motion; + bool continuous_cd; bool can_sleep; void _update_inertia(); virtual void _shapes_changed(); + Transform new_transform; Map constraint_map; @@ -235,7 +236,7 @@ public: void integrate_forces(real_t p_step); void integrate_velocities(real_t p_step); - void simulate_motion(const Transform& p_xform,real_t p_step); + //void simulate_motion(const Transform& p_xform,real_t p_step); void call_queries(); void wakeup_neighbours(); diff --git a/servers/physics/collision_object_sw.cpp b/servers/physics/collision_object_sw.cpp index 156004d15d8..f34aa19cae5 100644 --- a/servers/physics/collision_object_sw.cpp +++ b/servers/physics/collision_object_sw.cpp @@ -216,4 +216,5 @@ CollisionObjectSW::CollisionObjectSW(Type p_type) { type=p_type; space=NULL; instance_id=0; + layer_mask=1; } diff --git a/servers/physics/collision_object_sw.h b/servers/physics/collision_object_sw.h index 6d60f2f0782..558a48f6fd1 100644 --- a/servers/physics/collision_object_sw.h +++ b/servers/physics/collision_object_sw.h @@ -47,6 +47,7 @@ private: Type type; RID self; ObjectID instance_id; + uint32_t layer_mask; struct Shape { @@ -71,7 +72,7 @@ protected: void _update_shapes_with_motion(const Vector3& p_motion); void _unregister_shapes(); - _FORCE_INLINE_ void _set_transform(const Transform& p_transform) { transform=p_transform; _update_shapes(); } + _FORCE_INLINE_ void _set_transform(const Transform& p_transform,bool p_update_shapes=true) { transform=p_transform; if (p_update_shapes) _update_shapes(); } _FORCE_INLINE_ void _set_inv_transform(const Transform& p_transform) { inv_transform=p_transform; } void _set_static(bool p_static); @@ -104,6 +105,8 @@ public: _FORCE_INLINE_ SpaceSW* get_space() const { return space; } + _FORCE_INLINE_ void set_layer_mask(uint32_t p_mask) { layer_mask=p_mask; } + _FORCE_INLINE_ uint32_t get_layer_mask() const { return layer_mask; } void remove_shape(ShapeSW *p_shape); void remove_shape(int p_index); diff --git a/servers/physics/collision_solver_sat.cpp b/servers/physics/collision_solver_sat.cpp index 1cd40db772c..750874f5076 100644 --- a/servers/physics/collision_solver_sat.cpp +++ b/servers/physics/collision_solver_sat.cpp @@ -43,7 +43,9 @@ struct _CollectorCallback { _FORCE_INLINE_ void call(const Vector3& p_point_A, const Vector3& p_point_B) { //if (normal.dot(p_point_A) >= normal.dot(p_point_B)) - // return; + // return; +// print_line("** A: "+p_point_A+" B: "+p_point_B+" D: "+rtos(p_point_A.distance_to(p_point_B))); + if (swap) callback(p_point_B,p_point_A,userdata); else @@ -231,11 +233,14 @@ static void _generate_contacts_face_face(const Vector3 * p_points_A,int p_point_ for (int i=0;iCMP_EPSILON) - continue; + //if (d>CMP_EPSILON) + // continue; Vector3 closest_B=clipbuf_src[i] - plane_B.normal*d; + if (p_callback->normal.dot(clipbuf_src[i]) >= p_callback->normal.dot(closest_B)) + continue; + p_callback->call(clipbuf_src[i],closest_B); added++; @@ -301,7 +306,7 @@ static void _generate_contacts_from_supports(const Vector3 * p_points_A,int p_po -template +template class SeparatorAxisTest { const ShapeA *shape_A; @@ -311,7 +316,8 @@ class SeparatorAxisTest { real_t best_depth; Vector3 best_axis; _CollectorCallback *callback; - + real_t margin_A; + real_t margin_B; Vector3 separator_axis; public: @@ -340,6 +346,13 @@ public: shape_A->project_range(axis,*transform_A,min_A,max_A); shape_B->project_range(axis,*transform_B,min_B,max_B); + if (withMargin) { + min_A-=margin_A; + max_A+=margin_A; + min_B-=margin_B; + max_B+=margin_B; + } + min_B -= ( max_A - min_A ) * 0.5; max_B += ( max_A - min_A ) * 0.5; @@ -394,6 +407,14 @@ public: supports_A[i] = transform_A->xform(supports_A[i]); } + if (withMargin) { + + for(int i=0;ixform(supports_B[i]); } + + if (withMargin) { + + for(int i=0;i +static void _collision_sphere_sphere(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const SphereShapeSW *sphere_A = static_cast(p_a); const SphereShapeSW *sphere_B = static_cast(p_b); - SeparatorAxisTest separator(sphere_A,p_transform_a,sphere_B,p_transform_b,p_collector); + SeparatorAxisTest separator(sphere_A,p_transform_a,sphere_B,p_transform_b,p_collector,p_margin_a,p_margin_b); // previous axis @@ -462,13 +495,14 @@ static void _collision_sphere_sphere(const ShapeSW *p_a,const Transform &p_trans separator.generate_contacts(); } -static void _collision_sphere_box(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { +template +static void _collision_sphere_box(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const SphereShapeSW *sphere_A = static_cast(p_a); const BoxShapeSW *box_B = static_cast(p_b); - SeparatorAxisTest separator(sphere_A,p_transform_a,box_B,p_transform_b,p_collector); + SeparatorAxisTest separator(sphere_A,p_transform_a,box_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) return; @@ -516,13 +550,13 @@ static void _collision_sphere_box(const ShapeSW *p_a,const Transform &p_transfor } - -static void _collision_sphere_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { +template +static void _collision_sphere_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const SphereShapeSW *sphere_A = static_cast(p_a); const CapsuleShapeSW *capsule_B = static_cast(p_b); - SeparatorAxisTest separator(sphere_A,p_transform_a,capsule_B,p_transform_b,p_collector); + SeparatorAxisTest separator(sphere_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) return; @@ -540,7 +574,7 @@ static void _collision_sphere_capsule(const ShapeSW *p_a,const Transform &p_tran Vector3 capsule_ball_2 = p_transform_b.origin - capsule_axis; - if (!separator.test_axis( (capsule_ball_1 - p_transform_a.origin).normalized() ) ) + if (!separator.test_axis( (capsule_ball_2 - p_transform_a.origin).normalized() ) ) return; //capsule edge, sphere @@ -556,13 +590,14 @@ static void _collision_sphere_capsule(const ShapeSW *p_a,const Transform &p_tran separator.generate_contacts(); } -static void _collision_sphere_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { +template +static void _collision_sphere_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const SphereShapeSW *sphere_A = static_cast(p_a); const ConvexPolygonShapeSW *convex_polygon_B = static_cast(p_b); - SeparatorAxisTest separator(sphere_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector); + SeparatorAxisTest separator(sphere_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) @@ -626,14 +661,15 @@ static void _collision_sphere_convex_polygon(const ShapeSW *p_a,const Transform } -static void _collision_sphere_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b, _CollectorCallback *p_collector) { +template +static void _collision_sphere_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const SphereShapeSW *sphere_A = static_cast(p_a); const FaceShapeSW *face_B = static_cast(p_b); - SeparatorAxisTest separator(sphere_A,p_transform_a,face_B,p_transform_b,p_collector); + SeparatorAxisTest separator(sphere_A,p_transform_a,face_B,p_transform_b,p_collector,p_margin_a,p_margin_b); Vector3 vertex[3]={ @@ -669,16 +705,14 @@ static void _collision_sphere_face(const ShapeSW *p_a,const Transform &p_transfo } - - - -static void _collision_box_box(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { +template +static void _collision_box_box(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const BoxShapeSW *box_A = static_cast(p_a); const BoxShapeSW *box_B = static_cast(p_b); - SeparatorAxisTest separator(box_A,p_transform_a,box_B,p_transform_b,p_collector); + SeparatorAxisTest separator(box_A,p_transform_a,box_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) return; @@ -723,18 +757,69 @@ static void _collision_box_box(const ShapeSW *p_a,const Transform &p_transform_a } } + if (withMargin) { + //add endpoint test between closest vertices and edges + + // calculate closest point to sphere + + Vector3 ab_vec = p_transform_b.origin - p_transform_a.origin; + + Vector3 cnormal_a=p_transform_a.basis.xform_inv( ab_vec ); + + Vector3 support_a=p_transform_a.xform( Vector3( + + (cnormal_a.x<0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x, + (cnormal_a.y<0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y, + (cnormal_a.z<0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z + ) ); + + + Vector3 cnormal_b=p_transform_b.basis.xform_inv( -ab_vec ); + + Vector3 support_b=p_transform_b.xform( Vector3( + + (cnormal_b.x<0) ? -box_B->get_half_extents().x : box_B->get_half_extents().x, + (cnormal_b.y<0) ? -box_B->get_half_extents().y : box_B->get_half_extents().y, + (cnormal_b.z<0) ? -box_B->get_half_extents().z : box_B->get_half_extents().z + ) ); + + Vector3 axis_ab = (support_a-support_b); + + if (!separator.test_axis( axis_ab.normalized() )) { + return; + } + + //now try edges, which become cylinders! + + for(int i=0;i<3;i++) { + + //a ->b + Vector3 axis_a = p_transform_a.basis.get_axis(i); + + if (!separator.test_axis( axis_ab.cross(axis_a).cross(axis_a).normalized() )) + return; + + //b ->a + Vector3 axis_b = p_transform_b.basis.get_axis(i); + + if (!separator.test_axis( axis_ab.cross(axis_b).cross(axis_b).normalized() )) + return; + + } + } + separator.generate_contacts(); } - -static void _collision_box_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { +template +static void _collision_box_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const BoxShapeSW *box_A = static_cast(p_a); const CapsuleShapeSW *capsule_B = static_cast(p_b); - SeparatorAxisTest separator(box_A,p_transform_a,capsule_B,p_transform_b,p_collector); + SeparatorAxisTest separator(box_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) return; @@ -828,15 +913,15 @@ static void _collision_box_capsule(const ShapeSW *p_a,const Transform &p_transfo separator.generate_contacts(); } - -static void _collision_box_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { +template +static void _collision_box_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const BoxShapeSW *box_A = static_cast(p_a); const ConvexPolygonShapeSW *convex_polygon_B = static_cast(p_b); - SeparatorAxisTest separator(box_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector); + SeparatorAxisTest separator(box_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) return; @@ -886,18 +971,84 @@ static void _collision_box_convex_polygon(const ShapeSW *p_a,const Transform &p_ } } + if (withMargin) { + + // calculate closest points between vertices and box edges + for(int v=0;vget_half_extents().x : box_A->get_half_extents().x, + (cnormal_a.y<0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y, + (cnormal_a.z<0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z + ) ); + + + Vector3 axis_ab = support_a-vtxb; + + if (!separator.test_axis( axis_ab.normalized() )) { + return; + } + + //now try edges, which become cylinders! + + for(int i=0;i<3;i++) { + + //a ->b + Vector3 axis_a = p_transform_a.basis.get_axis(i); + + if (!separator.test_axis( axis_ab.cross(axis_a).cross(axis_a).normalized() )) + return; + } + } + + //convex edges and box points + for (int i=0;i<2;i++) { + for (int j=0;j<2;j++) { + for (int k=0;k<2;k++) { + Vector3 he = box_A->get_half_extents(); + he.x*=(i*2-1); + he.y*=(j*2-1); + he.z*=(k*2-1); + Vector3 point=p_transform_a.origin; + for(int l=0;l<3;l++) + point+=p_transform_a.basis.get_axis(l)*he[l]; + + for(int e=0;e +static void _collision_box_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const BoxShapeSW *box_A = static_cast(p_a); const FaceShapeSW *face_B = static_cast(p_b); - SeparatorAxisTest separator(box_A,p_transform_a,face_B,p_transform_b,p_collector); + SeparatorAxisTest separator(box_A,p_transform_a,face_B,p_transform_b,p_collector,p_margin_a,p_margin_b); Vector3 vertex[3]={ p_transform_b.xform( face_B->vertex[0] ), @@ -918,13 +1069,14 @@ static void _collision_box_face(const ShapeSW *p_a,const Transform &p_transform_ } // combined edges + for(int i=0;i<3;i++) { Vector3 e=vertex[i]-vertex[(i+1)%3]; - for (int i=0;i<3;i++) { + for (int j=0;j<3;j++) { - Vector3 axis = p_transform_a.basis.get_axis(i); + Vector3 axis = p_transform_a.basis.get_axis(j); if (!separator.test_axis( e.cross(axis).normalized() )) return; @@ -932,16 +1084,82 @@ static void _collision_box_face(const ShapeSW *p_a,const Transform &p_transform_ } + if (withMargin) { + + // calculate closest points between vertices and box edges + for(int v=0;v<3;v++) { + + + Vector3 ab_vec = vertex[v] - p_transform_a.origin; + + Vector3 cnormal_a=p_transform_a.basis.xform_inv( ab_vec ); + + Vector3 support_a=p_transform_a.xform( Vector3( + + (cnormal_a.x<0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x, + (cnormal_a.y<0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y, + (cnormal_a.z<0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z + ) ); + + + Vector3 axis_ab = support_a-vertex[v]; + + if (!separator.test_axis( axis_ab.normalized() )) { + return; + } + + //now try edges, which become cylinders! + + for(int i=0;i<3;i++) { + + //a ->b + Vector3 axis_a = p_transform_a.basis.get_axis(i); + + if (!separator.test_axis( axis_ab.cross(axis_a).cross(axis_a).normalized() )) + return; + } + } + + //convex edges and box points, there has to be a way to speed up this (get closest point?) + for (int i=0;i<2;i++) { + for (int j=0;j<2;j++) { + for (int k=0;k<2;k++) { + Vector3 he = box_A->get_half_extents(); + he.x*=(i*2-1); + he.y*=(j*2-1); + he.z*=(k*2-1); + Vector3 point=p_transform_a.origin; + for(int l=0;l<3;l++) + point+=p_transform_a.basis.get_axis(l)*he[l]; + + for(int e=0;e<3;e++) { + + Vector3 p1=vertex[e]; + Vector3 p2=vertex[(e+1)%3]; + + Vector3 n = (p2-p1); + + if (!separator.test_axis( (point-p2).cross(n).cross(n).normalized() )) + return; + } + } + } + } + + } + separator.generate_contacts(); } -static void _collision_capsule_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { + +template +static void _collision_capsule_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const CapsuleShapeSW *capsule_A = static_cast(p_a); const CapsuleShapeSW *capsule_B = static_cast(p_b); - SeparatorAxisTest separator(capsule_A,p_transform_a,capsule_B,p_transform_b,p_collector); + SeparatorAxisTest separator(capsule_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) return; @@ -993,13 +1211,14 @@ static void _collision_capsule_capsule(const ShapeSW *p_a,const Transform &p_tra } -static void _collision_capsule_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { +template +static void _collision_capsule_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const CapsuleShapeSW *capsule_A = static_cast(p_a); const ConvexPolygonShapeSW *convex_polygon_B = static_cast(p_b); - SeparatorAxisTest separator(capsule_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector); + SeparatorAxisTest separator(capsule_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) return; @@ -1063,12 +1282,14 @@ static void _collision_capsule_convex_polygon(const ShapeSW *p_a,const Transform } -static void _collision_capsule_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b, _CollectorCallback *p_collector) { + +template +static void _collision_capsule_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const CapsuleShapeSW *capsule_A = static_cast(p_a); const FaceShapeSW *face_B = static_cast(p_b); - SeparatorAxisTest separator(capsule_A,p_transform_a,face_B,p_transform_b,p_collector); + SeparatorAxisTest separator(capsule_A,p_transform_a,face_B,p_transform_b,p_collector,p_margin_a,p_margin_b); @@ -1125,13 +1346,14 @@ static void _collision_capsule_face(const ShapeSW *p_a,const Transform &p_transf } -static void _collision_convex_polygon_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector) { +template +static void _collision_convex_polygon_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const ConvexPolygonShapeSW *convex_polygon_A = static_cast(p_a); const ConvexPolygonShapeSW *convex_polygon_B = static_cast(p_b); - SeparatorAxisTest separator(convex_polygon_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector); + SeparatorAxisTest separator(convex_polygon_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector,p_margin_a,p_margin_b); if (!separator.test_previous_axis()) return; @@ -1192,17 +1414,70 @@ static void _collision_convex_polygon_convex_polygon(const ShapeSW *p_a,const Tr } } + if (withMargin) { + + //vertex-vertex + for(int i=0;i +static void _collision_convex_polygon_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) { const ConvexPolygonShapeSW *convex_polygon_A = static_cast(p_a); const FaceShapeSW *face_B = static_cast(p_b); - SeparatorAxisTest separator(convex_polygon_A,p_transform_a,face_B,p_transform_b,p_collector); + SeparatorAxisTest separator(convex_polygon_A,p_transform_a,face_B,p_transform_b,p_collector,p_margin_a,p_margin_b); const Geometry::MeshData &mesh = convex_polygon_A->get_mesh(); @@ -1252,12 +1527,62 @@ static void _collision_convex_polygon_face(const ShapeSW *p_a,const Transform &p } } + + if (withMargin) { + + //vertex-vertex + for(int i=0;iget_type(); @@ -1273,26 +1598,54 @@ bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_tran static const CollisionFunc collision_table[5][5]={ - {_collision_sphere_sphere, - _collision_sphere_box, - _collision_sphere_capsule, - _collision_sphere_convex_polygon, - _collision_sphere_face}, + {_collision_sphere_sphere, + _collision_sphere_box, + _collision_sphere_capsule, + _collision_sphere_convex_polygon, + _collision_sphere_face}, {0, - _collision_box_box, - _collision_box_capsule, - _collision_box_convex_polygon, - _collision_box_face}, + _collision_box_box, + _collision_box_capsule, + _collision_box_convex_polygon, + _collision_box_face}, {0, 0, - _collision_capsule_capsule, - _collision_capsule_convex_polygon, - _collision_capsule_face}, + _collision_capsule_capsule, + _collision_capsule_convex_polygon, + _collision_capsule_face}, {0, 0, 0, - _collision_convex_polygon_convex_polygon, - _collision_convex_polygon_face}, + _collision_convex_polygon_convex_polygon, + _collision_convex_polygon_face}, + {0, + 0, + 0, + 0, + 0}, + }; + + static const CollisionFunc collision_table_margin[5][5]={ + {_collision_sphere_sphere, + _collision_sphere_box, + _collision_sphere_capsule, + _collision_sphere_convex_polygon, + _collision_sphere_face}, + {0, + _collision_box_box, + _collision_box_capsule, + _collision_box_convex_polygon, + _collision_box_face}, + {0, + 0, + _collision_capsule_capsule, + _collision_capsule_convex_polygon, + _collision_capsule_face}, + {0, + 0, + 0, + _collision_convex_polygon_convex_polygon, + _collision_convex_polygon_face}, {0, 0, 0, @@ -1311,20 +1664,30 @@ bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_tran const ShapeSW *B=p_shape_B; const Transform *transform_A=&p_transform_A; const Transform *transform_B=&p_transform_B; + float margin_A=p_margin_a; + float margin_B=p_margin_b; if (type_A > type_B) { SWAP(A,B); SWAP(transform_A,transform_B); SWAP(type_A,type_B); + SWAP(margin_A,margin_B); callback.swap = !callback.swap; } - CollisionFunc collision_func = collision_table[type_A-2][type_B-2]; + CollisionFunc collision_func; + if (margin_A!=0.0 || margin_B!=0.0) { + collision_func = collision_table_margin[type_A-2][type_B-2]; + + } else { + collision_func = collision_table[type_A-2][type_B-2]; + + } ERR_FAIL_COND_V(!collision_func,false); - collision_func(A,*transform_A,B,*transform_B,&callback); + collision_func(A,*transform_A,B,*transform_B,&callback,margin_A,margin_B); return callback.collided; diff --git a/servers/physics/collision_solver_sat.h b/servers/physics/collision_solver_sat.h index 5023a17810f..eeba53f1606 100644 --- a/servers/physics/collision_solver_sat.h +++ b/servers/physics/collision_solver_sat.h @@ -32,6 +32,6 @@ #include "collision_solver_sw.h" -bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, CollisionSolverSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap=false,Vector3* r_prev_axis=NULL); +bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, CollisionSolverSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap=false,Vector3* r_prev_axis=NULL,float p_margin_a=0,float p_margin_b=0); #endif // COLLISION_SOLVER_SAT_H diff --git a/servers/physics/collision_solver_sw.cpp b/servers/physics/collision_solver_sw.cpp index da28a4934fa..673f2d43857 100644 --- a/servers/physics/collision_solver_sw.cpp +++ b/servers/physics/collision_solver_sw.cpp @@ -114,6 +114,10 @@ struct _ConcaveCollisionInfo { bool collided; int aabb_tests; int collisions; + bool tested; + float margin_A; + float margin_B; + Vector3 close_A,close_B; }; @@ -123,7 +127,7 @@ void CollisionSolverSW::concave_callback(void *p_userdata, ShapeSW *p_convex) { _ConcaveCollisionInfo &cinfo = *(_ConcaveCollisionInfo*)(p_userdata); cinfo.aabb_tests++; - bool collided = collision_solver(cinfo.shape_A, *cinfo.transform_A, p_convex,*cinfo.transform_B, cinfo.result_callback, cinfo.userdata, cinfo.swap_result ); + bool collided = collision_solver(cinfo.shape_A, *cinfo.transform_A, p_convex,*cinfo.transform_B, cinfo.result_callback, cinfo.userdata, cinfo.swap_result,NULL,cinfo.margin_A,cinfo.margin_B); if (!collided) return; @@ -132,7 +136,7 @@ void CollisionSolverSW::concave_callback(void *p_userdata, ShapeSW *p_convex) { } -bool CollisionSolverSW::solve_concave(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result) { +bool CollisionSolverSW::solve_concave(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,float p_margin_A,float p_margin_B) { const ConcaveShapeSW *concave_B=static_cast(p_shape_B); @@ -146,6 +150,8 @@ bool CollisionSolverSW::solve_concave(const ShapeSW *p_shape_A,const Transform& cinfo.swap_result=p_swap_result; cinfo.collided=false; cinfo.collisions=0; + cinfo.margin_A=p_margin_A; + cinfo.margin_B=p_margin_B; cinfo.aabb_tests=0; @@ -163,21 +169,23 @@ bool CollisionSolverSW::solve_concave(const ShapeSW *p_shape_A,const Transform& float smin,smax; p_shape_A->project_range(axis,rel_transform,smin,smax); + smin-=p_margin_A; + smax+=p_margin_A; smin*=axis_scale; smax*=axis_scale; + local_aabb.pos[i]=smin; local_aabb.size[i]=smax-smin; } concave_B->cull(local_aabb,concave_callback,&cinfo); - return cinfo.collided; } -bool CollisionSolverSW::solve_static(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,Vector3 *r_sep_axis) { +bool CollisionSolverSW::solve_static(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,Vector3 *r_sep_axis,float p_margin_A,float p_margin_B) { PhysicsServer::ShapeType type_A=p_shape_A->get_type(); @@ -225,17 +233,126 @@ bool CollisionSolverSW::solve_static(const ShapeSW *p_shape_A,const Transform& p return false; if (!swap) - return solve_concave(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false); + return solve_concave(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false,p_margin_A,p_margin_B); else - return solve_concave(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true); + return solve_concave(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true,p_margin_A,p_margin_B); } else { - return collision_solver(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback,p_userdata,false,r_sep_axis); + return collision_solver(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback,p_userdata,false,r_sep_axis,p_margin_A,p_margin_B); } return false; } + + +void CollisionSolverSW::concave_distance_callback(void *p_userdata, ShapeSW *p_convex) { + + + _ConcaveCollisionInfo &cinfo = *(_ConcaveCollisionInfo*)(p_userdata); + cinfo.aabb_tests++; + if (cinfo.collided) + return; + + Vector3 close_A,close_B; + cinfo.collided = !gjk_epa_calculate_distance(cinfo.shape_A,*cinfo.transform_A,p_convex,*cinfo.transform_B,close_A,close_B); + + if (cinfo.collided) + return; + if (!cinfo.tested || close_A.distance_squared_to(close_B) < cinfo.close_A.distance_squared_to(cinfo.close_B)) { + + cinfo.close_A=close_A; + cinfo.close_B=close_B; + cinfo.tested=true; + } + + cinfo.collisions++; + +} + + +bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B,const AABB& p_concave_hint,Vector3 *r_sep_axis) { + + if (p_shape_A->is_concave()) + return false; + + if (p_shape_B->get_type()==PhysicsServer::SHAPE_PLANE) { + + return false; //unsupported + + } else if (p_shape_B->is_concave()) { + + if (p_shape_A->is_concave()) + return false; + + + const ConcaveShapeSW *concave_B=static_cast(p_shape_B); + + _ConcaveCollisionInfo cinfo; + cinfo.transform_A=&p_transform_A; + cinfo.shape_A=p_shape_A; + cinfo.transform_B=&p_transform_B; + cinfo.result_callback=NULL; + cinfo.userdata=NULL; + cinfo.swap_result=false; + cinfo.collided=false; + cinfo.collisions=0; + cinfo.aabb_tests=0; + cinfo.tested=false; + + Transform rel_transform = p_transform_A; + rel_transform.origin-=p_transform_B.origin; + + //quickly compute a local AABB + + bool use_cc_hint=p_concave_hint!=AABB(); + AABB cc_hint_aabb; + if (use_cc_hint) { + cc_hint_aabb=p_concave_hint; + cc_hint_aabb.pos-=p_transform_B.origin; + } + + AABB local_aabb; + for(int i=0;i<3;i++) { + + Vector3 axis( p_transform_B.basis.get_axis(i) ); + float axis_scale = 1.0/axis.length(); + axis*=axis_scale; + + float smin,smax; + + if (use_cc_hint) { + cc_hint_aabb.project_range_in_plane(Plane(axis,0),smin,smax); + } else { + p_shape_A->project_range(axis,rel_transform,smin,smax); + } + + smin*=axis_scale; + smax*=axis_scale; + + local_aabb.pos[i]=smin; + local_aabb.size[i]=smax-smin; + } + + + concave_B->cull(local_aabb,concave_distance_callback,&cinfo); + if (!cinfo.collided) { +// print_line(itos(cinfo.tested)); + r_point_A=cinfo.close_A; + r_point_B=cinfo.close_B; + + } + + return !cinfo.collided; + } else { + + return gjk_epa_calculate_distance(p_shape_A,p_transform_A,p_shape_B,p_transform_B,r_point_A,r_point_B); //should pass sepaxis.. + } + + + return false; +} + diff --git a/servers/physics/collision_solver_sw.h b/servers/physics/collision_solver_sw.h index e135ab92e0a..430f057c7c6 100644 --- a/servers/physics/collision_solver_sw.h +++ b/servers/physics/collision_solver_sw.h @@ -40,12 +40,14 @@ private: static void concave_callback(void *p_userdata, ShapeSW *p_convex); static bool solve_static_plane(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result); static bool solve_ray(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result); - static bool solve_concave(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result); + static bool solve_concave(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,float p_margin_A=0,float p_margin_B=0); + static void concave_distance_callback(void *p_userdata, ShapeSW *p_convex); public: - static bool solve_static(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,Vector3 *r_sep_axis=NULL); + static bool solve_static(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,Vector3 *r_sep_axis=NULL,float p_margin_A=0,float p_margin_B=0); + static bool solve_distance(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B,const AABB& p_concave_hint,Vector3 *r_sep_axis=NULL); }; diff --git a/servers/physics/gjk_epa.cpp b/servers/physics/gjk_epa.cpp index 37edc0d4144..9b5b3d4f678 100644 --- a/servers/physics/gjk_epa.cpp +++ b/servers/physics/gjk_epa.cpp @@ -1,31 +1,14 @@ -/*************************************************************************/ -/* gjk_epa.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ +/*************************************************/ +/* gjk_epa.cpp */ +/*************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/*************************************************/ +/* Source code within this file is: */ +/* (c) 2007-2010 Juan Linietsky, Ariel Manzur */ +/* All Rights Reserved. */ +/*************************************************/ + #include "gjk_epa.h" /*************** Bullet's GJK-EPA2 IMPLEMENTATION *******************/ @@ -798,8 +781,8 @@ bool Distance( const ShapeSW* shape0, w0+=shape.Support( gjk.m_simplex->c[i]->d,0)*p; w1+=shape.Support(-gjk.m_simplex->c[i]->d,1)*p; } - results.witnesses[0] = wtrs0.xform(w0); - results.witnesses[1] = wtrs0.xform(w1); + results.witnesses[0] = w0; + results.witnesses[1] = w1; results.normal = w0-w1; results.distance = results.normal.length(); results.normal /= results.distance>GJK_MIN_DISTANCE?results.distance:1; @@ -881,6 +864,24 @@ bool Penetration( const ShapeSW* shape0, + + +bool gjk_epa_calculate_distance(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, Vector3& r_result_A, Vector3& r_result_B) { + + + GjkEpa2::sResults res; + + if (GjkEpa2::Distance(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_transform_B.origin-p_transform_A.origin,res)) { + + r_result_A=res.witnesses[0]; + r_result_B=res.witnesses[1]; + return true; + } + + return false; + +} + bool gjk_epa_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, CollisionSolverSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap ) { GjkEpa2::sResults res; diff --git a/servers/physics/gjk_epa.h b/servers/physics/gjk_epa.h index 0303478f170..08b0a65b15c 100644 --- a/servers/physics/gjk_epa.h +++ b/servers/physics/gjk_epa.h @@ -1,31 +1,14 @@ -/*************************************************************************/ -/* gjk_epa.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ +/*************************************************/ +/* gjk_epa.h */ +/*************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/*************************************************/ +/* Source code within this file is: */ +/* (c) 2007-2010 Juan Linietsky, Ariel Manzur */ +/* All Rights Reserved. */ +/*************************************************/ + #ifndef GJK_EPA_H #define GJK_EPA_H @@ -36,5 +19,6 @@ #include "collision_solver_sw.h" bool gjk_epa_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, CollisionSolverSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap=false); +bool gjk_epa_calculate_distance(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, Vector3& r_result_A, Vector3& r_result_B); #endif diff --git a/servers/physics/physics_server_sw.cpp b/servers/physics/physics_server_sw.cpp index aff60b58817..a30383a88db 100644 --- a/servers/physics/physics_server_sw.cpp +++ b/servers/physics/physics_server_sw.cpp @@ -568,6 +568,25 @@ bool PhysicsServerSW::body_is_continuous_collision_detection_enabled(RID p_body) return body->is_continuous_collision_detection_enabled(); } +void PhysicsServerSW::body_set_layer_mask(RID p_body, uint32_t p_mask) { + + BodySW *body = body_owner.get(p_body); + ERR_FAIL_COND(!body); + + body->set_layer_mask(p_mask); + +} + +uint32_t PhysicsServerSW::body_get_layer_mask(RID p_body, uint32_t p_mask) const{ + + const BodySW *body = body_owner.get(p_body); + ERR_FAIL_COND_V(!body,0); + + return body->get_layer_mask(); + +} + + void PhysicsServerSW::body_attach_object_instance_ID(RID p_body,uint32_t p_ID) { BodySW *body = body_owner.get(p_body); @@ -618,13 +637,6 @@ float PhysicsServerSW::body_get_param(RID p_body, BodyParameter p_param) const { }; -void PhysicsServerSW::body_static_simulate_motion(RID p_body,const Transform& p_new_transform) { - - BodySW *body = body_owner.get(p_body); - ERR_FAIL_COND(!body); - body->simulate_motion(p_new_transform,last_step); - -}; void PhysicsServerSW::body_set_state(RID p_body, BodyState p_state, const Variant& p_variant) { @@ -1021,11 +1033,18 @@ void PhysicsServerSW::step(float p_step) { last_step=p_step; PhysicsDirectBodyStateSW::singleton->step=p_step; + island_count=0; + active_objects=0; + collision_pairs=0; for( Set::Element *E=active_spaces.front();E;E=E->next()) { stepper->step((SpaceSW*)E->get(),p_step,iterations); + island_count+=E->get()->get_island_count(); + active_objects+=E->get()->get_active_objects(); + collision_pairs+=E->get()->get_collision_pairs(); } -}; + +} void PhysicsServerSW::sync() { @@ -1054,9 +1073,72 @@ void PhysicsServerSW::finish() { }; +int PhysicsServerSW::get_process_info(ProcessInfo p_info) { + + switch(p_info) { + + case INFO_ACTIVE_OBJECTS: { + + return active_objects; + } break; + case INFO_COLLISION_PAIRS: { + return collision_pairs; + } break; + case INFO_ISLAND_COUNT: { + + return island_count; + } break; + + } + + return 0; +} + + +void PhysicsServerSW::_shape_col_cbk(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata) { + + + CollCbkData *cbk=(CollCbkData *)p_userdata; + + if (cbk->max==0) + return; + + if (cbk->amount == cbk->max) { + //find least deep + float min_depth=1e20; + int min_depth_idx=0; + for(int i=0;iamount;i++) { + + float d = cbk->ptr[i*2+0].distance_squared_to(cbk->ptr[i*2+1]); + if (dptr[min_depth_idx*2+0]=p_point_A; + cbk->ptr[min_depth_idx*2+1]=p_point_B; + + + } else { + + cbk->ptr[cbk->amount*2+0]=p_point_A; + cbk->ptr[cbk->amount*2+1]=p_point_B; + cbk->amount++; + } +} + + PhysicsServerSW::PhysicsServerSW() { BroadPhaseSW::create_func=BroadPhaseOctree::_create; + island_count=0; + active_objects=0; + collision_pairs=0; active=true; diff --git a/servers/physics/physics_server_sw.h b/servers/physics/physics_server_sw.h index 0822d76936d..185867e8174 100644 --- a/servers/physics/physics_server_sw.h +++ b/servers/physics/physics_server_sw.h @@ -47,6 +47,10 @@ friend class PhysicsDirectSpaceStateSW; bool doing_sync; real_t last_step; + int island_count; + int active_objects; + int collision_pairs; + StepSW *stepper; Set active_spaces; @@ -61,6 +65,15 @@ friend class PhysicsDirectSpaceStateSW; // void _clear_query(QuerySW *p_query); public: + struct CollCbkData { + + int max; + int amount; + Vector3 *ptr; + }; + + static void _shape_col_cbk(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata); + virtual RID shape_create(ShapeType p_shape); virtual void shape_set_data(RID p_shape, const Variant& p_data); virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias); @@ -146,15 +159,15 @@ public: virtual void body_set_enable_continuous_collision_detection(RID p_body,bool p_enable); virtual bool body_is_continuous_collision_detection_enabled(RID p_body) const; + virtual void body_set_layer_mask(RID p_body, uint32_t p_mask); + virtual uint32_t body_get_layer_mask(RID p_body, uint32_t p_mask) const; + virtual void body_set_user_flags(RID p_body, uint32_t p_flags); virtual uint32_t body_get_user_flags(RID p_body, uint32_t p_flags) const; virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value); virtual float body_get_param(RID p_body, BodyParameter p_param) const; - //advanced simulation - virtual void body_static_simulate_motion(RID p_body,const Transform& p_new_transform); - virtual void body_set_state(RID p_body, BodyState p_state, const Variant& p_variant); virtual Variant body_get_state(RID p_body, BodyState p_state) const; @@ -209,6 +222,8 @@ public: virtual void flush_queries(); virtual void finish(); + int get_process_info(ProcessInfo p_info); + PhysicsServerSW(); ~PhysicsServerSW(); diff --git a/servers/physics/shape_sw.cpp b/servers/physics/shape_sw.cpp index 1312b7da959..bd4be05bb9e 100644 --- a/servers/physics/shape_sw.cpp +++ b/servers/physics/shape_sw.cpp @@ -928,8 +928,8 @@ void FaceShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supp for (int i=0;i<3;i++) { int nx=(i+1)%3; - //if (i!=vert_support_idx && nx!=vert_support_idx) - // continue; + if (i!=vert_support_idx && nx!=vert_support_idx) + continue; // check if edge is valid as a support float dot=(vertex[i]-vertex[nx]).normalized().dot(n); @@ -951,8 +951,12 @@ bool FaceShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end, bool c=Geometry::segment_intersects_triangle(p_begin,p_end,vertex[0],vertex[1],vertex[2],&r_result); - if (c) + if (c) { r_normal=Plane(vertex[0],vertex[1],vertex[2]).normal; + if (r_normal.dot(p_end-p_begin)>0) { + r_normal=-r_normal; + } + } return c; } @@ -1070,13 +1074,15 @@ void ConcavePolygonShapeSW::_cull_segment(int p_idx,_SegmentCullParams *p_params &res)) { - float d=p_params->normal.dot(res) - p_params->normal.dot(p_params->from); + float d=p_params->dir.dot(res) - p_params->dir.dot(p_params->from); //TODO, seems segmen/triangle intersection is broken :( if (d>0 && dmin_d) { p_params->min_d=d; p_params->result=res; p_params->normal=Plane(vertices[0],vertices[1],vertices[2]).normal; + if (p_params->normal.dot(p_params->dir)>0) + p_params->normal=-p_params->normal; p_params->collisions++; } @@ -1107,7 +1113,7 @@ bool ConcavePolygonShapeSW::intersect_segment(const Vector3& p_begin,const Vecto params.from=p_begin; params.to=p_end; params.collisions=0; - params.normal=(p_end-p_begin).normalized(); + params.dir=(p_end-p_begin).normalized(); params.faces=fr.ptr(); params.vertices=vr.ptr(); diff --git a/servers/physics/shape_sw.h b/servers/physics/shape_sw.h index 890d6d87417..cdb21556b83 100644 --- a/servers/physics/shape_sw.h +++ b/servers/physics/shape_sw.h @@ -26,405 +26,446 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef SHAPE_SW_H -#define SHAPE_SW_H - -#include "servers/physics_server.h" -#include "bsp_tree.h" -#include "geometry.h" -/* - -SHAPE_LINE, ///< plane:"plane" -SHAPE_SEGMENT, ///< float:"length" -SHAPE_CIRCLE, ///< float:"radius" -SHAPE_RECTANGLE, ///< vec3:"extents" -SHAPE_CONVEX_POLYGON, ///< array of planes:"planes" -SHAPE_CONCAVE_POLYGON, ///< Vector3 array:"triangles" , or Dictionary with "indices" (int array) and "triangles" (Vector3 array) -SHAPE_CUSTOM, ///< Server-Implementation based custom shape, calling shape_create() with this value will result in an error - -*/ - -class ShapeSW; - -class ShapeOwnerSW { -public: - - virtual void _shape_changed()=0; - virtual void remove_shape(ShapeSW *p_shape)=0; - - virtual ~ShapeOwnerSW() {} -}; - - -class ShapeSW { - - RID self; - AABB aabb; - bool configured; - real_t custom_bias; - - Map owners; -protected: - - void configure(const AABB& p_aabb); -public: - - enum { - MAX_SUPPORTS=8 - }; - - _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; } - _FORCE_INLINE_ RID get_self() const {return self; } - - virtual PhysicsServer::ShapeType get_type() const=0; - - _FORCE_INLINE_ AABB get_aabb() const { return aabb; } - _FORCE_INLINE_ bool is_configured() const { return configured; } - - virtual bool is_concave() const { return false; } - - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const=0; - virtual Vector3 get_support(const Vector3& p_normal) const; - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const=0; - - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_point, Vector3 &r_normal) const=0; - virtual Vector3 get_moment_of_inertia(float p_mass) const=0; - - virtual void set_data(const Variant& p_data)=0; - virtual Variant get_data() const=0; - - _FORCE_INLINE_ void set_custom_bias(real_t p_bias) { custom_bias=p_bias; } - _FORCE_INLINE_ real_t get_custom_bias() const { return custom_bias; } - - void add_owner(ShapeOwnerSW *p_owner); - void remove_owner(ShapeOwnerSW *p_owner); - bool is_owner(ShapeOwnerSW *p_owner) const; - const Map& get_owners() const; - - ShapeSW(); - virtual ~ShapeSW(); -}; - - -class ConcaveShapeSW : public ShapeSW { - -public: - - virtual bool is_concave() const { return true; } - typedef void (*Callback)(void* p_userdata,ShapeSW *p_convex); - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const { r_amount=0; } - - virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const=0; - - ConcaveShapeSW() {} -}; - -class PlaneShapeSW : public ShapeSW { - - Plane plane; - - void _setup(const Plane& p_plane); -public: - - Plane get_plane() const; - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_PLANE; } - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - virtual Vector3 get_support(const Vector3& p_normal) const; - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const { r_amount=0; } - - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - virtual Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - PlaneShapeSW(); -}; - -class RayShapeSW : public ShapeSW { - - float length; - - void _setup(float p_length); -public: - - float get_length() const; - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_RAY; } - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - virtual Vector3 get_support(const Vector3& p_normal) const; - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; - - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - virtual Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - RayShapeSW(); -}; - -class SphereShapeSW : public ShapeSW { - - real_t radius; - - void _setup(real_t p_radius); -public: - - real_t get_radius() const; - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_SPHERE; } - - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - virtual Vector3 get_support(const Vector3& p_normal) const; - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - virtual Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - SphereShapeSW(); -}; - -class BoxShapeSW : public ShapeSW { - - Vector3 half_extents; - void _setup(const Vector3& p_half_extents); -public: - - _FORCE_INLINE_ Vector3 get_half_extents() const { return half_extents; } - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_BOX; } - - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - virtual Vector3 get_support(const Vector3& p_normal) const; - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - virtual Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - BoxShapeSW(); -}; - -class CapsuleShapeSW : public ShapeSW { - - real_t height; - real_t radius; - - - void _setup(real_t p_height,real_t p_radius); -public: - - _FORCE_INLINE_ real_t get_height() const { return height; } - _FORCE_INLINE_ real_t get_radius() const { return radius; } - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CAPSULE; } - - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - virtual Vector3 get_support(const Vector3& p_normal) const; - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - virtual Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - CapsuleShapeSW(); -}; - -struct ConvexPolygonShapeSW : public ShapeSW { - - Geometry::MeshData mesh; - - void _setup(const Vector& p_vertices); -public: - - const Geometry::MeshData& get_mesh() const { return mesh; } - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONVEX_POLYGON; } - - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - virtual Vector3 get_support(const Vector3& p_normal) const; - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - virtual Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - ConvexPolygonShapeSW(); - -}; - - -struct _VolumeSW_BVH; -struct FaceShapeSW; - -struct ConcavePolygonShapeSW : public ConcaveShapeSW { - // always a trimesh - - struct Face { - - Vector3 normal; - int indices[3]; - }; - - DVector faces; - DVector vertices; - - struct BVH { - - AABB aabb; - int left; - int right; - - int face_index; - }; - - DVector bvh; - - struct _CullParams { - - AABB aabb; - Callback callback; - void *userdata; - const Face *faces; - const Vector3 *vertices; - const BVH *bvh; - FaceShapeSW *face; - }; - - struct _SegmentCullParams { - - Vector3 from; - Vector3 to; - const Face *faces; - const Vector3 *vertices; - const BVH *bvh; - - Vector3 result; - Vector3 normal; - real_t min_d; - int collisions; - - }; - - void _cull_segment(int p_idx,_SegmentCullParams *p_params) const; - void _cull(int p_idx,_CullParams *p_params) const; - - void _fill_bvh(_VolumeSW_BVH* p_bvh_tree,BVH* p_bvh_array,int& p_idx); - - - void _setup(DVector p_faces); -public: - - DVector get_faces() const; - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONCAVE_POLYGON; } - - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - virtual Vector3 get_support(const Vector3& p_normal) const; - - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const; - - virtual Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - ConcavePolygonShapeSW(); - -}; - - -struct HeightMapShapeSW : public ConcaveShapeSW { - - DVector heights; - int width; - int depth; - float cell_size; - -// void _cull_segment(int p_idx,_SegmentCullParams *p_params) const; -// void _cull(int p_idx,_CullParams *p_params) const; - - void _setup(DVector p_heights,int p_width,int p_depth,float p_cell_size); -public: - - DVector get_heights() const; - int get_width() const; - int get_depth() const; - float get_cell_size() const; - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_HEIGHTMAP; } - - virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - virtual Vector3 get_support(const Vector3& p_normal) const; - virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const; - - virtual Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data); - virtual Variant get_data() const; - - HeightMapShapeSW(); - -}; - -//used internally -struct FaceShapeSW : public ShapeSW { - - Vector3 normal; //cache - Vector3 vertex[3]; - - virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONCAVE_POLYGON; } - - const Vector3& get_vertex(int p_idx) const { return vertex[p_idx]; } - - void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; - Vector3 get_support(const Vector3& p_normal) const; - virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; - bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; - - Vector3 get_moment_of_inertia(float p_mass) const; - - virtual void set_data(const Variant& p_data) {} - virtual Variant get_data() const { return Variant(); } - - FaceShapeSW(); -}; - - - - - -struct _ShapeTestConvexBSPSW { - - const BSP_Tree *bsp; - const ShapeSW *shape; - Transform transform; - - _FORCE_INLINE_ void project_range(const Vector3& p_normal, real_t& r_min, real_t& r_max) const { - - shape->project_range(p_normal,transform,r_min,r_max); - } - -}; - - - - -#endif // SHAPESW_H +#ifndef SHAPE_SW_H +#define SHAPE_SW_H + +#include "servers/physics_server.h" +#include "bsp_tree.h" +#include "geometry.h" +/* + +SHAPE_LINE, ///< plane:"plane" +SHAPE_SEGMENT, ///< float:"length" +SHAPE_CIRCLE, ///< float:"radius" +SHAPE_RECTANGLE, ///< vec3:"extents" +SHAPE_CONVEX_POLYGON, ///< array of planes:"planes" +SHAPE_CONCAVE_POLYGON, ///< Vector3 array:"triangles" , or Dictionary with "indices" (int array) and "triangles" (Vector3 array) +SHAPE_CUSTOM, ///< Server-Implementation based custom shape, calling shape_create() with this value will result in an error + +*/ + +class ShapeSW; + +class ShapeOwnerSW { +public: + + virtual void _shape_changed()=0; + virtual void remove_shape(ShapeSW *p_shape)=0; + + virtual ~ShapeOwnerSW() {} +}; + + +class ShapeSW { + + RID self; + AABB aabb; + bool configured; + real_t custom_bias; + + Map owners; +protected: + + void configure(const AABB& p_aabb); +public: + + enum { + MAX_SUPPORTS=8 + }; + + _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; } + _FORCE_INLINE_ RID get_self() const {return self; } + + virtual PhysicsServer::ShapeType get_type() const=0; + + _FORCE_INLINE_ AABB get_aabb() const { return aabb; } + _FORCE_INLINE_ bool is_configured() const { return configured; } + + virtual bool is_concave() const { return false; } + + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const=0; + virtual Vector3 get_support(const Vector3& p_normal) const; + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const=0; + + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_point, Vector3 &r_normal) const=0; + virtual Vector3 get_moment_of_inertia(float p_mass) const=0; + + virtual void set_data(const Variant& p_data)=0; + virtual Variant get_data() const=0; + + _FORCE_INLINE_ void set_custom_bias(real_t p_bias) { custom_bias=p_bias; } + _FORCE_INLINE_ real_t get_custom_bias() const { return custom_bias; } + + void add_owner(ShapeOwnerSW *p_owner); + void remove_owner(ShapeOwnerSW *p_owner); + bool is_owner(ShapeOwnerSW *p_owner) const; + const Map& get_owners() const; + + ShapeSW(); + virtual ~ShapeSW(); +}; + + +class ConcaveShapeSW : public ShapeSW { + +public: + + virtual bool is_concave() const { return true; } + typedef void (*Callback)(void* p_userdata,ShapeSW *p_convex); + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const { r_amount=0; } + + virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const=0; + + ConcaveShapeSW() {} +}; + +class PlaneShapeSW : public ShapeSW { + + Plane plane; + + void _setup(const Plane& p_plane); +public: + + Plane get_plane() const; + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_PLANE; } + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + virtual Vector3 get_support(const Vector3& p_normal) const; + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const { r_amount=0; } + + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + virtual Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + PlaneShapeSW(); +}; + +class RayShapeSW : public ShapeSW { + + float length; + + void _setup(float p_length); +public: + + float get_length() const; + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_RAY; } + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + virtual Vector3 get_support(const Vector3& p_normal) const; + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; + + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + virtual Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + RayShapeSW(); +}; + +class SphereShapeSW : public ShapeSW { + + real_t radius; + + void _setup(real_t p_radius); +public: + + real_t get_radius() const; + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_SPHERE; } + + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + virtual Vector3 get_support(const Vector3& p_normal) const; + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + virtual Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + SphereShapeSW(); +}; + +class BoxShapeSW : public ShapeSW { + + Vector3 half_extents; + void _setup(const Vector3& p_half_extents); +public: + + _FORCE_INLINE_ Vector3 get_half_extents() const { return half_extents; } + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_BOX; } + + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + virtual Vector3 get_support(const Vector3& p_normal) const; + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + virtual Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + BoxShapeSW(); +}; + +class CapsuleShapeSW : public ShapeSW { + + real_t height; + real_t radius; + + + void _setup(real_t p_height,real_t p_radius); +public: + + _FORCE_INLINE_ real_t get_height() const { return height; } + _FORCE_INLINE_ real_t get_radius() const { return radius; } + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CAPSULE; } + + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + virtual Vector3 get_support(const Vector3& p_normal) const; + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + virtual Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + CapsuleShapeSW(); +}; + +struct ConvexPolygonShapeSW : public ShapeSW { + + Geometry::MeshData mesh; + + void _setup(const Vector& p_vertices); +public: + + const Geometry::MeshData& get_mesh() const { return mesh; } + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONVEX_POLYGON; } + + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + virtual Vector3 get_support(const Vector3& p_normal) const; + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + virtual Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + ConvexPolygonShapeSW(); + +}; + + +struct _VolumeSW_BVH; +struct FaceShapeSW; + +struct ConcavePolygonShapeSW : public ConcaveShapeSW { + // always a trimesh + + struct Face { + + Vector3 normal; + int indices[3]; + }; + + DVector faces; + DVector vertices; + + struct BVH { + + AABB aabb; + int left; + int right; + + int face_index; + }; + + DVector bvh; + + struct _CullParams { + + AABB aabb; + Callback callback; + void *userdata; + const Face *faces; + const Vector3 *vertices; + const BVH *bvh; + FaceShapeSW *face; + }; + + struct _SegmentCullParams { + + Vector3 from; + Vector3 to; + const Face *faces; + const Vector3 *vertices; + const BVH *bvh; + Vector3 dir; + + Vector3 result; + Vector3 normal; + real_t min_d; + int collisions; + + }; + + void _cull_segment(int p_idx,_SegmentCullParams *p_params) const; + void _cull(int p_idx,_CullParams *p_params) const; + + void _fill_bvh(_VolumeSW_BVH* p_bvh_tree,BVH* p_bvh_array,int& p_idx); + + + void _setup(DVector p_faces); +public: + + DVector get_faces() const; + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONCAVE_POLYGON; } + + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + virtual Vector3 get_support(const Vector3& p_normal) const; + + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const; + + virtual Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + ConcavePolygonShapeSW(); + +}; + + +struct HeightMapShapeSW : public ConcaveShapeSW { + + DVector heights; + int width; + int depth; + float cell_size; + +// void _cull_segment(int p_idx,_SegmentCullParams *p_params) const; +// void _cull(int p_idx,_CullParams *p_params) const; + + void _setup(DVector p_heights,int p_width,int p_depth,float p_cell_size); +public: + + DVector get_heights() const; + int get_width() const; + int get_depth() const; + float get_cell_size() const; + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_HEIGHTMAP; } + + virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + virtual Vector3 get_support(const Vector3& p_normal) const; + virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const; + + virtual Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data); + virtual Variant get_data() const; + + HeightMapShapeSW(); + +}; + +//used internally +struct FaceShapeSW : public ShapeSW { + + Vector3 normal; //cache + Vector3 vertex[3]; + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONCAVE_POLYGON; } + + const Vector3& get_vertex(int p_idx) const { return vertex[p_idx]; } + + void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const; + Vector3 get_support(const Vector3& p_normal) const; + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const; + bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const; + + Vector3 get_moment_of_inertia(float p_mass) const; + + virtual void set_data(const Variant& p_data) {} + virtual Variant get_data() const { return Variant(); } + + FaceShapeSW(); +}; + + +struct MotionShapeSW : public ShapeSW { + + ShapeSW *shape; + Vector3 motion; + + virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONVEX_POLYGON; } + + + void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const { + + Vector3 cast = p_transform.basis.xform(motion); + real_t mina,maxa; + real_t minb,maxb; + Transform ofsb = p_transform; + ofsb.origin+=cast; + shape->project_range(p_normal,p_transform,mina,maxa); + shape->project_range(p_normal,ofsb,minb,maxb); + r_min=MIN(mina,minb); + r_max=MAX(maxa,maxb); + } + + Vector3 get_support(const Vector3& p_normal) const { + + Vector3 support = shape->get_support(p_normal); + if (p_normal.dot(motion)>0) { + support+=motion; + } + return support; + } + virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const {} + bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const { return false; } + + Vector3 get_moment_of_inertia(float p_mass) const { return Vector3(); } + + virtual void set_data(const Variant& p_data) {} + virtual Variant get_data() const { return Variant(); } + + MotionShapeSW() { configure(AABB()); } +}; + + + + +struct _ShapeTestConvexBSPSW { + + const BSP_Tree *bsp; + const ShapeSW *shape; + Transform transform; + + _FORCE_INLINE_ void project_range(const Vector3& p_normal, real_t& r_min, real_t& r_max) const { + + shape->project_range(p_normal,transform,r_min,r_max); + } + +}; + + + + +#endif // SHAPESW_H diff --git a/servers/physics/space_sw.cpp b/servers/physics/space_sw.cpp index ad86a62280f..da023e1144f 100644 --- a/servers/physics/space_sw.cpp +++ b/servers/physics/space_sw.cpp @@ -32,7 +32,22 @@ #include "physics_server_sw.h" -bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set& p_exclude,uint32_t p_user_mask) { +_FORCE_INLINE_ static bool _match_object_type_query(CollisionObjectSW *p_object, uint32_t p_layer_mask, uint32_t p_type_mask) { + + if ((p_object->get_layer_mask()&p_layer_mask)==0) + return false; + + if (p_object->get_type()==CollisionObjectSW::TYPE_AREA && !(p_type_mask&PhysicsDirectSpaceState::TYPE_MASK_AREA)) + return false; + + BodySW *body = static_cast(p_object); + + return (1<get_mode())&p_type_mask; + +} + + +bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) { ERR_FAIL_COND_V(space->locked,false); @@ -58,8 +73,8 @@ bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3& p_from, const Vecto for(int i=0;iintersection_query_results[i]->get_type()==CollisionObjectSW::TYPE_AREA) - continue; //ignore area + if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask)) + continue; if (p_exclude.has( space->intersection_query_results[i]->get_self())) continue; @@ -114,7 +129,7 @@ bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3& p_from, const Vecto } -int PhysicsDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Transform& p_xform,ShapeResult *r_results,int p_result_max,const Set& p_exclude,uint32_t p_user_mask) { +int PhysicsDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Transform& p_xform,float p_margin,ShapeResult *r_results,int p_result_max,const Set& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) { if (p_result_max<=0) return 0; @@ -136,8 +151,9 @@ int PhysicsDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Transfo if (cc>=p_result_max) break; - if (space->intersection_query_results[i]->get_type()==CollisionObjectSW::TYPE_AREA) - continue; //ignore area + if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask)) + continue; + if (p_exclude.has( space->intersection_query_results[i]->get_self())) continue; @@ -146,7 +162,7 @@ int PhysicsDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Transfo const CollisionObjectSW *col_obj=space->intersection_query_results[i]; int shape_idx=space->intersection_query_subindex_results[i]; - if (!CollisionSolverSW::solve_static(shape,p_xform,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), NULL,NULL,NULL)) + if (!CollisionSolverSW::solve_static(shape,p_xform,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), NULL,NULL,NULL,p_margin,0)) continue; r_results[cc].collider_id=col_obj->get_instance_id(); @@ -163,6 +179,283 @@ int PhysicsDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Transfo } + +bool PhysicsDirectSpaceStateSW::cast_motion(const RID& p_shape, const Transform& p_xform,const Vector3& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask,ShapeRestInfo *r_info) { + + + + ShapeSW *shape = static_cast(PhysicsServer::get_singleton())->shape_owner.get(p_shape); + ERR_FAIL_COND_V(!shape,false); + + AABB aabb = p_xform.xform(shape->get_aabb()); + aabb=aabb.merge(AABB(aabb.pos+p_motion,aabb.size)); //motion + aabb=aabb.grow(p_margin); + + //if (p_motion!=Vector3()) + // print_line(p_motion); + + int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); + + float best_safe=1; + float best_unsafe=1; + + Transform xform_inv = p_xform.affine_inverse(); + MotionShapeSW mshape; + mshape.shape=shape; + mshape.motion=xform_inv.basis.xform(p_motion); + + bool best_first=true; + + Vector3 closest_A,closest_B; + + for(int i=0;iintersection_query_results[i],p_layer_mask,p_object_type_mask)) + continue; + + if (p_exclude.has( space->intersection_query_results[i]->get_self())) + continue; //ignore excluded + + + const CollisionObjectSW *col_obj=space->intersection_query_results[i]; + int shape_idx=space->intersection_query_subindex_results[i]; + + Vector3 point_A,point_B; + Vector3 sep_axis=p_motion.normalized(); + + Transform col_obj_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx); + //test initial overlap, does it collide if going all the way? + if (CollisionSolverSW::solve_distance(&mshape,p_xform,col_obj->get_shape(shape_idx),col_obj_xform,point_A,point_B,aabb,&sep_axis)) { + //print_line("failed motion cast (no collision)"); + continue; + } + + + //test initial overlap +#if 0 + if (CollisionSolverSW::solve_static(shape,p_xform,col_obj->get_shape(shape_idx),col_obj_xform,NULL,NULL,&sep_axis)) { + print_line("failed initial cast (collision at begining)"); + return false; + } +#else + sep_axis=p_motion.normalized(); + + if (!CollisionSolverSW::solve_distance(shape,p_xform,col_obj->get_shape(shape_idx),col_obj_xform,point_A,point_B,aabb,&sep_axis)) { + //print_line("failed motion cast (no collision)"); + return false; + } +#endif + + + //just do kinematic solving + float low=0; + float hi=1; + Vector3 mnormal=p_motion.normalized(); + + for(int i=0;i<8;i++) { //steps should be customizable.. + + Transform xfa = p_xform; + float ofs = (low+hi)*0.5; + + Vector3 sep=mnormal; //important optimization for this to work fast enough + + mshape.motion=xform_inv.basis.xform(p_motion*ofs); + + Vector3 lA,lB; + + bool collided = !CollisionSolverSW::solve_distance(&mshape,p_xform,col_obj->get_shape(shape_idx),col_obj_xform,lA,lB,aabb,&sep); + + if (collided) { + + //print_line(itos(i)+": "+rtos(ofs)); + hi=ofs; + } else { + + point_A=lA; + point_B=lB; + low=ofs; + } + } + + if (lowcollider_id=col_obj->get_instance_id(); + r_info->rid=col_obj->get_self(); + r_info->shape=shape_idx; + r_info->point=closest_B; + r_info->normal=(closest_A-closest_B).normalized(); + best_first=false; + if (col_obj->get_type()==CollisionObjectSW::TYPE_BODY) { + const BodySW *body=static_cast(col_obj); + r_info->linear_velocity= body->get_linear_velocity() + (body->get_angular_velocity()).cross(body->get_transform().origin - closest_B); + } + + } + + + } + + p_closest_safe=best_safe; + p_closest_unsafe=best_unsafe; + + return true; +} + +bool PhysicsDirectSpaceStateSW::collide_shape(RID p_shape, const Transform& p_shape_xform,float p_margin,Vector3 *r_results,int p_result_max,int &r_result_count, const Set& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask){ + + if (p_result_max<=0) + return 0; + + ShapeSW *shape = static_cast(PhysicsServer::get_singleton())->shape_owner.get(p_shape); + ERR_FAIL_COND_V(!shape,0); + + AABB aabb = p_shape_xform.xform(shape->get_aabb()); + aabb=aabb.grow(p_margin); + + int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); + + bool collided=false; + int cc=0; + r_result_count=0; + + PhysicsServerSW::CollCbkData cbk; + cbk.max=p_result_max; + cbk.amount=0; + cbk.ptr=r_results; + CollisionSolverSW::CallbackResult cbkres=NULL; + + PhysicsServerSW::CollCbkData *cbkptr=NULL; + if (p_result_max>0) { + cbkptr=&cbk; + cbkres=PhysicsServerSW::_shape_col_cbk; + } + + + for(int i=0;iintersection_query_results[i],p_layer_mask,p_object_type_mask)) + continue; + + const CollisionObjectSW *col_obj=space->intersection_query_results[i]; + int shape_idx=space->intersection_query_subindex_results[i]; + + if (p_exclude.has( col_obj->get_self() )) { + continue; + } + + //print_line("AGAINST: "+itos(col_obj->get_self().get_id())+":"+itos(shape_idx)); + //print_line("THE ABBB: "+(col_obj->get_transform() * col_obj->get_shape_transform(shape_idx)).xform(col_obj->get_shape(shape_idx)->get_aabb())); + + if (CollisionSolverSW::solve_static(shape,p_shape_xform,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),cbkres,cbkptr,NULL,p_margin)) { + collided=true; + } + + } + + r_result_count=cbk.amount; + + return collided; + +} + + +struct _RestCallbackData { + + const CollisionObjectSW *object; + const CollisionObjectSW *best_object; + int shape; + int best_shape; + Vector3 best_contact; + Vector3 best_normal; + float best_len; +}; + +static void _rest_cbk_result(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata) { + + + _RestCallbackData *rd=(_RestCallbackData*)p_userdata; + + Vector3 contact_rel = p_point_B - p_point_A; + float len = contact_rel.length(); + if (len <= rd->best_len) + return; + + rd->best_len=len; + rd->best_contact=p_point_B; + rd->best_normal=contact_rel/len; + rd->best_object=rd->object; + rd->best_shape=rd->shape; + +} +bool PhysicsDirectSpaceStateSW::rest_info(RID p_shape, const Transform& p_shape_xform,float p_margin,ShapeRestInfo *r_info, const Set& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) { + + + ShapeSW *shape = static_cast(PhysicsServer::get_singleton())->shape_owner.get(p_shape); + ERR_FAIL_COND_V(!shape,0); + + AABB aabb = p_shape_xform.xform(shape->get_aabb()); + aabb=aabb.grow(p_margin); + + int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); + + _RestCallbackData rcd; + rcd.best_len=0; + rcd.best_object=NULL; + rcd.best_shape=0; + + for(int i=0;iintersection_query_results[i],p_layer_mask,p_object_type_mask)) + continue; + + const CollisionObjectSW *col_obj=space->intersection_query_results[i]; + int shape_idx=space->intersection_query_subindex_results[i]; + + if (p_exclude.has( col_obj->get_self() )) + continue; + + rcd.object=col_obj; + rcd.shape=shape_idx; + bool sc = CollisionSolverSW::solve_static(shape,p_shape_xform,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),_rest_cbk_result,&rcd,NULL,p_margin); + if (!sc) + continue; + + + } + + if (rcd.best_len==0) + return false; + + r_info->collider_id=rcd.best_object->get_instance_id(); + r_info->shape=rcd.best_shape; + r_info->normal=rcd.best_normal; + r_info->point=rcd.best_contact; + r_info->rid=rcd.best_object->get_self(); + if (rcd.best_object->get_type()==CollisionObjectSW::TYPE_BODY) { + + const BodySW *body = static_cast(rcd.best_object); + Vector3 rel_vec = r_info->point-body->get_transform().get_origin(); + r_info->linear_velocity = body->get_linear_velocity() + + (body->get_angular_velocity()).cross(body->get_transform().origin-rcd.best_contact);// * mPos); + + + } else { + r_info->linear_velocity=Vector3(); + } + + return true; +} + + PhysicsDirectSpaceStateSW::PhysicsDirectSpaceStateSW() { @@ -194,6 +487,8 @@ void* SpaceSW::_broadphase_pair(CollisionObjectSW *A,int p_subindex_A,CollisionO SpaceSW *self = (SpaceSW*)p_self; + self->collision_pairs++; + if (type_A==CollisionObjectSW::TYPE_AREA) { @@ -221,6 +516,7 @@ void SpaceSW::_broadphase_unpair(CollisionObjectSW *A,int p_subindex_A,Collision SpaceSW *self = (SpaceSW*)p_self; + self->collision_pairs--; ConstraintSW *c = (ConstraintSW*)p_data; memdelete(c); } @@ -398,6 +694,9 @@ PhysicsDirectSpaceStateSW *SpaceSW::get_direct_state() { SpaceSW::SpaceSW() { + collision_pairs=0; + active_objects=0; + island_count=0; locked=false; contact_recycle_radius=0.01; diff --git a/servers/physics/space_sw.h b/servers/physics/space_sw.h index cec10534006..a97647dcfc2 100644 --- a/servers/physics/space_sw.h +++ b/servers/physics/space_sw.h @@ -46,8 +46,11 @@ public: SpaceSW *space; - bool intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set& p_exclude=Set(),uint32_t p_user_mask=0); - int intersect_shape(const RID& p_shape, const Transform& p_xform,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_user_mask=0); + virtual bool intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION); + virtual int intersect_shape(const RID& p_shape, const Transform& p_xform,float p_margin,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION); + virtual bool cast_motion(const RID& p_shape, const Transform& p_xform,const Vector3& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION,ShapeRestInfo *r_info=NULL); + virtual bool collide_shape(RID p_shape, const Transform& p_shape_xform,float p_margin,Vector3 *r_results,int p_result_max,int &r_result_count, const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION); + virtual bool rest_info(RID p_shape, const Transform& p_shape_xform,float p_margin,ShapeRestInfo *r_info, const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION); PhysicsDirectSpaceStateSW(); }; @@ -94,6 +97,10 @@ class SpaceSW { bool locked; + int island_count; + int active_objects; + int collision_pairs; + friend class PhysicsDirectSpaceStateSW; public: @@ -147,6 +154,14 @@ public: void set_param(PhysicsServer::SpaceParameter p_param, real_t p_value); real_t get_param(PhysicsServer::SpaceParameter p_param) const; + void set_island_count(int p_island_count) { island_count=p_island_count; } + int get_island_count() const { return island_count; } + + void set_active_objects(int p_active_objects) { active_objects=p_active_objects; } + int get_active_objects() const { return active_objects; } + + int get_collision_pairs() const { return collision_pairs; } + PhysicsDirectSpaceStateSW *get_direct_state(); SpaceSW(); diff --git a/servers/physics/step_sw.cpp b/servers/physics/step_sw.cpp index b7815d22503..6d958048754 100644 --- a/servers/physics/step_sw.cpp +++ b/servers/physics/step_sw.cpp @@ -49,7 +49,7 @@ void StepSW::_populate_island(BodySW* p_body,BodySW** p_island,ConstraintSW **p_ if (i==E->get()) continue; BodySW *b = c->get_body_ptr()[i]; - if (b->get_island_step()==_step || b->get_mode()==PhysicsServer::BODY_MODE_STATIC) + if (b->get_island_step()==_step || b->get_mode()==PhysicsServer::BODY_MODE_STATIC || b->get_mode()==PhysicsServer::BODY_MODE_KINEMATIC) continue; //no go _populate_island(c->get_body_ptr()[i],p_island,p_constraint_island); } @@ -86,8 +86,10 @@ void StepSW::_check_suspend(BodySW *p_island,float p_delta) { BodySW *b = p_island; while(b) { - if (b->get_mode()==PhysicsServer::BODY_MODE_STATIC) + if (b->get_mode()==PhysicsServer::BODY_MODE_STATIC || b->get_mode()==PhysicsServer::BODY_MODE_KINEMATIC) { + b=b->get_island_next(); continue; //ignore for static + } if (!b->sleep_test(p_delta)) can_sleep=false; @@ -100,8 +102,10 @@ void StepSW::_check_suspend(BodySW *p_island,float p_delta) { b = p_island; while(b) { - if (b->get_mode()==PhysicsServer::BODY_MODE_STATIC) + if (b->get_mode()==PhysicsServer::BODY_MODE_STATIC || b->get_mode()==PhysicsServer::BODY_MODE_KINEMATIC) { + b=b->get_island_next(); continue; //ignore for static + } bool active = b->is_active(); @@ -131,6 +135,7 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) { active_count++; } + p_space->set_active_objects(active_count); /* GENERATE CONSTRAINT ISLANDS */ @@ -164,6 +169,8 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) { b=b->next(); } + p_space->set_island_count(island_count); + const SelfList::List &aml = p_space->get_moved_area_list(); while(aml.first()) { @@ -207,9 +214,9 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) { b = body_list->first(); while(b) { - + const SelfList*n=b->next(); b->self()->integrate_velocities(p_delta); - b=b->next(); + b=n; } /* SLEEP / WAKE UP ISLANDS */ diff --git a/servers/physics_2d/area_2d_sw.h b/servers/physics_2d/area_2d_sw.h index 51e6ccd1664..0eda1050fa5 100644 --- a/servers/physics_2d/area_2d_sw.h +++ b/servers/physics_2d/area_2d_sw.h @@ -71,7 +71,7 @@ class Area2DSW : public CollisionObject2DSW{ return area_shape < p_key.area_shape; } else - return body_shape < p_key.area_shape; + return body_shape < p_key.body_shape; } else return rid < p_key.rid; diff --git a/servers/physics_2d/collision_solver_2d_sat.cpp b/servers/physics_2d/collision_solver_2d_sat.cpp index 7d85183645a..f73ed5732e5 100644 --- a/servers/physics_2d/collision_solver_2d_sat.cpp +++ b/servers/physics_2d/collision_solver_2d_sat.cpp @@ -593,8 +593,8 @@ static void _collision_segment_segment(const Shape2DSW* p_a,const Matrix32& p_tr //this collision is kind of pointless - if (!separator.test_previous_axis()) - return; + //if (!separator.test_previous_axis()) + // return; if (!separator.test_cast()) return; diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp index 2171a9c2c4f..09fa3f9b6af 100644 --- a/servers/physics_2d/physics_2d_server_sw.cpp +++ b/servers/physics_2d/physics_2d_server_sw.cpp @@ -1086,9 +1086,15 @@ void Physics2DServerSW::step(float p_step) { last_step=p_step; Physics2DDirectBodyStateSW::singleton->step=p_step; + island_count=0; + active_objects=0; + collision_pairs=0; for( Set::Element *E=active_spaces.front();E;E=E->next()) { stepper->step((Space2DSW*)E->get(),p_step,iterations); + island_count+=E->get()->get_island_count(); + active_objects+=E->get()->get_active_objects(); + collision_pairs+=E->get()->get_collision_pairs(); } }; @@ -1118,6 +1124,27 @@ void Physics2DServerSW::finish() { memdelete(direct_state); }; +int Physics2DServerSW::get_process_info(ProcessInfo p_info) { + + switch(p_info) { + + case INFO_ACTIVE_OBJECTS: { + + return active_objects; + } break; + case INFO_COLLISION_PAIRS: { + return collision_pairs; + } break; + case INFO_ISLAND_COUNT: { + + return island_count; + } break; + + } + + return 0; +} + Physics2DServerSW::Physics2DServerSW() { @@ -1125,8 +1152,13 @@ Physics2DServerSW::Physics2DServerSW() { // BroadPhase2DSW::create_func=BroadPhase2DBasic::_create; active=true; + island_count=0; + active_objects=0; + collision_pairs=0; + }; + Physics2DServerSW::~Physics2DServerSW() { }; diff --git a/servers/physics_2d/physics_2d_server_sw.h b/servers/physics_2d/physics_2d_server_sw.h index 09ca0291273..7ffffe669fd 100644 --- a/servers/physics_2d/physics_2d_server_sw.h +++ b/servers/physics_2d/physics_2d_server_sw.h @@ -47,6 +47,11 @@ friend class Physics2DDirectSpaceStateSW; bool doing_sync; real_t last_step; + int island_count; + int active_objects; + int collision_pairs; + + Step2DSW *stepper; Set active_spaces; @@ -223,6 +228,8 @@ public: virtual void flush_queries(); virtual void finish(); + int get_process_info(ProcessInfo p_info); + Physics2DServerSW(); ~Physics2DServerSW(); diff --git a/servers/physics_2d/shape_2d_sw.h b/servers/physics_2d/shape_2d_sw.h index d3fcf1fab25..8500a6194f6 100644 --- a/servers/physics_2d/shape_2d_sw.h +++ b/servers/physics_2d/shape_2d_sw.h @@ -582,5 +582,6 @@ public: }; +#undef DEFAULT_PROJECT_RANGE_CAST #endif // SHAPE_2D_2DSW_H diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp index 5fbf828c388..21a99cd4b2c 100644 --- a/servers/physics_2d/space_2d_sw.cpp +++ b/servers/physics_2d/space_2d_sw.cpp @@ -323,7 +323,7 @@ bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Matrix32& p_s } -struct _RestCallbackData { +struct _RestCallbackData2D { const CollisionObject2DSW *object; const CollisionObject2DSW *best_object; @@ -337,7 +337,7 @@ struct _RestCallbackData { static void _rest_cbk_result(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata) { - _RestCallbackData *rd=(_RestCallbackData*)p_userdata; + _RestCallbackData2D *rd=(_RestCallbackData2D*)p_userdata; Vector2 contact_rel = p_point_B - p_point_A; float len = contact_rel.length(); @@ -365,7 +365,7 @@ bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Matrix32& p_shape int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); - _RestCallbackData rcd; + _RestCallbackData2D rcd; rcd.best_len=0; rcd.best_object=NULL; rcd.best_shape=0; @@ -443,6 +443,7 @@ void* Space2DSW::_broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,Collis } Space2DSW *self = (Space2DSW*)p_self; + self->collision_pairs++; if (type_A==CollisionObject2DSW::TYPE_AREA) { @@ -468,8 +469,8 @@ void* Space2DSW::_broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,Collis void Space2DSW::_broadphase_unpair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_self) { - Space2DSW *self = (Space2DSW*)p_self; + self->collision_pairs--; Constraint2DSW *c = (Constraint2DSW*)p_data; memdelete(c); } @@ -646,6 +647,10 @@ Physics2DDirectSpaceStateSW *Space2DSW::get_direct_state() { Space2DSW::Space2DSW() { + collision_pairs=0; + active_objects=0; + island_count=0; + locked=false; contact_recycle_radius=0.01; contact_max_separation=0.05; diff --git a/servers/physics_2d/space_2d_sw.h b/servers/physics_2d/space_2d_sw.h index bd41097fbab..c638a0c45b9 100644 --- a/servers/physics_2d/space_2d_sw.h +++ b/servers/physics_2d/space_2d_sw.h @@ -97,6 +97,10 @@ class Space2DSW { bool locked; + int island_count; + int active_objects; + int collision_pairs; + friend class Physics2DDirectSpaceStateSW; public: @@ -153,6 +157,14 @@ public: void set_param(Physics2DServer::SpaceParameter p_param, real_t p_value); real_t get_param(Physics2DServer::SpaceParameter p_param) const; + void set_island_count(int p_island_count) { island_count=p_island_count; } + int get_island_count() const { return island_count; } + + void set_active_objects(int p_active_objects) { active_objects=p_active_objects; } + int get_active_objects() const { return active_objects; } + + int get_collision_pairs() const { return collision_pairs; } + Physics2DDirectSpaceStateSW *get_direct_state(); Space2DSW(); diff --git a/servers/physics_2d/step_2d_sw.cpp b/servers/physics_2d/step_2d_sw.cpp index 29f4a58287f..e75f9300ce8 100644 --- a/servers/physics_2d/step_2d_sw.cpp +++ b/servers/physics_2d/step_2d_sw.cpp @@ -137,6 +137,8 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) { active_count++; } + p_space->set_active_objects(active_count); + /* GENERATE CONSTRAINT ISLANDS */ Body2DSW *island_list=NULL; @@ -168,6 +170,8 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) { b=b->next(); } + p_space->set_island_count(island_count); + const SelfList::List &aml = p_space->get_moved_area_list(); diff --git a/servers/physics_2d_server.cpp b/servers/physics_2d_server.cpp index 9cbd7414bd8..da8ac5f9c8c 100644 --- a/servers/physics_2d_server.cpp +++ b/servers/physics_2d_server.cpp @@ -110,17 +110,132 @@ Physics2DDirectBodyState::Physics2DDirectBodyState() {} -Variant Physics2DDirectSpaceState::_intersect_ray(const Vector2& p_from, const Vector2& p_to,const Vector& p_exclude,uint32_t p_user_mask) { +void Physics2DShapeQueryParameters::set_shape(const RES &p_shape) { + + ERR_FAIL_COND(p_shape.is_null()); + shape=p_shape->get_rid(); +} + +void Physics2DShapeQueryParameters::set_shape_rid(const RID& p_shape) { + + shape=p_shape; +} + +RID Physics2DShapeQueryParameters::get_shape_rid() const { + + return shape; +} + +void Physics2DShapeQueryParameters::set_transform(const Matrix32& p_transform){ + + transform=p_transform; +} +Matrix32 Physics2DShapeQueryParameters::get_transform() const{ + + return transform; +} + +void Physics2DShapeQueryParameters::set_motion(const Vector2& p_motion){ + + motion=p_motion; +} +Vector2 Physics2DShapeQueryParameters::get_motion() const{ + + return motion; +} + +void Physics2DShapeQueryParameters::set_margin(float p_margin){ + + margin=p_margin; +} +float Physics2DShapeQueryParameters::get_margin() const{ + + return margin; +} + +void Physics2DShapeQueryParameters::set_layer_mask(int p_layer_mask){ + + layer_mask=p_layer_mask; +} +int Physics2DShapeQueryParameters::get_layer_mask() const{ + + return layer_mask; +} + + +void Physics2DShapeQueryParameters::set_object_type_mask(int p_object_type_mask){ + + object_type_mask=p_object_type_mask; +} +int Physics2DShapeQueryParameters::get_object_type_mask() const{ + + return object_type_mask; +} +void Physics2DShapeQueryParameters::set_exclude(const Vector& p_exclude) { + + exclude.clear();; + for(int i=0;i Physics2DShapeQueryParameters::get_exclude() const{ + + Vector ret; + ret.resize(exclude.size()); + int idx=0; + for(Set::Element *E=exclude.front();E;E=E->next()) { + ret[idx]=E->get(); + } + return ret; +} + +void Physics2DShapeQueryParameters::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("set_shape","shape:Shape2D"),&Physics2DShapeQueryParameters::set_shape); + ObjectTypeDB::bind_method(_MD("set_shape_rid","shape"),&Physics2DShapeQueryParameters::set_shape_rid); + ObjectTypeDB::bind_method(_MD("get_shape_rid"),&Physics2DShapeQueryParameters::get_shape_rid); + + ObjectTypeDB::bind_method(_MD("set_transform","transform"),&Physics2DShapeQueryParameters::set_transform); + ObjectTypeDB::bind_method(_MD("get_transform"),&Physics2DShapeQueryParameters::get_transform); + + ObjectTypeDB::bind_method(_MD("set_motion","motion"),&Physics2DShapeQueryParameters::set_motion); + ObjectTypeDB::bind_method(_MD("get_motion"),&Physics2DShapeQueryParameters::get_motion); + + ObjectTypeDB::bind_method(_MD("set_margin","margin"),&Physics2DShapeQueryParameters::set_margin); + ObjectTypeDB::bind_method(_MD("get_margin"),&Physics2DShapeQueryParameters::get_margin); + + ObjectTypeDB::bind_method(_MD("set_layer_mask","layer_mask"),&Physics2DShapeQueryParameters::set_layer_mask); + ObjectTypeDB::bind_method(_MD("get_layer_mask"),&Physics2DShapeQueryParameters::get_layer_mask); + + ObjectTypeDB::bind_method(_MD("set_object_type_mask","object_type_mask"),&Physics2DShapeQueryParameters::set_object_type_mask); + ObjectTypeDB::bind_method(_MD("get_object_type_mask"),&Physics2DShapeQueryParameters::get_object_type_mask); + + ObjectTypeDB::bind_method(_MD("set_exclude","exclude"),&Physics2DShapeQueryParameters::set_exclude); + ObjectTypeDB::bind_method(_MD("get_exclude"),&Physics2DShapeQueryParameters::get_exclude); + + +} + +Physics2DShapeQueryParameters::Physics2DShapeQueryParameters() { + + margin=0; + layer_mask=0x7FFFFFFF; + object_type_mask=Physics2DDirectSpaceState::TYPE_MASK_COLLISION; +} + + +Dictionary Physics2DDirectSpaceState::_intersect_ray(const Vector2& p_from, const Vector2& p_to,const Vector& p_exclude,uint32_t p_layers,uint32_t p_object_type_mask) { RayResult inters; Set exclude; for(int i=0;i& p_exclude,uint32_t p_user_mask) { +Array Physics2DDirectSpaceState::_intersect_shape(const Ref &psq, int p_max_results) { - ERR_FAIL_INDEX_V(p_result_max,4096,Variant()); - if (p_result_max<=0) - return Variant(); + Vector sr; + sr.resize(p_max_results); + int rc = intersect_shape(psq->shape,psq->transform,psq->motion,psq->margin,sr.ptr(),sr.size(),psq->exclude,psq->layer_mask,psq->object_type_mask); + Array ret; + ret.resize(rc); + for(int i=0;i exclude; - for(int i=0;i result = memnew( Physics2DShapeQueryResult ); - result->result.resize(rc); - for(int i=0;iresult[i]=res[i]; - - return result; + Dictionary d; + d["rid"]=sr[i].rid; + d["collider_id"]=sr[i].collider_id; + d["collider"]=sr[i].collider; + d["shape"]=sr[i].shape; + ret[i]=d; + } + return ret; } +Array Physics2DDirectSpaceState::_cast_motion(const Ref &psq){ -Variant Physics2DDirectSpaceState::_cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,const Vector& p_exclude,uint32_t p_user_mask) { + float closest_safe,closest_unsafe; + bool res = cast_motion(psq->shape,psq->transform,psq->motion,psq->margin,closest_safe,closest_unsafe,psq->exclude,psq->layer_mask,psq->object_type_mask); + if (!res) + return Array(); + Array ret(true); + ret.resize(2); + ret[0]=closest_safe; + ret[0]=closest_unsafe; + return ret; +} +Array Physics2DDirectSpaceState::_collide_shape(const Ref &psq, int p_max_results){ -#if 0 - Set exclude; - for(int i=0;i ret; + ret.resize(p_max_results*2); + int rc=0; + bool res = collide_shape(psq->shape,psq->transform,psq->motion,psq->margin,ret.ptr(),p_max_results,rc,psq->exclude,psq->layer_mask,psq->object_type_mask); + if (!res) + return Array(); + Array r; + r.resize(rc*2); + for(int i=0;i &psq){ - bool result = cast_motion(p_shape,p_xform,p_motion,0,mcc,exclude,p_user_mask); + ShapeRestInfo sri; - if (!result) - return Variant(); + bool res = rest_info(psq->shape,psq->transform,psq->motion,psq->margin,&sri,psq->exclude,psq->layer_mask,psq->object_type_mask); + Dictionary r(true); + if (!res) + return r; - Dictionary d(true); - d["point"]=mcc.point; - d["normal"]=mcc.normal; - d["rid"]=mcc.rid; - d["collider_id"]=mcc.collider_id; - d["collider"]=mcc.collider; - d["shape"]=mcc.shape; - - return d; -#endif - return Variant(); + r["point"]=sri.point; + r["normal"]=sri.normal; + r["rid"]=sri.rid; + r["collider_id"]=sri.collider_id; + r["shape"]=sri.shape; + r["linear_velocity"]=sri.linear_velocity; + return r; } @@ -200,9 +327,19 @@ Physics2DDirectSpaceState::Physics2DDirectSpaceState() { void Physics2DDirectSpaceState::_bind_methods() { - ObjectTypeDB::bind_method(_MD("intersect_ray:Dictionary","from","to","exclude","umask"),&Physics2DDirectSpaceState::_intersect_ray,DEFVAL(Array()),DEFVAL(0)); - ObjectTypeDB::bind_method(_MD("intersect_shape:Physics2DShapeQueryResult","shape","xform","result_max","exclude","umask"),&Physics2DDirectSpaceState::_intersect_shape,DEFVAL(Array()),DEFVAL(0)); - ObjectTypeDB::bind_method(_MD("cast_motion","shape","xform","motion","exclude","umask"),&Physics2DDirectSpaceState::_intersect_shape,DEFVAL(Array()),DEFVAL(0)); + ObjectTypeDB::bind_method(_MD("intersect_ray:Dictionary","from","to","exclude","layer_mask","type_mask"),&Physics2DDirectSpaceState::_intersect_ray,DEFVAL(Array()),DEFVAL(0x7FFFFFFF),DEFVAL(TYPE_MASK_COLLISION)); + ObjectTypeDB::bind_method(_MD("intersect_shape","shape:Physics2DShapeQueryParameters","max_results"),&Physics2DDirectSpaceState::_intersect_shape,DEFVAL(32)); + ObjectTypeDB::bind_method(_MD("cast_motion","shape:Physics2DShapeQueryParameters"),&Physics2DDirectSpaceState::_cast_motion); + ObjectTypeDB::bind_method(_MD("collide_shape","shape:Physics2DShapeQueryParameters","max_results"),&Physics2DDirectSpaceState::_collide_shape,DEFVAL(32)); + ObjectTypeDB::bind_method(_MD("get_rest_info","shape:Physics2DShapeQueryParameters"),&Physics2DDirectSpaceState::_get_rest_info); + //ObjectTypeDB::bind_method(_MD("cast_motion","shape","xform","motion","exclude","umask"),&Physics2DDirectSpaceState::_intersect_shape,DEFVAL(Array()),DEFVAL(0)); + + BIND_CONSTANT( TYPE_MASK_STATIC_BODY ); + BIND_CONSTANT( TYPE_MASK_KINEMATIC_BODY ); + BIND_CONSTANT( TYPE_MASK_RIGID_BODY ); + BIND_CONSTANT( TYPE_MASK_CHARACTER_BODY ); + BIND_CONSTANT( TYPE_MASK_AREA ); + BIND_CONSTANT( TYPE_MASK_COLLISION ); } @@ -375,6 +512,8 @@ void Physics2DServer::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_active","active"),&Physics2DServer::set_active); + ObjectTypeDB::bind_method(_MD("get_process_info"),&Physics2DServer::get_process_info); + // ObjectTypeDB::bind_method(_MD("init"),&Physics2DServer::init); // ObjectTypeDB::bind_method(_MD("step"),&Physics2DServer::step); // ObjectTypeDB::bind_method(_MD("sync"),&Physics2DServer::sync); @@ -434,6 +573,10 @@ void Physics2DServer::_bind_methods() { BIND_CONSTANT( AREA_BODY_ADDED ); BIND_CONSTANT( AREA_BODY_REMOVED ); + BIND_CONSTANT( INFO_ACTIVE_OBJECTS ); + BIND_CONSTANT( INFO_COLLISION_PAIRS ); + BIND_CONSTANT( INFO_ISLAND_COUNT ); + } diff --git a/servers/physics_2d_server.h b/servers/physics_2d_server.h index def1e69992f..17a21e46a31 100644 --- a/servers/physics_2d_server.h +++ b/servers/physics_2d_server.h @@ -31,6 +31,7 @@ #include "object.h" #include "reference.h" +#include "resource.h" class Physics2DDirectSpaceState; @@ -84,14 +85,60 @@ public: class Physics2DShapeQueryResult; +//used for script +class Physics2DShapeQueryParameters : public Reference { + + OBJ_TYPE(Physics2DShapeQueryParameters, Reference); +friend class Physics2DDirectSpaceState; + RID shape; + Matrix32 transform; + Vector2 motion; + float margin; + Set exclude; + uint32_t layer_mask; + uint32_t object_type_mask; +protected: + static void _bind_methods(); +public: + + + void set_shape(const RES& p_shape); + void set_shape_rid(const RID& p_shape); + RID get_shape_rid() const; + + void set_transform(const Matrix32& p_transform); + Matrix32 get_transform() const; + + void set_motion(const Vector2& p_motion); + Vector2 get_motion() const; + + void set_margin(float p_margin); + float get_margin() const; + + void set_layer_mask(int p_layer_mask); + int get_layer_mask() const; + + void set_object_type_mask(int p_object_type_mask); + int get_object_type_mask() const; + + void set_exclude(const Vector& p_exclude); + Vector get_exclude() const; + + Physics2DShapeQueryParameters(); + +}; + + class Physics2DDirectSpaceState : public Object { OBJ_TYPE( Physics2DDirectSpaceState, Object ); - Variant _intersect_ray(const Vector2& p_from, const Vector2& p_to,const Vector& p_exclude=Vector(),uint32_t p_layers=0); - Variant _intersect_shape(const RID& p_shape, const Matrix32& p_xform,int p_result_max=64,const Vector& p_exclude=Vector(),uint32_t p_layers=0); - Variant _cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,const Vector& p_exclude=Vector(),uint32_t p_layers=0); + Dictionary _intersect_ray(const Vector2& p_from, const Vector2& p_to,const Vector& p_exclude=Vector(),uint32_t p_layers=0,uint32_t p_object_type_mask=TYPE_MASK_COLLISION); + Array _intersect_shape(const Ref &p_shape_query,int p_max_results=32); + Array _cast_motion(const Ref &p_shape_query); + Array _collide_shape(const Ref &p_shape_query,int p_max_results=32); + Dictionary _get_rest_info(const Ref &p_shape_query); protected: static void _bind_methods(); @@ -131,8 +178,6 @@ public: virtual int intersect_shape(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,float p_margin,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; - - virtual bool cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; virtual bool collide_shape(RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,float p_margin,Vector2 *r_results,int p_result_max,int &r_result_count, const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; @@ -448,6 +493,15 @@ public: virtual void flush_queries()=0; virtual void finish()=0; + enum ProcessInfo { + + INFO_ACTIVE_OBJECTS, + INFO_COLLISION_PAIRS, + INFO_ISLAND_COUNT + }; + + virtual int get_process_info(ProcessInfo p_info)=0; + Physics2DServer(); ~Physics2DServer(); }; @@ -465,5 +519,6 @@ VARIANT_ENUM_CAST( Physics2DServer::JointType ); VARIANT_ENUM_CAST( Physics2DServer::DampedStringParam ); //VARIANT_ENUM_CAST( Physics2DServer::ObjectType ); VARIANT_ENUM_CAST( Physics2DServer::AreaBodyStatus ); +VARIANT_ENUM_CAST( Physics2DServer::ProcessInfo ); #endif diff --git a/servers/physics_server.cpp b/servers/physics_server.cpp index 070bc5e0629..e2dd3e14eb7 100644 --- a/servers/physics_server.cpp +++ b/servers/physics_server.cpp @@ -113,6 +113,112 @@ PhysicsDirectBodyState::PhysicsDirectBodyState() {} +void PhysicsShapeQueryParameters::set_shape(const RES &p_shape) { + + ERR_FAIL_COND(p_shape.is_null()); + shape=p_shape->get_rid(); +} + +void PhysicsShapeQueryParameters::set_shape_rid(const RID& p_shape) { + + shape=p_shape; +} + +RID PhysicsShapeQueryParameters::get_shape_rid() const { + + return shape; +} + +void PhysicsShapeQueryParameters::set_transform(const Matrix32& p_transform){ + + transform=p_transform; +} +Matrix32 PhysicsShapeQueryParameters::get_transform() const{ + + return transform; +} + +void PhysicsShapeQueryParameters::set_margin(float p_margin){ + + margin=p_margin; +} + +float PhysicsShapeQueryParameters::get_margin() const{ + + return margin; +} + +void PhysicsShapeQueryParameters::set_layer_mask(int p_layer_mask){ + + layer_mask=p_layer_mask; +} +int PhysicsShapeQueryParameters::get_layer_mask() const{ + + return layer_mask; +} + + +void PhysicsShapeQueryParameters::set_object_type_mask(int p_object_type_mask){ + + object_type_mask=p_object_type_mask; +} +int PhysicsShapeQueryParameters::get_object_type_mask() const{ + + return object_type_mask; +} +void PhysicsShapeQueryParameters::set_exclude(const Vector& p_exclude) { + + exclude.clear();; + for(int i=0;i PhysicsShapeQueryParameters::get_exclude() const{ + + Vector ret; + ret.resize(exclude.size()); + int idx=0; + for(Set::Element *E=exclude.front();E;E=E->next()) { + ret[idx]=E->get(); + } + return ret; +} + +void PhysicsShapeQueryParameters::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("set_shape","shape:Shape"),&PhysicsShapeQueryParameters::set_shape); + ObjectTypeDB::bind_method(_MD("set_shape_rid","shape"),&PhysicsShapeQueryParameters::set_shape_rid); + ObjectTypeDB::bind_method(_MD("get_shape_rid"),&PhysicsShapeQueryParameters::get_shape_rid); + + ObjectTypeDB::bind_method(_MD("set_transform","transform"),&PhysicsShapeQueryParameters::set_transform); + ObjectTypeDB::bind_method(_MD("get_transform"),&PhysicsShapeQueryParameters::get_transform); + + ObjectTypeDB::bind_method(_MD("set_margin","margin"),&PhysicsShapeQueryParameters::set_margin); + ObjectTypeDB::bind_method(_MD("get_margin"),&PhysicsShapeQueryParameters::get_margin); + + ObjectTypeDB::bind_method(_MD("set_layer_mask","layer_mask"),&PhysicsShapeQueryParameters::set_layer_mask); + ObjectTypeDB::bind_method(_MD("get_layer_mask"),&PhysicsShapeQueryParameters::get_layer_mask); + + ObjectTypeDB::bind_method(_MD("set_object_type_mask","object_type_mask"),&PhysicsShapeQueryParameters::set_object_type_mask); + ObjectTypeDB::bind_method(_MD("get_object_type_mask"),&PhysicsShapeQueryParameters::get_object_type_mask); + + ObjectTypeDB::bind_method(_MD("set_exclude","exclude"),&PhysicsShapeQueryParameters::set_exclude); + ObjectTypeDB::bind_method(_MD("get_exclude"),&PhysicsShapeQueryParameters::get_exclude); + + +} + +PhysicsShapeQueryParameters::PhysicsShapeQueryParameters() { + + margin=0; + layer_mask=0x7FFFFFFF; + object_type_mask=PhysicsDirectSpaceState::TYPE_MASK_COLLISION; +} + + + +///////////////////////////////////// Variant PhysicsDirectSpaceState::_intersect_ray(const Vector3& p_from, const Vector3& p_to,const Vector& p_exclude,uint32_t p_user_mask) { RayResult inters; @@ -150,7 +256,7 @@ Variant PhysicsDirectSpaceState::_intersect_shape(const RID& p_shape, const Tran ShapeResult *res=(ShapeResult*)alloca(p_result_max*sizeof(ShapeResult)); - int rc = intersect_shape(p_shape,p_xform,res,p_result_max,exclude,p_user_mask); + int rc = intersect_shape(p_shape,p_xform,0,res,p_result_max,exclude); if (rc==0) return Variant(); @@ -308,8 +414,6 @@ void PhysicsServer::_bind_methods() { ObjectTypeDB::bind_method(_MD("body_set_param","body","param","value"),&PhysicsServer::body_set_param); ObjectTypeDB::bind_method(_MD("body_get_param","body","param"),&PhysicsServer::body_get_param); - ObjectTypeDB::bind_method(_MD("body_static_simulate_motion","body","new_xform"),&PhysicsServer::body_static_simulate_motion); - ObjectTypeDB::bind_method(_MD("body_set_state","body","state","value"),&PhysicsServer::body_set_state); ObjectTypeDB::bind_method(_MD("body_get_state","body","state"),&PhysicsServer::body_get_state); @@ -355,6 +459,8 @@ void PhysicsServer::_bind_methods() { //ObjectTypeDB::bind_method(_MD("flush_queries"),&PhysicsServer::flush_queries); + ObjectTypeDB::bind_method(_MD("get_process_info"),&PhysicsServer::get_process_info); + BIND_CONSTANT( SHAPE_PLANE ); BIND_CONSTANT( SHAPE_RAY ); BIND_CONSTANT( SHAPE_SPHERE ); @@ -407,6 +513,11 @@ void PhysicsServer::_bind_methods() { BIND_CONSTANT( AREA_BODY_ADDED ); BIND_CONSTANT( AREA_BODY_REMOVED ); + BIND_CONSTANT( INFO_ACTIVE_OBJECTS ); + BIND_CONSTANT( INFO_COLLISION_PAIRS ); + BIND_CONSTANT( INFO_ISLAND_COUNT ); + + } diff --git a/servers/physics_server.h b/servers/physics_server.h index 955caffe5b8..5709974cc0d 100644 --- a/servers/physics_server.h +++ b/servers/physics_server.h @@ -30,7 +30,7 @@ #define PHYSICS_SERVER_H #include "object.h" -#include "reference.h" +#include "resource.h" class PhysicsDirectSpaceState; @@ -87,6 +87,45 @@ public: class PhysicsShapeQueryResult; +class PhysicsShapeQueryParameters : public Reference { + + OBJ_TYPE(PhysicsShapeQueryParameters, Reference); +friend class PhysicsDirectSpaceState; + RID shape; + Matrix32 transform; + float margin; + Set exclude; + uint32_t layer_mask; + uint32_t object_type_mask; +protected: + static void _bind_methods(); +public: + + + void set_shape(const RES& p_shape); + void set_shape_rid(const RID& p_shape); + RID get_shape_rid() const; + + void set_transform(const Matrix32& p_transform); + Matrix32 get_transform() const; + + void set_margin(float p_margin); + float get_margin() const; + + void set_layer_mask(int p_layer_mask); + int get_layer_mask() const; + + void set_object_type_mask(int p_object_type_mask); + int get_object_type_mask() const; + + void set_exclude(const Vector& p_exclude); + Vector get_exclude() const; + + PhysicsShapeQueryParameters(); + +}; + + class PhysicsDirectSpaceState : public Object { @@ -101,6 +140,15 @@ protected: public: + enum ObjectTypeMask { + TYPE_MASK_STATIC_BODY=1<<0, + TYPE_MASK_KINEMATIC_BODY=1<<1, + TYPE_MASK_RIGID_BODY=1<<2, + TYPE_MASK_CHARACTER_BODY=1<<3, + TYPE_MASK_AREA=1<<4, + TYPE_MASK_COLLISION=TYPE_MASK_STATIC_BODY|TYPE_MASK_CHARACTER_BODY|TYPE_MASK_KINEMATIC_BODY|TYPE_MASK_RIGID_BODY + }; + struct RayResult { Vector3 position; @@ -111,7 +159,7 @@ public: int shape; }; - virtual bool intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set& p_exclude=Set(),uint32_t p_user_mask=0)=0; + virtual bool intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; struct ShapeResult { @@ -122,7 +170,25 @@ public: }; - virtual int intersect_shape(const RID& p_shape, const Transform& p_xform,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_user_mask=0)=0; + virtual int intersect_shape(const RID& p_shape, const Transform& p_xform,float p_margin,ShapeResult *r_results,int p_result_max,const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; + + struct ShapeRestInfo { + + Vector3 point; + Vector3 normal; + RID rid; + ObjectID collider_id; + int shape; + Vector3 linear_velocity; //velocity at contact point + + }; + + virtual bool cast_motion(const RID& p_shape, const Transform& p_xform,const Vector3& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION,ShapeRestInfo *r_info=NULL)=0; + + virtual bool collide_shape(RID p_shape, const Transform& p_shape_xform,float p_margin,Vector3 *r_results,int p_result_max,int &r_result_count, const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; + + virtual bool rest_info(RID p_shape, const Transform& p_shape_xform,float p_margin,ShapeRestInfo *r_info, const Set& p_exclude=Set(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0; + PhysicsDirectSpaceState(); }; @@ -303,6 +369,9 @@ public: virtual void body_set_enable_continuous_collision_detection(RID p_body,bool p_enable)=0; virtual bool body_is_continuous_collision_detection_enabled(RID p_body) const=0; + virtual void body_set_layer_mask(RID p_body, uint32_t p_mask)=0; + virtual uint32_t body_get_layer_mask(RID p_body, uint32_t p_mask) const=0; + virtual void body_set_user_flags(RID p_body, uint32_t p_flags)=0; virtual uint32_t body_get_user_flags(RID p_body, uint32_t p_flags) const=0; @@ -317,8 +386,6 @@ public: virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value)=0; virtual float body_get_param(RID p_body, BodyParameter p_param) const=0; - //advanced simulation - virtual void body_static_simulate_motion(RID p_body,const Transform& p_new_transform)=0; //state enum BodyState { @@ -420,6 +487,15 @@ public: virtual void flush_queries()=0; virtual void finish()=0; + enum ProcessInfo { + + INFO_ACTIVE_OBJECTS, + INFO_COLLISION_PAIRS, + INFO_ISLAND_COUNT + }; + + virtual int get_process_info(ProcessInfo p_info)=0; + PhysicsServer(); ~PhysicsServer(); }; @@ -437,5 +513,6 @@ VARIANT_ENUM_CAST( PhysicsServer::BodyAxisLock ); //VARIANT_ENUM_CAST( PhysicsServer::DampedStringParam ); //VARIANT_ENUM_CAST( PhysicsServer::ObjectType ); VARIANT_ENUM_CAST( PhysicsServer::AreaBodyStatus ); +VARIANT_ENUM_CAST( PhysicsServer::ProcessInfo ); #endif diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp index 638156d813d..f8d38d15c02 100644 --- a/servers/register_server_types.cpp +++ b/servers/register_server_types.cpp @@ -55,6 +55,7 @@ void register_server_types() { ObjectTypeDB::register_virtual_type(); ObjectTypeDB::register_virtual_type(); ObjectTypeDB::register_virtual_type(); + ObjectTypeDB::register_type(); ObjectTypeDB::register_virtual_type(); ObjectTypeDB::register_virtual_type(); diff --git a/tools/collada/collada.cpp b/tools/collada/collada.cpp index 9962eed1b2e..c416286c199 100644 --- a/tools/collada/collada.cpp +++ b/tools/collada/collada.cpp @@ -1388,8 +1388,11 @@ void Collada::_parse_morph_controller(XMLParser& parser, String p_id) { state.morph_controller_data_map[p_id]=MorphControllerData(); MorphControllerData &morphdata = state.morph_controller_data_map[p_id]; + print_line("morph source: "+parser.get_attribute_value("source")+" id: "+p_id); morphdata.mesh=_uri_to_id(parser.get_attribute_value("source")); + print_line("morph source2: "+morphdata.mesh); morphdata.mode=parser.get_attribute_value("method"); + printf("JJmorph: %p\n",&morphdata); String current_source; while(parser.read()==OK) { diff --git a/tools/editor/icons/icon_instance_options.png b/tools/editor/icons/icon_instance_options.png new file mode 100644 index 0000000000000000000000000000000000000000..2d3e98b2ea0e1d6680872748f37f6bcf53333f5e GIT binary patch literal 523 zcmV+m0`&cfP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00DDJL_t(I%f*vDP6IIzg})g) zfe-=_Ap#0S#Q|vOxB`eON8loG3VK9AM@dIV2L&Q%QKVIh1wo{U1@W_4n}Q`;79x>~ zkzCm0d4BWW82&pX3?lzqqC8nTURs{t?DyjGFKJ(I)Di&ccJ3mVx&=T04-B$PrAl>T zPefjd#UgS)zgXV~u*PWDrLGAWK&GZAcfI!|01eGCR| z6_EhIT5~l>(hb0bL3B9c^|QRwYV<r8?0VF?~P&f-!p1@5Lej{a$P`N~JLdDXlkZ=?53wgO~7d$2tH2 N002ovPDHLkV1nIJ&)@(6 literal 0 HcmV?d00001 diff --git a/tools/editor/io_plugins/editor_import_collada.cpp b/tools/editor/io_plugins/editor_import_collada.cpp index 15a671d6232..2dce3fa8f50 100644 --- a/tools/editor/io_plugins/editor_import_collada.cpp +++ b/tools/editor/io_plugins/editor_import_collada.cpp @@ -564,6 +564,7 @@ Error ColladaImport::_create_mesh_surfaces(Ref& p_mesh,const Maptargets.has("MORPH_TARGET"), ERR_INVALID_DATA ); String mt = p_morph_data->targets["MORPH_TARGET"]; @@ -1478,8 +1479,11 @@ Error ColladaImport::_create_resources(Collada::Node *p_node) { Transform apply_xform; Vector bone_remap; + print_line("mesh: "+String(mi->get_name())); + if (ng->controller) { + print_line("has controller"); if (collada.state.skin_controller_data_map.has(ng->source)) { @@ -1528,9 +1532,12 @@ Error ColladaImport::_create_resources(Collada::Node *p_node) { bone_remap[i]=bone_remap_map[str]; } } else if (collada.state.morph_controller_data_map.has(ng->source)) { + print_line("is morph "+ng->source); //it's a morph!! - morph = &collada.state.morph_controller_data_map[meshid]; + morph = &collada.state.morph_controller_data_map[ng->source]; meshid=morph->mesh; + printf("KKmorph: %p\n",morph); + print_line("morph mshid: "+meshid); } else { ERR_EXPLAIN("Controller Instance Source '"+ng->source+"' is neither skin or morph!"); ERR_FAIL_V( ERR_INVALID_DATA ); diff --git a/tools/editor/plugins/baked_light_baker.cpp b/tools/editor/plugins/baked_light_baker.cpp index 1574ce81d7e..dea83e0ff8e 100644 --- a/tools/editor/plugins/baked_light_baker.cpp +++ b/tools/editor/plugins/baked_light_baker.cpp @@ -338,7 +338,7 @@ void BakedLightBaker::_fix_lights() { } if (dl.type==VS::LIGHT_OMNI) { - dl.area=4.0*Math_PI*pow(dl.radius,2.0); + dl.area=4.0*Math_PI*pow(dl.radius,2.0f); dl.constant=1.0/3.5; } else { diff --git a/tools/editor/property_editor.cpp b/tools/editor/property_editor.cpp index 4ac2ff05941..645d967a4bf 100644 --- a/tools/editor/property_editor.cpp +++ b/tools/editor/property_editor.cpp @@ -38,6 +38,7 @@ #include "scene/scene_string_names.h" #include "editor_settings.h" #include "editor_import_export.h" +#include "editor_node.h" void CustomPropertyEditor::_notification(int p_what) { @@ -1619,6 +1620,7 @@ CustomPropertyEditor::CustomPropertyEditor() { scene_tree = memnew( SceneTreeDialog ); add_child(scene_tree); scene_tree->connect("selected", this,"_node_path_selected"); + scene_tree->get_tree()->set_show_enabled_subscene(true); texture_preview = memnew( TextureFrame ); add_child( texture_preview); @@ -2037,6 +2039,17 @@ void PropertyEditor::update_tree() { List plist; obj->get_property_list(&plist,true); + bool draw_red=false; + + { + Node *nod = obj->cast_to(); + Node *es = EditorNode::get_singleton()->get_edited_scene(); + if (nod && es!=nod && nod->get_owner()!=es) { + draw_red=true; + } + } + + Color sscolor=get_color("prop_subsection","Editor"); TreeItem * current_category=NULL; @@ -2141,11 +2154,16 @@ void PropertyEditor::update_tree() { item->set_metadata( 0, d ); item->set_metadata( 1, p.name ); + + if (draw_red) + item->set_custom_color(0,Color(0.8,0.4,0.20)); + if (p.name==selected_property) { item->select(1); } + //printf("property %s type %i\n",p.name.ascii().get_data(),p.type); switch( p.type ) { diff --git a/tools/editor/scene_tree_dock.cpp b/tools/editor/scene_tree_dock.cpp index c4c3a10f74b..e7f4beb46ee 100644 --- a/tools/editor/scene_tree_dock.cpp +++ b/tools/editor/scene_tree_dock.cpp @@ -108,6 +108,9 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { case TOOL_NEW: { + + if (!_validate_no_foreign()) + break; create_dialog->popup_centered_ratio(); } break; case TOOL_INSTANCE: { @@ -124,6 +127,9 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { break; } + if (!_validate_no_foreign()) + break; + file->set_mode(FileDialog::MODE_OPEN_FILE); List extensions; ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions); @@ -147,6 +153,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (!current) break; + if (!_validate_no_foreign()) + break; connect_dialog->popup_centered_ratio(); connect_dialog->set_node(current); @@ -156,6 +164,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { Node *current = scene_tree->get_selected(); if (!current) break; + if (!_validate_no_foreign()) + break; groups_editor->set_current(current); groups_editor->popup_centered_ratio(); } break; @@ -165,6 +175,9 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (!selected) break; + if (!_validate_no_foreign()) + break; + Ref