From 192a4d7de5c557bdfe83bd180cd603d7e280ebd4 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Thu, 9 Nov 2017 23:34:01 -0300 Subject: Reworked how servers preallocate RIDs, should fix #10970 --- editor/editor_plugin.cpp | 4 +- editor/plugins/editor_preview_plugins.cpp | 8 ++-- main/tests/test_physics.cpp | 2 +- main/tests/test_physics_2d.cpp | 20 +++++----- main/tests/test_render.cpp | 4 +- scene/2d/physics_body_2d.cpp | 3 +- scene/2d/tile_map.cpp | 4 +- scene/3d/light.cpp | 8 +++- scene/3d/physics_body.cpp | 2 +- scene/resources/capsule_shape_2d.cpp | 2 +- scene/resources/circle_shape_2d.cpp | 2 +- scene/resources/concave_polygon_shape_2d.cpp | 2 +- scene/resources/convex_polygon_shape_2d.cpp | 2 +- scene/resources/rectangle_shape_2d.cpp | 2 +- scene/resources/segment_shape_2d.cpp | 4 +- scene/resources/shape_line_2d.cpp | 2 +- servers/physics_2d/physics_2d_server_sw.cpp | 47 ++++++++++++++++++++---- servers/physics_2d/physics_2d_server_sw.h | 15 +++++++- servers/physics_2d/physics_2d_server_wrap_mt.cpp | 27 +++++++------- servers/physics_2d/physics_2d_server_wrap_mt.h | 33 ++++++++--------- servers/physics_2d_server.cpp | 10 ++++- servers/physics_2d_server.h | 12 +++++- servers/visual/rasterizer.h | 4 ++ servers/visual/visual_server_raster.h | 4 +- servers/visual/visual_server_wrap_mt.cpp | 26 +++++++++++-- servers/visual/visual_server_wrap_mt.h | 42 +++++++++++---------- servers/visual_server.h | 4 +- 27 files changed, 196 insertions(+), 99 deletions(-) diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index c8abc1f9db..0bd677ca1b 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -76,11 +76,11 @@ Vector > EditorInterface::make_mesh_previews(const Vector //VS::get_singleton()->camera_set_perspective(camera,45,0.1,10); VS::get_singleton()->camera_set_orthogonal(camera, 1.0, 0.01, 1000.0); - RID light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL); + RID light = VS::get_singleton()->directional_light_create(); RID light_instance = VS::get_singleton()->instance_create2(light, scenario); VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0))); - RID light2 = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL); + RID light2 = VS::get_singleton()->directional_light_create(); VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7)); //VS::get_singleton()->light_set_color(light2, VS::LIGHT_COLOR_SPECULAR, Color(0.0, 0.0, 0.0)); RID light_instance2 = VS::get_singleton()->instance_create2(light2, scenario); diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index c48a241e4d..5f73d0b465 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -278,11 +278,11 @@ EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() { VS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3))); VS::get_singleton()->camera_set_perspective(camera, 45, 0.1, 10); - light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL); + light = VS::get_singleton()->directional_light_create(); light_instance = VS::get_singleton()->instance_create2(light, scenario); VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0))); - light2 = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL); + light2 = VS::get_singleton()->directional_light_create(); VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7)); //VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7)); @@ -850,11 +850,11 @@ EditorMeshPreviewPlugin::EditorMeshPreviewPlugin() { //VS::get_singleton()->camera_set_perspective(camera,45,0.1,10); VS::get_singleton()->camera_set_orthogonal(camera, 1.0, 0.01, 1000.0); - light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL); + light = VS::get_singleton()->directional_light_create(); light_instance = VS::get_singleton()->instance_create2(light, scenario); VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0))); - light2 = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL); + light2 = VS::get_singleton()->directional_light_create(); VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7)); //VS::get_singleton()->light_set_color(light2, VS::LIGHT_COLOR_SPECULAR, Color(0.0, 0.0, 0.0)); light_instance2 = VS::get_singleton()->instance_create2(light2, scenario); diff --git a/main/tests/test_physics.cpp b/main/tests/test_physics.cpp index f149821928..1c50470544 100644 --- a/main/tests/test_physics.cpp +++ b/main/tests/test_physics.cpp @@ -299,7 +299,7 @@ public: VisualServer *vs = VisualServer::get_singleton(); /* LIGHT */ - RID lightaux = vs->light_create(VisualServer::LIGHT_DIRECTIONAL); + RID lightaux = vs->directional_light_create(); scenario = vs->scenario_create(); vs->light_set_shadow(lightaux, true); light = vs->instance_create2(lightaux, scenario); diff --git a/main/tests/test_physics_2d.cpp b/main/tests/test_physics_2d.cpp index a746973799..7d596fbda3 100644 --- a/main/tests/test_physics_2d.cpp +++ b/main/tests/test_physics_2d.cpp @@ -86,7 +86,7 @@ class TestPhysics2DMainLoop : public MainLoop { body_shape_data[Physics2DServer::SHAPE_SEGMENT].image = vs->texture_create_from_image(image); - RID segment_shape = ps->shape_create(Physics2DServer::SHAPE_SEGMENT); + RID segment_shape = ps->segment_shape_create(); Rect2 sg(Point2(-16, 0), Point2(16, 0)); ps->shape_set_data(segment_shape, sg); @@ -113,7 +113,7 @@ class TestPhysics2DMainLoop : public MainLoop { body_shape_data[Physics2DServer::SHAPE_CIRCLE].image = vs->texture_create_from_image(image); - RID circle_shape = ps->shape_create(Physics2DServer::SHAPE_CIRCLE); + RID circle_shape = ps->circle_shape_create(); ps->shape_set_data(circle_shape, 16); body_shape_data[Physics2DServer::SHAPE_CIRCLE].shape = circle_shape; @@ -140,7 +140,7 @@ class TestPhysics2DMainLoop : public MainLoop { body_shape_data[Physics2DServer::SHAPE_RECTANGLE].image = vs->texture_create_from_image(image); - RID rectangle_shape = ps->shape_create(Physics2DServer::SHAPE_RECTANGLE); + RID rectangle_shape = ps->rectangle_shape_create(); ps->shape_set_data(rectangle_shape, Vector2(16, 16)); body_shape_data[Physics2DServer::SHAPE_RECTANGLE].shape = rectangle_shape; @@ -168,7 +168,7 @@ class TestPhysics2DMainLoop : public MainLoop { body_shape_data[Physics2DServer::SHAPE_CAPSULE].image = vs->texture_create_from_image(image); - RID capsule_shape = ps->shape_create(Physics2DServer::SHAPE_CAPSULE); + RID capsule_shape = ps->capsule_shape_create(); ps->shape_set_data(capsule_shape, Vector2(16, 32)); body_shape_data[Physics2DServer::SHAPE_CAPSULE].shape = capsule_shape; @@ -182,7 +182,7 @@ class TestPhysics2DMainLoop : public MainLoop { body_shape_data[Physics2DServer::SHAPE_CONVEX_POLYGON].image = vs->texture_create_from_image(image); - RID convex_polygon_shape = ps->shape_create(Physics2DServer::SHAPE_CONVEX_POLYGON); + RID convex_polygon_shape = ps->convex_polygon_shape_create(); PoolVector arr; Point2 sb(32, 32); @@ -277,10 +277,11 @@ protected: arr.push_back(p_normal); arr.push_back(p_d); - RID plane = ps->shape_create(Physics2DServer::SHAPE_LINE); + RID plane = ps->line_shape_create(); ps->shape_set_data(plane, arr); - RID plane_body = ps->body_create(Physics2DServer::BODY_MODE_STATIC); + RID plane_body = ps->body_create(); + ps->body_set_mode(plane_body, Physics2DServer::BODY_MODE_STATIC); ps->body_set_space(plane_body, space); ps->body_add_shape(plane_body, plane); } @@ -290,9 +291,10 @@ protected: Physics2DServer *ps = Physics2DServer::get_singleton(); VisualServer *vs = VisualServer::get_singleton(); - RID concave = ps->shape_create(Physics2DServer::SHAPE_CONCAVE_POLYGON); + RID concave = ps->concave_polygon_shape_create(); ps->shape_set_data(concave, p_points); - RID body = ps->body_create(Physics2DServer::BODY_MODE_STATIC); + RID body = ps->body_create(); + ps->body_set_mode(body, Physics2DServer::BODY_MODE_STATIC); ps->body_set_space(body, space); ps->body_add_shape(body, concave); ps->body_set_state(body, Physics2DServer::BODY_STATE_TRANSFORM, p_xform); diff --git a/main/tests/test_render.cpp b/main/tests/test_render.cpp index 1f6217928d..cbf1a57855 100644 --- a/main/tests/test_render.cpp +++ b/main/tests/test_render.cpp @@ -180,7 +180,7 @@ public: */ RID lightaux; - lightaux = vs->light_create(VisualServer::LIGHT_DIRECTIONAL); + lightaux = vs->directional_light_create(); //vs->light_set_color( lightaux, VisualServer::LIGHT_COLOR_AMBIENT, Color(0.0,0.0,0.0) ); vs->light_set_color(lightaux, Color(1.0, 1.0, 1.0)); //vs->light_set_shadow( lightaux, true ); @@ -191,7 +191,7 @@ public: vs->instance_set_transform(light, lla); - lightaux = vs->light_create(VisualServer::LIGHT_OMNI); + lightaux = vs->omni_light_create(); //vs->light_set_color( lightaux, VisualServer::LIGHT_COLOR_AMBIENT, Color(0.0,0.0,1.0) ); vs->light_set_color(lightaux, Color(1.0, 1.0, 0.0)); vs->light_set_param(lightaux, VisualServer::LIGHT_PARAM_RANGE, 4); diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index f0ee64a53f..1287a800e3 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -133,8 +133,9 @@ bool PhysicsBody2D::get_collision_layer_bit(int p_bit) const { } PhysicsBody2D::PhysicsBody2D(Physics2DServer::BodyMode p_mode) - : CollisionObject2D(Physics2DServer::get_singleton()->body_create(p_mode), false) { + : CollisionObject2D(Physics2DServer::get_singleton()->body_create(), false) { + Physics2DServer::get_singleton()->body_set_mode(get_rid(), p_mode); collision_layer = 1; collision_mask = 1; set_pickable(false); diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 4286d88ab1..41097ce8d7 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -587,7 +587,9 @@ Map::Element *TileMap::_create_quadrant(cons xform.set_origin(q.pos); //q.canvas_item = VisualServer::get_singleton()->canvas_item_create(); - q.body = Physics2DServer::get_singleton()->body_create(use_kinematic ? Physics2DServer::BODY_MODE_KINEMATIC : Physics2DServer::BODY_MODE_STATIC); + q.body = Physics2DServer::get_singleton()->body_create(); + Physics2DServer::get_singleton()->body_set_mode(q.body, 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_collision_layer(q.body, collision_layer); Physics2DServer::get_singleton()->body_set_collision_mask(q.body, collision_mask); diff --git a/scene/3d/light.cpp b/scene/3d/light.cpp index 02d10523e7..389d87cd90 100644 --- a/scene/3d/light.cpp +++ b/scene/3d/light.cpp @@ -255,7 +255,13 @@ void Light::_bind_methods() { Light::Light(VisualServer::LightType p_type) { type = p_type; - light = VisualServer::get_singleton()->light_create(p_type); + switch (p_type) { + case VS::LIGHT_DIRECTIONAL: light = VisualServer::get_singleton()->directional_light_create(); break; + case VS::LIGHT_OMNI: light = VisualServer::get_singleton()->omni_light_create(); break; + case VS::LIGHT_SPOT: light = VisualServer::get_singleton()->spot_light_create(); break; + default: {}; + } + VS::get_singleton()->instance_set_base(get_instance(), light); reverse_cull = false; diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp index bc089e5b41..4e06b272e2 100644 --- a/scene/3d/physics_body.cpp +++ b/scene/3d/physics_body.cpp @@ -995,7 +995,7 @@ Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Ve Transform gt = get_global_transform(); gt.origin -= collision.travel; set_global_transform(gt); - return floor_velocity; + return floor_velocity - p_floor_direction * p_floor_direction.dot(floor_velocity); } } else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle)) { //ceiling on_ceiling = true; diff --git a/scene/resources/capsule_shape_2d.cpp b/scene/resources/capsule_shape_2d.cpp index 56a09bc3bf..912150b939 100644 --- a/scene/resources/capsule_shape_2d.cpp +++ b/scene/resources/capsule_shape_2d.cpp @@ -98,7 +98,7 @@ void CapsuleShape2D::_bind_methods() { } CapsuleShape2D::CapsuleShape2D() - : Shape2D(Physics2DServer::get_singleton()->shape_create(Physics2DServer::SHAPE_CAPSULE)) { + : Shape2D(Physics2DServer::get_singleton()->capsule_shape_create()) { radius = 10; height = 20; diff --git a/scene/resources/circle_shape_2d.cpp b/scene/resources/circle_shape_2d.cpp index ecfc98ea60..287bde4bfb 100644 --- a/scene/resources/circle_shape_2d.cpp +++ b/scene/resources/circle_shape_2d.cpp @@ -77,7 +77,7 @@ void CircleShape2D::draw(const RID &p_to_rid, const Color &p_color) { } CircleShape2D::CircleShape2D() - : Shape2D(Physics2DServer::get_singleton()->shape_create(Physics2DServer::SHAPE_CIRCLE)) { + : Shape2D(Physics2DServer::get_singleton()->circle_shape_create()) { radius = 10; _update_shape(); diff --git a/scene/resources/concave_polygon_shape_2d.cpp b/scene/resources/concave_polygon_shape_2d.cpp index 7f4abf7ae0..bb91e33ec2 100644 --- a/scene/resources/concave_polygon_shape_2d.cpp +++ b/scene/resources/concave_polygon_shape_2d.cpp @@ -85,5 +85,5 @@ void ConcavePolygonShape2D::_bind_methods() { } ConcavePolygonShape2D::ConcavePolygonShape2D() - : Shape2D(Physics2DServer::get_singleton()->shape_create(Physics2DServer::SHAPE_CONCAVE_POLYGON)) { + : Shape2D(Physics2DServer::get_singleton()->concave_polygon_shape_create()) { } diff --git a/scene/resources/convex_polygon_shape_2d.cpp b/scene/resources/convex_polygon_shape_2d.cpp index 7588909d90..a76b6a7cf4 100644 --- a/scene/resources/convex_polygon_shape_2d.cpp +++ b/scene/resources/convex_polygon_shape_2d.cpp @@ -87,7 +87,7 @@ Rect2 ConvexPolygonShape2D::get_rect() const { } ConvexPolygonShape2D::ConvexPolygonShape2D() - : Shape2D(Physics2DServer::get_singleton()->shape_create(Physics2DServer::SHAPE_CONVEX_POLYGON)) { + : Shape2D(Physics2DServer::get_singleton()->convex_polygon_shape_create()) { int pcount = 3; for (int i = 0; i < pcount; i++) diff --git a/scene/resources/rectangle_shape_2d.cpp b/scene/resources/rectangle_shape_2d.cpp index 507dbce861..69dbb76744 100644 --- a/scene/resources/rectangle_shape_2d.cpp +++ b/scene/resources/rectangle_shape_2d.cpp @@ -67,7 +67,7 @@ void RectangleShape2D::_bind_methods() { } RectangleShape2D::RectangleShape2D() - : Shape2D(Physics2DServer::get_singleton()->shape_create(Physics2DServer::SHAPE_RECTANGLE)) { + : Shape2D(Physics2DServer::get_singleton()->rectangle_shape_create()) { extents = Vector2(10, 10); _update_shape(); diff --git a/scene/resources/segment_shape_2d.cpp b/scene/resources/segment_shape_2d.cpp index 1171db5c02..7c7ec0d112 100644 --- a/scene/resources/segment_shape_2d.cpp +++ b/scene/resources/segment_shape_2d.cpp @@ -87,7 +87,7 @@ void SegmentShape2D::_bind_methods() { } SegmentShape2D::SegmentShape2D() - : Shape2D(Physics2DServer::get_singleton()->shape_create(Physics2DServer::SHAPE_SEGMENT)) { + : Shape2D(Physics2DServer::get_singleton()->segment_shape_create()) { a = Vector2(); b = Vector2(0, 10); @@ -146,7 +146,7 @@ real_t RayShape2D::get_length() const { } RayShape2D::RayShape2D() - : Shape2D(Physics2DServer::get_singleton()->shape_create(Physics2DServer::SHAPE_RAY)) { + : Shape2D(Physics2DServer::get_singleton()->ray_shape_create()) { length = 20; _update_shape(); diff --git a/scene/resources/shape_line_2d.cpp b/scene/resources/shape_line_2d.cpp index 4dcc5ac981..d046ce876c 100644 --- a/scene/resources/shape_line_2d.cpp +++ b/scene/resources/shape_line_2d.cpp @@ -96,7 +96,7 @@ void LineShape2D::_bind_methods() { } LineShape2D::LineShape2D() - : Shape2D(Physics2DServer::get_singleton()->shape_create(Physics2DServer::SHAPE_LINE)) { + : Shape2D(Physics2DServer::get_singleton()->line_shape_create()) { normal = Vector2(0, -1); d = 0; diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp index 5d3305c82d..475a3fe3b3 100644 --- a/servers/physics_2d/physics_2d_server_sw.cpp +++ b/servers/physics_2d/physics_2d_server_sw.cpp @@ -35,7 +35,7 @@ #include "project_settings.h" #include "script_language.h" -RID Physics2DServerSW::shape_create(ShapeType p_shape) { +RID Physics2DServerSW::_shape_create(ShapeType p_shape) { Shape2DSW *shape = NULL; switch (p_shape) { @@ -83,7 +83,42 @@ RID Physics2DServerSW::shape_create(ShapeType p_shape) { shape->set_self(id); return id; -}; +} + +RID Physics2DServerSW::line_shape_create() { + + return _shape_create(SHAPE_LINE); +} + +RID Physics2DServerSW::ray_shape_create() { + + return _shape_create(SHAPE_RAY); +} +RID Physics2DServerSW::segment_shape_create() { + + return _shape_create(SHAPE_SEGMENT); +} +RID Physics2DServerSW::circle_shape_create() { + + return _shape_create(SHAPE_CIRCLE); +} +RID Physics2DServerSW::rectangle_shape_create() { + + return _shape_create(SHAPE_RECTANGLE); +} +RID Physics2DServerSW::capsule_shape_create() { + + return _shape_create(SHAPE_CAPSULE); +} + +RID Physics2DServerSW::convex_polygon_shape_create() { + + return _shape_create(SHAPE_CONVEX_POLYGON); +} +RID Physics2DServerSW::concave_polygon_shape_create() { + + return _shape_create(SHAPE_CONCAVE_POLYGON); +} void Physics2DServerSW::shape_set_data(RID p_shape, const Variant &p_data) { @@ -519,17 +554,13 @@ void Physics2DServerSW::area_set_area_monitor_callback(RID p_area, Object *p_rec /* BODY API */ -RID Physics2DServerSW::body_create(BodyMode p_mode, bool p_init_sleeping) { +RID Physics2DServerSW::body_create() { Body2DSW *body = memnew(Body2DSW); - if (p_mode != BODY_MODE_RIGID) - body->set_mode(p_mode); - if (p_init_sleeping) - body->set_state(BODY_STATE_SLEEPING, p_init_sleeping); RID rid = body_owner.make_rid(body); body->set_self(rid); return rid; -}; +} void Physics2DServerSW::body_set_space(RID p_body, RID p_space) { diff --git a/servers/physics_2d/physics_2d_server_sw.h b/servers/physics_2d/physics_2d_server_sw.h index c40cf0e3e0..171a0b7a81 100644 --- a/servers/physics_2d/physics_2d_server_sw.h +++ b/servers/physics_2d/physics_2d_server_sw.h @@ -67,6 +67,9 @@ class Physics2DServerSW : public Physics2DServer { static Physics2DServerSW *singletonsw; //void _clear_query(Query2DSW *p_query); + + RID _shape_create(ShapeType p_shape); + public: struct CollCbkData { @@ -78,9 +81,17 @@ public: Vector2 *ptr; }; + virtual RID line_shape_create(); + virtual RID ray_shape_create(); + virtual RID segment_shape_create(); + virtual RID circle_shape_create(); + virtual RID rectangle_shape_create(); + virtual RID capsule_shape_create(); + virtual RID convex_polygon_shape_create(); + virtual RID concave_polygon_shape_create(); + static void _shape_col_cbk(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_userdata); - virtual RID shape_create(ShapeType p_shape); virtual void shape_set_data(RID p_shape, const Variant &p_data); virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias); @@ -149,7 +160,7 @@ public: /* BODY API */ // create a body of a given type - virtual RID body_create(BodyMode p_mode = BODY_MODE_RIGID, bool p_init_sleeping = false); + virtual RID body_create(); virtual void body_set_space(RID p_body, RID p_space); virtual RID body_get_space(RID p_body) const; diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.cpp b/servers/physics_2d/physics_2d_server_wrap_mt.cpp index f8f3b620d4..f92ed18de2 100644 --- a/servers/physics_2d/physics_2d_server_wrap_mt.cpp +++ b/servers/physics_2d/physics_2d_server_wrap_mt.cpp @@ -130,19 +130,23 @@ void Physics2DServerWrapMT::finish() { Thread::wait_to_finish(thread); memdelete(thread); - /* - shape_free_cached_ids(); - area_free_cached_ids(); - body_free_cached_ids(); - pin_joint_free_cached_ids(); - groove_joint_free_cached_ids(); - damped_string_free_cached_ids(); -*/ thread = NULL; } else { physics_2d_server->finish(); } + line_shape_free_cached_ids(); + ray_shape_free_cached_ids(); + segment_shape_free_cached_ids(); + circle_shape_free_cached_ids(); + rectangle_shape_free_cached_ids(); + convex_polygon_shape_free_cached_ids(); + concave_polygon_shape_free_cached_ids(); + + space_free_cached_ids(); + area_free_cached_ids(); + body_free_cached_ids(); + if (step_sem) memdelete(step_sem); } @@ -158,12 +162,7 @@ Physics2DServerWrapMT::Physics2DServerWrapMT(Physics2DServer *p_contained, bool step_thread_up = false; alloc_mutex = Mutex::create(); - shape_pool_max_size = GLOBAL_GET("memory/limits/multithreaded_server/rid_pool_prealloc"); - area_pool_max_size = GLOBAL_GET("memory/limits/multithreaded_server/rid_pool_prealloc"); - body_pool_max_size = GLOBAL_GET("memory/limits/multithreaded_server/rid_pool_prealloc"); - pin_joint_pool_max_size = GLOBAL_GET("memory/limits/multithreaded_server/rid_pool_prealloc"); - groove_joint_pool_max_size = GLOBAL_GET("memory/limits/multithreaded_server/rid_pool_prealloc"); - damped_spring_joint_pool_max_size = GLOBAL_GET("memory/limits/multithreaded_server/rid_pool_prealloc"); + pool_max_size = GLOBAL_GET("memory/limits/multithreaded_server/rid_pool_prealloc"); if (!p_create_thread) { server_thread = Thread::get_caller_id(); diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.h b/servers/physics_2d/physics_2d_server_wrap_mt.h index 50e9ab1005..cbc316cb7a 100644 --- a/servers/physics_2d/physics_2d_server_wrap_mt.h +++ b/servers/physics_2d/physics_2d_server_wrap_mt.h @@ -64,21 +64,10 @@ class Physics2DServerWrapMT : public Physics2DServer { void thread_exit(); - Mutex *alloc_mutex; bool first_frame; - int shape_pool_max_size; - List shape_id_pool; - int area_pool_max_size; - List area_id_pool; - int body_pool_max_size; - List body_id_pool; - int pin_joint_pool_max_size; - List pin_joint_id_pool; - int groove_joint_pool_max_size; - List groove_joint_id_pool; - int damped_spring_joint_pool_max_size; - List damped_spring_joint_id_pool; + Mutex *alloc_mutex; + int pool_max_size; public: #define ServerName Physics2DServer @@ -87,7 +76,15 @@ public: #include "servers/server_wrap_mt_common.h" //FUNC1RID(shape,ShapeType); todo fix - FUNC1R(RID, shape_create, ShapeType); + FUNCRID(line_shape) + FUNCRID(ray_shape) + FUNCRID(segment_shape) + FUNCRID(circle_shape) + FUNCRID(rectangle_shape) + FUNCRID(capsule_shape) + FUNCRID(convex_polygon_shape) + FUNCRID(concave_polygon_shape) + FUNC2(shape_set_data, RID, const Variant &); FUNC2(shape_set_custom_solver_bias, RID, real_t); @@ -104,7 +101,7 @@ public: /* SPACE API */ - FUNC0R(RID, space_create); + FUNCRID(space); FUNC2(space_set_active, RID, bool); FUNC1RC(bool, space_is_active, RID); @@ -134,7 +131,7 @@ public: /* AREA API */ //FUNC0RID(area); - FUNC0R(RID, area_create); + FUNCRID(area); FUNC2(area_set_space, RID, RID); FUNC1RC(RID, area_get_space, RID); @@ -174,7 +171,7 @@ public: /* BODY API */ //FUNC2RID(body,BodyMode,bool); - FUNC2R(RID, body_create, BodyMode, bool) + FUNCRID(body) FUNC2(body_set_space, RID, RID); FUNC1RC(RID, body_get_space, RID); @@ -269,6 +266,8 @@ public: ///FUNC5RID(groove_joint,const Vector2&,const Vector2&,const Vector2&,RID,RID); ///FUNC4RID(damped_spring_joint,const Vector2&,const Vector2&,RID,RID); + //TODO need to convert this to FUNCRID, but it's a hassle.. + FUNC3R(RID, pin_joint_create, const Vector2 &, RID, RID); FUNC5R(RID, groove_joint_create, const Vector2 &, const Vector2 &, const Vector2 &, RID, RID); FUNC4R(RID, damped_spring_joint_create, const Vector2 &, const Vector2 &, RID, RID); diff --git a/servers/physics_2d_server.cpp b/servers/physics_2d_server.cpp index 130c0583dc..a5128c9435 100644 --- a/servers/physics_2d_server.cpp +++ b/servers/physics_2d_server.cpp @@ -475,7 +475,15 @@ bool Physics2DServer::_body_test_motion(RID p_body, const Transform2D &p_from, c void Physics2DServer::_bind_methods() { - ClassDB::bind_method(D_METHOD("shape_create", "type"), &Physics2DServer::shape_create); + ClassDB::bind_method(D_METHOD("line_shape_create"), &Physics2DServer::line_shape_create); + ClassDB::bind_method(D_METHOD("ray_shape_create"), &Physics2DServer::ray_shape_create); + ClassDB::bind_method(D_METHOD("segment_shape_create"), &Physics2DServer::segment_shape_create); + ClassDB::bind_method(D_METHOD("circle_shape_create"), &Physics2DServer::circle_shape_create); + ClassDB::bind_method(D_METHOD("rectangle_shape_create"), &Physics2DServer::rectangle_shape_create); + ClassDB::bind_method(D_METHOD("capsule_shape_create"), &Physics2DServer::capsule_shape_create); + ClassDB::bind_method(D_METHOD("convex_polygon_shape_create"), &Physics2DServer::convex_polygon_shape_create); + ClassDB::bind_method(D_METHOD("concave_polygon_shape_create"), &Physics2DServer::concave_polygon_shape_create); + ClassDB::bind_method(D_METHOD("shape_set_data", "shape", "data"), &Physics2DServer::shape_set_data); ClassDB::bind_method(D_METHOD("shape_get_type", "shape"), &Physics2DServer::shape_get_type); diff --git a/servers/physics_2d_server.h b/servers/physics_2d_server.h index ddd1555768..241255bdb5 100644 --- a/servers/physics_2d_server.h +++ b/servers/physics_2d_server.h @@ -252,7 +252,15 @@ public: SHAPE_CUSTOM, ///< Server-Implementation based custom shape, calling shape_create() with this value will result in an error }; - virtual RID shape_create(ShapeType p_shape) = 0; + virtual RID line_shape_create() = 0; + virtual RID ray_shape_create() = 0; + virtual RID segment_shape_create() = 0; + virtual RID circle_shape_create() = 0; + virtual RID rectangle_shape_create() = 0; + virtual RID capsule_shape_create() = 0; + virtual RID convex_polygon_shape_create() = 0; + virtual RID concave_polygon_shape_create() = 0; + virtual void shape_set_data(RID p_shape, const Variant &p_data) = 0; virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias) = 0; @@ -366,7 +374,7 @@ public: //BODY_MODE_SOFT ?? }; - virtual RID body_create(BodyMode p_mode = BODY_MODE_RIGID, bool p_init_sleeping = false) = 0; + virtual RID body_create() = 0; virtual void body_set_space(RID p_body, RID p_space) = 0; virtual RID body_get_space(RID p_body) const = 0; diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h index cd4b465d79..164baa8c9b 100644 --- a/servers/visual/rasterizer.h +++ b/servers/visual/rasterizer.h @@ -320,6 +320,10 @@ public: virtual RID light_create(VS::LightType p_type) = 0; + RID directional_light_create() { return light_create(VS::LIGHT_DIRECTIONAL); } + RID omni_light_create() { return light_create(VS::LIGHT_OMNI); } + RID spot_light_create() { return light_create(VS::LIGHT_SPOT); } + virtual void light_set_color(RID p_light, const Color &p_color) = 0; virtual void light_set_param(RID p_light, VS::LightParam p_param, float p_value) = 0; virtual void light_set_shadow(RID p_light, bool p_enabled) = 0; diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index 425381550e..b579f4032f 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -799,7 +799,9 @@ public: /* Light API */ - BIND1R(RID, light_create, LightType) + BIND0R(RID, directional_light_create) + BIND0R(RID, omni_light_create) + BIND0R(RID, spot_light_create) BIND2(light_set_color, RID, const Color &) BIND3(light_set_param, RID, LightParam, float) diff --git a/servers/visual/visual_server_wrap_mt.cpp b/servers/visual/visual_server_wrap_mt.cpp index d9a0077e60..1a03c72529 100644 --- a/servers/visual/visual_server_wrap_mt.cpp +++ b/servers/visual/visual_server_wrap_mt.cpp @@ -154,14 +154,34 @@ void VisualServerWrapMT::finish() { Thread::wait_to_finish(thread); memdelete(thread); - texture_free_cached_ids(); - //mesh_free_cached_ids(); - thread = NULL; } else { visual_server->finish(); } + texture_free_cached_ids(); + shader_free_cached_ids(); + material_free_cached_ids(); + mesh_free_cached_ids(); + multimesh_free_cached_ids(); + immediate_free_cached_ids(); + skeleton_free_cached_ids(); + directional_light_free_cached_ids(); + omni_light_free_cached_ids(); + spot_light_free_cached_ids(); + reflection_probe_free_cached_ids(); + gi_probe_free_cached_ids(); + particles_free_cached_ids(); + camera_free_cached_ids(); + viewport_free_cached_ids(); + environment_free_cached_ids(); + scenario_free_cached_ids(); + instance_free_cached_ids(); + canvas_free_cached_ids(); + canvas_item_free_cached_ids(); + canvas_light_occluder_free_cached_ids(); + canvas_occluder_polygon_free_cached_ids(); + if (draw_mutex) memdelete(draw_mutex); } diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h index 67d503dfca..80a1ef3879 100644 --- a/servers/visual/visual_server_wrap_mt.h +++ b/servers/visual/visual_server_wrap_mt.h @@ -103,12 +103,12 @@ public: /* SKY API */ - FUNC0R(RID, sky_create) + FUNCRID(sky) FUNC3(sky_set_texture, RID, RID, int) /* SHADER API */ - FUNC0R(RID, shader_create) + FUNCRID(shader) FUNC2(shader_set_code, RID, const String &) FUNC1RC(String, shader_get_code, RID) @@ -120,7 +120,7 @@ public: /* COMMON MATERIAL API */ - FUNC0R(RID, material_create) + FUNCRID(material) FUNC2(material_set_shader, RID, RID) FUNC1RC(RID, material_get_shader, RID) @@ -134,7 +134,7 @@ public: /* MESH API */ - FUNC0R(RID, mesh_create) + FUNCRID(mesh) FUNC10(mesh_add_surface, RID, uint32_t, PrimitiveType, const PoolVector &, int, const PoolVector &, int, const Rect3 &, const Vector > &, const Vector &) @@ -170,7 +170,7 @@ public: /* MULTIMESH API */ - FUNC0R(RID, multimesh_create) + FUNCRID(multimesh) FUNC4(multimesh_allocate, RID, int, MultimeshTransformFormat, MultimeshColorFormat) FUNC1RC(int, multimesh_get_instance_count, RID) @@ -192,7 +192,7 @@ public: /* IMMEDIATE API */ - FUNC0R(RID, immediate_create) + FUNCRID(immediate) FUNC3(immediate_begin, RID, PrimitiveType, RID) FUNC2(immediate_vertex, RID, const Vector3 &) FUNC2(immediate_normal, RID, const Vector3 &) @@ -207,7 +207,7 @@ public: /* SKELETON API */ - FUNC0R(RID, skeleton_create) + FUNCRID(skeleton) FUNC3(skeleton_allocate, RID, int, bool) FUNC1RC(int, skeleton_get_bone_count, RID) FUNC3(skeleton_bone_set_transform, RID, int, const Transform &) @@ -217,7 +217,9 @@ public: /* Light API */ - FUNC1R(RID, light_create, LightType) + FUNCRID(directional_light) + FUNCRID(omni_light) + FUNCRID(spot_light) FUNC2(light_set_color, RID, const Color &) FUNC3(light_set_param, RID, LightParam, float) @@ -237,7 +239,7 @@ public: /* PROBE API */ - FUNC0R(RID, reflection_probe_create) + FUNCRID(reflection_probe) FUNC2(reflection_probe_set_update_mode, RID, ReflectionProbeUpdateMode) FUNC2(reflection_probe_set_intensity, RID, float) @@ -254,7 +256,7 @@ public: /* BAKED LIGHT API */ - FUNC0R(RID, gi_probe_create) + FUNCRID(gi_probe) FUNC2(gi_probe_set_bounds, RID, const Rect3 &) FUNC1RC(Rect3, gi_probe_get_bounds, RID) @@ -291,7 +293,7 @@ public: /* PARTICLES */ - FUNC0R(RID, particles_create) + FUNCRID(particles) FUNC2(particles_set_emitting, RID, bool) FUNC2(particles_set_amount, RID, int) @@ -318,7 +320,7 @@ public: /* CAMERA API */ - FUNC0R(RID, camera_create) + FUNCRID(camera) FUNC4(camera_set_perspective, RID, float, float, float) FUNC4(camera_set_orthogonal, RID, float, float, float) FUNC2(camera_set_transform, RID, const Transform &) @@ -328,7 +330,7 @@ public: /* VIEWPORT TARGET API */ - FUNC0R(RID, viewport_create) + FUNCRID(viewport) FUNC2(viewport_set_use_arvr, RID, bool) @@ -377,7 +379,7 @@ public: /* ENVIRONMENT API */ - FUNC0R(RID, environment_create) + FUNCRID(environment) FUNC2(environment_set_background, RID, EnvironmentBG) FUNC2(environment_set_sky, RID, RID) @@ -401,7 +403,7 @@ public: FUNC6(environment_set_fog_depth, RID, bool, float, float, bool, float) FUNC5(environment_set_fog_height, RID, bool, float, float, float) - FUNC0R(RID, scenario_create) + FUNCRID(scenario) FUNC2(scenario_set_debug, RID, ScenarioDebugMode) FUNC2(scenario_set_environment, RID, RID) @@ -410,7 +412,7 @@ public: /* INSTANCING API */ // from can be mesh, light, area and portal so far. - FUNC0R(RID, instance_create) + FUNCRID(instance) FUNC2(instance_set_base, RID, RID) // from can be mesh, light, poly, area and portal so far. FUNC2(instance_set_scenario, RID, RID) // from can be mesh, light, poly, area and portal so far. @@ -440,11 +442,11 @@ public: /* CANVAS (2D) */ - FUNC0R(RID, canvas_create) + FUNCRID(canvas) FUNC3(canvas_set_item_mirroring, RID, RID, const Point2 &) FUNC2(canvas_set_modulate, RID, const Color &) - FUNC0R(RID, canvas_item_create) + FUNCRID(canvas_item) FUNC2(canvas_item_set_parent, RID, RID) FUNC2(canvas_item_set_visible, RID, bool) @@ -510,14 +512,14 @@ public: FUNC2(canvas_light_set_shadow_color, RID, const Color &) FUNC2(canvas_light_set_shadow_smooth, RID, float) - FUNC0R(RID, canvas_light_occluder_create) + FUNCRID(canvas_light_occluder) FUNC2(canvas_light_occluder_attach_to_canvas, RID, RID) FUNC2(canvas_light_occluder_set_enabled, RID, bool) FUNC2(canvas_light_occluder_set_polygon, RID, RID) FUNC2(canvas_light_occluder_set_transform, RID, const Transform2D &) FUNC2(canvas_light_occluder_set_light_mask, RID, int) - FUNC0R(RID, canvas_occluder_polygon_create) + FUNCRID(canvas_occluder_polygon) FUNC3(canvas_occluder_polygon_set_shape, RID, const PoolVector &, bool) FUNC2(canvas_occluder_polygon_set_shape_as_lines, RID, const PoolVector &) diff --git a/servers/visual_server.h b/servers/visual_server.h index 64ed540501..86c32a45a0 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -373,7 +373,9 @@ public: LIGHT_PARAM_MAX }; - virtual RID light_create(LightType p_type) = 0; + virtual RID directional_light_create() = 0; + virtual RID omni_light_create() = 0; + virtual RID spot_light_create() = 0; virtual void light_set_color(RID p_light, const Color &p_color) = 0; virtual void light_set_param(RID p_light, LightParam p_param, float p_value) = 0; -- cgit v1.2.3