From 97e46194f4d524ff8db773f42288fa80f306433b Mon Sep 17 00:00:00 2001 From: Hinsbart Date: Thu, 12 Feb 2015 04:17:29 +0100 Subject: [PATCH 1/7] fix get_joy_name() on windows --- platform/windows/os_windows.cpp | 52 ++++++++++++++++++++++++++++++++- platform/windows/os_windows.h | 1 + 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 915e1a6098..086b4d7d12 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -54,6 +54,8 @@ #include "io/marshalls.h" #include "shlobj.h" +#include + static const WORD MAX_CONSOLE_LINES = 1500; extern "C" { @@ -685,6 +687,48 @@ LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { } + +String OS_Windows::get_joystick_name(int id, JOYCAPS jcaps) +{ + char buffer [256]; + char OEM [256]; + HKEY hKey; + DWORD sz; + int res; + + _snprintf(buffer, sizeof(buffer), "%s\\%s\\%s", + REGSTR_PATH_JOYCONFIG, jcaps.szRegKey, + REGSTR_KEY_JOYCURR ); + res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey); + if (res != ERROR_SUCCESS) + { + res = RegOpenKeyEx(HKEY_CURRENT_USER, buffer, 0, KEY_QUERY_VALUE, &hKey); + if (res != ERROR_SUCCESS) + return ""; + } + + sz = sizeof(OEM); + _snprintf( buffer, sizeof(buffer), "Joystick%d%s", id + 1, REGSTR_VAL_JOYOEMNAME); + res = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEM, &sz); + RegCloseKey ( hKey ); + if (res != ERROR_SUCCESS) + return ""; + + _snprintf( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEM); + res = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey); + if (res != ERROR_SUCCESS) + return ""; + + sz = sizeof(buffer); + res = RegQueryValueEx(hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buffer, + &sz); + RegCloseKey(hKey); + if (res != ERROR_SUCCESS) + return ""; + + return String(buffer); +} + void OS_Windows::probe_joysticks() { static uint32_t last_attached = 0; @@ -726,7 +770,13 @@ void OS_Windows::probe_joysticks() { JOYCAPS jcaps; MMRESULT res = joyGetDevCaps(JOYSTICKID1 + i, &jcaps, sizeof(jcaps)); if (res == JOYERR_NOERROR) { - joy.name = jcaps.szPname; + String name = get_joystick_name(JOYSTICKID1 + i, jcaps); + if ( name == "") + joy.name = jcaps.szPname; + else + joy.name = name; + + }; }; diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 20993c6419..210e25d2d6 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -187,6 +187,7 @@ protected: void probe_joysticks(); void process_joysticks(); void process_key_events(); + String get_joystick_name( int id, JOYCAPS jcaps); struct ProcessInfo { From 9d182e93a3d75396405733109f9f086969c4b19b Mon Sep 17 00:00:00 2001 From: Carl Olsson Date: Fri, 13 Feb 2015 20:49:21 +1000 Subject: [PATCH 2/7] Added body mode property to TileMap to select between static and kinematic physics bodies. Kinematic allow use of TileMaps for moving platforms for example. Updated 2D Platformer demo to use kinematic TileMaps for moving platforms, in doing so discovered that the tileset was messed up and not converting properly, so fixed that too. And in order to fix the tileset I need to activate snapping for collision polygon vertices. --- demos/2d/platformer/moving_platform.png | Bin 2143 -> 0 bytes demos/2d/platformer/moving_platform.xml | 119 ++++++----- demos/2d/platformer/stage.xml | 40 ++-- demos/2d/platformer/tiles_demo.png | Bin 11736 -> 10066 bytes demos/2d/platformer/tileset.xml | 185 ++++++++++++------ demos/2d/platformer/tileset_edit.xml | 142 +++++++++----- scene/2d/tile_map.cpp | 51 +++-- scene/2d/tile_map.h | 11 +- .../collision_polygon_editor_plugin.cpp | 14 +- 9 files changed, 339 insertions(+), 223 deletions(-) delete mode 100644 demos/2d/platformer/moving_platform.png diff --git a/demos/2d/platformer/moving_platform.png b/demos/2d/platformer/moving_platform.png deleted file mode 100644 index f01c6ea37fc5535d28d704004a6c36deb0587890..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2143 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 E02CoKhX4Qo diff --git a/demos/2d/platformer/moving_platform.xml b/demos/2d/platformer/moving_platform.xml index 4d54d6d11c..f39b11782c 100644 --- a/demos/2d/platformer/moving_platform.xml +++ b/demos/2d/platformer/moving_platform.xml @@ -1,77 +1,56 @@ - - - - - 0 - -88, 24, -88, -24, 88, -24, 88, 24 - - + + + "names" - + "moving_platform" "Node2D" + "_import_path" "visibility/visible" "visibility/opacity" "visibility/self_opacity" - "visibility/on_top" "transform/pos" "transform/rot" "transform/scale" + "z/z" + "z/relative" "script/script" "__meta__" "motion" "cycle" "platform" - "RigidBody2D" - "shape_count" - "shapes/0/shape" - "shapes/0/transform" - "shapes/0/trigger" + "TileMap" "mode" - "mass" - "friction" - "bounce" - "custom_integrator" - "continuous_cd" - "contacts_reported" - "contact_monitor" - "active" - "can_sleep" - "velocity/linear" - "velocity/angular" - "Sprite" - "texture" - "centered" - "offset" - "flip_h" - "flip_v" - "vframes" - "hframes" - "frame" - "modulate" - "region" - "region_rect" - "CollisionPolygon2D" - "build_mode" - "polygon" + "tile_set" + "cell/size" + "cell/quadrant_size" + "cell/custom_transform" + "cell/half_offset" + "collision/body_mode" + "collision/friction" + "collision/bounce" + "collision/layers" + "tile_data" "version" 1 "conn_count" 0 "node_count" - 4 + 2 "variants" + "" True 1 0, 0 0 1, 1 - + 0 + "__editor_plugin_states__" @@ -92,16 +71,22 @@ "pixel_snap" False "zoom" - 1.360373 + 1.850616 + "use_snap" + True "ofs" - -210.652, -172.81 + -406.735, -157.32 + "snap" + 32 "3D" + "deflight_rot_y" + 0.628319 "zfar" 500 "fov" - 400 + 179 "viewports" @@ -111,10 +96,12 @@ 0 "y_rot" 0 - "use_orthogonal" - False + "listener" + True "use_environment" False + "use_orthogonal" + False "pos" 0, 0, 0 @@ -125,10 +112,12 @@ 0 "y_rot" 0 - "use_orthogonal" + "listener" False "use_environment" False + "use_orthogonal" + False "pos" 0, 0, 0 @@ -139,10 +128,12 @@ 0 "y_rot" 0 - "use_orthogonal" + "listener" False "use_environment" False + "use_orthogonal" + False "pos" 0, 0, 0 @@ -153,10 +144,12 @@ 0 "y_rot" 0 - "use_orthogonal" + "listener" False "use_environment" False + "use_orthogonal" + False "pos" 0, 0, 0 @@ -165,12 +158,18 @@ 1 "default_light" True + "ambient_light_color" + 0.15, 0.15, 0.15, 1 "show_grid" True "show_origin" True "znear" 0.1 + "default_srgb" + False + "deflight_rot_x" + 0.942478 "__editor_run_settings__" @@ -183,19 +182,17 @@ "__editor_plugin_screen__" "2D" + -96, -32 + + 64, 64 + 16 + 1, 0, 0, 1, 0, 0 + 2 1 - - 1, -0, 0, 1, 0, 0 - False - 3 - 0 - - 1, 1, 1, 1 - 0, 0, 0, 0 - -88, -24, 88, -24, 88, 24, -88, 24 + 0, 536870927, 1, 536870926, 2, 15 "nodes" - -1, -1, 1, 0, -1, 11, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 2, 12, 1, 0, 0, 0, 14, 13, -1, 23, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 15, 7, 16, 8, 17, 9, 18, 10, 19, 11, 20, 1, 21, 1, 22, 3, 23, 10, 24, 10, 25, 12, 26, 10, 27, 0, 28, 0, 29, 2, 30, 3, 0, 1, 0, 31, 31, -1, 18, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 32, 13, 33, 0, 34, 2, 35, 10, 36, 10, 37, 7, 38, 7, 39, 12, 40, 14, 41, 10, 42, 15, 0, 1, 0, 43, 43, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 44, 12, 45, 16, 0 + -1, -1, 1, 0, -1, 13, 2, 0, 3, 1, 4, 2, 5, 2, 6, 3, 7, 4, 8, 5, 9, 6, 10, 1, 11, 7, 12, 8, 13, 3, 14, 2, 0, 0, 0, 16, 15, -1, 20, 2, 0, 3, 1, 4, 2, 5, 2, 6, 9, 7, 4, 8, 5, 9, 6, 10, 1, 17, 6, 18, 10, 19, 11, 20, 12, 21, 13, 22, 14, 23, 15, 24, 2, 25, 4, 26, 15, 27, 16, 0 "conns" diff --git a/demos/2d/platformer/stage.xml b/demos/2d/platformer/stage.xml index e2943d8fcf..35517f747d 100644 --- a/demos/2d/platformer/stage.xml +++ b/demos/2d/platformer/stage.xml @@ -1,17 +1,17 @@ - - + + + - - + "names" - + "stage" "Node" "_import_path" @@ -21,16 +21,18 @@ "visibility/visible" "visibility/opacity" "visibility/self_opacity" - "visibility/behind_parent" "transform/pos" "transform/rot" "transform/scale" + "z/z" + "z/relative" "mode" "tile_set" "cell/size" "cell/quadrant_size" "cell/custom_transform" "cell/half_offset" + "collision/body_mode" "collision/friction" "collision/bounce" "collision/layers" @@ -167,11 +169,11 @@ "pixel_snap" False "zoom" - 0.54036 + 0.814506 "use_snap" False "ofs" - -177.089, 415.221 + -121.031, 464.121 "snap" 10 @@ -276,22 +278,21 @@ 0 "__editor_plugin_screen__" - "Script" + "2D" True 1 - False 0, 0 0 1, 1 0 64, 64 - 16 + 8 1, 0, 0, 1, 0, 0 2 1 - 0, 2, 70, 536870914, 71, 10, 72, 10, 73, 10, 74, 10, 75, 10, 76, 10, 77, 10, 78, 10, 65536, 2, 65606, 536870914, 65607, 10, 65608, 10, 65609, 10, 65610, 10, 65611, 10, 65612, 10, 65613, 10, 65614, 10, 131072, 2, 131142, 536870914, 131143, 10, 131144, 10, 131145, 10, 131146, 10, 131147, 10, 131148, 10, 131149, 10, 131150, 10, 196608, 2, 196626, 9, 196678, 536870914, 196679, 10, 196680, 10, 196681, 10, 196682, 10, 196683, 10, 196684, 10, 196685, 10, 196686, 10, 262144, 2, 262162, 8, 262214, 536870914, 262215, 10, 262216, 10, 262217, 10, 262218, 10, 262219, 10, 262220, 10, 262221, 10, 262222, 10, 327680, 2, 327697, 536870921, 327698, 7, 327733, 9, 327750, 536870914, 327751, 10, 327752, 10, 327753, 10, 327754, 10, 327755, 10, 327756, 10, 327757, 10, 327758, 10, 393216, 2, 393233, 536870920, 393234, 7, 393257, 9, 393269, 7, 393286, 536870914, 393287, 10, 393288, 10, 393289, 10, 393290, 10, 393291, 10, 393292, 10, 393293, 10, 393294, 10, 458752, 2, 458769, 7, 458770, 8, 458790, 9, 458793, 8, 458805, 8, 458822, 536870914, 458823, 10, 458824, 10, 458825, 10, 458826, 10, 458827, 10, 458828, 10, 458829, 10, 458830, 10, 524288, 4, 524289, 1, 524304, 536870913, 524305, 536870918, 524306, 6, 524307, 5, 524308, 1, 524326, 8, 524329, 7, 524341, 7, 524358, 536870914, 524359, 10, 524360, 10, 524361, 10, 524362, 10, 524363, 10, 524364, 10, 524365, 10, 524366, 10, 589824, 10, 589825, 13, 589840, 536870914, 589841, 10, 589842, 10, 589843, 10, 589844, 2, 589862, 7, 589865, 7, 589876, 536870913, 589877, 6, 589878, 1, 589894, 536870914, 589895, 10, 589896, 10, 589897, 10, 589898, 10, 589899, 10, 589900, 10, 589901, 10, 589902, 10, 655360, 2, 655376, 536870914, 655377, 10, 655378, 10, 655379, 10, 655380, 2, 655398, 7, 655401, 8, 655412, 536870925, 655413, 11, 655414, 13, 655430, 536870914, 655431, 10, 655432, 10, 655433, 10, 655434, 10, 655435, 10, 655436, 10, 655437, 10, 655438, 10, 720896, 2, 720912, 536870914, 720913, 10, 720914, 10, 720915, 10, 720916, 2, 720934, 8, 720937, 7, 720958, 536870913, 720959, 5, 720960, 536870917, 720961, 5, 720962, 5, 720963, 536870917, 720964, 5, 720965, 0, 720966, 536870916, 720967, 10, 720968, 10, 720969, 10, 720970, 10, 720971, 10, 720972, 10, 720973, 10, 720974, 10, 786432, 2, 786437, 9, 786448, 536870914, 786449, 10, 786450, 10, 786451, 10, 786452, 2, 786464, 536870913, 786465, 1, 786470, 7, 786473, 7, 786474, 536870924, 786475, 1, 786494, 536870914, 786495, 10, 786496, 10, 786497, 10, 786498, 10, 786499, 10, 786500, 10, 786501, 10, 786502, 10, 786503, 10, 786504, 10, 786505, 10, 786506, 10, 786507, 10, 786508, 10, 786509, 10, 851968, 2, 851973, 7, 851984, 536870914, 851985, 10, 851986, 10, 851987, 10, 851988, 2, 851996, 536870913, 851997, 1, 852000, 536870914, 852001, 3, 852006, 7, 852009, 536870913, 852011, 2, 852030, 536870914, 852031, 10, 852032, 10, 852033, 10, 852034, 10, 852035, 10, 852036, 10, 852037, 10, 852038, 10, 852039, 10, 852040, 10, 852041, 10, 852042, 10, 852043, 10, 852044, 10, 852045, 10, 917504, 2, 917506, 9, 917509, 7, 917512, 536870921, 917520, 536870925, 917521, 11, 917522, 11, 917523, 11, 917524, 13, 917532, 536870925, 917533, 13, 917536, 536870914, 917537, 4, 917538, 1, 917540, 536870913, 917541, 0, 917542, 1, 917545, 536870914, 917546, 10, 917547, 4, 917548, 1, 917566, 536870914, 917567, 10, 917568, 10, 917569, 10, 917570, 10, 917571, 10, 917572, 10, 917573, 10, 917574, 10, 917575, 10, 917576, 10, 917577, 10, 917578, 10, 917579, 10, 917580, 10, 917581, 10, 983040, 2, 983042, 7, 983045, 7, 983048, 536870920, 983050, 536870913, 983051, 1, 983064, 536870913, 983065, 1, 983072, 536870914, 983073, 10, 983074, 4, 983075, 0, 983076, 536870916, 983077, 10, 983078, 4, 983079, 536870912, 983080, 536870912, 983081, 536870916, 983082, 10, 983083, 10, 983084, 2, 983095, 9, 983102, 536870914, 983103, 10, 983104, 10, 983105, 10, 983106, 10, 983107, 10, 983108, 10, 983109, 10, 983110, 10, 983111, 10, 983112, 10, 983113, 10, 983114, 10, 983115, 10, 983116, 10, 983117, 10, 1048576, 2, 1048578, 8, 1048581, 8, 1048584, 536870919, 1048586, 536870925, 1048587, 13, 1048600, 536870925, 1048601, 13, 1048604, 9, 1048608, 536870925, 1048609, 536870923, 1048610, 536870923, 1048611, 536870923, 1048612, 10, 1048613, 10, 1048614, 10, 1048615, 10, 1048616, 10, 1048617, 10, 1048618, 10, 1048619, 10, 1048620, 4, 1048621, 1, 1048630, 536870921, 1048631, 8, 1048638, 536870914, 1048639, 10, 1048640, 10, 1048641, 10, 1048642, 10, 1048643, 10, 1048644, 10, 1048645, 10, 1048646, 10, 1048647, 10, 1048648, 10, 1048649, 10, 1048650, 10, 1048651, 10, 1048652, 10, 1048653, 10, 1114112, 4, 1114113, 0, 1114114, 6, 1114115, 0, 1114116, 0, 1114117, 6, 1114118, 1, 1114120, 536870920, 1114128, 536870913, 1114129, 5, 1114130, 536870917, 1114131, 5, 1114132, 0, 1114133, 1, 1114140, 7, 1114141, 536870921, 1114148, 536870914, 1114149, 10, 1114150, 10, 1114151, 10, 1114152, 10, 1114153, 10, 1114154, 10, 1114155, 10, 1114156, 10, 1114157, 2, 1114166, 536870920, 1114167, 8, 1114174, 536870914, 1114175, 10, 1114176, 10, 1114177, 10, 1114178, 10, 1114179, 10, 1114180, 10, 1114181, 10, 1114182, 10, 1114183, 10, 1114184, 10, 1114185, 10, 1114186, 10, 1114187, 10, 1114188, 10, 1179648, 10, 1179649, 10, 1179650, 10, 1179651, 10, 1179652, 10, 1179653, 10, 1179654, 2, 1179656, 536870919, 1179663, 536870915, 1179665, 10, 1179666, 10, 1179667, 10, 1179668, 10, 1179669, 4, 1179670, 12, 1179675, 9, 1179676, 8, 1179677, 8, 1179684, 536870914, 1179685, 10, 1179686, 10, 1179687, 10, 1179688, 10, 1179689, 10, 1179690, 10, 1179691, 10, 1179692, 10, 1179693, 4, 1179694, 1, 1179701, 9, 1179702, 536870919, 1179703, 7, 1179710, 536870914, 1179711, 10, 1179712, 10, 1179713, 10, 1179714, 10, 1179715, 10, 1179716, 10, 1179717, 10, 1179718, 10, 1179719, 10, 1179720, 10, 1179721, 10, 1179722, 10, 1245184, 10, 1245185, 10, 1245186, 10, 1245187, 10, 1245188, 10, 1245189, 10, 1245190, 2, 1245192, 536870919, 1245199, 536870913, 1245200, 536870916, 1245201, 10, 1245202, 10, 1245203, 10, 1245204, 10, 1245205, 10, 1245207, 1, 1245211, 7, 1245212, 7, 1245213, 536870920, 1245220, 536870914, 1245221, 10, 1245222, 10, 1245223, 10, 1245224, 10, 1245225, 10, 1245226, 10, 1245227, 10, 1245228, 10, 1245229, 10, 1245230, 2, 1245237, 8, 1245238, 536870919, 1245239, 8, 1245240, 536870921, 1245246, 536870914, 1245247, 10, 1245248, 10, 1245249, 10, 1245250, 10, 1245251, 10, 1245252, 10, 1245253, 10, 1245254, 10, 1245255, 10, 1245256, 10, 1245257, 10, 1245258, 10, 1310720, 10, 1310721, 10, 1310722, 10, 1310723, 10, 1310724, 10, 1310725, 10, 1310726, 2, 1310728, 536870920, 1310730, 536870913, 1310731, 1, 1310734, 536870913, 1310735, 536870916, 1310736, 10, 1310737, 10, 1310738, 10, 1310739, 10, 1310740, 10, 1310741, 10, 1310742, 10, 1310743, 4, 1310744, 1, 1310747, 8, 1310748, 7, 1310749, 536870919, 1310756, 536870914, 1310757, 10, 1310758, 10, 1310759, 10, 1310760, 10, 1310761, 10, 1310762, 10, 1310763, 10, 1310764, 10, 1310765, 10, 1310766, 4, 1310767, 5, 1310768, 12, 1310773, 7, 1310774, 536870919, 1310775, 7, 1310776, 536870919, 1310782, 536870914, 1310783, 10, 1310784, 10, 1310785, 10, 1310786, 10, 1310787, 10, 1310788, 10, 1310789, 10, 1310790, 10, 1310791, 10, 1310792, 10, 1310793, 10, 1376256, 10, 1376257, 10, 1376258, 10, 1376259, 10, 1376260, 10, 1376261, 10, 1376262, 4, 1376263, 0, 1376264, 536870918, 1376265, 0, 1376266, 536870916, 1376267, 4, 1376268, 0, 1376269, 0, 1376270, 536870916, 1376271, 10, 1376272, 10, 1376273, 10, 1376274, 10, 1376275, 10, 1376276, 10, 1376277, 10, 1376278, 10, 1376279, 10, 1376280, 4, 1376281, 12, 1376283, 8, 1376284, 8, 1376285, 536870920, 1376287, 536870924, 1376288, 0, 1376289, 5, 1376290, 536870917, 1376291, 0, 1376292, 536870916, 1376293, 10, 1376294, 10, 1376295, 10, 1376296, 10, 1376297, 10, 1376298, 10, 1376299, 10, 1376300, 10, 1376301, 10, 1376302, 10, 1376303, 10, 1376305, 12, 1376309, 7, 1376310, 536870920, 1376311, 7, 1376312, 536870920, 1376318, 536870914, 1376319, 10, 1376320, 10, 1376321, 10, 1376322, 10, 1376323, 10, 1376324, 10, 1376325, 10, 1376326, 10, 1376327, 10, 1376328, 10, 1441792, 10, 1441793, 10, 1441794, 10, 1441795, 10, 1441796, 10, 1441797, 10, 1441798, 10, 1441799, 10, 1441800, 10, 1441801, 10, 1441802, 10, 1441803, 10, 1441804, 10, 1441805, 10, 1441806, 10, 1441807, 10, 1441808, 10, 1441809, 10, 1441810, 10, 1441811, 10, 1441812, 10, 1441813, 10, 1441814, 10, 1441815, 10, 1441816, 10, 1441818, 0, 1441819, 6, 1441820, 6, 1441821, 536870918, 1441822, 5, 1441824, 10, 1441825, 10, 1441826, 10, 1441827, 10, 1441828, 10, 1441829, 10, 1441830, 10, 1441831, 10, 1441832, 10, 1441833, 10, 1441834, 10, 1441835, 10, 1441836, 10, 1441837, 10, 1441838, 10, 1441839, 10, 1441840, 10, 1441842, 0, 1441843, 0, 1441844, 0, 1441845, 6, 1441846, 536870918, 1441847, 6, 1441848, 536870918, 1441849, 0, 1441850, 5, 1441851, 536870917, 1441852, 5, 1441853, 0, 1441854, 536870916, 1441855, 10, 1441856, 10, 1441857, 10, 1441858, 10, 1441859, 10, 1441860, 10, 1441861, 10, 1441862, 10, 1441863, 10, 1507328, 10, 1507329, 10, 1507330, 10, 1507331, 10, 1507332, 10, 1507333, 10, 1507334, 10, 1507335, 10, 1507336, 10, 1507337, 10, 1507338, 10, 1507339, 10, 1507340, 10, 1507341, 10, 1507342, 10, 1507343, 10, 1507344, 10, 1507345, 10, 1507346, 10, 1507347, 10, 1507348, 10, 1507349, 10, 1507350, 10, 1507351, 10, 1507352, 10, 1507353, 10, 1507354, 10, 1507355, 10, 1507356, 10, 1507357, 10, 1507358, 10, 1507359, 10, 1507360, 10, 1507361, 10, 1507362, 10, 1507363, 10, 1507364, 10, 1507365, 10, 1507366, 10, 1507367, 10, 1507368, 10, 1507369, 10, 1507370, 10, 1507371, 10, 1507372, 10, 1507373, 10, 1507374, 10, 1507375, 10, 1507376, 10, 1507377, 10, 1507378, 10, 1507379, 10, 1507380, 10, 1507381, 10, 1507382, 10, 1507383, 10, 1507384, 10, 1507385, 10, 1507386, 10, 1507387, 10, 1507388, 10, 1507389, 10, 1507390, 10, 1507391, 10, 1507392, 10, 1507393, 10, 1507394, 10, 1507395, 10, 1507396, 10, 1507397, 10, 1507398, 10, 1507399, 10, 1572864, 10, 1572865, 10, 1572866, 10, 1572867, 10, 1572868, 10, 1572869, 10, 1572870, 10, 1572871, 10, 1572872, 10, 1572873, 10, 1572874, 10, 1572875, 10, 1572876, 10, 1572877, 10, 1572878, 10, 1572879, 10, 1572880, 10, 1572881, 10, 1572882, 10, 1572883, 10, 1572884, 10, 1572885, 10, 1572886, 10, 1572887, 10, 1572888, 10, 1572889, 10, 1572890, 10, 1572891, 10, 1572892, 10, 1572893, 10, 1572894, 10, 1572895, 10, 1572896, 10, 1572897, 10, 1572898, 10, 1572899, 10, 1572900, 10, 1572901, 10, 1572902, 10, 1572903, 10, 1572904, 10, 1572905, 10, 1572906, 10, 1572907, 10, 1572908, 10, 1572909, 10, 1572910, 10, 1572911, 10, 1572912, 10, 1572913, 10, 1572914, 10, 1572915, 10, 1572916, 10, 1572917, 10, 1572918, 10, 1572919, 10, 1572920, 10, 1572921, 10, 1572922, 10, 1572923, 10, 1572924, 10, 1572925, 10, 1572926, 10, 1572927, 10, 1572928, 10, 1572929, 10, 1572930, 10, 1572931, 10, 1572932, 10, 1572933, 10, 1572934, 10, 1572935, 10, 1638400, 10, 1638401, 10, 1638402, 10, 1638403, 10, 1638404, 10, 1638405, 10, 1638406, 10, 1638407, 10, 1638408, 10, 1638409, 10, 1638410, 10, 1638411, 10, 1638412, 10, 1638413, 10, 1638414, 10, 1638415, 10, 1638416, 10, 1638417, 10, 1638418, 10, 1638419, 10, 1638420, 10, 1638421, 10, 1638422, 10, 1638423, 10, 1638424, 10, 1638425, 10, 1638426, 10, 1638427, 10, 1638428, 10, 1638429, 10, 1638430, 10, 1638431, 10, 1638432, 10, 1638433, 10, 1638434, 10, 1638435, 10, 1638436, 10, 1638437, 10, 1638438, 10, 1638439, 10, 1638440, 10, 1638441, 10, 1638442, 10, 1638443, 10, 1638444, 10, 1638445, 10, 1638446, 10, 1638447, 10, 1638448, 10, 1638449, 10, 1638450, 10, 1638451, 10, 1638452, 10, 1638453, 10, 1638454, 10, 1638455, 10, 1638456, 10, 1638457, 10, 1638458, 10, 1638459, 10, 1638460, 10, 1638461, 10, 1638462, 10, 1638463, 10, 1638464, 10, 1638465, 10, 1638466, 10, 1638467, 10, 1638468, 10, 1638469, 10, 1638470, 10, 1638471, 10, 1703952, 10, 1703953, 10, 1703954, 10, 1703955, 10, 1703956, 10, 1703957, 10, 1703958, 10, 1703959, 10, 1703960, 10, 1703961, 10, 1703962, 10, 1703963, 10, 1703964, 10, 1703965, 10, 1703966, 10, 1703967, 10, 1703968, 10, 1703969, 10, 1703970, 10, 1703971, 10, 1703972, 10, 1703973, 10, 1703974, 10, 1703975, 10, 1703976, 10, 1703977, 10, 1703978, 10, 1703979, 10, 1703980, 10, 1703981, 10, 1703982, 10, 1703983, 10, 1703984, 10, 1703985, 10, 1703986, 10, 1703987, 10, 1703988, 10, 1703989, 10, 1703990, 10, 1703991, 10, 1703992, 10, 1703993, 10, 1703994, 10, 1703995, 10, 1703996, 10, 1703997, 10, 1703998, 10, 1703999, 10, 1704000, 10, 1704001, 10, 1704002, 10, 1704003, 10, 1704004, 10, 1704005, 10, 1704006, 10, 1704007, 10, 1769488, 10, 1769489, 10, 1769490, 10, 1769491, 10, 1769492, 10, 1769493, 10, 1769494, 10, 1769495, 10, 1769496, 10, 1769497, 10, 1769498, 10, 1769499, 10, 1769500, 10, 1769501, 10, 1769502, 10, 1769503, 10, 1769504, 10, 1769505, 10, 1769506, 10, 1769507, 10, 1769508, 10, 1769509, 10, 1769510, 10, 1769511, 10, 1769512, 10, 1769513, 10, 1769514, 10, 1769515, 10, 1769516, 10, 1769517, 10, 1769518, 10, 1769519, 10, 1769520, 10, 1769521, 10, 1769522, 10, 1769523, 10, 1769524, 10, 1769525, 10, 1769526, 10, 1769527, 10, 1769528, 10, 1769529, 10, 1769530, 10, 1769531, 10, 1769532, 10, 1769533, 10, 1769534, 10, 1769535, 10, 1769536, 10, 1769537, 10, 1769538, 10, 1769539, 10, 1769540, 10, 1769541, 10 + 0, 2, 70, 536870914, 71, 10, 72, 10, 73, 10, 74, 10, 75, 10, 76, 10, 77, 10, 78, 10, 65536, 2, 65606, 536870914, 65607, 10, 65608, 10, 65609, 10, 65610, 10, 65611, 10, 65612, 10, 65613, 10, 65614, 10, 131072, 2, 131142, 536870914, 131143, 10, 131144, 10, 131145, 10, 131146, 10, 131147, 10, 131148, 10, 131149, 10, 131150, 10, 196608, 2, 196626, 9, 196678, 536870914, 196679, 10, 196680, 10, 196681, 10, 196682, 10, 196683, 10, 196684, 10, 196685, 10, 196686, 10, 262144, 2, 262162, 8, 262214, 536870914, 262215, 10, 262216, 10, 262217, 10, 262218, 10, 262219, 10, 262220, 10, 262221, 10, 262222, 10, 327680, 2, 327697, 536870921, 327698, 7, 327733, 9, 327750, 536870914, 327751, 10, 327752, 10, 327753, 10, 327754, 10, 327755, 10, 327756, 10, 327757, 10, 327758, 10, 393216, 2, 393233, 536870920, 393234, 7, 393257, 9, 393269, 7, 393286, 536870914, 393287, 10, 393288, 10, 393289, 10, 393290, 10, 393291, 10, 393292, 10, 393293, 10, 393294, 10, 458752, 2, 458769, 7, 458770, 8, 458790, 9, 458793, 8, 458805, 8, 458822, 536870914, 458823, 10, 458824, 10, 458825, 10, 458826, 10, 458827, 10, 458828, 10, 458829, 10, 458830, 10, 524288, 4, 524289, 1, 524304, 536870913, 524305, 536870918, 524306, 6, 524307, 5, 524308, 1, 524326, 8, 524329, 7, 524341, 7, 524358, 536870914, 524359, 10, 524360, 10, 524361, 10, 524362, 10, 524363, 10, 524364, 10, 524365, 10, 524366, 10, 589824, 10, 589825, 13, 589840, 536870914, 589841, 10, 589842, 10, 589843, 10, 589844, 2, 589862, 7, 589865, 7, 589876, 536870913, 589877, 6, 589878, 1, 589894, 536870914, 589895, 10, 589896, 10, 589897, 10, 589898, 10, 589899, 10, 589900, 10, 589901, 10, 589902, 10, 655360, 2, 655376, 536870914, 655377, 10, 655378, 10, 655379, 10, 655380, 2, 655398, 7, 655401, 8, 655412, 536870925, 655413, 11, 655414, 13, 655430, 536870914, 655431, 10, 655432, 10, 655433, 10, 655434, 10, 655435, 10, 655436, 10, 655437, 10, 655438, 10, 720896, 2, 720912, 536870914, 720913, 10, 720914, 10, 720915, 10, 720916, 2, 720934, 8, 720937, 7, 720958, 536870913, 720959, 5, 720960, 536870917, 720961, 5, 720962, 5, 720963, 536870917, 720964, 5, 720965, 0, 720966, 536870916, 720967, 10, 720968, 10, 720969, 10, 720970, 10, 720971, 10, 720972, 10, 720973, 10, 720974, 10, 786432, 2, 786437, 9, 786448, 536870914, 786449, 10, 786450, 10, 786451, 10, 786452, 2, 786464, 536870913, 786465, 1, 786470, 7, 786473, 7, 786474, 536870924, 786475, 1, 786494, 536870914, 786495, 10, 786496, 10, 786497, 10, 786498, 10, 786499, 10, 786500, 10, 786501, 10, 786502, 10, 786503, 10, 786504, 10, 786505, 10, 786506, 10, 786507, 10, 786508, 10, 786509, 10, 851968, 2, 851973, 7, 851984, 536870914, 851985, 10, 851986, 10, 851987, 10, 851988, 2, 851996, 536870913, 851997, 1, 852000, 536870914, 852001, 3, 852006, 7, 852009, 536870913, 852011, 2, 852030, 536870914, 852031, 10, 852032, 10, 852033, 10, 852034, 10, 852035, 10, 852036, 10, 852037, 10, 852038, 10, 852039, 10, 852040, 10, 852041, 10, 852042, 10, 852043, 10, 852044, 10, 852045, 10, 917504, 2, 917506, 9, 917509, 7, 917512, 536870921, 917520, 536870925, 917521, 11, 917522, 11, 917523, 11, 917524, 13, 917532, 536870925, 917533, 13, 917536, 536870914, 917537, 4, 917538, 1, 917540, 536870913, 917541, 0, 917542, 1, 917545, 536870914, 917546, 10, 917547, 4, 917548, 1, 917566, 536870914, 917567, 10, 917568, 10, 917569, 10, 917570, 10, 917571, 10, 917572, 10, 917573, 10, 917574, 10, 917575, 10, 917576, 10, 917577, 10, 917578, 10, 917579, 10, 917580, 10, 917581, 10, 983040, 2, 983042, 7, 983045, 7, 983048, 536870920, 983050, 536870913, 983051, 1, 983064, 536870913, 983065, 1, 983072, 536870914, 983073, 10, 983074, 4, 983075, 0, 983076, 536870916, 983077, 10, 983078, 4, 983079, 536870912, 983080, 536870912, 983081, 536870916, 983082, 10, 983083, 10, 983084, 2, 983095, 9, 983102, 536870914, 983103, 10, 983104, 10, 983105, 10, 983106, 10, 983107, 10, 983108, 10, 983109, 10, 983110, 10, 983111, 10, 983112, 10, 983113, 10, 983114, 10, 983115, 10, 983116, 10, 983117, 10, 1048576, 2, 1048578, 8, 1048581, 8, 1048584, 536870919, 1048586, 536870925, 1048587, 13, 1048600, 536870925, 1048601, 13, 1048604, 9, 1048608, 536870925, 1048609, 536870923, 1048610, 536870923, 1048611, 536870923, 1048612, 10, 1048613, 10, 1048614, 10, 1048615, 10, 1048616, 10, 1048617, 10, 1048618, 10, 1048619, 10, 1048620, 4, 1048621, 1, 1048630, 536870921, 1048631, 8, 1048638, 536870914, 1048639, 10, 1048640, 10, 1048641, 10, 1048642, 10, 1048643, 10, 1048644, 10, 1048645, 10, 1048646, 10, 1048647, 10, 1048648, 10, 1048649, 10, 1048650, 10, 1048651, 10, 1048652, 10, 1048653, 10, 1114112, 4, 1114113, 0, 1114114, 6, 1114115, 0, 1114116, 0, 1114117, 6, 1114118, 1, 1114120, 536870920, 1114128, 536870913, 1114129, 5, 1114130, 536870917, 1114131, 5, 1114132, 0, 1114133, 1, 1114140, 7, 1114141, 536870921, 1114148, 536870914, 1114149, 10, 1114150, 10, 1114151, 10, 1114152, 10, 1114153, 10, 1114154, 10, 1114155, 10, 1114156, 10, 1114157, 2, 1114166, 536870920, 1114167, 8, 1114174, 536870914, 1114175, 10, 1114176, 10, 1114177, 10, 1114178, 10, 1114179, 10, 1114180, 10, 1114181, 10, 1114182, 10, 1114183, 10, 1114184, 10, 1114185, 10, 1114186, 10, 1114187, 10, 1114188, 10, 1179648, 10, 1179649, 10, 1179650, 10, 1179651, 10, 1179652, 10, 1179653, 10, 1179654, 2, 1179656, 536870919, 1179663, 536870915, 1179665, 10, 1179666, 10, 1179667, 10, 1179668, 10, 1179669, 4, 1179670, 12, 1179675, 9, 1179676, 8, 1179677, 8, 1179684, 536870914, 1179685, 10, 1179686, 10, 1179687, 10, 1179688, 10, 1179689, 10, 1179690, 10, 1179691, 10, 1179692, 10, 1179693, 4, 1179694, 1, 1179701, 9, 1179702, 536870919, 1179703, 7, 1179710, 536870914, 1179711, 10, 1179712, 10, 1179713, 10, 1179714, 10, 1179715, 10, 1179716, 10, 1179717, 10, 1179718, 10, 1179719, 10, 1179720, 10, 1179721, 10, 1179722, 10, 1245184, 10, 1245185, 10, 1245186, 10, 1245187, 10, 1245188, 10, 1245189, 10, 1245190, 2, 1245192, 536870919, 1245199, 536870913, 1245200, 536870916, 1245201, 10, 1245202, 10, 1245203, 10, 1245204, 10, 1245205, 10, 1245207, 1, 1245211, 7, 1245212, 7, 1245213, 536870920, 1245220, 536870914, 1245221, 10, 1245222, 10, 1245223, 10, 1245224, 10, 1245225, 10, 1245226, 10, 1245227, 10, 1245228, 10, 1245229, 10, 1245230, 2, 1245237, 8, 1245238, 536870919, 1245239, 8, 1245240, 536870921, 1245246, 536870914, 1245247, 10, 1245248, 10, 1245249, 10, 1245250, 10, 1245251, 10, 1245252, 10, 1245253, 10, 1245254, 10, 1245255, 10, 1245256, 10, 1245257, 10, 1245258, 10, 1310720, 10, 1310721, 10, 1310722, 10, 1310723, 10, 1310724, 10, 1310725, 10, 1310726, 2, 1310728, 536870920, 1310730, 536870913, 1310731, 1, 1310734, 536870913, 1310735, 536870916, 1310736, 10, 1310737, 10, 1310738, 10, 1310739, 10, 1310740, 10, 1310741, 10, 1310742, 10, 1310743, 4, 1310744, 1, 1310747, 8, 1310748, 7, 1310749, 536870919, 1310756, 536870914, 1310757, 10, 1310758, 10, 1310759, 10, 1310760, 10, 1310761, 10, 1310762, 10, 1310763, 10, 1310764, 10, 1310765, 10, 1310766, 4, 1310767, 5, 1310768, 12, 1310773, 7, 1310774, 536870919, 1310775, 7, 1310776, 536870919, 1310782, 536870914, 1310783, 10, 1310784, 10, 1310785, 10, 1310786, 10, 1310787, 10, 1310788, 10, 1310789, 10, 1310790, 10, 1310791, 10, 1310792, 10, 1310793, 10, 1376256, 10, 1376257, 10, 1376258, 10, 1376259, 10, 1376260, 10, 1376261, 10, 1376262, 4, 1376263, 0, 1376264, 0, 1376265, 0, 1376266, 536870916, 1376267, 4, 1376268, 0, 1376269, 0, 1376270, 536870916, 1376271, 10, 1376272, 10, 1376273, 10, 1376274, 10, 1376275, 10, 1376276, 10, 1376277, 10, 1376278, 10, 1376279, 10, 1376280, 4, 1376281, 12, 1376283, 8, 1376284, 8, 1376285, 536870920, 1376287, 536870924, 1376288, 0, 1376289, 5, 1376290, 536870917, 1376291, 0, 1376292, 536870916, 1376293, 10, 1376294, 10, 1376295, 10, 1376296, 10, 1376297, 10, 1376298, 10, 1376299, 10, 1376300, 10, 1376301, 10, 1376302, 10, 1376303, 10, 1376305, 12, 1376309, 7, 1376310, 536870920, 1376311, 7, 1376312, 536870920, 1376318, 536870914, 1376319, 10, 1376320, 10, 1376321, 10, 1376322, 10, 1376323, 10, 1376324, 10, 1376325, 10, 1376326, 10, 1376327, 10, 1376328, 10, 1441792, 10, 1441793, 10, 1441794, 10, 1441795, 10, 1441796, 10, 1441797, 10, 1441798, 10, 1441799, 10, 1441800, 10, 1441801, 10, 1441802, 10, 1441803, 10, 1441804, 10, 1441805, 10, 1441806, 10, 1441807, 10, 1441808, 10, 1441809, 10, 1441810, 10, 1441811, 10, 1441812, 10, 1441813, 10, 1441814, 10, 1441815, 10, 1441816, 10, 1441818, 0, 1441819, 6, 1441820, 6, 1441821, 536870918, 1441822, 5, 1441824, 10, 1441825, 10, 1441826, 10, 1441827, 10, 1441828, 10, 1441829, 10, 1441830, 10, 1441831, 10, 1441832, 10, 1441833, 10, 1441834, 10, 1441835, 10, 1441836, 10, 1441837, 10, 1441838, 10, 1441839, 10, 1441840, 10, 1441842, 0, 1441843, 0, 1441844, 0, 1441845, 6, 1441846, 536870918, 1441847, 6, 1441848, 536870918, 1441849, 0, 1441850, 5, 1441851, 536870917, 1441852, 5, 1441853, 0, 1441854, 536870916, 1441855, 10, 1441856, 10, 1441857, 10, 1441858, 10, 1441859, 10, 1441860, 10, 1441861, 10, 1441862, 10, 1441863, 10, 1507328, 10, 1507329, 10, 1507330, 10, 1507331, 10, 1507332, 10, 1507333, 10, 1507334, 10, 1507335, 10, 1507336, 10, 1507337, 10, 1507338, 10, 1507339, 10, 1507340, 10, 1507341, 10, 1507342, 10, 1507343, 10, 1507344, 10, 1507345, 10, 1507346, 10, 1507347, 10, 1507348, 10, 1507349, 10, 1507350, 10, 1507351, 10, 1507352, 10, 1507353, 10, 1507354, 10, 1507355, 10, 1507356, 10, 1507357, 10, 1507358, 10, 1507359, 10, 1507360, 10, 1507361, 10, 1507362, 10, 1507363, 10, 1507364, 10, 1507365, 10, 1507366, 10, 1507367, 10, 1507368, 10, 1507369, 10, 1507370, 10, 1507371, 10, 1507372, 10, 1507373, 10, 1507374, 10, 1507375, 10, 1507376, 10, 1507377, 10, 1507378, 10, 1507379, 10, 1507380, 10, 1507381, 10, 1507382, 10, 1507383, 10, 1507384, 10, 1507385, 10, 1507386, 10, 1507387, 10, 1507388, 10, 1507389, 10, 1507390, 10, 1507391, 10, 1507392, 10, 1507393, 10, 1507394, 10, 1507395, 10, 1507396, 10, 1507397, 10, 1507398, 10, 1507399, 10, 1572864, 10, 1572865, 10, 1572866, 10, 1572867, 10, 1572868, 10, 1572869, 10, 1572870, 10, 1572871, 10, 1572872, 10, 1572873, 10, 1572874, 10, 1572875, 10, 1572876, 10, 1572877, 10, 1572878, 10, 1572879, 10, 1572880, 10, 1572881, 10, 1572882, 10, 1572883, 10, 1572884, 10, 1572885, 10, 1572886, 10, 1572887, 10, 1572888, 10, 1572889, 10, 1572890, 10, 1572891, 10, 1572892, 10, 1572893, 10, 1572894, 10, 1572895, 10, 1572896, 10, 1572897, 10, 1572898, 10, 1572899, 10, 1572900, 10, 1572901, 10, 1572902, 10, 1572903, 10, 1572904, 10, 1572905, 10, 1572906, 10, 1572907, 10, 1572908, 10, 1572909, 10, 1572910, 10, 1572911, 10, 1572912, 10, 1572913, 10, 1572914, 10, 1572915, 10, 1572916, 10, 1572917, 10, 1572918, 10, 1572919, 10, 1572920, 10, 1572921, 10, 1572922, 10, 1572923, 10, 1572924, 10, 1572925, 10, 1572926, 10, 1572927, 10, 1572928, 10, 1572929, 10, 1572930, 10, 1572931, 10, 1572932, 10, 1572933, 10, 1572934, 10, 1572935, 10, 1638400, 10, 1638401, 10, 1638402, 10, 1638403, 10, 1638404, 10, 1638405, 10, 1638406, 10, 1638407, 10, 1638408, 10, 1638409, 10, 1638410, 10, 1638411, 10, 1638412, 10, 1638413, 10, 1638414, 10, 1638415, 10, 1638416, 10, 1638417, 10, 1638418, 10, 1638419, 10, 1638420, 10, 1638421, 10, 1638422, 10, 1638423, 10, 1638424, 10, 1638425, 10, 1638426, 10, 1638427, 10, 1638428, 10, 1638429, 10, 1638430, 10, 1638431, 10, 1638432, 10, 1638433, 10, 1638434, 10, 1638435, 10, 1638436, 10, 1638437, 10, 1638438, 10, 1638439, 10, 1638440, 10, 1638441, 10, 1638442, 10, 1638443, 10, 1638444, 10, 1638445, 10, 1638446, 10, 1638447, 10, 1638448, 10, 1638449, 10, 1638450, 10, 1638451, 10, 1638452, 10, 1638453, 10, 1638454, 10, 1638455, 10, 1638456, 10, 1638457, 10, 1638458, 10, 1638459, 10, 1638460, 10, 1638461, 10, 1638462, 10, 1638463, 10, 1638464, 10, 1638465, 10, 1638466, 10, 1638467, 10, 1638468, 10, 1638469, 10, 1638470, 10, 1638471, 10, 1703952, 10, 1703953, 10, 1703954, 10, 1703955, 10, 1703956, 10, 1703957, 10, 1703958, 10, 1703959, 10, 1703960, 10, 1703961, 10, 1703962, 10, 1703963, 10, 1703964, 10, 1703965, 10, 1703966, 10, 1703967, 10, 1703968, 10, 1703969, 10, 1703970, 10, 1703971, 10, 1703972, 10, 1703973, 10, 1703974, 10, 1703975, 10, 1703976, 10, 1703977, 10, 1703978, 10, 1703979, 10, 1703980, 10, 1703981, 10, 1703982, 10, 1703983, 10, 1703984, 10, 1703985, 10, 1703986, 10, 1703987, 10, 1703988, 10, 1703989, 10, 1703990, 10, 1703991, 10, 1703992, 10, 1703993, 10, 1703994, 10, 1703995, 10, 1703996, 10, 1703997, 10, 1703998, 10, 1703999, 10, 1704000, 10, 1704001, 10, 1704002, 10, 1704003, 10, 1704004, 10, 1704005, 10, 1704006, 10, 1704007, 10, 1769488, 10, 1769489, 10, 1769490, 10, 1769491, 10, 1769492, 10, 1769493, 10, 1769494, 10, 1769495, 10, 1769496, 10, 1769497, 10, 1769498, 10, 1769499, 10, 1769500, 10, 1769501, 10, 1769502, 10, 1769503, 10, 1769504, 10, 1769505, 10, 1769506, 10, 1769507, 10, 1769508, 10, 1769509, 10, 1769510, 10, 1769511, 10, 1769512, 10, 1769513, 10, 1769514, 10, 1769515, 10, 1769516, 10, 1769517, 10, 1769518, 10, 1769519, 10, 1769520, 10, 1769521, 10, 1769522, 10, 1769523, 10, 1769524, 10, 1769525, 10, 1769526, 10, 1769527, 10, 1769528, 10, 1769529, 10, 1769530, 10, 1769531, 10, 1769532, 10, 1769533, 10, 1769534, 10, 1769535, 10, 1769536, 10, 1769537, 10, 1769538, 10, 1769539, 10, 1769540, 10, 1769541, 10 "_edit_lock_" True @@ -482,6 +483,12 @@ "3D" + "deflight_rot_y" + 0.628319 + "zfar" + 500 + "fov" + 45 "viewports" @@ -549,12 +556,6 @@ 0, 0, 0 - "zfar" - 500 - "deflight_rot_y" - 0.628319 - "fov" - 45 "default_light" True "viewport_mode" @@ -805,6 +806,7 @@ "2D" + False 2 834.664, 1309.6 @@ -998,7 +1000,7 @@ -1 "nodes" - -1, -1, 1, 0, -1, 2, 2, 0, 3, 1, 0, 0, 0, 5, 4, -1, 19, 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, 12, 18, 13, 19, 3, 20, 6, 21, 14, 22, 15, 3, 16, 0, 0, 0, 1, 23, -1, 2, 2, 0, 3, 17, 0, 2, 0, 25, 24, 18, 3, 2, 0, 10, 19, 3, 20, 0, 2, 0, 25, 26, 18, 3, 2, 0, 10, 21, 3, 20, 0, 2, 0, 25, 27, 18, 3, 2, 0, 10, 22, 3, 20, 0, 2, 0, 25, 28, 18, 3, 2, 0, 10, 23, 3, 20, 0, 2, 0, 25, 29, 18, 3, 2, 0, 10, 24, 3, 20, 0, 2, 0, 25, 30, 18, 3, 2, 0, 10, 25, 3, 20, 0, 2, 0, 25, 31, 18, 3, 2, 0, 10, 26, 3, 20, 0, 2, 0, 25, 32, 18, 3, 2, 0, 10, 27, 3, 20, 0, 2, 0, 25, 33, 18, 3, 2, 0, 10, 28, 3, 20, 0, 2, 0, 25, 34, 18, 3, 2, 0, 10, 29, 3, 20, 0, 2, 0, 25, 35, 18, 3, 2, 0, 10, 30, 3, 20, 0, 2, 0, 25, 36, 18, 3, 2, 0, 10, 31, 3, 20, 0, 2, 0, 25, 37, 18, 3, 2, 0, 10, 32, 3, 20, 0, 2, 0, 25, 38, 18, 3, 2, 0, 10, 33, 3, 20, 0, 2, 0, 25, 39, 18, 3, 2, 0, 10, 34, 3, 20, 0, 2, 0, 25, 40, 18, 3, 2, 0, 10, 35, 3, 20, 0, 2, 0, 25, 41, 18, 3, 2, 0, 10, 36, 3, 20, 0, 2, 0, 25, 42, 18, 3, 2, 0, 10, 37, 3, 20, 0, 2, 0, 25, 43, 18, 3, 2, 0, 10, 38, 3, 20, 0, 2, 0, 25, 44, 18, 3, 2, 0, 10, 39, 3, 20, 0, 2, 0, 25, 45, 18, 3, 2, 0, 10, 40, 3, 20, 0, 2, 0, 25, 46, 18, 3, 2, 0, 10, 41, 3, 20, 0, 2, 0, 25, 47, 18, 3, 2, 0, 10, 42, 3, 20, 0, 2, 0, 25, 48, 18, 3, 2, 0, 10, 43, 3, 20, 0, 2, 0, 25, 49, 18, 3, 2, 0, 10, 44, 3, 20, 0, 2, 0, 25, 50, 18, 3, 2, 0, 10, 45, 3, 20, 0, 2, 0, 25, 51, 18, 3, 2, 0, 10, 46, 3, 20, 0, 2, 0, 25, 52, 18, 3, 2, 0, 10, 47, 3, 20, 0, 2, 0, 25, 53, 18, 3, 2, 0, 10, 48, 3, 20, 0, 2, 0, 25, 54, 18, 3, 2, 0, 10, 49, 3, 20, 0, 2, 0, 25, 55, 18, 3, 2, 0, 10, 50, 3, 20, 0, 2, 0, 25, 56, 18, 3, 2, 0, 10, 51, 3, 20, 0, 2, 0, 25, 57, 18, 3, 2, 0, 10, 52, 3, 20, 0, 2, 0, 25, 58, 18, 3, 2, 0, 10, 53, 3, 20, 0, 2, 0, 25, 59, 18, 3, 2, 0, 10, 54, 3, 20, 0, 2, 0, 25, 60, 18, 3, 2, 0, 10, 55, 3, 20, 0, 2, 0, 25, 61, 18, 3, 2, 0, 10, 56, 3, 20, 0, 2, 0, 25, 62, 18, 3, 2, 0, 10, 57, 3, 20, 0, 2, 0, 25, 63, 18, 3, 2, 0, 10, 58, 3, 20, 0, 2, 0, 25, 64, 18, 3, 2, 0, 10, 59, 3, 20, 0, 2, 0, 25, 65, 18, 3, 2, 0, 10, 60, 3, 20, 0, 2, 0, 25, 66, 18, 3, 2, 0, 10, 61, 3, 20, 0, 0, 0, 68, 67, 62, 3, 2, 0, 10, 63, 3, 64, 0, 0, 0, 1, 69, -1, 1, 2, 0, 0, 46, 0, 71, 70, 65, 5, 2, 0, 10, 66, 3, 67, 72, 68, 73, 69, 0, 46, 0, 71, 74, 65, 5, 2, 0, 10, 70, 3, 67, 72, 71, 73, 72, 0, 46, 0, 71, 75, 65, 5, 2, 0, 10, 73, 3, 67, 72, 74, 73, 72, 0, 46, 0, 71, 76, 75, 3, 2, 0, 10, 76, 3, 77, 0, 0, 0, 78, 77, -1, 7, 2, 0, 79, 78, 80, 4, 81, 2, 82, 79, 83, 2, 84, 4, 0, 0, 0, 1, 85, -1, 1, 2, 0, 0, 52, 0, 68, 86, 80, 3, 2, 0, 10, 81, 3, 82, 0, 52, 0, 68, 87, 80, 3, 2, 0, 10, 83, 3, 82, 0, 52, 0, 68, 88, 80, 3, 2, 0, 10, 84, 3, 82, 0, 52, 0, 68, 89, 80, 3, 2, 0, 10, 85, 3, 82, 0, 52, 0, 68, 90, 80, 3, 2, 0, 10, 86, 3, 82, 0, 52, 0, 68, 91, 80, 3, 2, 0, 10, 87, 3, 82, 0, 52, 0, 68, 92, 80, 3, 2, 0, 10, 88, 3, 82, 0, 52, 0, 68, 93, 80, 3, 2, 0, 10, 89, 3, 82, 0, 52, 0, 68, 94, 80, 3, 2, 0, 10, 90, 3, 82, 0, 52, 0, 68, 95, 80, 3, 2, 0, 10, 91, 3, 82, 0, 52, 0, 68, 96, 80, 3, 2, 0, 10, 92, 3, 82, 0, 0, 0, 98, 97, 93, 2, 2, 0, 3, 94, 0, 0, 0, 99, 99, -1, 30, 2, 0, 6, 2, 7, 3, 8, 3, 9, 4, 100, 95, 101, 96, 102, 97, 103, 98, 104, 0, 105, 0, 106, 0, 107, 0, 108, 2, 109, 2, 110, 13, 111, 3, 112, 6, 113, 99, 114, 3, 115, 100, 116, 6, 117, 4, 118, 4, 119, 101, 120, 8, 121, 8, 122, 2, 123, 4, 124, 102, 0 + -1, -1, 1, 0, -1, 2, 2, 0, 3, 1, 0, 0, 0, 5, 4, -1, 21, 2, 0, 6, 2, 7, 3, 8, 3, 9, 4, 10, 5, 11, 6, 12, 7, 13, 2, 14, 7, 15, 8, 16, 9, 17, 10, 18, 11, 19, 12, 20, 7, 21, 3, 22, 5, 23, 13, 24, 14, 3, 15, 0, 0, 0, 1, 25, -1, 2, 2, 0, 3, 16, 0, 2, 0, 27, 26, 17, 3, 2, 0, 9, 18, 3, 19, 0, 2, 0, 27, 28, 17, 3, 2, 0, 9, 20, 3, 19, 0, 2, 0, 27, 29, 17, 3, 2, 0, 9, 21, 3, 19, 0, 2, 0, 27, 30, 17, 3, 2, 0, 9, 22, 3, 19, 0, 2, 0, 27, 31, 17, 3, 2, 0, 9, 23, 3, 19, 0, 2, 0, 27, 32, 17, 3, 2, 0, 9, 24, 3, 19, 0, 2, 0, 27, 33, 17, 3, 2, 0, 9, 25, 3, 19, 0, 2, 0, 27, 34, 17, 3, 2, 0, 9, 26, 3, 19, 0, 2, 0, 27, 35, 17, 3, 2, 0, 9, 27, 3, 19, 0, 2, 0, 27, 36, 17, 3, 2, 0, 9, 28, 3, 19, 0, 2, 0, 27, 37, 17, 3, 2, 0, 9, 29, 3, 19, 0, 2, 0, 27, 38, 17, 3, 2, 0, 9, 30, 3, 19, 0, 2, 0, 27, 39, 17, 3, 2, 0, 9, 31, 3, 19, 0, 2, 0, 27, 40, 17, 3, 2, 0, 9, 32, 3, 19, 0, 2, 0, 27, 41, 17, 3, 2, 0, 9, 33, 3, 19, 0, 2, 0, 27, 42, 17, 3, 2, 0, 9, 34, 3, 19, 0, 2, 0, 27, 43, 17, 3, 2, 0, 9, 35, 3, 19, 0, 2, 0, 27, 44, 17, 3, 2, 0, 9, 36, 3, 19, 0, 2, 0, 27, 45, 17, 3, 2, 0, 9, 37, 3, 19, 0, 2, 0, 27, 46, 17, 3, 2, 0, 9, 38, 3, 19, 0, 2, 0, 27, 47, 17, 3, 2, 0, 9, 39, 3, 19, 0, 2, 0, 27, 48, 17, 3, 2, 0, 9, 40, 3, 19, 0, 2, 0, 27, 49, 17, 3, 2, 0, 9, 41, 3, 19, 0, 2, 0, 27, 50, 17, 3, 2, 0, 9, 42, 3, 19, 0, 2, 0, 27, 51, 17, 3, 2, 0, 9, 43, 3, 19, 0, 2, 0, 27, 52, 17, 3, 2, 0, 9, 44, 3, 19, 0, 2, 0, 27, 53, 17, 3, 2, 0, 9, 45, 3, 19, 0, 2, 0, 27, 54, 17, 3, 2, 0, 9, 46, 3, 19, 0, 2, 0, 27, 55, 17, 3, 2, 0, 9, 47, 3, 19, 0, 2, 0, 27, 56, 17, 3, 2, 0, 9, 48, 3, 19, 0, 2, 0, 27, 57, 17, 3, 2, 0, 9, 49, 3, 19, 0, 2, 0, 27, 58, 17, 3, 2, 0, 9, 50, 3, 19, 0, 2, 0, 27, 59, 17, 3, 2, 0, 9, 51, 3, 19, 0, 2, 0, 27, 60, 17, 3, 2, 0, 9, 52, 3, 19, 0, 2, 0, 27, 61, 17, 3, 2, 0, 9, 53, 3, 19, 0, 2, 0, 27, 62, 17, 3, 2, 0, 9, 54, 3, 19, 0, 2, 0, 27, 63, 17, 3, 2, 0, 9, 55, 3, 19, 0, 2, 0, 27, 64, 17, 3, 2, 0, 9, 56, 3, 19, 0, 2, 0, 27, 65, 17, 3, 2, 0, 9, 57, 3, 19, 0, 2, 0, 27, 66, 17, 3, 2, 0, 9, 58, 3, 19, 0, 2, 0, 27, 67, 17, 3, 2, 0, 9, 59, 3, 19, 0, 2, 0, 27, 68, 17, 3, 2, 0, 9, 60, 3, 19, 0, 0, 0, 70, 69, 61, 3, 2, 0, 9, 62, 3, 63, 0, 0, 0, 1, 71, -1, 1, 2, 0, 0, 46, 0, 73, 72, 64, 5, 2, 0, 9, 65, 3, 66, 74, 67, 75, 68, 0, 46, 0, 73, 76, 64, 5, 2, 0, 9, 69, 3, 66, 74, 70, 75, 71, 0, 46, 0, 73, 77, 64, 5, 2, 0, 9, 72, 3, 66, 74, 73, 75, 71, 0, 46, 0, 73, 78, 74, 3, 2, 0, 9, 75, 3, 76, 0, 0, 0, 80, 79, -1, 7, 2, 0, 81, 77, 82, 78, 83, 2, 84, 79, 85, 2, 86, 78, 0, 0, 0, 1, 87, -1, 1, 2, 0, 0, 52, 0, 70, 88, 80, 3, 2, 0, 9, 81, 3, 82, 0, 52, 0, 70, 89, 80, 3, 2, 0, 9, 83, 3, 82, 0, 52, 0, 70, 90, 80, 3, 2, 0, 9, 84, 3, 82, 0, 52, 0, 70, 91, 80, 3, 2, 0, 9, 85, 3, 82, 0, 52, 0, 70, 92, 80, 3, 2, 0, 9, 86, 3, 82, 0, 52, 0, 70, 93, 80, 3, 2, 0, 9, 87, 3, 82, 0, 52, 0, 70, 94, 80, 3, 2, 0, 9, 88, 3, 82, 0, 52, 0, 70, 95, 80, 3, 2, 0, 9, 89, 3, 82, 0, 52, 0, 70, 96, 80, 3, 2, 0, 9, 90, 3, 82, 0, 52, 0, 70, 97, 80, 3, 2, 0, 9, 91, 3, 82, 0, 52, 0, 70, 98, 80, 3, 2, 0, 9, 92, 3, 82, 0, 0, 0, 100, 99, 93, 2, 2, 0, 3, 94, 0, 0, 0, 101, 101, -1, 29, 2, 0, 6, 2, 7, 3, 8, 3, 102, 95, 103, 96, 104, 97, 105, 98, 106, 0, 107, 0, 108, 0, 109, 0, 110, 2, 111, 2, 112, 12, 113, 3, 114, 5, 115, 99, 116, 3, 117, 100, 118, 5, 119, 78, 120, 78, 121, 101, 122, 7, 123, 7, 124, 2, 125, 78, 126, 102, 0 "conns" diff --git a/demos/2d/platformer/tiles_demo.png b/demos/2d/platformer/tiles_demo.png index a7a5000906e746f5dea30f6439ab316b5e77163e..bc738e6d387d09cbe98f456228bb126d07f03650 100644 GIT binary patch literal 10066 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� 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 Re}6%RnWw9t%Q~loCIB+#`6B=T diff --git a/demos/2d/platformer/tileset.xml b/demos/2d/platformer/tileset.xml index 2e4ecc8c04..d8f9a651ee 100644 --- a/demos/2d/platformer/tileset.xml +++ b/demos/2d/platformer/tileset.xml @@ -1,134 +1,191 @@ - + - - "" - 0 - 0, 8, 64, 8, 64, 64, 0, 64 - - - "" 0 - 0, 64, 0, 8, 56, 8, 56, 64 - + -32, -24, 32, -24, 32, 32, -32, 32 + - "" 0 - 0, 64, 0, 0, 56, 0, 56, 64 - + -32, 32, -32, -24, 24, -24, 24, 32 + - "" 0 - 0, 64, 0, 0, 56, 0, 56, 64 - + -32, 32, -32, -32, 24, -32, 24, 32 + - "" 0 - 0, 64, 0, 0, 56, 0, 64, 8, 64, 64 - + -64, 32, -64, -32, -8, -32, -8, 32 + - "" 0 - 0, 64, 0, 8, 64, 8, 64, 64 - + -32, 32, -32, -32, 24, -32, 32, -24, 32, 32 + - "" 0 - 0, 64, 0, 8, 64, 8, 64, 64 - + -32, 32, -32, -24, 32, -24, 32, 32 + - "" 0 - 0, 0, 64, 0, 64, 64, 0, 64 - + -32, 32, -32, -24, 32, -24, 32, 32 + - "" 0 - 0, 8, 64, 72, 64, 128, 0, 128 - + -32, -32, 32, -32, 32, 32, -32, 32 + - "" 0 - 0, 64, 0, 0, 56, 0, 56, 64 - + -32, -56, 32, 8, 32, 64, -32, 64 + + + + 0 + -32, 32, -32, -32, 24, -32, 24, 32 + + + + 0 + -32, -24, 32, -24, 32, 24, -32, 24 + + + + 0 + -32, -24, 24, -24, 24, 24, -32, 24 + - "" "floor" - 0, 0 + 0, 0 + 32, 32 0, 0, 64, 64 - + + + "edge" - 0, 0 + 0, 0 + 32, 32 64, 0, 64, 64 - + + + "wall" - 0, 0 + 0, 0 + 32, 32 64, 64, 64, 64 - + + + "wall_deco" - 0, 0 + 0, 0 + 64, 32 320, 128, 128, 64 - + + + "corner" - 0, 0 + 0, 0 + 32, 32 64, 128, 64, 64 - + + + "flowers" - 0, 0 + 0, 0 + 32, 32 192, 192, 64, 64 - + + + "tree_base" - 0, 0 + 0, 0 + 32, 32 256, 192, 64, 64 - + + + "tree_mid" - 0, 0 + 0, 0 + 0, 0 256, 128, 64, 64 - "tree_mid 2" + + + "tree_mid 2" - 0, 0 + 0, 0 + 0, 0 256, 64, 64, 64 - "tree_top" + + + "tree_top" - 0, 0 + 0, 0 + 0, 0 256, 0, 64, 64 - "solid" + + + "solid" - 0, 0 + 0, 0 + 0, 0 0, 64, 64, 64 - "ceiling" + + + "ceiling" - 0, 0 + 0, 0 + 32, 32 384, 64, 64, 64 - + + + "ramp" - 0, 0 + 0, 0 + 32, 64 128, 128, 64, 128 - + + + "ceiling2wall" - 0, 0 + 0, 0 + 32, 32 448, 64, 64, 64 - - + + + + "platform_floor" + + 0, 0 + 32, 32 + 128, 0, 64, 64 + + + + "platform_edge" + + 0, 0 + 32, 32 + 192, 0, 64, 64 + + + + \ No newline at end of file diff --git a/demos/2d/platformer/tileset_edit.xml b/demos/2d/platformer/tileset_edit.xml index 2473656a6a..db289433ab 100644 --- a/demos/2d/platformer/tileset_edit.xml +++ b/demos/2d/platformer/tileset_edit.xml @@ -1,71 +1,83 @@ - + 0 - 0, 8, 64, 8, 64, 64, 0, 64 + -32, -24, 32, -24, 32, 32, -32, 32 0 - 0, 64, 0, 8, 56, 8, 56, 64 + -32, 32, -32, -24, 24, -24, 24, 32 0 - 0, 64, 0, 0, 56, 0, 56, 64 + -32, 32, -32, -32, 24, -32, 24, 32 0 - 0, 64, 0, 0, 56, 0, 56, 64 + -64, 32, -64, -32, -8, -32, -8, 32 0 - 0, 64, 0, 0, 56, 0, 64, 8, 64, 64 + -32, 32, -32, -32, 24, -32, 32, -24, 32, 32 0 - 0, 8, 64, 72, 64, 128, 0, 128 + -32, 32, -32, -24, 32, -24, 32, 32 0 - 0, 64, 0, 8, 64, 8, 64, 64 + -32, 32, -32, -24, 32, -24, 32, 32 0 - 0, 64, 0, 8, 64, 8, 64, 64 + -32, -32, 32, -32, 32, 32, -32, 32 0 - 0, 0, 64, 0, 64, 64, 0, 64 + -32, -56, 32, 8, 32, 64, -32, 64 0 - 0, 64, 0, 0, 56, 0, 56, 64 + -32, 32, -32, -32, 24, -32, 24, 32 + + + + 0 + -32, -24, 32, -24, 32, 24, -32, 24 + + + + 0 + -32, -24, 24, -24, 24, 24, -32, 24 "names" - + "Node" + "_import_path" "__meta__" "floor" "Sprite" "visibility/visible" "visibility/opacity" "visibility/self_opacity" - "visibility/behind_parent" "transform/pos" "transform/rot" "transform/scale" + "z/z" + "z/relative" "texture" "centered" "offset" @@ -83,6 +95,7 @@ "shapes/0/shape" "shapes/0/transform" "shapes/0/trigger" + "layers" "constant_linear_velocity" "constant_angular_velocity" "friction" @@ -90,11 +103,11 @@ "CollisionPolygon2D" "build_mode" "polygon" + "trigger" "edge" "wall" "wall_deco" "corner" - "ramp" "flowers" "tree_base" "tree_mid" @@ -102,13 +115,10 @@ "tree_top" "solid" "ceiling" + "ramp" "ceiling2wall" "help" "Label" - "margin/left" - "margin/top" - "margin/right" - "margin/bottom" "focus_neighbour/left" "focus_neighbour/top" "focus_neighbour/right" @@ -130,29 +140,38 @@ "autowrap" "uppercase" "percent_visible" + "platform_floor" + "platform_edge" "version" 1 "conn_count" 0 "node_count" - 36 + 42 "variants" - + + "" "__editor_plugin_states__" "2D" "pixel_snap" - False + True "zoom" - 1.670182 + 1.670183 + "use_snap" + True "ofs" - -58.9115, 60.1605 + -446.534, -87.6905 + "snap" + 8 "3D" + "deflight_rot_y" + 0.628319 "zfar" 500 "fov" @@ -166,10 +185,12 @@ 0 "y_rot" 0 - "use_orthogonal" - False + "listener" + True "use_environment" False + "use_orthogonal" + False "pos" 0, 0, 0 @@ -180,10 +201,12 @@ 0 "y_rot" 0 - "use_orthogonal" + "listener" False "use_environment" False + "use_orthogonal" + False "pos" 0, 0, 0 @@ -194,10 +217,12 @@ 0 "y_rot" 0 - "use_orthogonal" + "listener" False "use_environment" False + "use_orthogonal" + False "pos" 0, 0, 0 @@ -208,10 +233,12 @@ 0 "y_rot" 0 - "use_orthogonal" + "listener" False "use_environment" False + "use_orthogonal" + False "pos" 0, 0, 0 @@ -220,12 +247,18 @@ 1 "default_light" True + "ambient_light_color" + 0.15, 0.15, 0.15, 1 "show_grid" True "show_origin" True "znear" 0.1 + "default_srgb" + False + "deflight_rot_x" + 0.942478 "__editor_run_settings__" @@ -239,45 +272,42 @@ "2D" True - - + 1 0, 0 - + 0 1, 1 + 0 + False 1 - 1, 1, 1, 1 0, 0, 64, 64 1, -0, 0, 1, 0, 0 - 64, 8, 64, 64, 0, 64, 0, 8 + 32, -24, 32, 32, -32, 32, -32, -24 64, 0 64, 0, 64, 64 - 0, 8, 56, 8, 56, 64, 0, 64 + -32, -24, 24, -24, 24, 32, -32, 32 64, 64 64, 64, 64, 64 - 0, 0, 56, 0, 56, 64, 0, 64 - 64, 128 + -32, -32, 24, -32, 24, 32, -32, 32 + 96, 128 320, 128, 128, 64 + -64, -32, -8, -32, -8, 32, -64, 32 64, 192 64, 128, 64, 64 - 0, 0, 56, 0, 64, 8, 64, 64, 0, 64 - 256, 192 - 128, 128, 64, 128 - - 0, 8, 64, 72, 64, 128, 0, 128 + -32, -32, 24, -32, 32, -24, 32, 32, -32, 32 128, 192 192, 192, 64, 64 - - 0, 64, 64, 64, 64, 8, 0, 8 + + -32, 32, 32, 32, 32, -24, -32, -24 192, 192 256, 192, 64, 64 - + 192, 128 256, 128, 64, 64 192, 64 @@ -288,23 +318,29 @@ 0, 64, 64, 64 0, 128 384, 64, 64, 64 + + 32, -32, 32, 32, -32, 32, -32, -32 + 256, 224 + 128, 128, 64, 128 - 64, 0, 64, 64, 0, 64, 0, 0 + -32, -56, 32, 8, 32, 64, -32, 64 0, 192 448, 64, 64, 64 - - - - - 2 - - "This scene serves as a tool for editing the tileset. Nodes (sprites) and their respective collisions are edited here. To create a tileset from this, a "TileSet" resoucre must be created. Use the helper in: Scene -< Convert To -< TileSet This will save a tileset. Saving over it will merge your changes. Finally, the saved tileset resource (tileset.xml in this case), can be opened to be used into a TileMap node for editing a tile map. " + "This scene serves as a tool for editing the tileset. Nodes (sprites) and their respective collisions are edited here. To create a tileset from this, a "TileSet" resoucre must be created. Use the helper in: Scene -< Convert To -< TileSet This will save a tileset. Saving over it will merge your changes. Finally, the saved tileset resource (tileset.xml in this case), can be opened to be used into a TileMap node for editing a tile map. " -1 + 0, 256 + 128, 0, 64, 64 + + 32, -24, 32, 24, -32, 24, -32, -24 + 64, 256 + 192, 0, 64, 64 + + 24, -24, 24, 24, -32, 24, -32, -24 "nodes" - -1, -1, 0, 0, -1, 1, 1, 0, 0, 0, 0, 3, 2, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 11, 0, 1, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 12, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 2, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 14, 0, 0, 0, 3, 35, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 15, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 16, 0, 4, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 17, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 5, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 18, 0, 0, 0, 3, 36, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 19, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 20, 0, 7, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 21, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 8, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 22, 0, 0, 0, 3, 37, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 23, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 24, 0, 10, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 25, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 11, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 22, 0, 0, 0, 3, 38, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 26, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 27, 0, 13, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 28, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 14, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 29, 0, 0, 0, 3, 39, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 30, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 31, 0, 16, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 32, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 17, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 33, 0, 0, 0, 3, 40, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 34, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 35, 0, 19, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 36, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 20, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 37, 0, 0, 0, 3, 41, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 38, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 39, 0, 22, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 40, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 23, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 37, 0, 0, 0, 3, 42, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 41, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 42, 0, 0, 0, 3, 43, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 43, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 44, 0, 0, 0, 3, 44, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 45, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 46, 0, 0, 0, 3, 45, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 47, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 48, 0, 0, 0, 3, 46, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 49, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 50, 0, 29, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 51, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 30, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 52, 0, 0, 0, 3, 47, -1, 18, 4, 1, 5, 2, 6, 2, 7, 3, 8, 53, 9, 5, 10, 6, 11, 7, 12, 3, 13, 4, 14, 3, 15, 3, 16, 8, 17, 8, 18, 9, 19, 10, 20, 1, 21, 54, 0, 32, 0, 23, 22, -1, 15, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 24, 8, 25, 55, 26, 13, 27, 3, 28, 4, 29, 5, 30, 2, 31, 5, 0, 33, 0, 32, 32, -1, 9, 4, 1, 5, 2, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 33, 9, 34, 22, 0, 0, 0, 49, 48, -1, 29, 4, 1, 5, 2, 6, 2, 7, 3, 50, 56, 51, 57, 52, 58, 53, 59, 54, 60, 55, 60, 56, 60, 57, 60, 58, 1, 59, 1, 60, 61, 61, 2, 62, 5, 63, 62, 64, 2, 65, 62, 66, 5, 67, 3, 68, 3, 69, 63, 70, 9, 71, 9, 72, 3, 73, 3, 74, 64, 0 + -1, -1, 0, 0, -1, 2, 1, 0, 2, 1, 0, 0, 0, 4, 3, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 12, 0, 1, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 13, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 2, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 15, 38, 9, 0, 0, 0, 4, 39, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 16, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 17, 0, 4, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 18, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 5, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 19, 38, 9, 0, 0, 0, 4, 40, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 20, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 21, 0, 7, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 22, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 8, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 23, 38, 9, 0, 0, 0, 4, 41, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 24, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 25, 0, 10, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 26, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 11, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 27, 38, 9, 0, 0, 0, 4, 42, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 28, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 29, 0, 13, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 30, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 14, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 31, 38, 9, 0, 0, 0, 4, 43, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 32, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 33, 0, 16, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 34, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 17, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 35, 38, 9, 0, 0, 0, 4, 44, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 36, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 37, 0, 19, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 38, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 20, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 35, 38, 9, 0, 0, 0, 4, 45, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 39, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 40, 0, 0, 0, 4, 46, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 41, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 42, 0, 0, 0, 4, 47, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 43, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 44, 0, 0, 0, 4, 48, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 45, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 46, 0, 0, 0, 4, 49, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 47, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 48, 0, 26, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 49, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 27, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 50, 38, 9, 0, 0, 0, 4, 50, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 51, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 52, 0, 29, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 53, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 30, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 54, 38, 9, 0, 0, 0, 4, 51, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 55, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 56, 0, 32, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 57, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 33, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 23, 38, 9, 0, 0, 0, 53, 52, -1, 25, 1, 0, 5, 2, 6, 3, 7, 3, 54, 0, 55, 0, 56, 0, 57, 0, 58, 2, 59, 2, 60, 58, 61, 3, 62, 5, 63, 3, 64, 3, 65, 3, 66, 5, 67, 9, 68, 9, 69, 59, 70, 7, 71, 7, 72, 9, 73, 9, 74, 60, 0, 0, 0, 4, 75, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 61, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 62, 0, 36, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 63, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 37, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 64, 38, 9, 0, 0, 0, 4, 76, -1, 20, 1, 0, 5, 2, 6, 3, 7, 3, 8, 65, 9, 5, 10, 6, 11, 7, 12, 2, 13, 8, 14, 2, 15, 4, 16, 9, 17, 9, 18, 10, 19, 10, 20, 7, 21, 11, 22, 2, 23, 66, 0, 39, 0, 25, 24, -1, 18, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 26, 10, 27, 67, 28, 14, 29, 9, 30, 10, 31, 4, 32, 5, 33, 3, 34, 5, 0, 40, 0, 35, 35, -1, 12, 1, 0, 5, 2, 6, 3, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12, 2, 36, 7, 37, 68, 38, 9, 0 "conns" diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 9fcf34cee6..06c97027f0 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -28,7 +28,7 @@ /*************************************************************************/ #include "tile_map.h" #include "io/marshalls.h" -#include "servers/physics_2d_server.h" + void TileMap::_notification(int p_what) { switch(p_what) { @@ -62,7 +62,7 @@ void TileMap::_update_quadrant_space(const RID& p_space) { for (Map::Element *E=quadrant_map.front();E;E=E->next()) { Quadrant &q=E->get(); - Physics2DServer::get_singleton()->body_set_space(q.static_body,p_space); + Physics2DServer::get_singleton()->body_set_space(q.body,p_space); } } @@ -79,7 +79,7 @@ void TileMap::_update_quadrant_transform() { Matrix32 xform; xform.set_origin( q.pos ); xform = global_transform * xform; - Physics2DServer::get_singleton()->body_set_state(q.static_body,Physics2DServer::BODY_STATE_TRANSFORM,xform); + Physics2DServer::get_singleton()->body_set_state(q.body,Physics2DServer::BODY_STATE_TRANSFORM,xform); } } @@ -178,7 +178,7 @@ void TileMap::_update_dirty_quadrants() { Quadrant &q = *dirty_quadrant_list.first()->self(); vs->canvas_item_clear(q.canvas_item); - ps->body_clear_shapes(q.static_body); + ps->body_clear_shapes(q.body); int shape_idx=0; for(int i=0;ibody_add_shape(q.static_body,shape->get_rid(),xform); - ps->body_set_shape_metadata(q.static_body,shape_idx++,Vector2(E->key().x,E->key().y)); + ps->body_add_shape(q.body,shape->get_rid(),xform); + ps->body_set_shape_metadata(q.body,shape_idx++,Vector2(E->key().x,E->key().y)); } } @@ -339,19 +339,19 @@ Map::Element *TileMap::_create_quadrant(const q.canvas_item = VisualServer::get_singleton()->canvas_item_create(); VisualServer::get_singleton()->canvas_item_set_parent( q.canvas_item, get_canvas_item() ); VisualServer::get_singleton()->canvas_item_set_transform( q.canvas_item, xform ); - q.static_body=Physics2DServer::get_singleton()->body_create(Physics2DServer::BODY_MODE_STATIC); - Physics2DServer::get_singleton()->body_attach_object_instance_ID(q.static_body,get_instance_ID()); - Physics2DServer::get_singleton()->body_set_layer_mask(q.static_body,collision_layer); - Physics2DServer::get_singleton()->body_set_param(q.static_body,Physics2DServer::BODY_PARAM_FRICTION,friction); - Physics2DServer::get_singleton()->body_set_param(q.static_body,Physics2DServer::BODY_PARAM_BOUNCE,bounce); + q.body=Physics2DServer::get_singleton()->body_create(body_mode); + Physics2DServer::get_singleton()->body_attach_object_instance_ID(q.body,get_instance_ID()); + Physics2DServer::get_singleton()->body_set_layer_mask(q.body,collision_layer); + Physics2DServer::get_singleton()->body_set_param(q.body,Physics2DServer::BODY_PARAM_FRICTION,friction); + Physics2DServer::get_singleton()->body_set_param(q.body,Physics2DServer::BODY_PARAM_BOUNCE,bounce); if (is_inside_tree()) { xform = get_global_transform() * xform; RID space = get_world_2d()->get_space(); - Physics2DServer::get_singleton()->body_set_space(q.static_body,space); + Physics2DServer::get_singleton()->body_set_space(q.body,space); } - Physics2DServer::get_singleton()->body_set_state(q.static_body,Physics2DServer::BODY_STATE_TRANSFORM,xform); + Physics2DServer::get_singleton()->body_set_state(q.body,Physics2DServer::BODY_STATE_TRANSFORM,xform); rect_cache_dirty=true; quadrant_order_dirty=true; @@ -361,7 +361,7 @@ Map::Element *TileMap::_create_quadrant(const void TileMap::_erase_quadrant(Map::Element *Q) { Quadrant &q=Q->get(); - Physics2DServer::get_singleton()->free(q.static_body); + Physics2DServer::get_singleton()->free(q.body); VisualServer::get_singleton()->free(q.canvas_item); if (q.dirty_list.in_list()) dirty_quadrant_list.remove(&q.dirty_list); @@ -586,17 +586,29 @@ void TileMap::set_collision_layer_mask(uint32_t p_layer) { for (Map::Element *E=quadrant_map.front();E;E=E->next()) { Quadrant &q=E->get(); - Physics2DServer::get_singleton()->body_set_layer_mask(q.static_body,collision_layer); + Physics2DServer::get_singleton()->body_set_layer_mask(q.body,collision_layer); } } +Physics2DServer::BodyMode TileMap::get_collision_body_mode() const{ + + return body_mode; +} + +void TileMap::set_collision_body_mode(Physics2DServer::BodyMode p_body_mode) { + + _clear_quadrants(); + body_mode=p_body_mode; + _recreate_quadrants(); +} + void TileMap::set_collision_friction(float p_friction) { friction=p_friction; for (Map::Element *E=quadrant_map.front();E;E=E->next()) { Quadrant &q=E->get(); - Physics2DServer::get_singleton()->body_set_param(q.static_body,Physics2DServer::BODY_PARAM_FRICTION,p_friction); + Physics2DServer::get_singleton()->body_set_param(q.body,Physics2DServer::BODY_PARAM_FRICTION,p_friction); } } @@ -612,7 +624,7 @@ void TileMap::set_collision_bounce(float p_bounce){ for (Map::Element *E=quadrant_map.front();E;E=E->next()) { Quadrant &q=E->get(); - Physics2DServer::get_singleton()->body_set_param(q.static_body,Physics2DServer::BODY_PARAM_BOUNCE,p_bounce); + Physics2DServer::get_singleton()->body_set_param(q.body,Physics2DServer::BODY_PARAM_BOUNCE,p_bounce); } } @@ -807,6 +819,9 @@ void TileMap::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_collision_layer_mask","mask"),&TileMap::set_collision_layer_mask); ObjectTypeDB::bind_method(_MD("get_collision_layer_mask"),&TileMap::get_collision_layer_mask); + ObjectTypeDB::bind_method(_MD("set_collision_body_mode","body_mode"),&TileMap::set_collision_body_mode); + ObjectTypeDB::bind_method(_MD("get_collision_body_mode"),&TileMap::get_collision_body_mode); + ObjectTypeDB::bind_method(_MD("set_collision_friction","value"),&TileMap::set_collision_friction); ObjectTypeDB::bind_method(_MD("get_collision_friction"),&TileMap::get_collision_friction); @@ -837,6 +852,7 @@ void TileMap::_bind_methods() { ADD_PROPERTY( PropertyInfo(Variant::INT,"cell/quadrant_size",PROPERTY_HINT_RANGE,"1,128,1"),_SCS("set_quadrant_size"),_SCS("get_quadrant_size")); ADD_PROPERTY( PropertyInfo(Variant::MATRIX32,"cell/custom_transform"),_SCS("set_custom_transform"),_SCS("get_custom_transform")); ADD_PROPERTY( PropertyInfo(Variant::INT,"cell/half_offset",PROPERTY_HINT_ENUM,"Offset X,Offset Y,Disabled"),_SCS("set_half_offset"),_SCS("get_half_offset")); + ADD_PROPERTY( PropertyInfo(Variant::INT,"collision/body_mode",PROPERTY_HINT_ENUM,"Static,Kinematic"),_SCS("set_collision_body_mode"),_SCS("get_collision_body_mode")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"collision/friction",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_collision_friction"),_SCS("get_collision_friction")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"collision/bounce",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_collision_bounce"),_SCS("get_collision_bounce")); ADD_PROPERTY( PropertyInfo(Variant::INT,"collision/layers",PROPERTY_HINT_ALL_FLAGS),_SCS("set_collision_layer_mask"),_SCS("get_collision_layer_mask")); @@ -870,6 +886,7 @@ TileMap::TileMap() { bounce=0; mode=MODE_SQUARE; half_offset=HALF_OFFSET_DISABLED; + body_mode=Physics2DServer::BODY_MODE_STATIC; fp_adjust=0.01; fp_adjust=0.01; diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index 4e9e2e7e97..52e8eae306 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -33,6 +33,7 @@ #include "scene/resources/tile_set.h" #include "self_list.h" #include "vset.h" +#include "servers/physics_2d_server.h" class TileMap : public Node2D { @@ -60,6 +61,7 @@ private: Mode mode; Matrix32 custom_transform; HalfOffset half_offset; + Physics2DServer::BodyMode body_mode; union PosKey { @@ -97,14 +99,14 @@ private: Vector2 pos; RID canvas_item; - RID static_body; + RID body; SelfList dirty_list; VSet cells; - void operator=(const Quadrant& q) { pos=q.pos; canvas_item=q.canvas_item; static_body=q.static_body; cells=q.cells; } - Quadrant(const Quadrant& q) : dirty_list(this) { pos=q.pos; canvas_item=q.canvas_item; static_body=q.static_body; cells=q.cells;} + void operator=(const Quadrant& q) { pos=q.pos; canvas_item=q.canvas_item; body=q.body; cells=q.cells; } + Quadrant(const Quadrant& q) : dirty_list(this) { pos=q.pos; canvas_item=q.canvas_item; body=q.body; cells=q.cells;} Quadrant() : dirty_list(this) {} }; @@ -177,6 +179,9 @@ public: void set_collision_layer_mask(uint32_t p_layer); uint32_t get_collision_layer_mask() const; + void set_collision_body_mode(Physics2DServer::BodyMode p_body_mode); + Physics2DServer::BodyMode get_collision_body_mode() const; + void set_collision_friction(float p_friction); float get_collision_friction() const; diff --git a/tools/editor/plugins/collision_polygon_editor_plugin.cpp b/tools/editor/plugins/collision_polygon_editor_plugin.cpp index b92acb60f9..a6f2085a19 100644 --- a/tools/editor/plugins/collision_polygon_editor_plugin.cpp +++ b/tools/editor/plugins/collision_polygon_editor_plugin.cpp @@ -31,6 +31,8 @@ #include "os/file_access.h" #include "tools/editor/editor_settings.h" #include "scene/3d/camera.h" +#include "canvas_item_editor_plugin.h" + void CollisionPolygonEditor::_notification(int p_what) { switch(p_what) { @@ -71,14 +73,14 @@ void CollisionPolygonEditor::_node_removed(Node *p_node) { Vector2 CollisionPolygonEditor::snap_point(const Vector2& p_point) const { return p_point; - /* - if (canvas_item_editor->is_snap_active()) { + + if (CanvasItemEditor::get_singleton()->is_snap_active()) { - return p_point.snapped(Vector2(1,1)*canvas_item_editor->get_snap()); + return p_point.snapped(Vector2(1,1)*CanvasItemEditor::get_singleton()->get_snap()); } else { return p_point; - } ??? */ + } } void CollisionPolygonEditor::_menu_option(int p_option) { @@ -148,7 +150,7 @@ bool CollisionPolygonEditor::forward_spatial_input_event(Camera* p_camera,const Vector2 cpoint(spoint.x,spoint.y); - //cpoint=snap_point(cpoint); snap? + cpoint=snap_point(cpoint); Vector poly = node->get_polygon(); @@ -362,7 +364,7 @@ bool CollisionPolygonEditor::forward_spatial_input_event(Camera* p_camera,const Vector2 cpoint(spoint.x,spoint.y); - //cpoint=snap_point(cpoint); + cpoint=snap_point(cpoint); edited_point_pos = cpoint; _polygon_draw(); From 8bb1e19d7355ac92ec5cfe39fbb6db73d6c0fffe Mon Sep 17 00:00:00 2001 From: Carl Olsson Date: Sat, 14 Feb 2015 06:43:50 +1000 Subject: [PATCH 3/7] Replace body_mode property with use_kinematic flag. Revert 2D Platformer demo's moving platforms to sprite plus body. --- demos/2d/platformer/moving_platform.png | Bin 0 -> 2143 bytes demos/2d/platformer/moving_platform.xml | 119 ++++++++++++------------ scene/2d/tile_map.cpp | 21 +++-- scene/2d/tile_map.h | 7 +- 4 files changed, 75 insertions(+), 72 deletions(-) create mode 100644 demos/2d/platformer/moving_platform.png diff --git a/demos/2d/platformer/moving_platform.png b/demos/2d/platformer/moving_platform.png new file mode 100644 index 0000000000000000000000000000000000000000..f01c6ea37fc5535d28d704004a6c36deb0587890 GIT binary patch literal 2143 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 E02CoKhX4Qo literal 0 HcmV?d00001 diff --git a/demos/2d/platformer/moving_platform.xml b/demos/2d/platformer/moving_platform.xml index f39b11782c..4d54d6d11c 100644 --- a/demos/2d/platformer/moving_platform.xml +++ b/demos/2d/platformer/moving_platform.xml @@ -1,56 +1,77 @@ - - - + + + + + 0 + -88, 24, -88, -24, 88, -24, 88, 24 + + "names" - + "moving_platform" "Node2D" - "_import_path" "visibility/visible" "visibility/opacity" "visibility/self_opacity" + "visibility/on_top" "transform/pos" "transform/rot" "transform/scale" - "z/z" - "z/relative" "script/script" "__meta__" "motion" "cycle" "platform" - "TileMap" + "RigidBody2D" + "shape_count" + "shapes/0/shape" + "shapes/0/transform" + "shapes/0/trigger" "mode" - "tile_set" - "cell/size" - "cell/quadrant_size" - "cell/custom_transform" - "cell/half_offset" - "collision/body_mode" - "collision/friction" - "collision/bounce" - "collision/layers" - "tile_data" + "mass" + "friction" + "bounce" + "custom_integrator" + "continuous_cd" + "contacts_reported" + "contact_monitor" + "active" + "can_sleep" + "velocity/linear" + "velocity/angular" + "Sprite" + "texture" + "centered" + "offset" + "flip_h" + "flip_v" + "vframes" + "hframes" + "frame" + "modulate" + "region" + "region_rect" + "CollisionPolygon2D" + "build_mode" + "polygon" "version" 1 "conn_count" 0 "node_count" - 2 + 4 "variants" - "" True 1 0, 0 0 1, 1 - 0 - + "__editor_plugin_states__" @@ -71,22 +92,16 @@ "pixel_snap" False "zoom" - 1.850616 - "use_snap" - True + 1.360373 "ofs" - -406.735, -157.32 - "snap" - 32 + -210.652, -172.81 "3D" - "deflight_rot_y" - 0.628319 "zfar" 500 "fov" - 179 + 400 "viewports" @@ -96,12 +111,10 @@ 0 "y_rot" 0 - "listener" - True - "use_environment" - False "use_orthogonal" False + "use_environment" + False "pos" 0, 0, 0 @@ -112,12 +125,10 @@ 0 "y_rot" 0 - "listener" + "use_orthogonal" False "use_environment" False - "use_orthogonal" - False "pos" 0, 0, 0 @@ -128,12 +139,10 @@ 0 "y_rot" 0 - "listener" + "use_orthogonal" False "use_environment" False - "use_orthogonal" - False "pos" 0, 0, 0 @@ -144,12 +153,10 @@ 0 "y_rot" 0 - "listener" + "use_orthogonal" False "use_environment" False - "use_orthogonal" - False "pos" 0, 0, 0 @@ -158,18 +165,12 @@ 1 "default_light" True - "ambient_light_color" - 0.15, 0.15, 0.15, 1 "show_grid" True "show_origin" True "znear" 0.1 - "default_srgb" - False - "deflight_rot_x" - 0.942478 "__editor_run_settings__" @@ -182,17 +183,19 @@ "__editor_plugin_screen__" "2D" - -96, -32 - - 64, 64 - 16 - 1, 0, 0, 1, 0, 0 - 2 1 - 0, 536870927, 1, 536870926, 2, 15 + + 1, -0, 0, 1, 0, 0 + False + 3 + 0 + + 1, 1, 1, 1 + 0, 0, 0, 0 + -88, -24, 88, -24, 88, 24, -88, 24 "nodes" - -1, -1, 1, 0, -1, 13, 2, 0, 3, 1, 4, 2, 5, 2, 6, 3, 7, 4, 8, 5, 9, 6, 10, 1, 11, 7, 12, 8, 13, 3, 14, 2, 0, 0, 0, 16, 15, -1, 20, 2, 0, 3, 1, 4, 2, 5, 2, 6, 9, 7, 4, 8, 5, 9, 6, 10, 1, 17, 6, 18, 10, 19, 11, 20, 12, 21, 13, 22, 14, 23, 15, 24, 2, 25, 4, 26, 15, 27, 16, 0 + -1, -1, 1, 0, -1, 11, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 2, 12, 1, 0, 0, 0, 14, 13, -1, 23, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 15, 7, 16, 8, 17, 9, 18, 10, 19, 11, 20, 1, 21, 1, 22, 3, 23, 10, 24, 10, 25, 12, 26, 10, 27, 0, 28, 0, 29, 2, 30, 3, 0, 1, 0, 31, 31, -1, 18, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 32, 13, 33, 0, 34, 2, 35, 10, 36, 10, 37, 7, 38, 7, 39, 12, 40, 14, 41, 10, 42, 15, 0, 1, 0, 43, 43, -1, 9, 2, 0, 3, 1, 4, 1, 5, 0, 6, 2, 7, 3, 8, 4, 44, 12, 45, 16, 0 "conns" diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 06c97027f0..52f4d27497 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -28,6 +28,7 @@ /*************************************************************************/ #include "tile_map.h" #include "io/marshalls.h" +#include "servers/physics_2d_server.h" void TileMap::_notification(int p_what) { @@ -339,7 +340,7 @@ Map::Element *TileMap::_create_quadrant(const q.canvas_item = VisualServer::get_singleton()->canvas_item_create(); VisualServer::get_singleton()->canvas_item_set_parent( q.canvas_item, get_canvas_item() ); VisualServer::get_singleton()->canvas_item_set_transform( q.canvas_item, xform ); - q.body=Physics2DServer::get_singleton()->body_create(body_mode); + q.body=Physics2DServer::get_singleton()->body_create(use_kinematic?Physics2DServer::BODY_MODE_KINEMATIC:Physics2DServer::BODY_MODE_STATIC); Physics2DServer::get_singleton()->body_attach_object_instance_ID(q.body,get_instance_ID()); Physics2DServer::get_singleton()->body_set_layer_mask(q.body,collision_layer); Physics2DServer::get_singleton()->body_set_param(q.body,Physics2DServer::BODY_PARAM_FRICTION,friction); @@ -590,15 +591,15 @@ void TileMap::set_collision_layer_mask(uint32_t p_layer) { } } -Physics2DServer::BodyMode TileMap::get_collision_body_mode() const{ +bool TileMap::get_collision_use_kinematic() const{ - return body_mode; + return use_kinematic; } -void TileMap::set_collision_body_mode(Physics2DServer::BodyMode p_body_mode) { +void TileMap::set_collision_use_kinematic(bool p_use_kinematic) { _clear_quadrants(); - body_mode=p_body_mode; + use_kinematic=p_use_kinematic; _recreate_quadrants(); } @@ -816,12 +817,12 @@ void TileMap::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_center_y","enable"),&TileMap::set_center_y); ObjectTypeDB::bind_method(_MD("get_center_y"),&TileMap::get_center_y); + ObjectTypeDB::bind_method(_MD("set_collision_use_kinematic","use_kinematic"),&TileMap::set_collision_use_kinematic); + ObjectTypeDB::bind_method(_MD("get_collision_use_kinematic"),&TileMap::get_collision_use_kinematic); + ObjectTypeDB::bind_method(_MD("set_collision_layer_mask","mask"),&TileMap::set_collision_layer_mask); ObjectTypeDB::bind_method(_MD("get_collision_layer_mask"),&TileMap::get_collision_layer_mask); - ObjectTypeDB::bind_method(_MD("set_collision_body_mode","body_mode"),&TileMap::set_collision_body_mode); - ObjectTypeDB::bind_method(_MD("get_collision_body_mode"),&TileMap::get_collision_body_mode); - ObjectTypeDB::bind_method(_MD("set_collision_friction","value"),&TileMap::set_collision_friction); ObjectTypeDB::bind_method(_MD("get_collision_friction"),&TileMap::get_collision_friction); @@ -852,7 +853,7 @@ void TileMap::_bind_methods() { ADD_PROPERTY( PropertyInfo(Variant::INT,"cell/quadrant_size",PROPERTY_HINT_RANGE,"1,128,1"),_SCS("set_quadrant_size"),_SCS("get_quadrant_size")); ADD_PROPERTY( PropertyInfo(Variant::MATRIX32,"cell/custom_transform"),_SCS("set_custom_transform"),_SCS("get_custom_transform")); ADD_PROPERTY( PropertyInfo(Variant::INT,"cell/half_offset",PROPERTY_HINT_ENUM,"Offset X,Offset Y,Disabled"),_SCS("set_half_offset"),_SCS("get_half_offset")); - ADD_PROPERTY( PropertyInfo(Variant::INT,"collision/body_mode",PROPERTY_HINT_ENUM,"Static,Kinematic"),_SCS("set_collision_body_mode"),_SCS("get_collision_body_mode")); + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"collision/use_kinematic",PROPERTY_HINT_NONE,""),_SCS("set_collision_use_kinematic"),_SCS("get_collision_use_kinematic")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"collision/friction",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_collision_friction"),_SCS("get_collision_friction")); ADD_PROPERTY( PropertyInfo(Variant::REAL,"collision/bounce",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_collision_bounce"),_SCS("get_collision_bounce")); ADD_PROPERTY( PropertyInfo(Variant::INT,"collision/layers",PROPERTY_HINT_ALL_FLAGS),_SCS("set_collision_layer_mask"),_SCS("get_collision_layer_mask")); @@ -886,7 +887,7 @@ TileMap::TileMap() { bounce=0; mode=MODE_SQUARE; half_offset=HALF_OFFSET_DISABLED; - body_mode=Physics2DServer::BODY_MODE_STATIC; + use_kinematic=false; fp_adjust=0.01; fp_adjust=0.01; diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index 52e8eae306..c8708e1bed 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -33,7 +33,6 @@ #include "scene/resources/tile_set.h" #include "self_list.h" #include "vset.h" -#include "servers/physics_2d_server.h" class TileMap : public Node2D { @@ -61,7 +60,7 @@ private: Mode mode; Matrix32 custom_transform; HalfOffset half_offset; - Physics2DServer::BodyMode body_mode; + bool use_kinematic; union PosKey { @@ -179,8 +178,8 @@ public: void set_collision_layer_mask(uint32_t p_layer); uint32_t get_collision_layer_mask() const; - void set_collision_body_mode(Physics2DServer::BodyMode p_body_mode); - Physics2DServer::BodyMode get_collision_body_mode() const; + void set_collision_use_kinematic(bool p_use_kinematic); + bool get_collision_use_kinematic() const; void set_collision_friction(float p_friction); float get_collision_friction() const; From c5f509f238576dba39ffcce74ab2066f24e67b58 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sat, 14 Feb 2015 12:09:52 -0300 Subject: [PATCH 4/7] New Navigation & Pathfinding support for 2D -Added Navigation & NavigationPolygon nodes -Added corresponding visual editor -New pathfinding algorithm is modern and fast! -Similar API to 3D Pathfinding (more coherent) --- core/bind/core_bind.cpp | 7 + core/bind/core_bind.h | 2 + core/dvector.h | 17 + core/math/geometry.h | 14 + core/math/triangulator.cpp | 1543 +++++++++++++++++ core/math/triangulator.h | 309 ++++ demos/2d/navpoly/agent.png | Bin 0 -> 2508 bytes demos/2d/navpoly/engine.cfg | 4 + demos/2d/navpoly/navigation.gd | 63 + demos/2d/navpoly/navigation.scn | Bin 0 -> 3471 bytes demos/2d/navpoly/path.png | Bin 0 -> 309506 bytes scene/2d/navigation2d.cpp | 623 +++++++ scene/2d/navigation2d.h | 137 ++ scene/2d/navigation_polygon.cpp | 450 +++++ scene/2d/navigation_polygon.h | 84 + scene/2d/node_2d.cpp | 14 + scene/2d/node_2d.h | 3 + scene/gui/dialogs.cpp | 4 +- scene/gui/popup.cpp | 4 + scene/register_scene_types.cpp | 5 + tools/editor/editor_node.cpp | 9 + tools/editor/editor_node.h | 4 + tools/editor/icons/icon_navigation_2d.png | Bin 0 -> 541 bytes .../icon_navigation_polygon_instance.png | Bin 0 -> 391 bytes .../navigation_polygon_editor_plugin.cpp | 547 ++++++ .../navigation_polygon_editor_plugin.h | 91 + 26 files changed, 3932 insertions(+), 2 deletions(-) create mode 100644 core/math/triangulator.cpp create mode 100644 core/math/triangulator.h create mode 100644 demos/2d/navpoly/agent.png create mode 100644 demos/2d/navpoly/engine.cfg create mode 100644 demos/2d/navpoly/navigation.gd create mode 100644 demos/2d/navpoly/navigation.scn create mode 100644 demos/2d/navpoly/path.png create mode 100644 scene/2d/navigation2d.cpp create mode 100644 scene/2d/navigation2d.h create mode 100644 scene/2d/navigation_polygon.cpp create mode 100644 scene/2d/navigation_polygon.h create mode 100644 tools/editor/icons/icon_navigation_2d.png create mode 100644 tools/editor/icons/icon_navigation_polygon_instance.png create mode 100644 tools/editor/plugins/navigation_polygon_editor_plugin.cpp create mode 100644 tools/editor/plugins/navigation_polygon_editor_plugin.h diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index 0c5d21b4f6..a03fd7fe4a 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -838,6 +838,12 @@ Variant _Geometry::segment_intersects_triangle( const Vector3& p_from, const Vec return Variant(); } + +bool _Geometry::point_is_inside_triangle(const Vector2& s, const Vector2& a, const Vector2& b, const Vector2& c) const { + + return Geometry::is_point_in_triangle(s,a,b,c); +} + DVector _Geometry::segment_intersects_sphere( const Vector3& p_from, const Vector3& p_to, const Vector3& p_sphere_pos,real_t p_sphere_radius) { DVector r; @@ -938,6 +944,7 @@ void _Geometry::_bind_methods() { ObjectTypeDB::bind_method(_MD("segment_intersects_sphere","from","to","spos","sradius"),&_Geometry::segment_intersects_sphere); ObjectTypeDB::bind_method(_MD("segment_intersects_cylinder","from","to","height","radius"),&_Geometry::segment_intersects_cylinder); ObjectTypeDB::bind_method(_MD("segment_intersects_convex","from","to","planes"),&_Geometry::segment_intersects_convex); + ObjectTypeDB::bind_method(_MD("point_is_inside_triangle","point","a","b","c"),&_Geometry::point_is_inside_triangle); ObjectTypeDB::bind_method(_MD("triangulate_polygon","polygon"),&_Geometry::triangulate_polygon); diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 12a4ae86eb..f5043ba71f 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -248,6 +248,8 @@ public: Vector3 get_closest_point_to_segment(const Vector3& p_point, const Vector3& p_a,const Vector3& p_b); Variant ray_intersects_triangle( const Vector3& p_from, const Vector3& p_dir, const Vector3& p_v0,const Vector3& p_v1,const Vector3& p_v2); Variant segment_intersects_triangle( const Vector3& p_from, const Vector3& p_to, const Vector3& p_v0,const Vector3& p_v1,const Vector3& p_v2); + bool point_is_inside_triangle(const Vector2& s, const Vector2& a, const Vector2& b, const Vector2& c) const; + DVector segment_intersects_sphere( const Vector3& p_from, const Vector3& p_to, const Vector3& p_sphere_pos,real_t p_sphere_radius); DVector segment_intersects_cylinder( const Vector3& p_from, const Vector3& p_to, float p_height,float p_radius); DVector segment_intersects_convex(const Vector3& p_from, const Vector3& p_to,const Vector& p_planes); diff --git a/core/dvector.h b/core/dvector.h index 72661882cd..29be417844 100644 --- a/core/dvector.h +++ b/core/dvector.h @@ -262,6 +262,23 @@ public: w[bs+i]=r[i]; } + + Error insert(int p_pos,const T& p_val) { + + int s=size(); + ERR_FAIL_INDEX_V(p_pos,s+1,ERR_INVALID_PARAMETER); + resize(s+1); + { + Write w = write(); + for (int i=s;i>p_pos;i--) + w[i]=w[i-1]; + w[p_pos]=p_val; + } + + return OK; + } + + bool is_locked() const { return mem.is_locked(); } inline const T operator[](int p_index) const; diff --git a/core/math/geometry.h b/core/math/geometry.h index 81530e30c0..7e0cc01a22 100644 --- a/core/math/geometry.h +++ b/core/math/geometry.h @@ -511,6 +511,20 @@ public: else return p_segment[0]+n*d; // inside } + + static bool is_point_in_triangle(const Vector2& s, const Vector2& a, const Vector2& b, const Vector2& c) + { + int as_x = s.x-a.x; + int as_y = s.y-a.y; + + bool s_ab = (b.x-a.x)*as_y-(b.y-a.y)*as_x > 0; + + if((c.x-a.x)*as_y-(c.y-a.y)*as_x > 0 == s_ab) return false; + + if((c.x-b.x)*(s.y-b.y)-(c.y-b.y)*(s.x-b.x) > 0 != s_ab) return false; + + return true; + } static Vector2 get_closest_point_to_segment_uncapped_2d(const Vector2& p_point, const Vector2 *p_segment) { Vector2 p=p_point-p_segment[0]; diff --git a/core/math/triangulator.cpp b/core/math/triangulator.cpp new file mode 100644 index 0000000000..6be1cdb330 --- /dev/null +++ b/core/math/triangulator.cpp @@ -0,0 +1,1543 @@ +//Copyright (C) 2011 by Ivan Fratric +// +//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. + + +#include +#include +#include +#include +#include "triangulator.h" +using namespace std; + +#define TRIANGULATOR_VERTEXTYPE_REGULAR 0 +#define TRIANGULATOR_VERTEXTYPE_START 1 +#define TRIANGULATOR_VERTEXTYPE_END 2 +#define TRIANGULATOR_VERTEXTYPE_SPLIT 3 +#define TRIANGULATOR_VERTEXTYPE_MERGE 4 + +TriangulatorPoly::TriangulatorPoly() { + hole = false; + numpoints = 0; + points = NULL; +} + +TriangulatorPoly::~TriangulatorPoly() { + if(points) delete [] points; +} + +void TriangulatorPoly::Clear() { + if(points) delete [] points; + hole = false; + numpoints = 0; + points = NULL; +} + +void TriangulatorPoly::Init(long numpoints) { + Clear(); + this->numpoints = numpoints; + points = new Vector2[numpoints]; +} + +void TriangulatorPoly::Triangle(Vector2 &p1, Vector2 &p2, Vector2 &p3) { + Init(3); + points[0] = p1; + points[1] = p2; + points[2] = p3; +} + +TriangulatorPoly::TriangulatorPoly(const TriangulatorPoly &src) { + hole = src.hole; + numpoints = src.numpoints; + points = new Vector2[numpoints]; + memcpy(points, src.points, numpoints*sizeof(Vector2)); +} + +TriangulatorPoly& TriangulatorPoly::operator=(const TriangulatorPoly &src) { + Clear(); + hole = src.hole; + numpoints = src.numpoints; + points = new Vector2[numpoints]; + memcpy(points, src.points, numpoints*sizeof(Vector2)); + return *this; +} + +int TriangulatorPoly::GetOrientation() { + long i1,i2; + real_t area = 0; + for(i1=0; i10) return TRIANGULATOR_CCW; + if(area<0) return TRIANGULATOR_CW; + return 0; +} + +void TriangulatorPoly::SetOrientation(int orientation) { + int polyorientation = GetOrientation(); + if(polyorientation&&(polyorientation!=orientation)) { + Invert(); + } +} + +void TriangulatorPoly::Invert() { + long i; + Vector2 *invpoints; + + invpoints = new Vector2[numpoints]; + for(i=0;i0) return 0; + if(dot21*dot22>0) return 0; + + return 1; +} + +//removes holes from inpolys by merging them with non-holes +int TriangulatorPartition::RemoveHoles(list *inpolys, list *outpolys) { + list polys; + list::iterator holeiter,polyiter,iter,iter2; + long i,i2,holepointindex,polypointindex; + Vector2 holepoint,polypoint,bestpolypoint; + Vector2 linep1,linep2; + Vector2 v1,v2; + TriangulatorPoly newpoly; + bool hasholes; + bool pointvisible; + bool pointfound; + + //check for trivial case (no holes) + hasholes = false; + for(iter = inpolys->begin(); iter!=inpolys->end(); iter++) { + if(iter->IsHole()) { + hasholes = true; + break; + } + } + if(!hasholes) { + for(iter = inpolys->begin(); iter!=inpolys->end(); iter++) { + outpolys->push_back(*iter); + } + return 1; + } + + polys = *inpolys; + + while(1) { + //find the hole point with the largest x + hasholes = false; + for(iter = polys.begin(); iter!=polys.end(); iter++) { + if(!iter->IsHole()) continue; + + if(!hasholes) { + hasholes = true; + holeiter = iter; + holepointindex = 0; + } + + for(i=0; i < iter->GetNumPoints(); i++) { + if(iter->GetPoint(i).x > holeiter->GetPoint(holepointindex).x) { + holeiter = iter; + holepointindex = i; + } + } + } + if(!hasholes) break; + holepoint = holeiter->GetPoint(holepointindex); + + pointfound = false; + for(iter = polys.begin(); iter!=polys.end(); iter++) { + if(iter->IsHole()) continue; + for(i=0; i < iter->GetNumPoints(); i++) { + if(iter->GetPoint(i).x <= holepoint.x) continue; + if(!InCone(iter->GetPoint((i+iter->GetNumPoints()-1)%(iter->GetNumPoints())), + iter->GetPoint(i), + iter->GetPoint((i+1)%(iter->GetNumPoints())), + holepoint)) + continue; + polypoint = iter->GetPoint(i); + if(pointfound) { + v1 = Normalize(polypoint-holepoint); + v2 = Normalize(bestpolypoint-holepoint); + if(v2.x > v1.x) continue; + } + pointvisible = true; + for(iter2 = polys.begin(); iter2!=polys.end(); iter2++) { + if(iter2->IsHole()) continue; + for(i2=0; i2 < iter2->GetNumPoints(); i2++) { + linep1 = iter2->GetPoint(i2); + linep2 = iter2->GetPoint((i2+1)%(iter2->GetNumPoints())); + if(Intersects(holepoint,polypoint,linep1,linep2)) { + pointvisible = false; + break; + } + } + if(!pointvisible) break; + } + if(pointvisible) { + pointfound = true; + bestpolypoint = polypoint; + polyiter = iter; + polypointindex = i; + } + } + } + + if(!pointfound) return 0; + + newpoly.Init(holeiter->GetNumPoints() + polyiter->GetNumPoints() + 2); + i2 = 0; + for(i=0;i<=polypointindex;i++) { + newpoly[i2] = polyiter->GetPoint(i); + i2++; + } + for(i=0;i<=holeiter->GetNumPoints();i++) { + newpoly[i2] = holeiter->GetPoint((i+holepointindex)%holeiter->GetNumPoints()); + i2++; + } + for(i=polypointindex;iGetNumPoints();i++) { + newpoly[i2] = polyiter->GetPoint(i); + i2++; + } + + polys.erase(holeiter); + polys.erase(polyiter); + polys.push_back(newpoly); + } + + for(iter = polys.begin(); iter!=polys.end(); iter++) { + outpolys->push_back(*iter); + } + + return 1; +} + +bool TriangulatorPartition::IsConvex(Vector2& p1, Vector2& p2, Vector2& p3) { + real_t tmp; + tmp = (p3.y-p1.y)*(p2.x-p1.x)-(p3.x-p1.x)*(p2.y-p1.y); + if(tmp>0) return 1; + else return 0; +} + +bool TriangulatorPartition::IsReflex(Vector2& p1, Vector2& p2, Vector2& p3) { + real_t tmp; + tmp = (p3.y-p1.y)*(p2.x-p1.x)-(p3.x-p1.x)*(p2.y-p1.y); + if(tmp<0) return 1; + else return 0; +} + +bool TriangulatorPartition::IsInside(Vector2& p1, Vector2& p2, Vector2& p3, Vector2 &p) { + if(IsConvex(p1,p,p2)) return false; + if(IsConvex(p2,p,p3)) return false; + if(IsConvex(p3,p,p1)) return false; + return true; +} + +bool TriangulatorPartition::InCone(Vector2 &p1, Vector2 &p2, Vector2 &p3, Vector2 &p) { + bool convex; + + convex = IsConvex(p1,p2,p3); + + if(convex) { + if(!IsConvex(p1,p2,p)) return false; + if(!IsConvex(p2,p3,p)) return false; + return true; + } else { + if(IsConvex(p1,p2,p)) return true; + if(IsConvex(p2,p3,p)) return true; + return false; + } +} + +bool TriangulatorPartition::InCone(PartitionVertex *v, Vector2 &p) { + Vector2 p1,p2,p3; + + p1 = v->previous->p; + p2 = v->p; + p3 = v->next->p; + + return InCone(p1,p2,p3,p); +} + +void TriangulatorPartition::UpdateVertexReflexity(PartitionVertex *v) { + PartitionVertex *v1,*v3; + v1 = v->previous; + v3 = v->next; + v->isConvex = !IsReflex(v1->p,v->p,v3->p); +} + +void TriangulatorPartition::UpdateVertex(PartitionVertex *v, PartitionVertex *vertices, long numvertices) { + long i; + PartitionVertex *v1,*v3; + Vector2 vec1,vec3; + + v1 = v->previous; + v3 = v->next; + + v->isConvex = IsConvex(v1->p,v->p,v3->p); + + vec1 = Normalize(v1->p - v->p); + vec3 = Normalize(v3->p - v->p); + v->angle = vec1.x*vec3.x + vec1.y*vec3.y; + + if(v->isConvex) { + v->isEar = true; + for(i=0;ip.x)&&(vertices[i].p.y==v->p.y)) continue; + if((vertices[i].p.x==v1->p.x)&&(vertices[i].p.y==v1->p.y)) continue; + if((vertices[i].p.x==v3->p.x)&&(vertices[i].p.y==v3->p.y)) continue; + if(IsInside(v1->p,v->p,v3->p,vertices[i].p)) { + v->isEar = false; + break; + } + } + } else { + v->isEar = false; + } +} + +//triangulation by ear removal +int TriangulatorPartition::Triangulate_EC(TriangulatorPoly *poly, list *triangles) { + long numvertices; + PartitionVertex *vertices; + PartitionVertex *ear; + TriangulatorPoly triangle; + long i,j; + bool earfound; + + if(poly->GetNumPoints() < 3) return 0; + if(poly->GetNumPoints() == 3) { + triangles->push_back(*poly); + return 1; + } + + numvertices = poly->GetNumPoints(); + + vertices = new PartitionVertex[numvertices]; + for(i=0;iGetPoint(i); + if(i==(numvertices-1)) vertices[i].next=&(vertices[0]); + else vertices[i].next=&(vertices[i+1]); + if(i==0) vertices[i].previous = &(vertices[numvertices-1]); + else vertices[i].previous = &(vertices[i-1]); + } + for(i=0;i ear->angle) { + ear = &(vertices[j]); + } + } + } + if(!earfound) { + delete [] vertices; + return 0; + } + + triangle.Triangle(ear->previous->p,ear->p,ear->next->p); + triangles->push_back(triangle); + + ear->isActive = false; + ear->previous->next = ear->next; + ear->next->previous = ear->previous; + + if(i==numvertices-4) break; + + UpdateVertex(ear->previous,vertices,numvertices); + UpdateVertex(ear->next,vertices,numvertices); + } + for(i=0;ip,vertices[i].p,vertices[i].next->p); + triangles->push_back(triangle); + break; + } + } + + delete [] vertices; + + return 1; +} + +int TriangulatorPartition::Triangulate_EC(list *inpolys, list *triangles) { + list outpolys; + list::iterator iter; + + if(!RemoveHoles(inpolys,&outpolys)) return 0; + for(iter=outpolys.begin();iter!=outpolys.end();iter++) { + if(!Triangulate_EC(&(*iter),triangles)) return 0; + } + return 1; +} + +int TriangulatorPartition::ConvexPartition_HM(TriangulatorPoly *poly, list *parts) { + list triangles; + list::iterator iter1,iter2; + TriangulatorPoly *poly1,*poly2; + TriangulatorPoly newpoly; + Vector2 d1,d2,p1,p2,p3; + long i11,i12,i21,i22,i13,i23,j,k; + bool isdiagonal; + long numreflex; + + //check if the poly is already convex + numreflex = 0; + for(i11=0;i11GetNumPoints();i11++) { + if(i11==0) i12 = poly->GetNumPoints()-1; + else i12=i11-1; + if(i11==(poly->GetNumPoints()-1)) i13=0; + else i13=i11+1; + if(IsReflex(poly->GetPoint(i12),poly->GetPoint(i11),poly->GetPoint(i13))) { + numreflex = 1; + break; + } + } + if(numreflex == 0) { + parts->push_back(*poly); + return 1; + } + + if(!Triangulate_EC(poly,&triangles)) return 0; + + for(iter1 = triangles.begin(); iter1 != triangles.end(); iter1++) { + poly1 = &(*iter1); + for(i11=0;i11GetNumPoints();i11++) { + d1 = poly1->GetPoint(i11); + i12 = (i11+1)%(poly1->GetNumPoints()); + d2 = poly1->GetPoint(i12); + + isdiagonal = false; + for(iter2 = iter1; iter2 != triangles.end(); iter2++) { + if(iter1 == iter2) continue; + poly2 = &(*iter2); + + for(i21=0;i21GetNumPoints();i21++) { + if((d2.x != poly2->GetPoint(i21).x)||(d2.y != poly2->GetPoint(i21).y)) continue; + i22 = (i21+1)%(poly2->GetNumPoints()); + if((d1.x != poly2->GetPoint(i22).x)||(d1.y != poly2->GetPoint(i22).y)) continue; + isdiagonal = true; + break; + } + if(isdiagonal) break; + } + + if(!isdiagonal) continue; + + p2 = poly1->GetPoint(i11); + if(i11 == 0) i13 = poly1->GetNumPoints()-1; + else i13 = i11-1; + p1 = poly1->GetPoint(i13); + if(i22 == (poly2->GetNumPoints()-1)) i23 = 0; + else i23 = i22+1; + p3 = poly2->GetPoint(i23); + + if(!IsConvex(p1,p2,p3)) continue; + + p2 = poly1->GetPoint(i12); + if(i12 == (poly1->GetNumPoints()-1)) i13 = 0; + else i13 = i12+1; + p3 = poly1->GetPoint(i13); + if(i21 == 0) i23 = poly2->GetNumPoints()-1; + else i23 = i21-1; + p1 = poly2->GetPoint(i23); + + if(!IsConvex(p1,p2,p3)) continue; + + newpoly.Init(poly1->GetNumPoints()+poly2->GetNumPoints()-2); + k = 0; + for(j=i12;j!=i11;j=(j+1)%(poly1->GetNumPoints())) { + newpoly[k] = poly1->GetPoint(j); + k++; + } + for(j=i22;j!=i21;j=(j+1)%(poly2->GetNumPoints())) { + newpoly[k] = poly2->GetPoint(j); + k++; + } + + triangles.erase(iter2); + *iter1 = newpoly; + poly1 = &(*iter1); + i11 = -1; + + continue; + } + } + + for(iter1 = triangles.begin(); iter1 != triangles.end(); iter1++) { + parts->push_back(*iter1); + } + + return 1; +} + +int TriangulatorPartition::ConvexPartition_HM(list *inpolys, list *parts) { + list outpolys; + list::iterator iter; + + if(!RemoveHoles(inpolys,&outpolys)) return 0; + for(iter=outpolys.begin();iter!=outpolys.end();iter++) { + if(!ConvexPartition_HM(&(*iter),parts)) return 0; + } + return 1; +} + +//minimum-weight polygon triangulation by dynamic programming +//O(n^3) time complexity +//O(n^2) space complexity +int TriangulatorPartition::Triangulate_OPT(TriangulatorPoly *poly, list *triangles) { + long i,j,k,gap,n; + DPState **dpstates; + Vector2 p1,p2,p3,p4; + long bestvertex; + real_t weight,minweight,d1,d2; + Diagonal diagonal,newdiagonal; + list diagonals; + TriangulatorPoly triangle; + int ret = 1; + + n = poly->GetNumPoints(); + dpstates = new DPState *[n]; + for(i=1;iGetPoint(i); + for(j=i+1;jGetPoint(j); + + //visibility check + if(i==0) p3 = poly->GetPoint(n-1); + else p3 = poly->GetPoint(i-1); + if(i==(n-1)) p4 = poly->GetPoint(0); + else p4 = poly->GetPoint(i+1); + if(!InCone(p3,p1,p4,p2)) { + dpstates[j][i].visible = false; + continue; + } + + if(j==0) p3 = poly->GetPoint(n-1); + else p3 = poly->GetPoint(j-1); + if(j==(n-1)) p4 = poly->GetPoint(0); + else p4 = poly->GetPoint(j+1); + if(!InCone(p3,p2,p4,p1)) { + dpstates[j][i].visible = false; + continue; + } + + for(k=0;kGetPoint(k); + if(k==(n-1)) p4 = poly->GetPoint(0); + else p4 = poly->GetPoint(k+1); + if(Intersects(p1,p2,p3,p4)) { + dpstates[j][i].visible = false; + break; + } + } + } + } + } + dpstates[n-1][0].visible = true; + dpstates[n-1][0].weight = 0; + dpstates[n-1][0].bestvertex = -1; + + for(gap = 2; gapGetPoint(i),poly->GetPoint(k)); + if(j<=(k+1)) d2=0; + else d2 = Distance(poly->GetPoint(k),poly->GetPoint(j)); + + weight = dpstates[k][i].weight + dpstates[j][k].weight + d1 + d2; + + if((bestvertex == -1)||(weightGetPoint(diagonal.index1),poly->GetPoint(bestvertex),poly->GetPoint(diagonal.index2)); + triangles->push_back(triangle); + if(bestvertex > (diagonal.index1+1)) { + newdiagonal.index1 = diagonal.index1; + newdiagonal.index2 = bestvertex; + diagonals.push_back(newdiagonal); + } + if(diagonal.index2 > (bestvertex+1)) { + newdiagonal.index1 = bestvertex; + newdiagonal.index2 = diagonal.index2; + diagonals.push_back(newdiagonal); + } + } + + for(i=1;i *pairs; + long w2; + + w2 = dpstates[a][b].weight; + if(w>w2) return; + + pairs = &(dpstates[a][b].pairs); + newdiagonal.index1 = i; + newdiagonal.index2 = j; + + if(wclear(); + pairs->push_front(newdiagonal); + dpstates[a][b].weight = w; + } else { + if((!pairs->empty())&&(i <= pairs->begin()->index1)) return; + while((!pairs->empty())&&(pairs->begin()->index2 >= j)) pairs->pop_front(); + pairs->push_front(newdiagonal); + } +} + +void TriangulatorPartition::TypeA(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates) { + list *pairs; + list::iterator iter,lastiter; + long top; + long w; + + if(!dpstates[i][j].visible) return; + top = j; + w = dpstates[i][j].weight; + if(k-j > 1) { + if (!dpstates[j][k].visible) return; + w += dpstates[j][k].weight + 1; + } + if(j-i > 1) { + pairs = &(dpstates[i][j].pairs); + iter = pairs->end(); + lastiter = pairs->end(); + while(iter!=pairs->begin()) { + iter--; + if(!IsReflex(vertices[iter->index2].p,vertices[j].p,vertices[k].p)) lastiter = iter; + else break; + } + if(lastiter == pairs->end()) w++; + else { + if(IsReflex(vertices[k].p,vertices[i].p,vertices[lastiter->index1].p)) w++; + else top = lastiter->index1; + } + } + UpdateState(i,k,w,top,j,dpstates); +} + +void TriangulatorPartition::TypeB(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates) { + list *pairs; + list::iterator iter,lastiter; + long top; + long w; + + if(!dpstates[j][k].visible) return; + top = j; + w = dpstates[j][k].weight; + + if (j-i > 1) { + if (!dpstates[i][j].visible) return; + w += dpstates[i][j].weight + 1; + } + if (k-j > 1) { + pairs = &(dpstates[j][k].pairs); + + iter = pairs->begin(); + if((!pairs->empty())&&(!IsReflex(vertices[i].p,vertices[j].p,vertices[iter->index1].p))) { + lastiter = iter; + while(iter!=pairs->end()) { + if(!IsReflex(vertices[i].p,vertices[j].p,vertices[iter->index1].p)) { + lastiter = iter; + iter++; + } + else break; + } + if(IsReflex(vertices[lastiter->index2].p,vertices[k].p,vertices[i].p)) w++; + else top = lastiter->index2; + } else w++; + } + UpdateState(i,k,w,j,top,dpstates); +} + +int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, list *parts) { + Vector2 p1,p2,p3,p4; + PartitionVertex *vertices; + DPState2 **dpstates; + long i,j,k,n,gap; + list diagonals,diagonals2; + Diagonal diagonal,newdiagonal; + list *pairs,*pairs2; + list::iterator iter,iter2; + int ret; + TriangulatorPoly newpoly; + list indices; + list::iterator iiter; + bool ijreal,jkreal; + + n = poly->GetNumPoints(); + vertices = new PartitionVertex[n]; + + dpstates = new DPState2 *[n]; + for(i=0;iGetPoint(i); + vertices[i].isActive = true; + if(i==0) vertices[i].previous = &(vertices[n-1]); + else vertices[i].previous = &(vertices[i-1]); + if(i==(poly->GetNumPoints()-1)) vertices[i].next = &(vertices[0]); + else vertices[i].next = &(vertices[i+1]); + } + for(i=1;iGetPoint(i); + for(j=i+1;jGetPoint(j); + + //visibility check + if(!InCone(&vertices[i],p2)) { + dpstates[i][j].visible = false; + continue; + } + if(!InCone(&vertices[j],p1)) { + dpstates[i][j].visible = false; + continue; + } + + for(k=0;kGetPoint(k); + if(k==(n-1)) p4 = poly->GetPoint(0); + else p4 = poly->GetPoint(k+1); + if(Intersects(p1,p2,p3,p4)) { + dpstates[i][j].visible = false; + break; + } + } + } + } + } + for(i=0;i<(n-2);i++) { + j = i+2; + if(dpstates[i][j].visible) { + dpstates[i][j].weight = 0; + newdiagonal.index1 = i+1; + newdiagonal.index2 = i+1; + dpstates[i][j].pairs.push_back(newdiagonal); + } + } + + dpstates[0][n-1].visible = true; + vertices[0].isConvex = false; //by convention + + for(gap=3; gapempty()) { + ret = 0; + break; + } + if(!vertices[diagonal.index1].isConvex) { + iter = pairs->end(); + iter--; + j = iter->index2; + newdiagonal.index1 = j; + newdiagonal.index2 = diagonal.index2; + diagonals.push_front(newdiagonal); + if((j - diagonal.index1)>1) { + if(iter->index1 != iter->index2) { + pairs2 = &(dpstates[diagonal.index1][j].pairs); + while(1) { + if(pairs2->empty()) { + ret = 0; + break; + } + iter2 = pairs2->end(); + iter2--; + if(iter->index1 != iter2->index1) pairs2->pop_back(); + else break; + } + if(ret == 0) break; + } + newdiagonal.index1 = diagonal.index1; + newdiagonal.index2 = j; + diagonals.push_front(newdiagonal); + } + } else { + iter = pairs->begin(); + j = iter->index1; + newdiagonal.index1 = diagonal.index1; + newdiagonal.index2 = j; + diagonals.push_front(newdiagonal); + if((diagonal.index2 - j) > 1) { + if(iter->index1 != iter->index2) { + pairs2 = &(dpstates[j][diagonal.index2].pairs); + while(1) { + if(pairs2->empty()) { + ret = 0; + break; + } + iter2 = pairs2->begin(); + if(iter->index2 != iter2->index2) pairs2->pop_front(); + else break; + } + if(ret == 0) break; + } + newdiagonal.index1 = j; + newdiagonal.index2 = diagonal.index2; + diagonals.push_front(newdiagonal); + } + } + } + + if(ret == 0) { + for(i=0;iend(); + iter--; + j = iter->index2; + if(iter->index1 != iter->index2) ijreal = false; + } else { + iter = pairs->begin(); + j = iter->index1; + if(iter->index1 != iter->index2) jkreal = false; + } + + newdiagonal.index1 = diagonal.index1; + newdiagonal.index2 = j; + if(ijreal) { + diagonals.push_back(newdiagonal); + } else { + diagonals2.push_back(newdiagonal); + } + + newdiagonal.index1 = j; + newdiagonal.index2 = diagonal.index2; + if(jkreal) { + diagonals.push_back(newdiagonal); + } else { + diagonals2.push_back(newdiagonal); + } + + indices.push_back(j); + } + + indices.sort(); + newpoly.Init((long)indices.size()); + k=0; + for(iiter = indices.begin();iiter!=indices.end();iiter++) { + newpoly[k] = vertices[*iiter].p; + k++; + } + parts->push_back(newpoly); + } + + for(i=0;i *inpolys, list *monotonePolys) { + list::iterator iter; + MonotoneVertex *vertices; + long i,numvertices,vindex,vindex2,newnumvertices,maxnumvertices; + long polystartindex, polyendindex; + TriangulatorPoly *poly; + MonotoneVertex *v,*v2,*vprev,*vnext; + ScanLineEdge newedge; + bool error = false; + + numvertices = 0; + for(iter = inpolys->begin(); iter != inpolys->end(); iter++) { + numvertices += iter->GetNumPoints(); + } + + maxnumvertices = numvertices*3; + vertices = new MonotoneVertex[maxnumvertices]; + newnumvertices = numvertices; + + polystartindex = 0; + for(iter = inpolys->begin(); iter != inpolys->end(); iter++) { + poly = &(*iter); + polyendindex = polystartindex + poly->GetNumPoints()-1; + for(i=0;iGetNumPoints();i++) { + vertices[i+polystartindex].p = poly->GetPoint(i); + if(i==0) vertices[i+polystartindex].previous = polyendindex; + else vertices[i+polystartindex].previous = i+polystartindex-1; + if(i==(poly->GetNumPoints()-1)) vertices[i+polystartindex].next = polystartindex; + else vertices[i+polystartindex].next = i+polystartindex+1; + } + polystartindex = polyendindex+1; + } + + //construct the priority queue + long *priority = new long [numvertices]; + for(i=0;iprevious]); + vnext = &(vertices[v->next]); + + if(Below(vprev->p,v->p)&&Below(vnext->p,v->p)) { + if(IsConvex(vnext->p,vprev->p,v->p)) { + vertextypes[i] = TRIANGULATOR_VERTEXTYPE_START; + } else { + vertextypes[i] = TRIANGULATOR_VERTEXTYPE_SPLIT; + } + } else if(Below(v->p,vprev->p)&&Below(v->p,vnext->p)) { + if(IsConvex(vnext->p,vprev->p,v->p)) + { + vertextypes[i] = TRIANGULATOR_VERTEXTYPE_END; + } else { + vertextypes[i] = TRIANGULATOR_VERTEXTYPE_MERGE; + } + } else { + vertextypes[i] = TRIANGULATOR_VERTEXTYPE_REGULAR; + } + } + + //helpers + long *helpers = new long[maxnumvertices]; + + //binary search tree that holds edges intersecting the scanline + //note that while set doesn't actually have to be implemented as a tree + //complexity requirements for operations are the same as for the balanced binary search tree + set edgeTree; + //store iterators to the edge tree elements + //this makes deleting existing edges much faster + set::iterator *edgeTreeIterators,edgeIter; + edgeTreeIterators = new set::iterator[maxnumvertices]; + pair::iterator,bool> edgeTreeRet; + for(i = 0; ip; + newedge.p2 = vertices[v->next].p; + newedge.index = vindex; + edgeTreeRet = edgeTree.insert(newedge); + edgeTreeIterators[vindex] = edgeTreeRet.first; + helpers[vindex] = vindex; + break; + + case TRIANGULATOR_VERTEXTYPE_END: + //if helper(ei-1) is a merge vertex + if(vertextypes[helpers[v->previous]]==TRIANGULATOR_VERTEXTYPE_MERGE) { + //Insert the diagonal connecting vi to helper(ei-1) in D. + AddDiagonal(vertices,&newnumvertices,vindex,helpers[v->previous], + vertextypes, edgeTreeIterators, &edgeTree, helpers); + } + //Delete ei-1 from T + edgeTree.erase(edgeTreeIterators[v->previous]); + break; + + case TRIANGULATOR_VERTEXTYPE_SPLIT: + //Search in T to find the edge e j directly left of vi. + newedge.p1 = v->p; + newedge.p2 = v->p; + edgeIter = edgeTree.lower_bound(newedge); + if(edgeIter == edgeTree.begin()) { + error = true; + break; + } + edgeIter--; + //Insert the diagonal connecting vi to helper(ej) in D. + AddDiagonal(vertices,&newnumvertices,vindex,helpers[edgeIter->index], + vertextypes, edgeTreeIterators, &edgeTree, helpers); + vindex2 = newnumvertices-2; + v2 = &(vertices[vindex2]); + //helper(e j)�vi + helpers[edgeIter->index] = vindex; + //Insert ei in T and set helper(ei) to vi. + newedge.p1 = v2->p; + newedge.p2 = vertices[v2->next].p; + newedge.index = vindex2; + edgeTreeRet = edgeTree.insert(newedge); + edgeTreeIterators[vindex2] = edgeTreeRet.first; + helpers[vindex2] = vindex2; + break; + + case TRIANGULATOR_VERTEXTYPE_MERGE: + //if helper(ei-1) is a merge vertex + if(vertextypes[helpers[v->previous]]==TRIANGULATOR_VERTEXTYPE_MERGE) { + //Insert the diagonal connecting vi to helper(ei-1) in D. + AddDiagonal(vertices,&newnumvertices,vindex,helpers[v->previous], + vertextypes, edgeTreeIterators, &edgeTree, helpers); + vindex2 = newnumvertices-2; + v2 = &(vertices[vindex2]); + } + //Delete ei-1 from T. + edgeTree.erase(edgeTreeIterators[v->previous]); + //Search in T to find the edge e j directly left of vi. + newedge.p1 = v->p; + newedge.p2 = v->p; + edgeIter = edgeTree.lower_bound(newedge); + if(edgeIter == edgeTree.begin()) { + error = true; + break; + } + edgeIter--; + //if helper(ej) is a merge vertex + if(vertextypes[helpers[edgeIter->index]]==TRIANGULATOR_VERTEXTYPE_MERGE) { + //Insert the diagonal connecting vi to helper(e j) in D. + AddDiagonal(vertices,&newnumvertices,vindex2,helpers[edgeIter->index], + vertextypes, edgeTreeIterators, &edgeTree, helpers); + } + //helper(e j)�vi + helpers[edgeIter->index] = vindex2; + break; + + case TRIANGULATOR_VERTEXTYPE_REGULAR: + //if the interior of P lies to the right of vi + if(Below(v->p,vertices[v->previous].p)) { + //if helper(ei-1) is a merge vertex + if(vertextypes[helpers[v->previous]]==TRIANGULATOR_VERTEXTYPE_MERGE) { + //Insert the diagonal connecting vi to helper(ei-1) in D. + AddDiagonal(vertices,&newnumvertices,vindex,helpers[v->previous], + vertextypes, edgeTreeIterators, &edgeTree, helpers); + vindex2 = newnumvertices-2; + v2 = &(vertices[vindex2]); + } + //Delete ei-1 from T. + edgeTree.erase(edgeTreeIterators[v->previous]); + //Insert ei in T and set helper(ei) to vi. + newedge.p1 = v2->p; + newedge.p2 = vertices[v2->next].p; + newedge.index = vindex2; + edgeTreeRet = edgeTree.insert(newedge); + edgeTreeIterators[vindex2] = edgeTreeRet.first; + helpers[vindex2] = vindex; + } else { + //Search in T to find the edge ej directly left of vi. + newedge.p1 = v->p; + newedge.p2 = v->p; + edgeIter = edgeTree.lower_bound(newedge); + if(edgeIter == edgeTree.begin()) { + error = true; + break; + } + edgeIter--; + //if helper(ej) is a merge vertex + if(vertextypes[helpers[edgeIter->index]]==TRIANGULATOR_VERTEXTYPE_MERGE) { + //Insert the diagonal connecting vi to helper(e j) in D. + AddDiagonal(vertices,&newnumvertices,vindex,helpers[edgeIter->index], + vertextypes, edgeTreeIterators, &edgeTree, helpers); + } + //helper(e j)�vi + helpers[edgeIter->index] = vindex; + } + break; + } + + if(error) break; + } + + char *used = new char[newnumvertices]; + memset(used,0,newnumvertices*sizeof(char)); + + if(!error) { + //return result + long size; + TriangulatorPoly mpoly; + for(i=0;inext]); + size = 1; + while(vnext!=v) { + vnext = &(vertices[vnext->next]); + size++; + } + mpoly.Init(size); + v = &(vertices[i]); + mpoly[0] = v->p; + vnext = &(vertices[v->next]); + size = 1; + used[i] = 1; + used[v->next] = 1; + while(vnext!=v) { + mpoly[size] = vnext->p; + used[vnext->next] = 1; + vnext = &(vertices[vnext->next]); + size++; + } + monotonePolys->push_back(mpoly); + } + } + + //cleanup + delete [] vertices; + delete [] priority; + delete [] vertextypes; + delete [] edgeTreeIterators; + delete [] helpers; + delete [] used; + + if(error) { + return 0; + } else { + return 1; + } +} + +//adds a diagonal to the doubly-connected list of vertices +void TriangulatorPartition::AddDiagonal(MonotoneVertex *vertices, long *numvertices, long index1, long index2, + char *vertextypes, set::iterator *edgeTreeIterators, + set *edgeTree, long *helpers) +{ + long newindex1,newindex2; + + newindex1 = *numvertices; + (*numvertices)++; + newindex2 = *numvertices; + (*numvertices)++; + + vertices[newindex1].p = vertices[index1].p; + vertices[newindex2].p = vertices[index2].p; + + vertices[newindex2].next = vertices[index2].next; + vertices[newindex1].next = vertices[index1].next; + + vertices[vertices[index2].next].previous = newindex2; + vertices[vertices[index1].next].previous = newindex1; + + vertices[index1].next = newindex2; + vertices[newindex2].previous = index1; + + vertices[index2].next = newindex1; + vertices[newindex1].previous = index2; + + //update all relevant structures + vertextypes[newindex1] = vertextypes[index1]; + edgeTreeIterators[newindex1] = edgeTreeIterators[index1]; + helpers[newindex1] = helpers[index1]; + if(edgeTreeIterators[newindex1] != edgeTree->end()) + edgeTreeIterators[newindex1]->index = newindex1; + vertextypes[newindex2] = vertextypes[index2]; + edgeTreeIterators[newindex2] = edgeTreeIterators[index2]; + helpers[newindex2] = helpers[index2]; + if(edgeTreeIterators[newindex2] != edgeTree->end()) + edgeTreeIterators[newindex2]->index = newindex2; +} + +bool TriangulatorPartition::Below(Vector2 &p1, Vector2 &p2) { + if(p1.y < p2.y) return true; + else if(p1.y == p2.y) { + if(p1.x < p2.x) return true; + } + return false; +} + +//sorts in the falling order of y values, if y is equal, x is used instead +bool TriangulatorPartition::VertexSorter::operator() (long index1, long index2) { + if(vertices[index1].p.y > vertices[index2].p.y) return true; + else if(vertices[index1].p.y == vertices[index2].p.y) { + if(vertices[index1].p.x > vertices[index2].p.x) return true; + } + return false; +} + +bool TriangulatorPartition::ScanLineEdge::IsConvex(const Vector2& p1, const Vector2& p2, const Vector2& p3) const { + real_t tmp; + tmp = (p3.y-p1.y)*(p2.x-p1.x)-(p3.x-p1.x)*(p2.y-p1.y); + if(tmp>0) return 1; + else return 0; +} + +bool TriangulatorPartition::ScanLineEdge::operator < (const ScanLineEdge & other) const { + if(other.p1.y == other.p2.y) { + if(p1.y == p2.y) { + if(p1.y < other.p1.y) return true; + else return false; + } + if(IsConvex(p1,p2,other.p1)) return true; + else return false; + } else if(p1.y == p2.y) { + if(IsConvex(other.p1,other.p2,p1)) return false; + else return true; + } else if(p1.y < other.p1.y) { + if(IsConvex(other.p1,other.p2,p1)) return false; + else return true; + } else { + if(IsConvex(p1,p2,other.p1)) return true; + else return false; + } +} + +//triangulates monotone polygon +//O(n) time, O(n) space complexity +int TriangulatorPartition::TriangulateMonotone(TriangulatorPoly *inPoly, list *triangles) { + long i,i2,j,topindex,bottomindex,leftindex,rightindex,vindex; + Vector2 *points; + long numpoints; + TriangulatorPoly triangle; + + numpoints = inPoly->GetNumPoints(); + points = inPoly->GetPoints(); + + //trivial calses + if(numpoints < 3) return 0; + if(numpoints == 3) { + triangles->push_back(*inPoly); + } + + topindex = 0; bottomindex=0; + for(i=1;i=numpoints) i2 = 0; + if(!Below(points[i2],points[i])) return 0; + i = i2; + } + i = bottomindex; + while(i!=topindex) { + i2 = i+1; if(i2>=numpoints) i2 = 0; + if(!Below(points[i],points[i2])) return 0; + i = i2; + } + + char *vertextypes = new char[numpoints]; + long *priority = new long[numpoints]; + + //merge left and right vertex chains + priority[0] = topindex; + vertextypes[topindex] = 0; + leftindex = topindex+1; if(leftindex>=numpoints) leftindex = 0; + rightindex = topindex-1; if(rightindex<0) rightindex = numpoints-1; + for(i=1;i<(numpoints-1);i++) { + if(leftindex==bottomindex) { + priority[i] = rightindex; + rightindex--; if(rightindex<0) rightindex = numpoints-1; + vertextypes[priority[i]] = -1; + } else if(rightindex==bottomindex) { + priority[i] = leftindex; + leftindex++; if(leftindex>=numpoints) leftindex = 0; + vertextypes[priority[i]] = 1; + } else { + if(Below(points[leftindex],points[rightindex])) { + priority[i] = rightindex; + rightindex--; if(rightindex<0) rightindex = numpoints-1; + vertextypes[priority[i]] = -1; + } else { + priority[i] = leftindex; + leftindex++; if(leftindex>=numpoints) leftindex = 0; + vertextypes[priority[i]] = 1; + } + } + } + priority[i] = bottomindex; + vertextypes[bottomindex] = 0; + + long *stack = new long[numpoints]; + long stackptr = 0; + + stack[0] = priority[0]; + stack[1] = priority[1]; + stackptr = 2; + + //for each vertex from top to bottom trim as many triangles as possible + for(i=2;i<(numpoints-1);i++) { + vindex = priority[i]; + if(vertextypes[vindex]!=vertextypes[stack[stackptr-1]]) { + for(j=0;j<(stackptr-1);j++) { + if(vertextypes[vindex]==1) { + triangle.Triangle(points[stack[j+1]],points[stack[j]],points[vindex]); + } else { + triangle.Triangle(points[stack[j]],points[stack[j+1]],points[vindex]); + } + triangles->push_back(triangle); + } + stack[0] = priority[i-1]; + stack[1] = priority[i]; + stackptr = 2; + } else { + stackptr--; + while(stackptr>0) { + if(vertextypes[vindex]==1) { + if(IsConvex(points[vindex],points[stack[stackptr-1]],points[stack[stackptr]])) { + triangle.Triangle(points[vindex],points[stack[stackptr-1]],points[stack[stackptr]]); + triangles->push_back(triangle); + stackptr--; + } else { + break; + } + } else { + if(IsConvex(points[vindex],points[stack[stackptr]],points[stack[stackptr-1]])) { + triangle.Triangle(points[vindex],points[stack[stackptr]],points[stack[stackptr-1]]); + triangles->push_back(triangle); + stackptr--; + } else { + break; + } + } + } + stackptr++; + stack[stackptr] = vindex; + stackptr++; + } + } + vindex = priority[i]; + for(j=0;j<(stackptr-1);j++) { + if(vertextypes[stack[j+1]]==1) { + triangle.Triangle(points[stack[j]],points[stack[j+1]],points[vindex]); + } else { + triangle.Triangle(points[stack[j+1]],points[stack[j]],points[vindex]); + } + triangles->push_back(triangle); + } + + delete [] priority; + delete [] vertextypes; + delete [] stack; + + return 1; +} + +int TriangulatorPartition::Triangulate_MONO(list *inpolys, list *triangles) { + list monotone; + list::iterator iter; + + if(!MonotonePartition(inpolys,&monotone)) return 0; + for(iter = monotone.begin(); iter!=monotone.end();iter++) { + if(!TriangulateMonotone(&(*iter),triangles)) return 0; + } + return 1; +} + +int TriangulatorPartition::Triangulate_MONO(TriangulatorPoly *poly, list *triangles) { + list polys; + polys.push_back(*poly); + + return Triangulate_MONO(&polys, triangles); +} diff --git a/core/math/triangulator.h b/core/math/triangulator.h new file mode 100644 index 0000000000..c34c445892 --- /dev/null +++ b/core/math/triangulator.h @@ -0,0 +1,309 @@ +//Copyright (C) 2011 by Ivan Fratric +// +//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. + +#ifndef TRIANGULATOR_H +#define TRIANGULATOR_H + +#include "math_2d.h" +#include +#include + +//2D point structure + + +#define TRIANGULATOR_CCW 1 +#define TRIANGULATOR_CW -1 +//Polygon implemented as an array of points with a 'hole' flag +class TriangulatorPoly { +protected: + + + + Vector2 *points; + long numpoints; + bool hole; + +public: + + //constructors/destructors + TriangulatorPoly(); + ~TriangulatorPoly(); + + TriangulatorPoly(const TriangulatorPoly &src); + TriangulatorPoly& operator=(const TriangulatorPoly &src); + + //getters and setters + long GetNumPoints() { + return numpoints; + } + + bool IsHole() { + return hole; + } + + void SetHole(bool hole) { + this->hole = hole; + } + + Vector2 &GetPoint(long i) { + return points[i]; + } + + Vector2 *GetPoints() { + return points; + } + + Vector2& operator[] (int i) { + return points[i]; + } + + //clears the polygon points + void Clear(); + + //inits the polygon with numpoints vertices + void Init(long numpoints); + + //creates a triangle with points p1,p2,p3 + void Triangle(Vector2 &p1, Vector2 &p2, Vector2 &p3); + + //inverts the orfer of vertices + void Invert(); + + //returns the orientation of the polygon + //possible values: + // Triangulator_CCW : polygon vertices are in counter-clockwise order + // Triangulator_CW : polygon vertices are in clockwise order + // 0 : the polygon has no (measurable) area + int GetOrientation(); + + //sets the polygon orientation + //orientation can be + // Triangulator_CCW : sets vertices in counter-clockwise order + // Triangulator_CW : sets vertices in clockwise order + void SetOrientation(int orientation); +}; + +class TriangulatorPartition { +protected: + struct PartitionVertex { + bool isActive; + bool isConvex; + bool isEar; + + Vector2 p; + real_t angle; + PartitionVertex *previous; + PartitionVertex *next; + }; + + struct MonotoneVertex { + Vector2 p; + long previous; + long next; + }; + + class VertexSorter{ + MonotoneVertex *vertices; + public: + VertexSorter(MonotoneVertex *v) : vertices(v) {} + bool operator() (long index1, long index2); + }; + + struct Diagonal { + long index1; + long index2; + }; + + //dynamic programming state for minimum-weight triangulation + struct DPState { + bool visible; + real_t weight; + long bestvertex; + }; + + //dynamic programming state for convex partitioning + struct DPState2 { + bool visible; + long weight; + std::list pairs; + }; + + //edge that intersects the scanline + struct ScanLineEdge { + mutable long index; + Vector2 p1; + Vector2 p2; + + //determines if the edge is to the left of another edge + bool operator< (const ScanLineEdge & other) const; + + bool IsConvex(const Vector2& p1, const Vector2& p2, const Vector2& p3) const; + }; + + //standard helper functions + bool IsConvex(Vector2& p1, Vector2& p2, Vector2& p3); + bool IsReflex(Vector2& p1, Vector2& p2, Vector2& p3); + bool IsInside(Vector2& p1, Vector2& p2, Vector2& p3, Vector2 &p); + + bool InCone(Vector2 &p1, Vector2 &p2, Vector2 &p3, Vector2 &p); + bool InCone(PartitionVertex *v, Vector2 &p); + + int Intersects(Vector2 &p11, Vector2 &p12, Vector2 &p21, Vector2 &p22); + + Vector2 Normalize(const Vector2 &p); + real_t Distance(const Vector2 &p1, const Vector2 &p2); + + //helper functions for Triangulate_EC + void UpdateVertexReflexity(PartitionVertex *v); + void UpdateVertex(PartitionVertex *v,PartitionVertex *vertices, long numvertices); + + //helper functions for ConvexPartition_OPT + void UpdateState(long a, long b, long w, long i, long j, DPState2 **dpstates); + void TypeA(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates); + void TypeB(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates); + + //helper functions for MonotonePartition + bool Below(Vector2 &p1, Vector2 &p2); + void AddDiagonal(MonotoneVertex *vertices, long *numvertices, long index1, long index2, + char *vertextypes, std::set::iterator *edgeTreeIterators, + std::set *edgeTree, long *helpers); + + //triangulates a monotone polygon, used in Triangulate_MONO + int TriangulateMonotone(TriangulatorPoly *inPoly, std::list *triangles); + +public: + + //simple heuristic procedure for removing holes from a list of polygons + //works by creating a diagonal from the rightmost hole vertex to some visible vertex + //time complexity: O(h*(n^2)), h is the number of holes, n is the number of vertices + //space complexity: O(n) + //params: + // inpolys : a list of polygons that can contain holes + // vertices of all non-hole polys have to be in counter-clockwise order + // vertices of all hole polys have to be in clockwise order + // outpolys : a list of polygons without holes + //returns 1 on success, 0 on failure + int RemoveHoles(std::list *inpolys, std::list *outpolys); + + //triangulates a polygon by ear clipping + //time complexity O(n^2), n is the number of vertices + //space complexity: O(n) + //params: + // poly : an input polygon to be triangulated + // vertices have to be in counter-clockwise order + // triangles : a list of triangles (result) + //returns 1 on success, 0 on failure + int Triangulate_EC(TriangulatorPoly *poly, std::list *triangles); + + //triangulates a list of polygons that may contain holes by ear clipping algorithm + //first calls RemoveHoles to get rid of the holes, and then Triangulate_EC for each resulting polygon + //time complexity: O(h*(n^2)), h is the number of holes, n is the number of vertices + //space complexity: O(n) + //params: + // inpolys : a list of polygons to be triangulated (can contain holes) + // vertices of all non-hole polys have to be in counter-clockwise order + // vertices of all hole polys have to be in clockwise order + // triangles : a list of triangles (result) + //returns 1 on success, 0 on failure + int Triangulate_EC(std::list *inpolys, std::list *triangles); + + //creates an optimal polygon triangulation in terms of minimal edge length + //time complexity: O(n^3), n is the number of vertices + //space complexity: O(n^2) + //params: + // poly : an input polygon to be triangulated + // vertices have to be in counter-clockwise order + // triangles : a list of triangles (result) + //returns 1 on success, 0 on failure + int Triangulate_OPT(TriangulatorPoly *poly, std::list *triangles); + + //triangulates a polygons by firstly partitioning it into monotone polygons + //time complexity: O(n*log(n)), n is the number of vertices + //space complexity: O(n) + //params: + // poly : an input polygon to be triangulated + // vertices have to be in counter-clockwise order + // triangles : a list of triangles (result) + //returns 1 on success, 0 on failure + int Triangulate_MONO(TriangulatorPoly *poly, std::list *triangles); + + //triangulates a list of polygons by firstly partitioning them into monotone polygons + //time complexity: O(n*log(n)), n is the number of vertices + //space complexity: O(n) + //params: + // inpolys : a list of polygons to be triangulated (can contain holes) + // vertices of all non-hole polys have to be in counter-clockwise order + // vertices of all hole polys have to be in clockwise order + // triangles : a list of triangles (result) + //returns 1 on success, 0 on failure + int Triangulate_MONO(std::list *inpolys, std::list *triangles); + + //creates a monotone partition of a list of polygons that can contain holes + //time complexity: O(n*log(n)), n is the number of vertices + //space complexity: O(n) + //params: + // inpolys : a list of polygons to be triangulated (can contain holes) + // vertices of all non-hole polys have to be in counter-clockwise order + // vertices of all hole polys have to be in clockwise order + // monotonePolys : a list of monotone polygons (result) + //returns 1 on success, 0 on failure + int MonotonePartition(std::list *inpolys, std::list *monotonePolys); + + //partitions a polygon into convex polygons by using Hertel-Mehlhorn algorithm + //the algorithm gives at most four times the number of parts as the optimal algorithm + //however, in practice it works much better than that and often gives optimal partition + //uses triangulation obtained by ear clipping as intermediate result + //time complexity O(n^2), n is the number of vertices + //space complexity: O(n) + //params: + // poly : an input polygon to be partitioned + // vertices have to be in counter-clockwise order + // parts : resulting list of convex polygons + //returns 1 on success, 0 on failure + int ConvexPartition_HM(TriangulatorPoly *poly, std::list *parts); + + //partitions a list of polygons into convex parts by using Hertel-Mehlhorn algorithm + //the algorithm gives at most four times the number of parts as the optimal algorithm + //however, in practice it works much better than that and often gives optimal partition + //uses triangulation obtained by ear clipping as intermediate result + //time complexity O(n^2), n is the number of vertices + //space complexity: O(n) + //params: + // inpolys : an input list of polygons to be partitioned + // vertices of all non-hole polys have to be in counter-clockwise order + // vertices of all hole polys have to be in clockwise order + // parts : resulting list of convex polygons + //returns 1 on success, 0 on failure + int ConvexPartition_HM(std::list *inpolys, std::list *parts); + + //optimal convex partitioning (in terms of number of resulting convex polygons) + //using the Keil-Snoeyink algorithm + //M. Keil, J. Snoeyink, "On the time bound for convex decomposition of simple polygons", 1998 + //time complexity O(n^3), n is the number of vertices + //space complexity: O(n^3) + // poly : an input polygon to be partitioned + // vertices have to be in counter-clockwise order + // parts : resulting list of convex polygons + //returns 1 on success, 0 on failure + int ConvexPartition_OPT(TriangulatorPoly *poly, std::list *parts); +}; + + +#endif diff --git a/demos/2d/navpoly/agent.png b/demos/2d/navpoly/agent.png new file mode 100644 index 0000000000000000000000000000000000000000..23e396c4787450c93f25ebd4b2f52f20ac911695 GIT binary patch literal 2508 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 literal 0 HcmV?d00001 diff --git a/demos/2d/navpoly/engine.cfg b/demos/2d/navpoly/engine.cfg new file mode 100644 index 0000000000..51eefd7b77 --- /dev/null +++ b/demos/2d/navpoly/engine.cfg @@ -0,0 +1,4 @@ +[application] + +name="Navigation Polygon (2D)" +main_scene="res://navigation.scn" diff --git a/demos/2d/navpoly/navigation.gd b/demos/2d/navpoly/navigation.gd new file mode 100644 index 0000000000..9c3dc2921d --- /dev/null +++ b/demos/2d/navpoly/navigation.gd @@ -0,0 +1,63 @@ + +extends Navigation2D + +# member variables here, example: +# var a=2 +# var b="textvar" +var begin=Vector2() +var end=Vector2() +var path=[] + +const SPEED=200.0 + +func _process(delta): + + + if (path.size()>1): + + var to_walk = delta*SPEED + while(to_walk>0 and path.size()>=2): + var pfrom = path[path.size()-1] + var pto = path[path.size()-2] + var d = pfrom.distance_to(pto) + if (d<=to_walk): + path.remove(path.size()-1) + to_walk-=d + else: + path[path.size()-1] = pfrom.linear_interpolate(pto,to_walk/d) + to_walk=0 + + var atpos = path[path.size()-1] + get_node("agent").set_pos(atpos) + + if (path.size()<2): + path=[] + set_process(false) + + else: + set_process(false) + + + +func _update_path(): + + var p = get_simple_path(begin,end,true) + path=Array(p) # Vector2array to complex to use, convert to regular array + path.invert() + + set_process(true) + + +func _input(ev): + if (ev.type==InputEvent.MOUSE_BUTTON and ev.pressed and ev.button_index==1): + begin=get_node("agent").get_pos() + #mouse to local navigatio cooards + end=ev.pos - get_pos() + _update_path() + +func _ready(): + # Initialization here + set_process_input(true) + pass + + diff --git a/demos/2d/navpoly/navigation.scn b/demos/2d/navpoly/navigation.scn new file mode 100644 index 0000000000000000000000000000000000000000..c116d10ae2b6b11007dad10ffa94a012fa412614 GIT binary patch literal 3471 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�wcDHyPxEU5tKF=wWuB9ZNujq5(yjFS?} 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Ôi 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 literal 0 HcmV?d00001 diff --git a/scene/2d/navigation2d.cpp b/scene/2d/navigation2d.cpp new file mode 100644 index 0000000000..5e93dac61d --- /dev/null +++ b/scene/2d/navigation2d.cpp @@ -0,0 +1,623 @@ +#include "navigation2d.h" + +void Navigation2D::_navpoly_link(int p_id) { + + ERR_FAIL_COND(!navpoly_map.has(p_id)); + NavMesh &nm=navpoly_map[p_id]; + ERR_FAIL_COND(nm.linked); + + print_line("LINK"); + + DVector vertices=nm.navpoly->get_vertices(); + int len = vertices.size(); + if (len==0) + return; + + DVector::Read r=vertices.read(); + + for(int i=0;iget_polygon_count();i++) { + + //build + + List::Element *P=nm.polygons.push_back(Polygon()); + Polygon &p=P->get(); + p.owner=&nm; + + Vector poly = nm.navpoly->get_polygon(i); + int plen=poly.size(); + const int *indices=poly.ptr(); + bool valid=true; + p.edges.resize(plen); + + Vector2 center; + + for(int j=0;j=len) { + valid=false; + break; + } + + Polygon::Edge e; + Vector2 ep=nm.xform.xform(r[idx]); + center+=ep; + e.point=_get_point(ep); + p.edges[j]=e; + } + + if (!valid) { + nm.polygons.pop_back(); + ERR_CONTINUE(!valid); + continue; + } + + p.center=center/plen; + + //connect + + for(int j=0;j::Element *C=connections.find(ek); + if (!C) { + + Connection c; + c.A=&p; + c.A_edge=j; + c.B=NULL; + c.B_edge=-1; + connections[ek]=c; + } else { + + if (C->get().B!=NULL) { + print_line(String()+_get_vertex(ek.a)+" -> "+_get_vertex(ek.b)); + } + ERR_CONTINUE(C->get().B!=NULL); //wut + + C->get().B=&p; + C->get().B_edge=j; + C->get().A->edges[C->get().A_edge].C=&p; + C->get().A->edges[C->get().A_edge].C_edge=j;; + p.edges[j].C=C->get().A; + p.edges[j].C_edge=C->get().A_edge; + //connection successful. + } + } + } + + nm.linked=true; + +} + + +void Navigation2D::_navpoly_unlink(int p_id) { + + ERR_FAIL_COND(!navpoly_map.has(p_id)); + NavMesh &nm=navpoly_map[p_id]; + ERR_FAIL_COND(!nm.linked); + + print_line("UNLINK"); + + for (List::Element *E=nm.polygons.front();E;E=E->next()) { + + + Polygon &p=E->get(); + + int ec = p.edges.size(); + Polygon::Edge *edges=p.edges.ptr(); + + for(int i=0;i::Element *C=connections.find(ek); + ERR_CONTINUE(!C); + if (C->get().B) { + //disconnect + + C->get().B->edges[C->get().B_edge].C=NULL; + C->get().B->edges[C->get().B_edge].C_edge=-1; + C->get().A->edges[C->get().A_edge].C=NULL; + C->get().A->edges[C->get().A_edge].C_edge=-1; + + if (C->get().A==&E->get()) { + + C->get().A=C->get().B; + C->get().A_edge=C->get().B_edge; + } + C->get().B=NULL; + C->get().B_edge=-1; + + } else { + connections.erase(C); + //erase + } + } + } + + nm.polygons.clear(); + + nm.linked=false; + + +} + + +int Navigation2D::navpoly_create(const Ref& p_mesh, const Matrix32& p_xform, Object *p_owner) { + + int id = last_id++; + NavMesh nm; + nm.linked=false; + nm.navpoly=p_mesh; + nm.xform=p_xform; + nm.owner=p_owner; + navpoly_map[id]=nm; + + _navpoly_link(id); + + return id; +} + +void Navigation2D::navpoly_set_transform(int p_id, const Matrix32& p_xform){ + + ERR_FAIL_COND(!navpoly_map.has(p_id)); + NavMesh &nm=navpoly_map[p_id]; + if (nm.xform==p_xform) + return; //bleh + _navpoly_unlink(p_id); + nm.xform=p_xform; + _navpoly_link(p_id); + + + +} +void Navigation2D::navpoly_remove(int p_id){ + + ERR_FAIL_COND(!navpoly_map.has(p_id)); + _navpoly_unlink(p_id); + navpoly_map.erase(p_id); + +} +#if 0 +void Navigation2D::_clip_path(Vector& path, Polygon *from_poly, const Vector2& p_to_point, Polygon* p_to_poly) { + + Vector2 from = path[path.size()-1]; + + if (from.distance_to(p_to_point)prev_edge; + Vector2 a = _get_vertex(from_poly->edges[pe].point); + Vector2 b = _get_vertex(from_poly->edges[(pe+1)%from_poly->edges.size()].point); + + from_poly=from_poly->edges[pe].C; + ERR_FAIL_COND(!from_poly); + + if (a.distance_to(b)>CMP_EPSILON) { + + Vector2 inters; + if (cut_plane.intersects_segment(a,b,&inters)) { + if (inters.distance_to(p_to_point)>CMP_EPSILON && inters.distance_to(path[path.size()-1])>CMP_EPSILON) { + path.push_back(inters); + } + } + } + } +} +#endif + +Vector Navigation2D::get_simple_path(const Vector2& p_start, const Vector2& p_end, bool p_optimize) { + + + Polygon *begin_poly=NULL; + Polygon *end_poly=NULL; + Vector2 begin_point; + Vector2 end_point; + float begin_d=1e20; + float end_d=1e20; + + //look for point inside triangle + + for (Map::Element*E=navpoly_map.front();E;E=E->next()) { + + if (!E->get().linked) + continue; + for(List::Element *F=E->get().polygons.front();F;F=F->next()) { + + + Polygon &p=F->get(); + if (begin_d || end_d) { + for(int i=2;i0) { + + if (Geometry::is_point_in_triangle(p_start,_get_vertex(p.edges[0].point),_get_vertex(p.edges[i-1].point),_get_vertex(p.edges[i].point))) { + + begin_poly=&p; + begin_point=p_start; + begin_d=0; + if (end_d==0) + break; + + } + } + + if (end_d>0) { + + if (Geometry::is_point_in_triangle(p_end,_get_vertex(p.edges[0].point),_get_vertex(p.edges[i-1].point),_get_vertex(p.edges[i].point))) { + + end_poly=&p; + end_point=p_end; + end_d=0; + if (begin_d==0) + break; + } + } + + } + } + + p.prev_edge=-1; + } + } + + //start or end not inside triangle.. look for closest segment :| + if (begin_d || end_d) { + for (Map::Element*E=navpoly_map.front();E;E=E->next()) { + + if (!E->get().linked) + continue; + for(List::Element *F=E->get().polygons.front();F;F=F->next()) { + + Polygon &p=F->get(); + int es = p.edges.size(); + for(int i=0;i0) { + Vector2 spoint=Geometry::get_closest_point_to_segment_2d(p_start,edge); + float d = spoint.distance_to(p_start); + if (d0) { + Vector2 spoint=Geometry::get_closest_point_to_segment_2d(p_end,edge); + float d = spoint.distance_to(p_end); + if (d(); //no path + } + + if (begin_poly==end_poly) { + + Vector path; + path.resize(2); + path[0]=begin_point; + path[1]=end_point; + //print_line("Direct Path"); + return path; + } + + + bool found_route=false; + + List open_list; + + for(int i=0;iedges.size();i++) { + + if (begin_poly->edges[i].C) { + + begin_poly->edges[i].C->prev_edge=begin_poly->edges[i].C_edge; + begin_poly->edges[i].C->distance=begin_poly->center.distance_to(begin_poly->edges[i].C->center); + open_list.push_back(begin_poly->edges[i].C); + + if (begin_poly->edges[i].C==end_poly) { + found_route=true; + } + } + } + + + while(!found_route) { + + if (open_list.size()==0) { + // print_line("NOU OPEN LIST"); + break; + } + //check open list + + List::Element *least_cost_poly=NULL; + float least_cost=1e30; + + //this could be faster (cache previous results) + for (List::Element *E=open_list.front();E;E=E->next()) { + + Polygon *p=E->get(); + + + float cost=p->distance; + cost+=p->center.distance_to(end_point); + + if (costget(); + //open the neighbours for search + + for(int i=0;iedges.size();i++) { + + + Polygon::Edge &e=p->edges[i]; + + if (!e.C) + continue; + + float distance = p->center.distance_to(e.C->center) + p->distance; + + if (e.C->prev_edge!=-1) { + //oh this was visited already, can we win the cost? + + if (e.C->distance>distance) { + + e.C->prev_edge=e.C_edge; + e.C->distance=distance; + } + } else { + //add to open neighbours + + e.C->prev_edge=e.C_edge; + e.C->distance=distance; + open_list.push_back(e.C); + + if (e.C==end_poly) { + //oh my reached end! stop algorithm + found_route=true; + break; + + } + + } + } + + if (found_route) + break; + + open_list.erase(least_cost_poly); + } + + if (found_route) { + + Vector path; + + if (p_optimize) { + //string pulling + + Polygon *apex_poly=end_poly; + Vector2 apex_point=end_point; + Vector2 portal_left=apex_point; + Vector2 portal_right=apex_point; + Polygon *left_poly=end_poly; + Polygon *right_poly=end_poly; + Polygon *p=end_poly; + path.push_back(end_point); + + while(p) { + + Vector2 left; + Vector2 right; + +//#define CLOCK_TANGENT(m_a,m_b,m_c) ( ((m_a)-(m_c)).cross((m_a)-(m_b)) ) +#define CLOCK_TANGENT(m_a,m_b,m_c) ((((m_a).x - (m_c).x) * ((m_b).y - (m_c).y) - ((m_b).x - (m_c).x) * ((m_a).y - (m_c).y))) + + if (p==begin_poly) { + left=begin_point; + right=begin_point; + } else { + int prev = p->prev_edge; + int prev_n = (p->prev_edge+1)%p->edges.size(); + left = _get_vertex(p->edges[prev].point); + right = _get_vertex(p->edges[prev_n].point); + + if (CLOCK_TANGENT(apex_point,left,(left+right)*0.5) < 0){ + SWAP(left,right); + } + } + + bool skip=false; + + + if (CLOCK_TANGENT(apex_point,portal_left,left) >= 0){ + //process + if (portal_left==apex_point || CLOCK_TANGENT(apex_point,left,portal_right) > 0) { + left_poly=p; + portal_left=left; + } else { + + //_clip_path(path,apex_poly,portal_right,right_poly); + + apex_point=portal_right; + p=right_poly; + left_poly=p; + apex_poly=p; + portal_left=apex_point; + portal_right=apex_point; + path.push_back(apex_point); + skip=true; + } + } + + if (!skip && CLOCK_TANGENT(apex_point,portal_right,right) <= 0){ + //process + if (portal_right==apex_point || CLOCK_TANGENT(apex_point,right,portal_left) < 0) { + right_poly=p; + portal_right=right; + } else { + + //_clip_path(path,apex_poly,portal_left,left_poly); + + apex_point=portal_left; + p=left_poly; + right_poly=p; + apex_poly=p; + portal_right=apex_point; + portal_left=apex_point; + path.push_back(apex_point); + } + } + + if (p!=begin_poly) + p=p->edges[p->prev_edge].C; + else + p=NULL; + + } + + if (path[path.size()-1]!=begin_point) + path.push_back(begin_point); + + path.invert(); + + + + + } else { + //midpoints + Polygon *p=end_poly; + + path.push_back(end_point); + while(true) { + int prev = p->prev_edge; + int prev_n = (p->prev_edge+1)%p->edges.size(); + Vector2 point = (_get_vertex(p->edges[prev].point) + _get_vertex(p->edges[prev_n].point))*0.5; + path.push_back(point); + p = p->edges[prev].C; + if (p==begin_poly) + break; + } + + path.push_back(begin_point); + + + path.invert();; + } + + return path; + } + + + return Vector(); + +} + + +Vector2 Navigation2D::get_closest_point(const Vector2& p_point) { + + Vector2 closest_point=Vector2(); + float closest_point_d=1e20; + + for (Map::Element*E=navpoly_map.front();E;E=E->next()) { + + if (!E->get().linked) + continue; + for(List::Element *F=E->get().polygons.front();F;F=F->next()) { + + Polygon &p=F->get(); + for(int i=2;i::Element*E=navpoly_map.front();E;E=E->next()) { + + if (!E->get().linked) + continue; + for(List::Element *F=E->get().polygons.front();F;F=F->next()) { + + Polygon &p=F->get(); + int es = p.edges.size(); + for(int i=0;i b.key) { + SWAP(a,b); + } + } + }; + + + struct NavMesh; + + + struct Polygon { + + struct Edge { + Point point; + Polygon *C; //connection + int C_edge; + Edge() { C=NULL; C_edge=-1; } + }; + + Vector edges; + + Vector2 center; + + float distance; + int prev_edge; + + NavMesh *owner; + }; + + + struct Connection { + + Polygon *A; + int A_edge; + Polygon *B; + int B_edge; + Connection() { A=NULL; B=NULL; A_edge=-1; B_edge=-1;} + }; + + Map connections; + + + struct NavMesh { + + Object *owner; + Matrix32 xform; + bool linked; + Ref navpoly; + List polygons; + + }; + + + + _FORCE_INLINE_ Point _get_point(const Vector2& p_pos) const { + + int x = int(Math::floor(p_pos.x/cell_size)); + int y = int(Math::floor(p_pos.y/cell_size)); + + Point p; + p.key=0; + p.x=x; + p.y=y; + return p; + + } + + _FORCE_INLINE_ Vector2 _get_vertex(const Point& p_point) const { + + return Vector2(p_point.x,p_point.y)*cell_size; + } + + + + void _navpoly_link(int p_id); + void _navpoly_unlink(int p_id); + + float cell_size; + Map navpoly_map; + int last_id; +#if 0 + void _clip_path(Vector& path,Polygon *from_poly, const Vector2& p_to_point, Polygon* p_to_poly); +#endif +protected: + + static void _bind_methods(); + +public: + + //API should be as dynamic as possible + int navpoly_create(const Ref& p_mesh,const Matrix32& p_xform,Object* p_owner=NULL); + void navpoly_set_transform(int p_id, const Matrix32& p_xform); + void navpoly_remove(int p_id); + + Vector get_simple_path(const Vector2& p_start, const Vector2& p_end,bool p_optimize=true); + Vector2 get_closest_point(const Vector2& p_point); + + Navigation2D(); +}; + + +#endif // Navigation2D2D_H diff --git a/scene/2d/navigation_polygon.cpp b/scene/2d/navigation_polygon.cpp new file mode 100644 index 0000000000..570a5b95b0 --- /dev/null +++ b/scene/2d/navigation_polygon.cpp @@ -0,0 +1,450 @@ +#include "navigation_polygon.h" +#include "navigation2d.h" +#include "triangulator.h" +#include "core_string_names.h" + +void NavigationPolygon::set_vertices(const DVector& p_vertices) { + + vertices=p_vertices; +} + +DVector NavigationPolygon::get_vertices() const{ + + return vertices; +} + + +void NavigationPolygon::_set_polygons(const Array& p_array) { + + polygons.resize(p_array.size()); + for(int i=0;i& p_polygon){ + + Polygon polygon; + polygon.indices=p_polygon; + polygons.push_back(polygon); + +} + +void NavigationPolygon::add_outline_at_index(const DVector& p_outline,int p_index) { + + outlines.insert(p_index,p_outline); +} + +int NavigationPolygon::get_polygon_count() const{ + + return polygons.size(); +} +Vector NavigationPolygon::get_polygon(int p_idx){ + + ERR_FAIL_INDEX_V(p_idx,polygons.size(),Vector()); + return polygons[p_idx].indices; +} +void NavigationPolygon::clear_polygons(){ + + polygons.clear(); +} + +void NavigationPolygon::add_outline(const DVector& p_outline) { + + outlines.push_back(p_outline); +} + +int NavigationPolygon::get_outline_count() const{ + + return outlines.size(); +} + +void NavigationPolygon::set_outline(int p_idx,const DVector& p_outline) { + ERR_FAIL_INDEX(p_idx,outlines.size()); + outlines[p_idx]=p_outline; +} + +void NavigationPolygon::remove_outline(int p_idx) { + + ERR_FAIL_INDEX(p_idx,outlines.size()); + outlines.remove(p_idx); + +} + +DVector NavigationPolygon::get_outline(int p_idx) const { + ERR_FAIL_INDEX_V(p_idx,outlines.size(),DVector()); + return outlines[p_idx]; +} + +void NavigationPolygon::clear_outlines(){ + + outlines.clear();; +} +void NavigationPolygon::make_polygons_from_outlines(){ + + std::list in_poly,out_poly; + + Vector2 outside_point(-1e10,-1e10); + + for(int i=0;i ol = outlines[i]; + int olsize = ol.size(); + if (olsize<3) + continue; + DVector::Read r=ol.read(); + for(int j=0;j ol = outlines[i]; + int olsize = ol.size(); + if (olsize<3) + continue; + DVector::Read r=ol.read(); + + int interscount=0; + //test if this is an outer outline + for(int k=0;k ol2 = outlines[k]; + int olsize2 = ol2.size(); + if (olsize2<3) + continue; + DVector::Read r2=ol2.read(); + + for(int l=0;l points; + for(std::list::iterator I = out_poly.begin();I!=out_poly.end();I++) { + + TriangulatorPoly& tp = *I; + + struct Polygon p; + + for(int i=0;i::Element *E=points.find(tp[i]); + if (!E) { + E=points.insert(tp[i],vertices.size()); + vertices.push_back(tp[i]); + } + p.indices.push_back(E->get()); + } + + polygons.push_back(p); + } + + emit_signal(CoreStringNames::get_singleton()->changed); +} + + +void NavigationPolygon::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("set_vertices","vertices"),&NavigationPolygon::set_vertices); + ObjectTypeDB::bind_method(_MD("get_vertices"),&NavigationPolygon::get_vertices); + + ObjectTypeDB::bind_method(_MD("add_polygon","polygon"),&NavigationPolygon::add_polygon); + ObjectTypeDB::bind_method(_MD("get_polygon_count"),&NavigationPolygon::get_polygon_count); + ObjectTypeDB::bind_method(_MD("get_polygon","idx"),&NavigationPolygon::get_polygon); + ObjectTypeDB::bind_method(_MD("clear_polygons"),&NavigationPolygon::clear_polygons); + + ObjectTypeDB::bind_method(_MD("add_outline","outline"),&NavigationPolygon::add_outline); + ObjectTypeDB::bind_method(_MD("add_outline_at_index","outline","index"),&NavigationPolygon::add_outline_at_index); + ObjectTypeDB::bind_method(_MD("get_outline_count"),&NavigationPolygon::get_outline_count); + ObjectTypeDB::bind_method(_MD("set_outline","idx","outline"),&NavigationPolygon::set_outline); + ObjectTypeDB::bind_method(_MD("get_outline","idx"),&NavigationPolygon::get_outline); + ObjectTypeDB::bind_method(_MD("remove_outline","idx"),&NavigationPolygon::remove_outline); + ObjectTypeDB::bind_method(_MD("clear_outlines"),&NavigationPolygon::clear_outlines); + ObjectTypeDB::bind_method(_MD("make_polygons_from_outlines"),&NavigationPolygon::make_polygons_from_outlines); + + ObjectTypeDB::bind_method(_MD("_set_polygons","polygons"),&NavigationPolygon::_set_polygons); + ObjectTypeDB::bind_method(_MD("_get_polygons"),&NavigationPolygon::_get_polygons); + + ObjectTypeDB::bind_method(_MD("_set_outlines","outlines"),&NavigationPolygon::_set_outlines); + ObjectTypeDB::bind_method(_MD("_get_outlines"),&NavigationPolygon::_get_outlines); + + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3_ARRAY,"vertices",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("set_vertices"),_SCS("get_vertices")); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY,"polygons",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("_set_polygons"),_SCS("_get_polygons")); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY,"outlines",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("_set_outlines"),_SCS("_get_outlines")); +} + +NavigationPolygon::NavigationPolygon() { + + +} + +void NavigationPolygonInstance::set_enabled(bool p_enabled) { + + if (enabled==p_enabled) + return; + enabled=p_enabled; + + if (!is_inside_tree()) + return; + + if (!enabled) { + + if (nav_id!=-1) { + navigation->navpoly_remove(nav_id); + nav_id=-1; + } + } else { + + if (navigation) { + + if (navpoly.is_valid()) { + + nav_id = navigation->navpoly_create(navpoly,get_relative_transform(navigation),this); + } + } + + } + + if (get_tree()->is_editor_hint()) + update(); + +// update_gizmo(); +} + +bool NavigationPolygonInstance::is_enabled() const { + + + return enabled; +} + + +///////////////////////////// + + +void NavigationPolygonInstance::_notification(int p_what) { + + + switch(p_what) { + case NOTIFICATION_ENTER_TREE: { + + Node2D *c=this; + while(c) { + + navigation=c->cast_to(); + if (navigation) { + + if (enabled && navpoly.is_valid()) { + + nav_id = navigation->navpoly_create(navpoly,get_relative_transform(navigation),this); + } + break; + } + + c=c->get_parent()->cast_to(); + } + + } break; + case NOTIFICATION_TRANSFORM_CHANGED: { + + if (navigation && nav_id!=-1) { + navigation->navpoly_set_transform(nav_id,get_relative_transform(navigation)); + } + + } break; + case NOTIFICATION_EXIT_TREE: { + + if (navigation) { + + if (nav_id!=-1) { + navigation->navpoly_remove(nav_id); + nav_id=-1; + } + } + navigation=NULL; + } break; + case NOTIFICATION_DRAW: { + + if (is_inside_tree() && get_tree()->is_editor_hint() && navpoly.is_valid()) { + + DVector verts=navpoly->get_vertices(); + int vsize = verts.size(); + if (vsize<3) + return; + + + Color color; + if (enabled) { + color=Color(0.1,0.8,1.0,0.4); + } else { + color=Color(1.0,0.8,0.1,0.4); + } + Vector colors; + Vector vertices; + vertices.resize(vsize); + colors.resize(vsize); + { + DVector::Read vr = verts.read(); + for(int i=0;i indices; + + + for(int i=0;iget_polygon_count();i++) { + Vector polygon = navpoly->get_polygon(i); + + for(int j=2;jcanvas_item_add_triangle_array(get_canvas_item(),indices,vertices,colors); + + } + } break; + + } +} + + +void NavigationPolygonInstance::set_navigation_polygon(const Ref& p_navpoly) { + + if (p_navpoly==navpoly) + return; + + if (navigation && nav_id!=-1) { + navigation->navpoly_remove(nav_id); + nav_id=-1; + } + if (navpoly.is_valid()) { + navpoly->disconnect(CoreStringNames::get_singleton()->changed,this,"_navpoly_changed"); + } + navpoly=p_navpoly; + + if (navpoly.is_valid()) { + navpoly->connect(CoreStringNames::get_singleton()->changed,this,"_navpoly_changed"); + } + + if (navigation && navpoly.is_valid() && enabled) { + nav_id = navigation->navpoly_create(navpoly,get_relative_transform(navigation),this); + } + //update_gizmo(); + _change_notify("navpoly"); + +} + +Ref NavigationPolygonInstance::get_navigation_polygon() const{ + + return navpoly; +} + +void NavigationPolygonInstance::_navpoly_changed() { + + if (is_inside_tree() && get_tree()->is_editor_hint()) + update(); +} + +void NavigationPolygonInstance::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("set_navigation_polygon","navpoly"),&NavigationPolygonInstance::set_navigation_polygon); + ObjectTypeDB::bind_method(_MD("get_navigation_polygon"),&NavigationPolygonInstance::get_navigation_polygon); + + ObjectTypeDB::bind_method(_MD("set_enabled","enabled"),&NavigationPolygonInstance::set_enabled); + ObjectTypeDB::bind_method(_MD("is_enabled"),&NavigationPolygonInstance::is_enabled); + + ObjectTypeDB::bind_method(_MD("_navpoly_changed"),&NavigationPolygonInstance::_navpoly_changed); + + ADD_PROPERTY( PropertyInfo(Variant::OBJECT,"navpoly",PROPERTY_HINT_RESOURCE_TYPE,"NavigationPolygon"),_SCS("set_navigation_polygon"),_SCS("get_navigation_polygon")); + ADD_PROPERTY( PropertyInfo(Variant::BOOL,"enabled"),_SCS("set_enabled"),_SCS("is_enabled")); +} + +NavigationPolygonInstance::NavigationPolygonInstance() { + + navigation=NULL; + nav_id=-1; + enabled=true; + +} diff --git a/scene/2d/navigation_polygon.h b/scene/2d/navigation_polygon.h new file mode 100644 index 0000000000..01307a170b --- /dev/null +++ b/scene/2d/navigation_polygon.h @@ -0,0 +1,84 @@ +#ifndef NAVIGATION_POLYGON_H +#define NAVIGATION_POLYGON_H + +#include "scene/2d/node_2d.h" + + +class NavigationPolygon : public Resource { + + OBJ_TYPE( NavigationPolygon, Resource ); + + DVector vertices; + struct Polygon { + Vector indices; + }; + Vector polygons; + Vector< DVector > outlines; + +protected: + + static void _bind_methods(); + + void _set_polygons(const Array& p_array); + Array _get_polygons() const; + + void _set_outlines(const Array& p_array); + Array _get_outlines() const; + +public: + + + + void set_vertices(const DVector& p_vertices); + DVector get_vertices() const; + + void add_polygon(const Vector& p_polygon); + int get_polygon_count() const; + + void add_outline(const DVector& p_outline); + void add_outline_at_index(const DVector& p_outline,int p_index); + void set_outline(int p_idx,const DVector& p_outline); + DVector get_outline(int p_idx) const; + void remove_outline(int p_idx); + int get_outline_count() const; + + void clear_outlines(); + void make_polygons_from_outlines(); + + Vector get_polygon(int p_idx); + void clear_polygons(); + + NavigationPolygon(); +}; + + +class Navigation2D; + +class NavigationPolygonInstance : public Node2D { + + OBJ_TYPE(NavigationPolygonInstance,Node2D); + + bool enabled; + int nav_id; + Navigation2D *navigation; + Ref navpoly; + + void _navpoly_changed(); + +protected: + + void _notification(int p_what); + static void _bind_methods(); +public: + + void set_enabled(bool p_enabled); + bool is_enabled() const; + + void set_navigation_polygon(const Ref& p_navpoly); + Ref get_navigation_polygon() const; + + NavigationPolygonInstance(); +}; + + +#endif // NAVIGATIONPOLYGON_H diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp index 8b4196ee7f..36b6b220b3 100644 --- a/scene/2d/node_2d.cpp +++ b/scene/2d/node_2d.cpp @@ -317,6 +317,18 @@ int Node2D::get_z() const{ return z; } +Matrix32 Node2D::get_relative_transform(const Node *p_parent) const { + + if (p_parent==this) + return Matrix32(); + + Node2D *parent_2d = get_parent()->cast_to(); + ERR_FAIL_COND_V(!parent_2d,Matrix32()); + if (p_parent==parent_2d) + return get_transform(); + else + return parent_2d->get_relative_transform(p_parent) * get_transform(); +} void Node2D::_bind_methods() { @@ -351,6 +363,8 @@ void Node2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("edit_set_pivot"),&Node2D::edit_set_pivot); + ObjectTypeDB::bind_method(_MD("get_relative_transform"),&Node2D::get_relative_transform); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"transform/pos"),_SCS("set_pos"),_SCS("get_pos")); ADD_PROPERTY(PropertyInfo(Variant::REAL,"transform/rot",PROPERTY_HINT_RANGE,"-1440,1440,0.1"),_SCS("_set_rotd"),_SCS("_get_rotd")); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"transform/scale"),_SCS("set_scale"),_SCS("get_scale")); diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h index 61b8c829d6..7b059008c2 100644 --- a/scene/2d/node_2d.h +++ b/scene/2d/node_2d.h @@ -93,6 +93,9 @@ public: void set_z_as_relative(bool p_enabled); bool is_z_relative() const; + Matrix32 get_relative_transform(const Node *p_parent) const; + + Matrix32 get_transform() const; Node2D(); diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp index a82cfc7ea6..30e0241f23 100644 --- a/scene/gui/dialogs.cpp +++ b/scene/gui/dialogs.cpp @@ -328,8 +328,8 @@ AcceptDialog::AcceptDialog() { label->set_anchor(MARGIN_RIGHT,ANCHOR_END); label->set_anchor(MARGIN_BOTTOM,ANCHOR_END); label->set_begin( Point2( margin, margin) ); - label->set_end( Point2( margin, button_margin) ); - label->set_autowrap(true); + label->set_end( Point2( margin, button_margin+10) ); + //label->set_autowrap(true); add_child(label); hbc = memnew( HBoxContainer ); diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp index bccd05d4fe..d58cb3da79 100644 --- a/scene/gui/popup.cpp +++ b/scene/gui/popup.cpp @@ -94,6 +94,8 @@ void Popup::popup_centered_minsize(const Size2& p_minsize) { Control *c=get_child(i)->cast_to(); if (!c) continue; + if (c->is_hidden()) + continue; Size2 minsize = c->get_combined_minimum_size(); @@ -114,6 +116,8 @@ void Popup::popup_centered_minsize(const Size2& p_minsize) { } + print_line(String(c->get_type())+": "+minsize); + total_minsize.width = MAX( total_minsize.width, minsize.width ); total_minsize.height = MAX( total_minsize.height, minsize.height ); } diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 9d907391ec..9600469e8a 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -102,6 +102,7 @@ #include "scene/2d/screen_button.h" #include "scene/2d/remote_transform_2d.h" #include "scene/2d/y_sort.h" +#include "scene/2d/navigation2d.h" #include "scene/2d/position_2d.h" #include "scene/2d/tile_map.h" @@ -575,6 +576,10 @@ void register_scene_types() { ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); + ObjectTypeDB::register_type(); + ObjectTypeDB::register_type(); + ObjectTypeDB::register_type(); + OS::get_singleton()->yield(); //may take time to init ObjectTypeDB::register_type(); diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp index 58c1cac12c..cc1a05f7d3 100644 --- a/tools/editor/editor_node.cpp +++ b/tools/editor/editor_node.cpp @@ -89,6 +89,7 @@ #include "plugins/animation_player_editor_plugin.h" #include "plugins/baked_light_editor_plugin.h" #include "plugins/polygon_2d_editor_plugin.h" +#include "plugins/navigation_polygon_editor_plugin.h" // end #include "tools/editor/io_plugins/editor_texture_import_plugin.h" #include "tools/editor/io_plugins/editor_scene_import_plugin.h" @@ -3260,6 +3261,11 @@ Error EditorNode::export_platform(const String& p_platform, const String& p_path return OK; } +void EditorNode::show_warning(const String& p_text) { + + warning->set_text(p_text); + warning->popup_centered_minsize(); +} EditorNode::EditorNode() { @@ -3970,6 +3976,8 @@ EditorNode::EditorNode() { logo->set_pos(Point2(20,20)); logo->set_texture(gui_base->get_icon("Logo","EditorIcons") ); + warning = memnew( AcceptDialog ); + add_child(warning); @@ -4107,6 +4115,7 @@ EditorNode::EditorNode() { add_editor_plugin( memnew( PathEditorPlugin(this) ) ); add_editor_plugin( memnew( BakedLightEditorPlugin(this) ) ); add_editor_plugin( memnew( Polygon2DEditorPlugin(this) ) ); + add_editor_plugin( memnew( NavigationPolygonEditorPlugin(this) ) ); for(int i=0;i get_editor_theme() const { return theme; } + void show_warning(const String& p_text); + + Error export_platform(const String& p_platform, const String& p_path, bool p_debug,const String& p_password,bool p_quit_after=false); static void register_editor_types(); diff --git a/tools/editor/icons/icon_navigation_2d.png b/tools/editor/icons/icon_navigation_2d.png new file mode 100644 index 0000000000000000000000000000000000000000..8170ecf68c4bdb21d25e780c2191beec6b2f4b30 GIT binary patch literal 541 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>l9!3+eRrV)08*w4i&6F zTm1EF>FnVAz4hlR=Y5`2eDBuUneo>)Dn}fXF8O77#rwCE)YR`M8$?9+SBWlYleLIq ztZ4f^^+Bz~yVx%iq$LhT);LQmXCw*48??{gA#g!FwZVQzuc}XiwAhBG{u`az72=bo zU*)N~cC4)CfQeh7c=Shc_JW-<0jwF1O!Xcb9NWnLzEE&}ft>njhQ}77zP>fb6=jb5 z=5T#x%W>4cD|s-daeYOrBu|22(}FfM-g$e}rtG0x zS`y#t9c_6NIe*JG{0ynqEq(DI&}h~%Lz$lUv+RVwDWB1;>3eqY%n6BkZbizmKkYk9 z-}ukEUa0iExI*SY;2h3_5&O-yeKatg7&h1MW0`7W-VOi& literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_navigation_polygon_instance.png b/tools/editor/icons/icon_navigation_polygon_instance.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9c318906004aa41977731d1dc76973530b7981 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7BevLUI$@DCym(^3=9nHC7!;n?Dv^?c{DXw{3v8$U|a(HQi|LG-tve)39X^A>Xv z!^ue-WFMH#+t9&3#jxi)L;doo6^|IcM;uVxW*~4hsxZ$q;*aJAL38^BO&2rXb4)HY zUbCQW&F%v^KUN;`ndP{@?N@!Mhwr`%-95GM9S!%{{GRKW#eZr?&kwQZu|KtY9_SoR zP*VBLwf42e+Y5iCK4&E89$g^0uPOabqV1!N8LJz2?vb3r^rz!|$9IEyOyyz~oc6M_ sZ)EOfw0g(pEOy?qJ2msG)?@yrk7h{=UZ}S*FfcH9y85}Sb4q9e0N&22JOBUy literal 0 HcmV?d00001 diff --git a/tools/editor/plugins/navigation_polygon_editor_plugin.cpp b/tools/editor/plugins/navigation_polygon_editor_plugin.cpp new file mode 100644 index 0000000000..599d18c8bb --- /dev/null +++ b/tools/editor/plugins/navigation_polygon_editor_plugin.cpp @@ -0,0 +1,547 @@ +#include "navigation_polygon_editor_plugin.h" + +#include "canvas_item_editor_plugin.h" +#include "os/file_access.h" +#include "tools/editor/editor_settings.h" + +void NavigationPolygonEditor::_notification(int p_what) { + + switch(p_what) { + + case NOTIFICATION_READY: { + + button_create->set_icon( get_icon("Edit","EditorIcons")); + button_edit->set_icon( get_icon("MovePoint","EditorIcons")); + button_edit->set_pressed(true); + get_tree()->connect("node_removed",this,"_node_removed"); + create_nav->connect("confirmed",this,"_create_nav"); + + } break; + case NOTIFICATION_FIXED_PROCESS: { + + + } break; + } + +} +void NavigationPolygonEditor::_node_removed(Node *p_node) { + + if(p_node==node) { + node=NULL; + hide(); + canvas_item_editor->get_viewport_control()->update(); + } + +} + +void NavigationPolygonEditor::_create_nav() { + + undo_redo->create_action("Create Navigation Polygon"); + undo_redo->add_do_method(node,"set_navigation_polygon",Ref(memnew( NavigationPolygon))); + undo_redo->add_undo_method(node,"set_navigation_polygon",Variant(REF())); + undo_redo->commit_action(); +} + +Vector2 NavigationPolygonEditor::snap_point(const Vector2& p_point) const { + + if (canvas_item_editor->is_snap_active()) { + + return p_point.snapped(Vector2(1,1)*canvas_item_editor->get_snap()); + + } else { + return p_point; + } +} + +void NavigationPolygonEditor::_menu_option(int p_option) { + + switch(p_option) { + + case MODE_CREATE: { + + mode=MODE_CREATE; + button_create->set_pressed(true); + button_edit->set_pressed(false); + } break; + case MODE_EDIT: { + + mode=MODE_EDIT; + button_create->set_pressed(false); + button_edit->set_pressed(true); + } break; + + } +} + +void NavigationPolygonEditor::_wip_close() { + + + if (wip.size()>=3) { + + undo_redo->create_action("Create Poly"); + undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"remove_outline",node->get_navigation_polygon()->get_outline_count()); + undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"add_outline",wip); + undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines"); + undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines"); + undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update"); + undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update"); + undo_redo->commit_action(); + mode=MODE_EDIT; + button_edit->set_pressed(true); + button_create->set_pressed(false); + } + + wip.clear(); + wip_active=false; + edited_point=-1; +} + +bool NavigationPolygonEditor::forward_input_event(const InputEvent& p_event) { + + + if (!node) + return false; + + if (node->get_navigation_polygon().is_null()) { + if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1 && p_event.mouse_button.pressed) { + create_nav->set_text("No NavigationPolygon resource on this node.\nCreate and assign one?"); + create_nav->popup_centered_minsize(); + } + return false; + } + + + switch(p_event.type) { + + case InputEvent::MOUSE_BUTTON: { + + const InputEventMouseButton &mb=p_event.mouse_button; + + Matrix32 xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); + + + Vector2 gpoint = Point2(mb.x,mb.y); + Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint); + cpoint=snap_point(cpoint); + cpoint = node->get_global_transform().affine_inverse().xform(cpoint); + + + + //first check if a point is to be added (segment split) + real_t grab_treshold=EDITOR_DEF("poly_editor/point_grab_radius",8); + + switch(mode) { + + + case MODE_CREATE: { + + if (mb.button_index==BUTTON_LEFT && mb.pressed) { + + + if (!wip_active) { + + wip.clear(); + wip.push_back( cpoint ); + wip_active=true; + edited_point_pos=cpoint; + edited_outline=-1; + canvas_item_editor->get_viewport_control()->update(); + edited_point=1; + return true; + } else { + + + if (wip.size()>1 && xform.xform(wip[0]).distance_to(gpoint)get_viewport_control()->update(); + return true; + + //add wip point + } + } + } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && wip_active) { + _wip_close(); + } + + + + } break; + + case MODE_EDIT: { + + if (mb.button_index==BUTTON_LEFT) { + if (mb.pressed) { + + if (mb.mod.control) { + + + //search edges + int closest_outline=-1; + int closest_idx=-1; + Vector2 closest_pos; + real_t closest_dist=1e10; + + for(int j=0;jget_navigation_polygon()->get_outline_count();j++) { + + + DVector points=node->get_navigation_polygon()->get_outline(j); + + int pc=points.size(); + DVector::Read poly=points.read(); + + for(int i=0;i=0) { + + pre_move_edit=node->get_navigation_polygon()->get_outline(closest_outline); + DVector poly = pre_move_edit; + poly.insert(closest_idx+1,xform.affine_inverse().xform(closest_pos)); + edited_point=closest_idx+1; + edited_outline=closest_outline; + edited_point_pos=xform.affine_inverse().xform(closest_pos); + node->get_navigation_polygon()->set_outline(closest_outline,poly); + canvas_item_editor->get_viewport_control()->update(); + return true; + } + } else { + + //look for points to move + int closest_outline=-1; + int closest_idx=-1; + Vector2 closest_pos; + real_t closest_dist=1e10; + + for(int j=0;jget_navigation_polygon()->get_outline_count();j++) { + + + DVector points=node->get_navigation_polygon()->get_outline(j); + + int pc=points.size(); + DVector::Read poly=points.read(); + + for(int i=0;i=0) { + + pre_move_edit=node->get_navigation_polygon()->get_outline(closest_outline); + edited_point=closest_idx; + edited_outline=closest_outline; + edited_point_pos=xform.affine_inverse().xform(closest_pos); + canvas_item_editor->get_viewport_control()->update(); + return true; + } + } + } else { + + if (edited_point!=-1) { + + //apply + + DVector poly = node->get_navigation_polygon()->get_outline(edited_outline); + ERR_FAIL_INDEX_V(edited_point,poly.size(),false); + poly.set(edited_point,edited_point_pos); + undo_redo->create_action("Edit Poly"); + undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"set_outline",edited_outline,poly); + undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"set_outline",edited_outline,pre_move_edit); + undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines"); + undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines"); + undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update"); + undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update"); + undo_redo->commit_action(); + + edited_point=-1; + return true; + } + } + } if (mb.button_index==BUTTON_RIGHT && mb.pressed && edited_point==-1) { + + int closest_outline=-1; + int closest_idx=-1; + Vector2 closest_pos; + real_t closest_dist=1e10; + + for(int j=0;jget_navigation_polygon()->get_outline_count();j++) { + + + DVector points=node->get_navigation_polygon()->get_outline(j); + + int pc=points.size(); + DVector::Read poly=points.read(); + + for(int i=0;i=0) { + + + DVector poly = node->get_navigation_polygon()->get_outline(closest_outline); + + if (poly.size()>3) { + undo_redo->create_action("Edit Poly (Remove Point)"); + undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"set_outline",closest_outline,poly); + poly.remove(closest_idx); + undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"set_outline",closest_outline,poly); + undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines"); + undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines"); + undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update"); + undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update"); + undo_redo->commit_action(); + } else { + + undo_redo->create_action("Remove Poly And Point"); + undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"add_outline_at_index",poly,closest_outline); + poly.remove(closest_idx); + undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"remove_outline",closest_outline); + undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines"); + undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines"); + undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update"); + undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update"); + undo_redo->commit_action(); + + } + return true; + } + } + + + + } break; + } + + + + } break; + case InputEvent::MOUSE_MOTION: { + + const InputEventMouseMotion &mm=p_event.mouse_motion; + + if (edited_point!=-1 && (wip_active || mm.button_mask&BUTTON_MASK_LEFT)) { + + Vector2 gpoint = Point2(mm.x,mm.y); + Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint); + cpoint=snap_point(cpoint); + edited_point_pos = node->get_global_transform().affine_inverse().xform(cpoint); + + canvas_item_editor->get_viewport_control()->update(); + + } + + } break; + } + + return false; +} +void NavigationPolygonEditor::_canvas_draw() { + + if (!node) + return; + + Control *vpc = canvas_item_editor->get_viewport_control(); + if (node->get_navigation_polygon().is_null()) + return; + + Matrix32 xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); + Ref handle= get_icon("EditorHandle","EditorIcons"); + + + + for(int j=-1;jget_navigation_polygon()->get_outline_count();j++) { + Vector poly; + + if (wip_active && j==edited_outline) { + poly=wip; + } else { + if (j==-1) + continue; + poly = Variant(node->get_navigation_polygon()->get_outline(j)); + } + + int len = poly.size(); + + for(int i=0;idraw_line(point,next_point,col,2); + vpc->draw_texture(handle,point-handle->get_size()*0.5); + } + } +} + + + +void NavigationPolygonEditor::edit(Node *p_collision_polygon) { + + if (!canvas_item_editor) { + canvas_item_editor=CanvasItemEditor::get_singleton(); + } + + if (p_collision_polygon) { + + node=p_collision_polygon->cast_to(); + if (!canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw")) + canvas_item_editor->get_viewport_control()->connect("draw",this,"_canvas_draw"); + wip.clear(); + wip_active=false; + edited_point=-1; + + } else { + node=NULL; + + if (canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw")) + canvas_item_editor->get_viewport_control()->disconnect("draw",this,"_canvas_draw"); + + } + +} + +void NavigationPolygonEditor::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("_menu_option"),&NavigationPolygonEditor::_menu_option); + ObjectTypeDB::bind_method(_MD("_canvas_draw"),&NavigationPolygonEditor::_canvas_draw); + ObjectTypeDB::bind_method(_MD("_node_removed"),&NavigationPolygonEditor::_node_removed); + ObjectTypeDB::bind_method(_MD("_create_nav"),&NavigationPolygonEditor::_create_nav); + +} + +NavigationPolygonEditor::NavigationPolygonEditor(EditorNode *p_editor) { + + canvas_item_editor=NULL; + editor=p_editor; + undo_redo = editor->get_undo_redo(); + + add_child( memnew( VSeparator )); + button_create = memnew( ToolButton ); + add_child(button_create); + button_create->connect("pressed",this,"_menu_option",varray(MODE_CREATE)); + button_create->set_toggle_mode(true); + button_create->set_tooltip("Create a new polygon from scratch"); + + button_edit = memnew( ToolButton ); + add_child(button_edit); + button_edit->connect("pressed",this,"_menu_option",varray(MODE_EDIT)); + button_edit->set_toggle_mode(true); + button_edit->set_tooltip("Edit existing polygon:\nLMB: Move Point.\nCtrl+LMB: Split Segment.\nRMB: Erase Point."); + create_nav = memnew( ConfirmationDialog ); + add_child(create_nav); + create_nav->get_ok()->set_text("Create"); + + + //add_constant_override("separation",0); + +#if 0 + options = memnew( MenuButton ); + add_child(options); + options->set_area_as_parent_rect(); + options->set_text("Polygon"); + //options->get_popup()->add_item("Parse BBCODE",PARSE_BBCODE); + options->get_popup()->connect("item_pressed", this,"_menu_option"); +#endif + + mode = MODE_EDIT; + wip_active=false; + edited_outline=-1; + +} + + +void NavigationPolygonEditorPlugin::edit(Object *p_object) { + + collision_polygon_editor->edit(p_object->cast_to()); +} + +bool NavigationPolygonEditorPlugin::handles(Object *p_object) const { + + return p_object->is_type("NavigationPolygonInstance"); +} + +void NavigationPolygonEditorPlugin::make_visible(bool p_visible) { + + if (p_visible) { + collision_polygon_editor->show(); + } else { + + collision_polygon_editor->hide(); + collision_polygon_editor->edit(NULL); + } + +} + +NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin(EditorNode *p_node) { + + editor=p_node; + collision_polygon_editor = memnew( NavigationPolygonEditor(p_node) ); + CanvasItemEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor); + + collision_polygon_editor->hide(); + + + +} + + +NavigationPolygonEditorPlugin::~NavigationPolygonEditorPlugin() +{ +} + diff --git a/tools/editor/plugins/navigation_polygon_editor_plugin.h b/tools/editor/plugins/navigation_polygon_editor_plugin.h new file mode 100644 index 0000000000..a86d28c8a8 --- /dev/null +++ b/tools/editor/plugins/navigation_polygon_editor_plugin.h @@ -0,0 +1,91 @@ +#ifndef NAVIGATIONPOLYGONEDITORPLUGIN_H +#define NAVIGATIONPOLYGONEDITORPLUGIN_H + + + +#include "tools/editor/editor_plugin.h" +#include "tools/editor/editor_node.h" +#include "scene/2d/navigation_polygon.h" +#include "scene/gui/tool_button.h" +#include "scene/gui/button_group.h" + +/** + @author Juan Linietsky +*/ +class CanvasItemEditor; + +class NavigationPolygonEditor : public HBoxContainer { + + OBJ_TYPE(NavigationPolygonEditor, HBoxContainer ); + + UndoRedo *undo_redo; + enum Mode { + + MODE_CREATE, + MODE_EDIT, + + }; + + Mode mode; + + ToolButton *button_create; + ToolButton *button_edit; + + ConfirmationDialog *create_nav; + + CanvasItemEditor *canvas_item_editor; + EditorNode *editor; + Panel *panel; + NavigationPolygonInstance *node; + MenuButton *options; + + int edited_outline; + int edited_point; + Vector2 edited_point_pos; + DVector pre_move_edit; + Vector wip; + bool wip_active; + + + void _wip_close(); + void _canvas_draw(); + void _create_nav(); + + void _menu_option(int p_option); + +protected: + void _notification(int p_what); + void _node_removed(Node *p_node); + static void _bind_methods(); +public: + + Vector2 snap_point(const Vector2& p_point) const; + bool forward_input_event(const InputEvent& p_event); + void edit(Node *p_collision_polygon); + NavigationPolygonEditor(EditorNode *p_editor); +}; + +class NavigationPolygonEditorPlugin : public EditorPlugin { + + OBJ_TYPE( NavigationPolygonEditorPlugin, EditorPlugin ); + + NavigationPolygonEditor *collision_polygon_editor; + EditorNode *editor; + +public: + + virtual bool forward_input_event(const InputEvent& p_event) { return collision_polygon_editor->forward_input_event(p_event); } + + virtual String get_name() const { return "NavigationPolygonInstance"; } + bool has_main_screen() const { return false; } + virtual void edit(Object *p_node); + virtual bool handles(Object *p_node) const; + virtual void make_visible(bool p_visible); + + NavigationPolygonEditorPlugin(EditorNode *p_node); + ~NavigationPolygonEditorPlugin(); + +}; + + +#endif // NAVIGATIONPOLYGONEDITORPLUGIN_H From a49802ae332e34542c0f835cce74fb3d5e49675a Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sat, 14 Feb 2015 14:54:58 -0300 Subject: [PATCH 5/7] -resolved shader set parameter bug, closes #1361 --- drivers/gles2/rasterizer_gles2.cpp | 114 ++++++++++++++++------------- 1 file changed, 62 insertions(+), 52 deletions(-) diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index c1631a527e..d1e55f2488 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -8330,7 +8330,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) { CanvasItem *current_clip=NULL; - + Shader *shader_cache=NULL; canvas_opacity=1.0; while(p_item_list) { @@ -8375,6 +8375,8 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) { } } + shader_cache=shader; + if (shader) { canvas_shader.set_custom_shader(shader->custom_code_id); if (canvas_shader.bind()) @@ -8384,50 +8386,6 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) { //todo optimize uniforms shader_owner->shader_version=shader->version; } - //this can be optimized.. - int tex_id=1; - int idx=0; - for(Map::Element *E=shader->uniforms.front();E;E=E->next()) { - - Map::Element *F=shader_owner->shader_param.find(E->key()); - - if ((E->get().type==ShaderLanguage::TYPE_TEXTURE || E->get().type==ShaderLanguage::TYPE_CUBEMAP)) { - - RID rid; - if (F) { - rid=F->get(); - } - - if (!rid.is_valid()) { - - Map::Element *DT=shader->default_textures.find(E->key()); - if (DT) { - rid=DT->get(); - } - } - - if (rid.is_valid()) { - - int loc = canvas_shader.get_custom_uniform_location(idx); //should be automatic.. - - glActiveTexture(GL_TEXTURE0+tex_id); - Texture *t=texture_owner.get(rid); - if (!t) - glBindTexture(GL_TEXTURE_2D,white_tex); - else - glBindTexture(t->target,t->tex_id); - - glUniform1i(loc,tex_id); - tex_id++; - } - } else { - Variant &v=F?F->get():E->get().default_value; - canvas_shader.set_custom_uniform(idx,v); - } - - idx++; - } - if (shader->has_texscreen && framebuffer.active) { @@ -8436,8 +8394,8 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) { canvas_shader.set_uniform(CanvasShaderGLES2::TEXSCREEN_SCREEN_MULT,Vector2(float(viewport.width)/framebuffer.width,float(viewport.height)/framebuffer.height)); canvas_shader.set_uniform(CanvasShaderGLES2::TEXSCREEN_SCREEN_CLAMP,Color(float(x)/framebuffer.width,float(y)/framebuffer.height,float(x+viewport.width)/framebuffer.width,float(y+viewport.height)/framebuffer.height)); - canvas_shader.set_uniform(CanvasShaderGLES2::TEXSCREEN_TEX,tex_id); - glActiveTexture(GL_TEXTURE0+tex_id); + canvas_shader.set_uniform(CanvasShaderGLES2::TEXSCREEN_TEX,max_texture_units-1); + glActiveTexture(GL_TEXTURE0+max_texture_units-1); glBindTexture(GL_TEXTURE_2D,framebuffer.sample_color); if (framebuffer.scale==1 && !canvas_texscreen_used) { #ifdef GLEW_ENABLED @@ -8449,14 +8407,12 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) { } canvas_texscreen_used=true; - } - tex_id++; + } - } - - if (tex_id>1) { glActiveTexture(GL_TEXTURE0); + } + if (shader->has_screen_uv) { canvas_shader.set_uniform(CanvasShaderGLES2::SCREEN_UV_MULT,Vector2(1.0/viewport.width,1.0/viewport.height)); } @@ -8470,6 +8426,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) { uses_texpixel_size=shader->uses_texpixel_size; } else { + shader_cache=NULL; canvas_shader.set_custom_shader(0); canvas_shader.bind(); uses_texpixel_size=false; @@ -8481,6 +8438,59 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) { canvas_last_shader=shader_owner->shader; } + if (shader_cache) { + + Shader *shader = shader_cache; + //this can be optimized.. + int tex_id=1; + int idx=0; + for(Map::Element *E=shader->uniforms.front();E;E=E->next()) { + + Map::Element *F=shader_owner->shader_param.find(E->key()); + + if ((E->get().type==ShaderLanguage::TYPE_TEXTURE || E->get().type==ShaderLanguage::TYPE_CUBEMAP)) { + + RID rid; + if (F) { + rid=F->get(); + } + + if (!rid.is_valid()) { + + Map::Element *DT=shader->default_textures.find(E->key()); + if (DT) { + rid=DT->get(); + } + } + + if (rid.is_valid()) { + + int loc = canvas_shader.get_custom_uniform_location(idx); //should be automatic.. + + glActiveTexture(GL_TEXTURE0+tex_id); + Texture *t=texture_owner.get(rid); + if (!t) + glBindTexture(GL_TEXTURE_2D,white_tex); + else + glBindTexture(t->target,t->tex_id); + + glUniform1i(loc,tex_id); + tex_id++; + } + } else { + Variant &v=F?F->get():E->get().default_value; + canvas_shader.set_custom_uniform(idx,v); + } + + idx++; + } + + if (tex_id>1) { + glActiveTexture(GL_TEXTURE0); + } + + } + canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX,ci->final_transform); canvas_shader.set_uniform(CanvasShaderGLES2::EXTRA_MATRIX,Matrix32()); From d2f86cc09bf4136ebc1c2bbb8ec7b48a439c0371 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sat, 14 Feb 2015 19:22:06 -0300 Subject: [PATCH 6/7] fixes to mouse warp -can warp now from viewport and control, in their respective coordinate systems -warp is now local to the window on Windows and OSX. IF YOU RUN OSX, PLEASE TEST THIS! And make sure it works!, new code is in OS_OSX::warp_mouse_pos. I don't have OSX so i can't test! --- platform/osx/os_osx.mm | 13 ++++++++++++- platform/windows/os_windows.cpp | 7 ++++++- platform/x11/os_x11.cpp | 6 +++++- scene/gui/control.cpp | 9 +++++++++ scene/gui/control.h | 2 +- scene/main/viewport.cpp | 9 +++++++++ scene/main/viewport.h | 2 ++ 7 files changed, 44 insertions(+), 4 deletions(-) diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 5bc47a74c1..af2552496b 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -1093,8 +1093,19 @@ void OS_OSX::warp_mouse_pos(const Point2& p_to) { mouse_y = p_to.y; } else{ //set OS position - CGPoint lMouseWarpPos = {p_to.x, p_to.y}; + /* this code has not been tested, please be a kind soul and fix it if it fails! */ + + //local point in window coords + NSPoint localPoint = { p_to.x, p_to.y }; + + NSPoint pointInWindow = [window_view convertPoint:localPoint toView:nil]; + NSPoint pointOnScreen = [[window_view window] convertRectToScreen:(CGRect){.origin=pointInWindow}]; + + //point in scren coords + CGPoint lMouseWarpPos = { pointOnScreen.x, pointOnScreen.y}; + + //do the warping CGEventSourceRef lEventRef = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); CGEventSourceSetLocalEventsSuppressionInterval(lEventRef, 0.0); CGAssociateMouseAndMouseCursorPosition(false); diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 086b4d7d12..ad54a327cf 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -1432,7 +1432,12 @@ void OS_Windows::warp_mouse_pos(const Point2& p_to) { old_y=p_to.y; } else { - SetCursorPos(p_to.x, p_to.y); + POINT p; + p.x=p_to.x; + p.y=p_to.y; + ClientToScreen(hWnd,&p); + + SetCursorPos(p.x,p.y); } } diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index a40af8d2a9..ac1818d200 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -479,8 +479,12 @@ void OS_X11::warp_mouse_pos(const Point2& p_to) { last_mouse_pos=p_to; } else { + /*XWindowAttributes xwa; + XGetWindowAttributes(x11_display, x11_window, &xwa); + printf("%d %d\n", xwa.x, xwa.y); needed? */ + XWarpPointer(x11_display, None, x11_window, - 0,0,0,0, (int)p_to.x, (int)p_to.y); + 0,0,0,0, (int)p_to.x , (int)p_to.y); } } diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index ce268843b1..4d32c7ea9a 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -2688,6 +2688,12 @@ Control *Control::get_focus_owner() const { return data.window->window->key_focus; } + +void Control::warp_mouse(const Point2& p_to_pos) { + ERR_FAIL_COND(!is_inside_tree()); + get_viewport()->warp_mouse(get_global_transform().xform(p_to_pos)); +} + void Control::_bind_methods() { ObjectTypeDB::bind_method(_MD("_window_input_event"),&Control::_window_input_event); @@ -2784,6 +2790,9 @@ void Control::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_drag_preview","control:Control"),&Control::set_drag_preview); + ObjectTypeDB::bind_method(_MD("warp_mouse","to_pos"),&Control::warp_mouse); + + BIND_VMETHOD(MethodInfo("_input_event",PropertyInfo(Variant::INPUT_EVENT,"event"))); BIND_VMETHOD(MethodInfo(Variant::VECTOR2,"get_minimum_size")); BIND_VMETHOD(MethodInfo(Variant::OBJECT,"get_drag_data",PropertyInfo(Variant::VECTOR2,"pos"))); diff --git a/scene/gui/control.h b/scene/gui/control.h index 64b5a9b661..7e14bff098 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -380,7 +380,7 @@ public: void grab_click_focus(); - + void warp_mouse(const Point2& p_to_pos); Control(); ~Control(); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index e6c787cf9e..fa163bf96d 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -29,6 +29,8 @@ #include "viewport.h" #include "os/os.h" #include "scene/3d/spatial.h" +#include "os/input.h" + //#include "scene/3d/camera.h" #include "servers/spatial_sound_server.h" @@ -1100,6 +1102,12 @@ void Viewport::_vp_unhandled_input(const InputEvent& p_ev) { } +void Viewport::warp_mouse(const Vector2& p_pos) { + + Vector2 gpos = (get_final_transform().affine_inverse() * _get_input_pre_xform()).affine_inverse().xform(p_pos); + Input::get_singleton()->warp_mouse_pos(gpos); +} + void Viewport::input(const InputEvent& p_event) { ERR_FAIL_COND(!is_inside_tree()); @@ -1289,6 +1297,7 @@ void Viewport::_bind_methods() { ObjectTypeDB::bind_method(_MD("is_audio_listener_2d","enable"), &Viewport::is_audio_listener_2d); ObjectTypeDB::bind_method(_MD("set_render_target_to_screen_rect"), &Viewport::set_render_target_to_screen_rect); + ObjectTypeDB::bind_method(_MD("warp_mouse","to_pos"), &Viewport::warp_mouse); ADD_PROPERTY( PropertyInfo(Variant::RECT2,"rect"), _SCS("set_rect"), _SCS("get_rect") ); ADD_PROPERTY( PropertyInfo(Variant::BOOL,"own_world"), _SCS("set_use_own_world"), _SCS("is_using_own_world") ); diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 4bb5735731..832a6b6107 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -246,6 +246,8 @@ public: void set_render_target_to_screen_rect(const Rect2& p_rect); Rect2 get_render_target_to_screen_rect() const; + void warp_mouse(const Vector2& p_pos); + void set_physics_object_picking(bool p_enable); bool get_physics_object_picking(); From 2185c018f6593e6d64b2beb62202d2291e2e008e Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sun, 15 Feb 2015 01:19:46 -0300 Subject: [PATCH 7/7] begin new serialization framework also got rid of STL dependency on triangulator --- core/bind/core_bind.cpp | 7 + core/bind/core_bind.h | 2 + core/math/triangulator.cpp | 325 +++++++++++----------- core/math/triangulator.h | 41 ++- core/set.h | 37 +++ core/variant.cpp | 43 +-- core/variant.h | 6 +- core/variant_construct_string.cpp | 433 ++++++++++++++++++++++++++++++ demos/2d/navpoly/navigation.scn | Bin 3471 -> 3456 bytes modules/gdscript/gd_functions.cpp | 32 ++- modules/gdscript/gd_functions.h | 2 + platform/windows/os_windows.cpp | 1 - scene/2d/navigation_polygon.cpp | 6 +- 13 files changed, 729 insertions(+), 206 deletions(-) create mode 100644 core/variant_construct_string.cpp diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index a03fd7fe4a..8d18acdc23 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -316,6 +316,11 @@ float _OS::get_time_scale() { return OS::get_singleton()->get_time_scale(); } +bool _OS::is_ok_left_and_cancel_right() const { + + return OS::get_singleton()->get_swap_ok_cancel(); +} + /* enum Weekday { DAY_SUNDAY, @@ -699,6 +704,8 @@ void _OS::_bind_methods() { ObjectTypeDB::bind_method(_MD("get_system_dir","dir"),&_OS::get_system_dir); ObjectTypeDB::bind_method(_MD("get_unique_ID"),&_OS::get_unique_ID); + ObjectTypeDB::bind_method(_MD("is_ok_left_and_cancel_right"),&_OS::is_ok_left_and_cancel_right); + ObjectTypeDB::bind_method(_MD("get_frames_per_second"),&_OS::get_frames_per_second); ObjectTypeDB::bind_method(_MD("print_all_textures_by_size"),&_OS::print_all_textures_by_size); diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index f5043ba71f..057ad90fe9 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -220,6 +220,8 @@ public: void set_time_scale(float p_scale); float get_time_scale(); + bool is_ok_left_and_cancel_right() const; + static _OS *get_singleton() { return singleton; } _OS(); diff --git a/core/math/triangulator.cpp b/core/math/triangulator.cpp index 6be1cdb330..8f82d76823 100644 --- a/core/math/triangulator.cpp +++ b/core/math/triangulator.cpp @@ -22,9 +22,9 @@ #include #include #include -#include + #include "triangulator.h" -using namespace std; + #define TRIANGULATOR_VERTEXTYPE_REGULAR 0 #define TRIANGULATOR_VERTEXTYPE_START 1 @@ -163,9 +163,9 @@ int TriangulatorPartition::Intersects(Vector2 &p11, Vector2 &p12, Vector2 &p21, } //removes holes from inpolys by merging them with non-holes -int TriangulatorPartition::RemoveHoles(list *inpolys, list *outpolys) { - list polys; - list::iterator holeiter,polyiter,iter,iter2; +int TriangulatorPartition::RemoveHoles(List *inpolys, List *outpolys) { + List polys; + List::Element *holeiter,*polyiter,*iter,*iter2; long i,i2,holepointindex,polypointindex; Vector2 holepoint,polypoint,bestpolypoint; Vector2 linep1,linep2; @@ -177,15 +177,15 @@ int TriangulatorPartition::RemoveHoles(list *inpolys, listbegin(); iter!=inpolys->end(); iter++) { - if(iter->IsHole()) { + for(iter = inpolys->front(); iter; iter=iter->next()) { + if(iter->get().IsHole()) { hasholes = true; break; } } if(!hasholes) { - for(iter = inpolys->begin(); iter!=inpolys->end(); iter++) { - outpolys->push_back(*iter); + for(iter = inpolys->front(); iter; iter=iter->next()) { + outpolys->push_back(iter->get()); } return 1; } @@ -195,8 +195,8 @@ int TriangulatorPartition::RemoveHoles(list *inpolys, listIsHole()) continue; + for(iter = polys.front(); iter; iter=iter->next()) { + if(!iter->get().IsHole()) continue; if(!hasholes) { hasholes = true; @@ -204,38 +204,38 @@ int TriangulatorPartition::RemoveHoles(list *inpolys, listGetNumPoints(); i++) { - if(iter->GetPoint(i).x > holeiter->GetPoint(holepointindex).x) { + for(i=0; i < iter->get().GetNumPoints(); i++) { + if(iter->get().GetPoint(i).x > holeiter->get().GetPoint(holepointindex).x) { holeiter = iter; holepointindex = i; } } } if(!hasholes) break; - holepoint = holeiter->GetPoint(holepointindex); + holepoint = holeiter->get().GetPoint(holepointindex); pointfound = false; - for(iter = polys.begin(); iter!=polys.end(); iter++) { - if(iter->IsHole()) continue; - for(i=0; i < iter->GetNumPoints(); i++) { - if(iter->GetPoint(i).x <= holepoint.x) continue; - if(!InCone(iter->GetPoint((i+iter->GetNumPoints()-1)%(iter->GetNumPoints())), - iter->GetPoint(i), - iter->GetPoint((i+1)%(iter->GetNumPoints())), + for(iter = polys.front(); iter; iter=iter->next()) { + if(iter->get().IsHole()) continue; + for(i=0; i < iter->get().GetNumPoints(); i++) { + if(iter->get().GetPoint(i).x <= holepoint.x) continue; + if(!InCone(iter->get().GetPoint((i+iter->get().GetNumPoints()-1)%(iter->get().GetNumPoints())), + iter->get().GetPoint(i), + iter->get().GetPoint((i+1)%(iter->get().GetNumPoints())), holepoint)) continue; - polypoint = iter->GetPoint(i); + polypoint = iter->get().GetPoint(i); if(pointfound) { v1 = Normalize(polypoint-holepoint); v2 = Normalize(bestpolypoint-holepoint); if(v2.x > v1.x) continue; } pointvisible = true; - for(iter2 = polys.begin(); iter2!=polys.end(); iter2++) { - if(iter2->IsHole()) continue; - for(i2=0; i2 < iter2->GetNumPoints(); i2++) { - linep1 = iter2->GetPoint(i2); - linep2 = iter2->GetPoint((i2+1)%(iter2->GetNumPoints())); + for(iter2 = polys.front(); iter2; iter2=iter2->next()) { + if(iter2->get().IsHole()) continue; + for(i2=0; i2 < iter2->get().GetNumPoints(); i2++) { + linep1 = iter2->get().GetPoint(i2); + linep2 = iter2->get().GetPoint((i2+1)%(iter2->get().GetNumPoints())); if(Intersects(holepoint,polypoint,linep1,linep2)) { pointvisible = false; break; @@ -254,18 +254,18 @@ int TriangulatorPartition::RemoveHoles(list *inpolys, listGetNumPoints() + polyiter->GetNumPoints() + 2); + newpoly.Init(holeiter->get().GetNumPoints() + polyiter->get().GetNumPoints() + 2); i2 = 0; for(i=0;i<=polypointindex;i++) { - newpoly[i2] = polyiter->GetPoint(i); + newpoly[i2] = polyiter->get().GetPoint(i); i2++; } - for(i=0;i<=holeiter->GetNumPoints();i++) { - newpoly[i2] = holeiter->GetPoint((i+holepointindex)%holeiter->GetNumPoints()); + for(i=0;i<=holeiter->get().GetNumPoints();i++) { + newpoly[i2] = holeiter->get().GetPoint((i+holepointindex)%holeiter->get().GetNumPoints()); i2++; } - for(i=polypointindex;iGetNumPoints();i++) { - newpoly[i2] = polyiter->GetPoint(i); + for(i=polypointindex;iget().GetNumPoints();i++) { + newpoly[i2] = polyiter->get().GetPoint(i); i2++; } @@ -274,8 +274,8 @@ int TriangulatorPartition::RemoveHoles(list *inpolys, listpush_back(*iter); + for(iter = polys.front(); iter; iter=iter->next()) { + outpolys->push_back(iter->get()); } return 1; @@ -366,7 +366,7 @@ void TriangulatorPartition::UpdateVertex(PartitionVertex *v, PartitionVertex *ve } //triangulation by ear removal -int TriangulatorPartition::Triangulate_EC(TriangulatorPoly *poly, list *triangles) { +int TriangulatorPartition::Triangulate_EC(TriangulatorPoly *poly, List *triangles) { long numvertices; PartitionVertex *vertices; PartitionVertex *ear; @@ -440,20 +440,20 @@ int TriangulatorPartition::Triangulate_EC(TriangulatorPoly *poly, list *inpolys, list *triangles) { - list outpolys; - list::iterator iter; +int TriangulatorPartition::Triangulate_EC(List *inpolys, List *triangles) { + List outpolys; + List::Element*iter; if(!RemoveHoles(inpolys,&outpolys)) return 0; - for(iter=outpolys.begin();iter!=outpolys.end();iter++) { - if(!Triangulate_EC(&(*iter),triangles)) return 0; + for(iter=outpolys.front();iter;iter=iter->next()) { + if(!Triangulate_EC(&(iter->get()),triangles)) return 0; } return 1; } -int TriangulatorPartition::ConvexPartition_HM(TriangulatorPoly *poly, list *parts) { - list triangles; - list::iterator iter1,iter2; +int TriangulatorPartition::ConvexPartition_HM(TriangulatorPoly *poly, List *parts) { + List triangles; + List::Element *iter1,*iter2; TriangulatorPoly *poly1,*poly2; TriangulatorPoly newpoly; Vector2 d1,d2,p1,p2,p3; @@ -480,17 +480,17 @@ int TriangulatorPartition::ConvexPartition_HM(TriangulatorPoly *poly, listnext()) { + poly1 = &(iter1->get()); for(i11=0;i11GetNumPoints();i11++) { d1 = poly1->GetPoint(i11); i12 = (i11+1)%(poly1->GetNumPoints()); d2 = poly1->GetPoint(i12); isdiagonal = false; - for(iter2 = iter1; iter2 != triangles.end(); iter2++) { + for(iter2 = iter1; iter2 ; iter2=iter2->next()) { if(iter1 == iter2) continue; - poly2 = &(*iter2); + poly2 = &(iter2->get()); for(i21=0;i21GetNumPoints();i21++) { if((d2.x != poly2->GetPoint(i21).x)||(d2.y != poly2->GetPoint(i21).y)) continue; @@ -536,28 +536,28 @@ int TriangulatorPartition::ConvexPartition_HM(TriangulatorPoly *poly, listget() = newpoly; + poly1 = &(iter1->get()); i11 = -1; continue; } } - for(iter1 = triangles.begin(); iter1 != triangles.end(); iter1++) { - parts->push_back(*iter1); + for(iter1 = triangles.front(); iter1 ; iter1=iter1->next()) { + parts->push_back(iter1->get()); } return 1; } -int TriangulatorPartition::ConvexPartition_HM(list *inpolys, list *parts) { - list outpolys; - list::iterator iter; +int TriangulatorPartition::ConvexPartition_HM(List *inpolys, List *parts) { + List outpolys; + List::Element* iter; if(!RemoveHoles(inpolys,&outpolys)) return 0; - for(iter=outpolys.begin();iter!=outpolys.end();iter++) { - if(!ConvexPartition_HM(&(*iter),parts)) return 0; + for(iter=outpolys.front();iter;iter=iter->next()) { + if(!ConvexPartition_HM(&(iter->get()),parts)) return 0; } return 1; } @@ -565,14 +565,14 @@ int TriangulatorPartition::ConvexPartition_HM(list *inpolys, l //minimum-weight polygon triangulation by dynamic programming //O(n^3) time complexity //O(n^2) space complexity -int TriangulatorPartition::Triangulate_OPT(TriangulatorPoly *poly, list *triangles) { +int TriangulatorPartition::Triangulate_OPT(TriangulatorPoly *poly, List *triangles) { long i,j,k,gap,n; DPState **dpstates; Vector2 p1,p2,p3,p4; long bestvertex; real_t weight,minweight,d1,d2; Diagonal diagonal,newdiagonal; - list diagonals; + List diagonals; TriangulatorPoly triangle; int ret = 1; @@ -666,7 +666,7 @@ int TriangulatorPartition::Triangulate_OPT(TriangulatorPoly *poly, listget()); diagonals.pop_front(); bestvertex = dpstates[diagonal.index2][diagonal.index1].bestvertex; if(bestvertex == -1) { @@ -697,7 +697,7 @@ int TriangulatorPartition::Triangulate_OPT(TriangulatorPoly *poly, list *pairs; + List *pairs; long w2; w2 = dpstates[a][b].weight; @@ -712,15 +712,15 @@ void TriangulatorPartition::UpdateState(long a, long b, long w, long i, long j, pairs->push_front(newdiagonal); dpstates[a][b].weight = w; } else { - if((!pairs->empty())&&(i <= pairs->begin()->index1)) return; - while((!pairs->empty())&&(pairs->begin()->index2 >= j)) pairs->pop_front(); + if((!pairs->empty())&&(i <= pairs->front()->get().index1)) return; + while((!pairs->empty())&&(pairs->front()->get().index2 >= j)) pairs->pop_front(); pairs->push_front(newdiagonal); } } void TriangulatorPartition::TypeA(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates) { - list *pairs; - list::iterator iter,lastiter; + List *pairs; + List::Element *iter,*lastiter; long top; long w; @@ -733,25 +733,29 @@ void TriangulatorPartition::TypeA(long i, long j, long k, PartitionVertex *verti } if(j-i > 1) { pairs = &(dpstates[i][j].pairs); - iter = pairs->end(); - lastiter = pairs->end(); - while(iter!=pairs->begin()) { - iter--; - if(!IsReflex(vertices[iter->index2].p,vertices[j].p,vertices[k].p)) lastiter = iter; + iter = NULL; + lastiter = NULL; + while(iter!=pairs->front()) { + if (!iter) + iter=pairs->back(); + else + iter=iter->prev(); + + if(!IsReflex(vertices[iter->get().index2].p,vertices[j].p,vertices[k].p)) lastiter = iter; else break; } - if(lastiter == pairs->end()) w++; + if(lastiter == NULL) w++; else { - if(IsReflex(vertices[k].p,vertices[i].p,vertices[lastiter->index1].p)) w++; - else top = lastiter->index1; + if(IsReflex(vertices[k].p,vertices[i].p,vertices[lastiter->get().index1].p)) w++; + else top = lastiter->get().index1; } } UpdateState(i,k,w,top,j,dpstates); } void TriangulatorPartition::TypeB(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates) { - list *pairs; - list::iterator iter,lastiter; + List *pairs; + List::Element* iter,*lastiter; long top; long w; @@ -766,36 +770,36 @@ void TriangulatorPartition::TypeB(long i, long j, long k, PartitionVertex *verti if (k-j > 1) { pairs = &(dpstates[j][k].pairs); - iter = pairs->begin(); - if((!pairs->empty())&&(!IsReflex(vertices[i].p,vertices[j].p,vertices[iter->index1].p))) { + iter = pairs->front(); + if((!pairs->empty())&&(!IsReflex(vertices[i].p,vertices[j].p,vertices[iter->get().index1].p))) { lastiter = iter; - while(iter!=pairs->end()) { - if(!IsReflex(vertices[i].p,vertices[j].p,vertices[iter->index1].p)) { + while(iter!=NULL) { + if(!IsReflex(vertices[i].p,vertices[j].p,vertices[iter->get().index1].p)) { lastiter = iter; - iter++; + iter=iter->next(); } else break; } - if(IsReflex(vertices[lastiter->index2].p,vertices[k].p,vertices[i].p)) w++; - else top = lastiter->index2; + if(IsReflex(vertices[lastiter->get().index2].p,vertices[k].p,vertices[i].p)) w++; + else top = lastiter->get().index2; } else w++; } UpdateState(i,k,w,j,top,dpstates); } -int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, list *parts) { +int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, List *parts) { Vector2 p1,p2,p3,p4; PartitionVertex *vertices; DPState2 **dpstates; long i,j,k,n,gap; - list diagonals,diagonals2; + List diagonals,diagonals2; Diagonal diagonal,newdiagonal; - list *pairs,*pairs2; - list::iterator iter,iter2; + List *pairs,*pairs2; + List::Element* iter,*iter2; int ret; TriangulatorPoly newpoly; - list indices; - list::iterator iiter; + List indices; + List::Element* iiter; bool ijreal,jkreal; n = poly->GetNumPoints(); @@ -903,7 +907,7 @@ int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, listget()); diagonals.pop_front(); if((diagonal.index2 - diagonal.index1) <=1) continue; pairs = &(dpstates[diagonal.index1][diagonal.index2].pairs); @@ -912,23 +916,23 @@ int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, listend(); - iter--; - j = iter->index2; + iter = pairs->back(); + + j = iter->get().index2; newdiagonal.index1 = j; newdiagonal.index2 = diagonal.index2; diagonals.push_front(newdiagonal); if((j - diagonal.index1)>1) { - if(iter->index1 != iter->index2) { + if(iter->get().index1 != iter->get().index2) { pairs2 = &(dpstates[diagonal.index1][j].pairs); while(1) { if(pairs2->empty()) { ret = 0; break; } - iter2 = pairs2->end(); - iter2--; - if(iter->index1 != iter2->index1) pairs2->pop_back(); + iter2 = pairs2->back(); + + if(iter->get().index1 != iter2->get().index1) pairs2->pop_back(); else break; } if(ret == 0) break; @@ -938,21 +942,21 @@ int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, listbegin(); - j = iter->index1; + iter = pairs->front(); + j = iter->get().index1; newdiagonal.index1 = diagonal.index1; newdiagonal.index2 = j; diagonals.push_front(newdiagonal); if((diagonal.index2 - j) > 1) { - if(iter->index1 != iter->index2) { + if(iter->get().index1 != iter->get().index2) { pairs2 = &(dpstates[j][diagonal.index2].pairs); while(1) { if(pairs2->empty()) { ret = 0; break; } - iter2 = pairs2->begin(); - if(iter->index2 != iter2->index2) pairs2->pop_front(); + iter2 = pairs2->front(); + if(iter->get().index2 != iter2->get().index2) pairs2->pop_front(); else break; } if(ret == 0) break; @@ -978,7 +982,7 @@ int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, listget(); diagonals.pop_front(); if((diagonal.index2 - diagonal.index1) <= 1) continue; @@ -989,21 +993,20 @@ int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, listget()); diagonals2.pop_front(); if((diagonal.index2 - diagonal.index1) <= 1) continue; ijreal = true; jkreal = true; pairs = &(dpstates[diagonal.index1][diagonal.index2].pairs); if(!vertices[diagonal.index1].isConvex) { - iter = pairs->end(); - iter--; - j = iter->index2; - if(iter->index1 != iter->index2) ijreal = false; + iter = pairs->back(); + j = iter->get().index2; + if(iter->get().index1 != iter->get().index2) ijreal = false; } else { - iter = pairs->begin(); - j = iter->index1; - if(iter->index1 != iter->index2) jkreal = false; + iter = pairs->front(); + j = iter->get().index1; + if(iter->get().index1 != iter->get().index2) jkreal = false; } newdiagonal.index1 = diagonal.index1; @@ -1028,8 +1031,8 @@ int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, listnext()) { + newpoly[k] = vertices[iiter->get()].p; k++; } parts->push_back(newpoly); @@ -1049,8 +1052,8 @@ int TriangulatorPartition::ConvexPartition_OPT(TriangulatorPoly *poly, list *inpolys, list *monotonePolys) { - list::iterator iter; +int TriangulatorPartition::MonotonePartition(List *inpolys, List *monotonePolys) { + List::Element *iter; MonotoneVertex *vertices; long i,numvertices,vindex,vindex2,newnumvertices,maxnumvertices; long polystartindex, polyendindex; @@ -1060,8 +1063,8 @@ int TriangulatorPartition::MonotonePartition(list *inpolys, li bool error = false; numvertices = 0; - for(iter = inpolys->begin(); iter != inpolys->end(); iter++) { - numvertices += iter->GetNumPoints(); + for(iter = inpolys->front(); iter ; iter=iter->next()) { + numvertices += iter->get().GetNumPoints(); } maxnumvertices = numvertices*3; @@ -1069,8 +1072,8 @@ int TriangulatorPartition::MonotonePartition(list *inpolys, li newnumvertices = numvertices; polystartindex = 0; - for(iter = inpolys->begin(); iter != inpolys->end(); iter++) { - poly = &(*iter); + for(iter = inpolys->front(); iter ; iter=iter->next()) { + poly = &(iter->get()); polyendindex = polystartindex + poly->GetNumPoints()-1; for(i=0;iGetNumPoints();i++) { vertices[i+polystartindex].p = poly->GetPoint(i); @@ -1085,7 +1088,9 @@ int TriangulatorPartition::MonotonePartition(list *inpolys, li //construct the priority queue long *priority = new long [numvertices]; for(i=0;i sorter; + sorter.compare.vertices=vertices; + sorter.sort(priority,numvertices); //determine vertex types char *vertextypes = new char[maxnumvertices]; @@ -1118,13 +1123,13 @@ int TriangulatorPartition::MonotonePartition(list *inpolys, li //binary search tree that holds edges intersecting the scanline //note that while set doesn't actually have to be implemented as a tree //complexity requirements for operations are the same as for the balanced binary search tree - set edgeTree; + Set edgeTree; //store iterators to the edge tree elements //this makes deleting existing edges much faster - set::iterator *edgeTreeIterators,edgeIter; - edgeTreeIterators = new set::iterator[maxnumvertices]; - pair::iterator,bool> edgeTreeRet; - for(i = 0; i::Element **edgeTreeIterators,*edgeIter; + edgeTreeIterators = new Set::Element*[maxnumvertices]; +// Pair::Element*,bool> edgeTreeRet; + for(i = 0; i *inpolys, li newedge.p1 = v->p; newedge.p2 = vertices[v->next].p; newedge.index = vindex; - edgeTreeRet = edgeTree.insert(newedge); - edgeTreeIterators[vindex] = edgeTreeRet.first; + edgeTreeIterators[vindex] = edgeTree.insert(newedge); helpers[vindex] = vindex; break; @@ -1162,24 +1166,24 @@ int TriangulatorPartition::MonotonePartition(list *inpolys, li newedge.p1 = v->p; newedge.p2 = v->p; edgeIter = edgeTree.lower_bound(newedge); - if(edgeIter == edgeTree.begin()) { + if(edgeIter == edgeTree.front()) { error = true; break; } - edgeIter--; + edgeIter=edgeIter->prev(); //Insert the diagonal connecting vi to helper(ej) in D. - AddDiagonal(vertices,&newnumvertices,vindex,helpers[edgeIter->index], + AddDiagonal(vertices,&newnumvertices,vindex,helpers[edgeIter->get().index], vertextypes, edgeTreeIterators, &edgeTree, helpers); vindex2 = newnumvertices-2; v2 = &(vertices[vindex2]); //helper(e j)�vi - helpers[edgeIter->index] = vindex; + helpers[edgeIter->get().index] = vindex; //Insert ei in T and set helper(ei) to vi. newedge.p1 = v2->p; newedge.p2 = vertices[v2->next].p; newedge.index = vindex2; - edgeTreeRet = edgeTree.insert(newedge); - edgeTreeIterators[vindex2] = edgeTreeRet.first; + + edgeTreeIterators[vindex2] = edgeTree.insert(newedge); helpers[vindex2] = vindex2; break; @@ -1198,19 +1202,19 @@ int TriangulatorPartition::MonotonePartition(list *inpolys, li newedge.p1 = v->p; newedge.p2 = v->p; edgeIter = edgeTree.lower_bound(newedge); - if(edgeIter == edgeTree.begin()) { + if(edgeIter == edgeTree.front()) { error = true; break; } - edgeIter--; + edgeIter=edgeIter->prev(); //if helper(ej) is a merge vertex - if(vertextypes[helpers[edgeIter->index]]==TRIANGULATOR_VERTEXTYPE_MERGE) { + if(vertextypes[helpers[edgeIter->get().index]]==TRIANGULATOR_VERTEXTYPE_MERGE) { //Insert the diagonal connecting vi to helper(e j) in D. - AddDiagonal(vertices,&newnumvertices,vindex2,helpers[edgeIter->index], + AddDiagonal(vertices,&newnumvertices,vindex2,helpers[edgeIter->get().index], vertextypes, edgeTreeIterators, &edgeTree, helpers); } //helper(e j)�vi - helpers[edgeIter->index] = vindex2; + helpers[edgeIter->get().index] = vindex2; break; case TRIANGULATOR_VERTEXTYPE_REGULAR: @@ -1230,27 +1234,26 @@ int TriangulatorPartition::MonotonePartition(list *inpolys, li newedge.p1 = v2->p; newedge.p2 = vertices[v2->next].p; newedge.index = vindex2; - edgeTreeRet = edgeTree.insert(newedge); - edgeTreeIterators[vindex2] = edgeTreeRet.first; + edgeTreeIterators[vindex2] = edgeTree.insert(newedge); helpers[vindex2] = vindex; } else { //Search in T to find the edge ej directly left of vi. newedge.p1 = v->p; newedge.p2 = v->p; edgeIter = edgeTree.lower_bound(newedge); - if(edgeIter == edgeTree.begin()) { + if(edgeIter == edgeTree.front()) { error = true; break; } - edgeIter--; + edgeIter=edgeIter->prev(); //if helper(ej) is a merge vertex - if(vertextypes[helpers[edgeIter->index]]==TRIANGULATOR_VERTEXTYPE_MERGE) { + if(vertextypes[helpers[edgeIter->get().index]]==TRIANGULATOR_VERTEXTYPE_MERGE) { //Insert the diagonal connecting vi to helper(e j) in D. - AddDiagonal(vertices,&newnumvertices,vindex,helpers[edgeIter->index], + AddDiagonal(vertices,&newnumvertices,vindex,helpers[edgeIter->get().index], vertextypes, edgeTreeIterators, &edgeTree, helpers); } //helper(e j)�vi - helpers[edgeIter->index] = vindex; + helpers[edgeIter->get().index] = vindex; } break; } @@ -1308,8 +1311,8 @@ int TriangulatorPartition::MonotonePartition(list *inpolys, li //adds a diagonal to the doubly-connected list of vertices void TriangulatorPartition::AddDiagonal(MonotoneVertex *vertices, long *numvertices, long index1, long index2, - char *vertextypes, set::iterator *edgeTreeIterators, - set *edgeTree, long *helpers) + char *vertextypes, Set::Element **edgeTreeIterators, + Set *edgeTree, long *helpers) { long newindex1,newindex2; @@ -1337,13 +1340,13 @@ void TriangulatorPartition::AddDiagonal(MonotoneVertex *vertices, long *numverti vertextypes[newindex1] = vertextypes[index1]; edgeTreeIterators[newindex1] = edgeTreeIterators[index1]; helpers[newindex1] = helpers[index1]; - if(edgeTreeIterators[newindex1] != edgeTree->end()) - edgeTreeIterators[newindex1]->index = newindex1; + if(edgeTreeIterators[newindex1] != NULL) + edgeTreeIterators[newindex1]->get().index = newindex1; vertextypes[newindex2] = vertextypes[index2]; edgeTreeIterators[newindex2] = edgeTreeIterators[index2]; helpers[newindex2] = helpers[index2]; - if(edgeTreeIterators[newindex2] != edgeTree->end()) - edgeTreeIterators[newindex2]->index = newindex2; + if(edgeTreeIterators[newindex2] != NULL) + edgeTreeIterators[newindex2]->get().index = newindex2; } bool TriangulatorPartition::Below(Vector2 &p1, Vector2 &p2) { @@ -1354,8 +1357,12 @@ bool TriangulatorPartition::Below(Vector2 &p1, Vector2 &p2) { return false; } + + + + //sorts in the falling order of y values, if y is equal, x is used instead -bool TriangulatorPartition::VertexSorter::operator() (long index1, long index2) { +bool TriangulatorPartition::VertexSorter::operator() (long index1, long index2) const { if(vertices[index1].p.y > vertices[index2].p.y) return true; else if(vertices[index1].p.y == vertices[index2].p.y) { if(vertices[index1].p.x > vertices[index2].p.x) return true; @@ -1392,7 +1399,7 @@ bool TriangulatorPartition::ScanLineEdge::operator < (const ScanLineEdge & other //triangulates monotone polygon //O(n) time, O(n) space complexity -int TriangulatorPartition::TriangulateMonotone(TriangulatorPoly *inPoly, list *triangles) { +int TriangulatorPartition::TriangulateMonotone(TriangulatorPoly *inPoly, List *triangles) { long i,i2,j,topindex,bottomindex,leftindex,rightindex,vindex; Vector2 *points; long numpoints; @@ -1524,19 +1531,19 @@ int TriangulatorPartition::TriangulateMonotone(TriangulatorPoly *inPoly, list *inpolys, list *triangles) { - list monotone; - list::iterator iter; +int TriangulatorPartition::Triangulate_MONO(List *inpolys, List *triangles) { + List monotone; + List::Element* iter; if(!MonotonePartition(inpolys,&monotone)) return 0; - for(iter = monotone.begin(); iter!=monotone.end();iter++) { - if(!TriangulateMonotone(&(*iter),triangles)) return 0; + for(iter = monotone.front(); iter;iter=iter->next()) { + if(!TriangulateMonotone(&(iter->get()),triangles)) return 0; } return 1; } -int TriangulatorPartition::Triangulate_MONO(TriangulatorPoly *poly, list *triangles) { - list polys; +int TriangulatorPartition::Triangulate_MONO(TriangulatorPoly *poly, List *triangles) { + List polys; polys.push_back(*poly); return Triangulate_MONO(&polys, triangles); diff --git a/core/math/triangulator.h b/core/math/triangulator.h index c34c445892..b6dd7e8236 100644 --- a/core/math/triangulator.h +++ b/core/math/triangulator.h @@ -22,9 +22,8 @@ #define TRIANGULATOR_H #include "math_2d.h" -#include -#include - +#include "list.h" +#include "set.h" //2D point structure @@ -119,11 +118,9 @@ protected: long next; }; - class VertexSorter{ - MonotoneVertex *vertices; - public: - VertexSorter(MonotoneVertex *v) : vertices(v) {} - bool operator() (long index1, long index2); + struct VertexSorter{ + mutable MonotoneVertex *vertices; + bool operator() (long index1, long index2) const; }; struct Diagonal { @@ -142,7 +139,7 @@ protected: struct DPState2 { bool visible; long weight; - std::list pairs; + List pairs; }; //edge that intersects the scanline @@ -182,11 +179,11 @@ protected: //helper functions for MonotonePartition bool Below(Vector2 &p1, Vector2 &p2); void AddDiagonal(MonotoneVertex *vertices, long *numvertices, long index1, long index2, - char *vertextypes, std::set::iterator *edgeTreeIterators, - std::set *edgeTree, long *helpers); + char *vertextypes, Set::Element **edgeTreeIterators, + Set *edgeTree, long *helpers); //triangulates a monotone polygon, used in Triangulate_MONO - int TriangulateMonotone(TriangulatorPoly *inPoly, std::list *triangles); + int TriangulateMonotone(TriangulatorPoly *inPoly, List *triangles); public: @@ -200,7 +197,7 @@ public: // vertices of all hole polys have to be in clockwise order // outpolys : a list of polygons without holes //returns 1 on success, 0 on failure - int RemoveHoles(std::list *inpolys, std::list *outpolys); + int RemoveHoles(List *inpolys, List *outpolys); //triangulates a polygon by ear clipping //time complexity O(n^2), n is the number of vertices @@ -210,7 +207,7 @@ public: // vertices have to be in counter-clockwise order // triangles : a list of triangles (result) //returns 1 on success, 0 on failure - int Triangulate_EC(TriangulatorPoly *poly, std::list *triangles); + int Triangulate_EC(TriangulatorPoly *poly, List *triangles); //triangulates a list of polygons that may contain holes by ear clipping algorithm //first calls RemoveHoles to get rid of the holes, and then Triangulate_EC for each resulting polygon @@ -222,7 +219,7 @@ public: // vertices of all hole polys have to be in clockwise order // triangles : a list of triangles (result) //returns 1 on success, 0 on failure - int Triangulate_EC(std::list *inpolys, std::list *triangles); + int Triangulate_EC(List *inpolys, List *triangles); //creates an optimal polygon triangulation in terms of minimal edge length //time complexity: O(n^3), n is the number of vertices @@ -232,7 +229,7 @@ public: // vertices have to be in counter-clockwise order // triangles : a list of triangles (result) //returns 1 on success, 0 on failure - int Triangulate_OPT(TriangulatorPoly *poly, std::list *triangles); + int Triangulate_OPT(TriangulatorPoly *poly, List *triangles); //triangulates a polygons by firstly partitioning it into monotone polygons //time complexity: O(n*log(n)), n is the number of vertices @@ -242,7 +239,7 @@ public: // vertices have to be in counter-clockwise order // triangles : a list of triangles (result) //returns 1 on success, 0 on failure - int Triangulate_MONO(TriangulatorPoly *poly, std::list *triangles); + int Triangulate_MONO(TriangulatorPoly *poly, List *triangles); //triangulates a list of polygons by firstly partitioning them into monotone polygons //time complexity: O(n*log(n)), n is the number of vertices @@ -253,7 +250,7 @@ public: // vertices of all hole polys have to be in clockwise order // triangles : a list of triangles (result) //returns 1 on success, 0 on failure - int Triangulate_MONO(std::list *inpolys, std::list *triangles); + int Triangulate_MONO(List *inpolys, List *triangles); //creates a monotone partition of a list of polygons that can contain holes //time complexity: O(n*log(n)), n is the number of vertices @@ -264,7 +261,7 @@ public: // vertices of all hole polys have to be in clockwise order // monotonePolys : a list of monotone polygons (result) //returns 1 on success, 0 on failure - int MonotonePartition(std::list *inpolys, std::list *monotonePolys); + int MonotonePartition(List *inpolys, List *monotonePolys); //partitions a polygon into convex polygons by using Hertel-Mehlhorn algorithm //the algorithm gives at most four times the number of parts as the optimal algorithm @@ -277,7 +274,7 @@ public: // vertices have to be in counter-clockwise order // parts : resulting list of convex polygons //returns 1 on success, 0 on failure - int ConvexPartition_HM(TriangulatorPoly *poly, std::list *parts); + int ConvexPartition_HM(TriangulatorPoly *poly, List *parts); //partitions a list of polygons into convex parts by using Hertel-Mehlhorn algorithm //the algorithm gives at most four times the number of parts as the optimal algorithm @@ -291,7 +288,7 @@ public: // vertices of all hole polys have to be in clockwise order // parts : resulting list of convex polygons //returns 1 on success, 0 on failure - int ConvexPartition_HM(std::list *inpolys, std::list *parts); + int ConvexPartition_HM(List *inpolys, List *parts); //optimal convex partitioning (in terms of number of resulting convex polygons) //using the Keil-Snoeyink algorithm @@ -302,7 +299,7 @@ public: // vertices have to be in counter-clockwise order // parts : resulting list of convex polygons //returns 1 on success, 0 on failure - int ConvexPartition_OPT(TriangulatorPoly *poly, std::list *parts); + int ConvexPartition_OPT(TriangulatorPoly *poly, List *parts); }; diff --git a/core/set.h b/core/set.h index d87f635577..95f38d7108 100644 --- a/core/set.h +++ b/core/set.h @@ -249,6 +249,37 @@ private: return (node!=_data._nil)?node:NULL; } + Element *_lower_bound(const T& p_value) const { + + Element *node = _data._root->left; + Element *prev = NULL; + C less; + + while(node!=_data._nil) { + prev=node; + + if (less(p_value,node->value)) + node=node->left; + else if (less(node->value,p_value)) + node=node->right; + else + break; // found + } + + if (node==_data._nil) { + if (prev==NULL) + return NULL; + if (less(prev->value,p_value)) { + + prev=prev->_next; + } + + return prev; + + } else + return node; + } + Element *_insert(const T& p_value, bool& r_exists) { @@ -582,6 +613,12 @@ public: return e; } + + Element *lower_bound(const T& p_value) const { + + return _lower_bound(p_value); + } + inline int size() const { return _data.size_cache; } int calculate_depth() const { diff --git a/core/variant.cpp b/core/variant.cpp index 2f0eca9e91..667a7d8648 100644 --- a/core/variant.cpp +++ b/core/variant.cpp @@ -2631,8 +2631,13 @@ Variant Variant::call(const StringName& p_method,VARIANT_ARG_DECLARE) { return ret; } +void Variant::construct_from_string(const String& p_string,Variant& r_value,ObjectConstruct p_obj_construct,void *p_construct_ud) { -String Variant::get_construct_string() const { + r_value=Variant(); +} + + +String Variant::get_construct_string(ObjectDeConstruct p_obj_deconstruct,void *p_deconstruct_ud) const { switch( type ) { @@ -2640,7 +2645,7 @@ String Variant::get_construct_string() const { case BOOL: return _data._bool ? "true" : "false"; case INT: return String::num(_data._int); case REAL: return String::num(_data._real); - case STRING: return "\""+*reinterpret_cast(_data._mem)+"\""; + case STRING: return "\""+reinterpret_cast(_data._mem)->c_escape()+"\""; case VECTOR2: return "Vector2("+operator Vector2()+")"; case RECT2: return "Rect2("+operator Rect2()+")"; case MATRIX32: return "Matrix32("+operator Matrix32()+")"; @@ -2651,7 +2656,7 @@ String Variant::get_construct_string() const { case QUAT: return "Quat("+operator Quat()+")"; case MATRIX3: return "Matrix3("+operator Matrix3()+")"; case TRANSFORM: return "Transform("+operator Transform()+")"; - case NODE_PATH: return "@\""+operator NodePath()+"\""; + case NODE_PATH: return "@\""+String(operator NodePath()).c_escape()+"\""; case INPUT_EVENT: return "InputEvent()"; case COLOR: return "Color("+String::num( operator Color().r)+","+String::num( operator Color().g)+","+String::num( operator Color().b)+","+String::num( operator Color().a)+")" ; case DICTIONARY: { @@ -2667,8 +2672,8 @@ String Variant::get_construct_string() const { for(List::Element *E=keys.front();E;E=E->next()) { _VariantStrPair sp; - sp.key=E->get().get_construct_string(); - sp.value=d[E->get()].get_construct_string(); + sp.key=E->get().get_construct_string(p_obj_deconstruct,p_deconstruct_ud); + sp.value=d[E->get()].get_construct_string(p_obj_deconstruct,p_deconstruct_ud); pairs.push_back(sp); } @@ -2686,50 +2691,50 @@ String Variant::get_construct_string() const { case VECTOR3_ARRAY: { DVector vec = operator DVector(); - String str="["; + String str="Vector3Array(["; for(int i=0;i0) str+=", "; str+=Variant( vec[i] ).get_construct_string(); } - return str+"]"; + return str+"])"; } break; case STRING_ARRAY: { DVector vec = operator DVector(); - String str="["; + String str="StringArray(["; for(int i=0;i0) str+=", "; str=str+=Variant( vec[i] ).get_construct_string(); } - return str+"]"; + return str+"])"; } break; case INT_ARRAY: { DVector vec = operator DVector(); - String str="["; + String str="IntArray(["; for(int i=0;i0) str+=", "; str=str+itos(vec[i]); } - return str+"]"; + return str+"])"; } break; case REAL_ARRAY: { DVector vec = operator DVector(); - String str="["; + String str="FloatArray(["; for(int i=0;i0) str+=", "; str=str+rtos(vec[i]); } - return str+"]"; + return str+"])"; } break; case ARRAY: { @@ -2738,16 +2743,20 @@ String Variant::get_construct_string() const { for (int i=0; iget_type()+".new()"; - else + if (_get_obj().obj) { + if (p_obj_deconstruct) { + return "Object(\""+p_obj_deconstruct(Variant(*this),p_deconstruct_ud).c_escape()+")"; + } else { + return _get_obj().obj->get_type()+".new()"; + } + } else return "null"; } break; diff --git a/core/variant.h b/core/variant.h index 47fc3f43ac..d5d4792422 100644 --- a/core/variant.h +++ b/core/variant.h @@ -419,7 +419,11 @@ public: static bool has_numeric_constant(Variant::Type p_type, const StringName& p_value); static int get_numeric_constant_value(Variant::Type p_type, const StringName& p_value); - String get_construct_string() const; + typedef String (*ObjectDeConstruct)(const Variant& p_object,void *ud); + typedef void (*ObjectConstruct)(const String& p_text,void *ud,Variant& r_value); + + String get_construct_string(ObjectDeConstruct p_obj_deconstruct=NULL,void *p_deconstruct_ud=NULL) const; + static void construct_from_string(const String& p_string,Variant& r_value,ObjectConstruct p_obj_construct=NULL,void *p_construct_ud=NULL); void operator=(const Variant& p_variant); // only this is enough for all the other types Variant(const Variant& p_variant); diff --git a/core/variant_construct_string.cpp b/core/variant_construct_string.cpp new file mode 100644 index 0000000000..0308fd3180 --- /dev/null +++ b/core/variant_construct_string.cpp @@ -0,0 +1,433 @@ + +#include "variant.h" + +class VariantConstruct { + + enum TokenType { + TK_CURLY_BRACKET_OPEN, + TK_CURLY_BRACKET_CLOSE, + TK_BRACKET_OPEN, + TK_BRACKET_CLOSE, + TK_IDENTIFIER, + TK_STRING, + TK_NUMBER, + TK_COLON, + TK_COMMA, + TK_EOF, + TK_MAX + }; + + enum Expecting { + + EXPECT_OBJECT, + EXPECT_OBJECT_KEY, + EXPECT_COLON, + EXPECT_OBJECT_VALUE, + }; + + struct Token { + + TokenType type; + Variant value; + }; + + static const char * tk_name[TK_MAX]; + + static String _print_var(const Variant& p_var); + + static Error _get_token(const CharType *p_str,int &index, int p_len,Token& r_token,int &line,String &r_err_str); + static Error _parse_value(Variant &value,Token& token,const CharType *p_str,int &index, int p_len,int &line,String &r_err_str,Variant::ObjectConstruct* p_construct,void* p_ud); + static Error _parse_array(Array &array,const CharType *p_str,int &index, int p_len,int &line,String &r_err_str,Variant::ObjectConstruct* p_construct,void* p_ud); + static Error _parse_dict(Dictionary &object,const CharType *p_str,int &index, int p_len,int &line,String &r_err_str,Variant::ObjectConstruct* p_construct,void* p_ud); + +public: + + static Error parse(const String& p_string,Variant& r_ret,String &r_err_str,int &r_err_line,Variant::ObjectConstruct* p_construct,void* p_ud); +}; + + +const char * VariantConstruct::tk_name[TK_MAX] = { + "'{'", + "'}'", + "'['", + "']'", + "identifier", + "string", + "number", + "':'", + "','", + "EOF", +}; + + + +Error VariantConstruct::_get_token(const CharType *p_str, int &idx, int p_len, Token& r_token,int &line,String &r_err_str) { + + while (true) { + switch(p_str[idx]) { + + case '\n': { + + line++; + idx++; + break; + }; + case 0: { + r_token.type=TK_EOF; + return OK; + } break; + case '{': { + + r_token.type=TK_CURLY_BRACKET_OPEN; + idx++; + return OK; + }; + case '}': { + + r_token.type=TK_CURLY_BRACKET_CLOSE; + idx++; + return OK; + }; + case '[': { + + r_token.type=TK_BRACKET_OPEN; + idx++; + return OK; + }; + case ']': { + + r_token.type=TK_BRACKET_CLOSE; + idx++; + return OK; + }; + case ':': { + + r_token.type=TK_COLON; + idx++; + return OK; + }; + case ',': { + + r_token.type=TK_COMMA; + idx++; + return OK; + }; + case '"': { + + idx++; + String str; + while(true) { + if (p_str[idx]==0) { + r_err_str="Unterminated String"; + return ERR_PARSE_ERROR; + } else if (p_str[idx]=='"') { + idx++; + break; + } else if (p_str[idx]=='\\') { + //escaped characters... + idx++; + CharType next = p_str[idx]; + if (next==0) { + r_err_str="Unterminated String"; + return ERR_PARSE_ERROR; + } + CharType res=0; + + switch(next) { + + case 'b': res=8; break; + case 't': res=9; break; + case 'n': res=10; break; + case 'f': res=12; break; + case 'r': res=13; break; + case '\"': res='\"'; break; + case '\\': res='\\'; break; + case '/': res='/'; break; //wtf + case 'u': { + //hexnumbarh - oct is deprecated + + + for(int j=0;j<4;j++) { + CharType c = p_str[idx+j+1]; + if (c==0) { + r_err_str="Unterminated String"; + return ERR_PARSE_ERROR; + } + if (!((c>='0' && c<='9') || (c>='a' && c<='f') || (c>='A' && c<='F'))) { + + r_err_str="Malformed hex constant in string"; + return ERR_PARSE_ERROR; + } + CharType v; + if (c>='0' && c<='9') { + v=c-'0'; + } else if (c>='a' && c<='f') { + v=c-'a'; + v+=10; + } else if (c>='A' && c<='F') { + v=c-'A'; + v+=10; + } else { + ERR_PRINT("BUG"); + v=0; + } + + res<<=4; + res|=v; + + + } + idx+=4; //will add at the end anyway + + + } break; + default: { + + r_err_str="Invalid escape sequence"; + return ERR_PARSE_ERROR; + } break; + } + + str+=res; + + } else { + if (p_str[idx]=='\n') + line++; + str+=p_str[idx]; + } + idx++; + } + + r_token.type=TK_STRING; + r_token.value=str; + return OK; + + } break; + default: { + + if (p_str[idx]<=32) { + idx++; + break; + } + + if (p_str[idx]=='-' || (p_str[idx]>='0' && p_str[idx]<='9')) { + //a number + const CharType *rptr; + double number = String::to_double(&p_str[idx],&rptr); + idx+=(rptr - &p_str[idx]); + r_token.type=TK_NUMBER; + r_token.value=number; + return OK; + + } else if ((p_str[idx]>='A' && p_str[idx]<='Z') || (p_str[idx]>='a' && p_str[idx]<='z')) { + + String id; + + while((p_str[idx]>='A' && p_str[idx]<='Z') || (p_str[idx]>='a' && p_str[idx]<='z')) { + + id+=p_str[idx]; + idx++; + } + + r_token.type=TK_IDENTIFIER; + r_token.value=id; + return OK; + } else { + r_err_str="Unexpected character."; + return ERR_PARSE_ERROR; + } + } + + } + } + + return ERR_PARSE_ERROR; +} + + + +Error VariantConstruct::_parse_value(Variant &value,Token& token,const CharType *p_str,int &index, int p_len,int &line,String &r_err_str,Variant::ObjectConstruct* p_construct,void* p_ud) { + + + if (token.type==TK_CURLY_BRACKET_OPEN) { + + Dictionary d; + Error err = _parse_dict(d,p_str,index,p_len,line,r_err_str,p_construct,p_ud); + if (err) + return err; + value=d; + return OK; + } else if (token.type==TK_BRACKET_OPEN) { + + Array a; + Error err = _parse_array(a,p_str,index,p_len,line,r_err_str,p_construct,p_ud); + if (err) + return err; + value=a; + return OK; + + } else if (token.type==TK_IDENTIFIER) { + + String id = token.value; + if (id=="true") + value=true; + else if (id=="false") + value=false; + else if (id=="null") + value=Variant(); + else { + r_err_str="Expected 'true','false' or 'null', got '"+id+"'."; + return ERR_PARSE_ERROR; + } + return OK; + + } else if (token.type==TK_NUMBER) { + + value=token.value; + return OK; + } else if (token.type==TK_STRING) { + + value=token.value; + return OK; + } else { + r_err_str="Expected value, got "+String(tk_name[token.type])+"."; + return ERR_PARSE_ERROR; + } + + return ERR_PARSE_ERROR; +} + + +Error VariantConstruct::_parse_array(Array &array,const CharType *p_str,int &index, int p_len,int &line,String &r_err_str,Variant::ObjectConstruct* p_construct,void* p_ud) { + + Token token; + bool need_comma=false; + + + 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 + } break; + case STR_TO_VAR: { + VALIDATE_ARG_COUNT(1); + if (p_args[0]->get_type()!=Variant::STRING) { + r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument=0; + r_error.expected=Variant::STRING; + r_ret=Variant(); + return; + } + Variant::construct_from_string(*p_args[0],r_ret); + } break; case GEN_RANGE: { - - switch(p_arg_count) { case 0: { @@ -861,7 +876,6 @@ void GDFunctions::call(Function p_func,const Variant **p_args,int p_arg_count,Va } } - r_ret = gdscr->_new(NULL,0,r_error); } break; @@ -1224,6 +1238,18 @@ MethodInfo GDFunctions::get_info(Function p_func) { return mi; } break; + case VAR_TO_STR: { + MethodInfo mi("var2str",PropertyInfo(Variant::NIL,"var")); + mi.return_val.type=Variant::STRING; + return mi; + + } break; + case STR_TO_VAR: { + + MethodInfo mi("str2var:var",PropertyInfo(Variant::STRING,"string")); + mi.return_val.type=Variant::NIL; + return mi; + } break; case GEN_RANGE: { MethodInfo mi("range",PropertyInfo(Variant::NIL,"...")); diff --git a/modules/gdscript/gd_functions.h b/modules/gdscript/gd_functions.h index 340763fb8c..05ff6a2e73 100644 --- a/modules/gdscript/gd_functions.h +++ b/modules/gdscript/gd_functions.h @@ -85,6 +85,8 @@ public: TEXT_PRINT_TABBED, TEXT_PRINTERR, TEXT_PRINTRAW, + VAR_TO_STR, + STR_TO_VAR, GEN_RANGE, RESOURCE_LOAD, INST2DICT, diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index ad54a327cf..13f2c32e77 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -1439,7 +1439,6 @@ void OS_Windows::warp_mouse_pos(const Point2& p_to) { SetCursorPos(p.x,p.y); } - } Point2 OS_Windows::get_mouse_pos() const { diff --git a/scene/2d/navigation_polygon.cpp b/scene/2d/navigation_polygon.cpp index 570a5b95b0..fc69ea8a0d 100644 --- a/scene/2d/navigation_polygon.cpp +++ b/scene/2d/navigation_polygon.cpp @@ -113,7 +113,7 @@ void NavigationPolygon::clear_outlines(){ } void NavigationPolygon::make_polygons_from_outlines(){ - std::list in_poly,out_poly; + List in_poly,out_poly; Vector2 outside_point(-1e10,-1e10); @@ -194,9 +194,9 @@ void NavigationPolygon::make_polygons_from_outlines(){ vertices.resize(0); Map points; - for(std::list::iterator I = out_poly.begin();I!=out_poly.end();I++) { + for(List::Element*I = out_poly.front();I;I=I->next()) { - TriangulatorPoly& tp = *I; + TriangulatorPoly& tp = I->get(); struct Polygon p;