diff --git a/doc/classes/VisualServer.xml b/doc/classes/VisualServer.xml index 2b370bb9a30..abe44ca3b90 100644 --- a/doc/classes/VisualServer.xml +++ b/doc/classes/VisualServer.xml @@ -45,6 +45,14 @@ Once finished with your RID, you will want to free the RID using the VisualServer's [method free_rid] static method. + + + + + Prevents physics interpolation for the current physics tick. + This is useful when moving a [Camera] to a new location, to give an instantaneous change rather than interpolation from the previous location. + + @@ -72,6 +80,14 @@ Sets camera to use frustum projection. This mode allows adjusting the [code]offset[/code] argument to create "tilted frustum" effects. + + + + + + Turns on and off physics interpolation for the [Camera]. + + @@ -1404,6 +1420,14 @@ Sets a material that will override the material for all surfaces on the mesh associated with this instance. Equivalent to [member GeometryInstance.material_override]. + + + + + Prevents physics interpolation for the current physics tick. + This is useful when moving an instance to a new location, to give an instantaneous change rather than interpolation from the previous location. + + @@ -1445,6 +1469,14 @@ Sets a margin to increase the size of the AABB when culling objects from the view frustum. This allows you to avoid culling objects that fall outside the view frustum. Equivalent to [member GeometryInstance.extra_cull_margin]. + + + + + + Turns on and off physics interpolation for the instance. + + @@ -2115,6 +2147,15 @@ Returns the [Transform2D] of the specified instance. For use when the multimesh is set to use 2D transforms. + + + + + + Prevents physics interpolation for the specified instance during the current physics tick. + This is useful when moving an instance to a new location, to give an instantaneous change rather than interpolation from the previous location. + + @@ -2163,6 +2204,16 @@ [Transform] is stored as 12 floats, [Transform2D] is stored as 8 floats, [code]COLOR_8BIT[/code] / [code]CUSTOM_DATA_8BIT[/code] is stored as 1 float (4 bytes as is) and [code]COLOR_FLOAT[/code] / [code]CUSTOM_DATA_FLOAT[/code] is stored as 4 floats. + + + + + + + Alternative version of [method multimesh_set_as_bulk_array] for use with physics interpolation. + Takes both an array of current data and an array of data for the previous physics tick. + + @@ -2171,6 +2222,23 @@ Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh.mesh]. + + + + + + Turns on and off physics interpolation for the [MultiMesh]. + + + + + + + + Sets the physics interpolation quality for the [MultiMesh]. + A value of [code]0[/code] gives fast but low quality interpolation, a value of [code]1[/code] gives slower but higher quality interpolation. + + @@ -3801,6 +3869,12 @@ MultiMesh custom data uses a float per component. + + MultiMesh physics interpolation favours speed over quality. + + + MultiMesh physics interpolation favours quality over speed. + Reflection probe will update reflections once and then stop. diff --git a/scene/resources/multimesh.cpp b/scene/resources/multimesh.cpp index 9bd55274bd1..c9b37da0bff 100644 --- a/scene/resources/multimesh.cpp +++ b/scene/resources/multimesh.cpp @@ -219,7 +219,7 @@ void MultiMesh::set_visible_instance_count(int p_count) { void MultiMesh::set_physics_interpolation_quality(PhysicsInterpolationQuality p_quality) { _physics_interpolation_quality = p_quality; - VisualServer::get_singleton()->multimesh_set_physics_interpolation_quality(multimesh, (int)p_quality); + VisualServer::get_singleton()->multimesh_set_physics_interpolation_quality(multimesh, (VS::MultimeshPhysicsInterpolationQuality)p_quality); } int MultiMesh::get_visible_instance_count() const { diff --git a/servers/visual/rasterizer.cpp b/servers/visual/rasterizer.cpp index 18c70c01d33..35cce2cb85f 100644 --- a/servers/visual/rasterizer.cpp +++ b/servers/visual/rasterizer.cpp @@ -466,11 +466,11 @@ void RasterizerStorage::multimesh_set_physics_interpolated(RID p_multimesh, bool } } -void RasterizerStorage::multimesh_set_physics_interpolation_quality(RID p_multimesh, int p_quality) { +void RasterizerStorage::multimesh_set_physics_interpolation_quality(RID p_multimesh, VS::MultimeshPhysicsInterpolationQuality p_quality) { ERR_FAIL_COND((p_quality < 0) || (p_quality > 1)); MMInterpolator *mmi = _multimesh_get_interpolator(p_multimesh); if (mmi) { - mmi->quality = p_quality; + mmi->quality = (int)p_quality; } } diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h index ce71698a77b..8b0ff0bbdb7 100644 --- a/servers/visual/rasterizer.h +++ b/servers/visual/rasterizer.h @@ -389,7 +389,7 @@ public: virtual void multimesh_set_as_bulk_array_interpolated(RID p_multimesh, const PoolVector &p_array, const PoolVector &p_array_prev); virtual void multimesh_set_physics_interpolated(RID p_multimesh, bool p_interpolated); - virtual void multimesh_set_physics_interpolation_quality(RID p_multimesh, int p_quality); + virtual void multimesh_set_physics_interpolation_quality(RID p_multimesh, VS::MultimeshPhysicsInterpolationQuality p_quality); virtual void multimesh_instance_reset_physics_interpolation(RID p_multimesh, int p_index); virtual void multimesh_set_visible_instances(RID p_multimesh, int p_visible); diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index 48f0c73c1ec..ccd1d7ea62f 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -286,7 +286,7 @@ public: BIND3(multimesh_set_as_bulk_array_interpolated, RID, const PoolVector &, const PoolVector &) BIND2(multimesh_set_physics_interpolated, RID, bool) - BIND2(multimesh_set_physics_interpolation_quality, RID, int) + BIND2(multimesh_set_physics_interpolation_quality, RID, MultimeshPhysicsInterpolationQuality) BIND2(multimesh_instance_reset_physics_interpolation, RID, int) BIND2(multimesh_set_visible_instances, RID, int) diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h index 1a321780f22..cc05bafa9a1 100644 --- a/servers/visual/visual_server_wrap_mt.h +++ b/servers/visual/visual_server_wrap_mt.h @@ -209,7 +209,7 @@ public: FUNC3(multimesh_set_as_bulk_array_interpolated, RID, const PoolVector &, const PoolVector &) FUNC2(multimesh_set_physics_interpolated, RID, bool) - FUNC2(multimesh_set_physics_interpolation_quality, RID, int) + FUNC2(multimesh_set_physics_interpolation_quality, RID, MultimeshPhysicsInterpolationQuality) FUNC2(multimesh_instance_reset_physics_interpolation, RID, int) FUNC2(multimesh_set_visible_instances, RID, int) diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index f56e4202775..41bd45a1d4b 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -1932,6 +1932,10 @@ void VisualServer::_bind_methods() { ClassDB::bind_method(D_METHOD("multimesh_set_visible_instances", "multimesh", "visible"), &VisualServer::multimesh_set_visible_instances); ClassDB::bind_method(D_METHOD("multimesh_get_visible_instances", "multimesh"), &VisualServer::multimesh_get_visible_instances); ClassDB::bind_method(D_METHOD("multimesh_set_as_bulk_array", "multimesh", "array"), &VisualServer::multimesh_set_as_bulk_array); + ClassDB::bind_method(D_METHOD("multimesh_set_as_bulk_array_interpolated", "multimesh", "array", "array_previous"), &VisualServer::multimesh_set_as_bulk_array_interpolated); + ClassDB::bind_method(D_METHOD("multimesh_set_physics_interpolated", "multimesh", "interpolated"), &VisualServer::multimesh_set_physics_interpolated); + ClassDB::bind_method(D_METHOD("multimesh_set_physics_interpolation_quality", "multimesh", "quality"), &VisualServer::multimesh_set_physics_interpolation_quality); + ClassDB::bind_method(D_METHOD("multimesh_instance_reset_physics_interpolation", "multimesh", "index"), &VisualServer::multimesh_instance_reset_physics_interpolation); #ifndef _3D_DISABLED ClassDB::bind_method(D_METHOD("immediate_create"), &VisualServer::immediate_create); ClassDB::bind_method(D_METHOD("immediate_begin", "immediate", "primitive", "texture"), &VisualServer::immediate_begin, DEFVAL(RID())); @@ -2060,6 +2064,8 @@ void VisualServer::_bind_methods() { ClassDB::bind_method(D_METHOD("camera_set_orthogonal", "camera", "size", "z_near", "z_far"), &VisualServer::camera_set_orthogonal); ClassDB::bind_method(D_METHOD("camera_set_frustum", "camera", "size", "offset", "z_near", "z_far"), &VisualServer::camera_set_frustum); ClassDB::bind_method(D_METHOD("camera_set_transform", "camera", "transform"), &VisualServer::camera_set_transform); + ClassDB::bind_method(D_METHOD("camera_set_interpolated", "camera", "interpolated"), &VisualServer::camera_set_interpolated); + ClassDB::bind_method(D_METHOD("camera_reset_physics_interpolation", "camera"), &VisualServer::camera_reset_physics_interpolation); ClassDB::bind_method(D_METHOD("camera_set_cull_mask", "camera", "layers"), &VisualServer::camera_set_cull_mask); ClassDB::bind_method(D_METHOD("camera_set_environment", "camera", "env"), &VisualServer::camera_set_environment); ClassDB::bind_method(D_METHOD("camera_set_use_vertical_aspect", "camera", "enable"), &VisualServer::camera_set_use_vertical_aspect); @@ -2136,6 +2142,8 @@ void VisualServer::_bind_methods() { ClassDB::bind_method(D_METHOD("instance_set_scenario", "instance", "scenario"), &VisualServer::instance_set_scenario); ClassDB::bind_method(D_METHOD("instance_set_layer_mask", "instance", "mask"), &VisualServer::instance_set_layer_mask); ClassDB::bind_method(D_METHOD("instance_set_transform", "instance", "transform"), &VisualServer::instance_set_transform); + ClassDB::bind_method(D_METHOD("instance_set_interpolated", "instance", "interpolated"), &VisualServer::instance_set_interpolated); + ClassDB::bind_method(D_METHOD("instance_reset_physics_interpolation", "instance"), &VisualServer::instance_reset_physics_interpolation); ClassDB::bind_method(D_METHOD("instance_attach_object_instance_id", "instance", "id"), &VisualServer::instance_attach_object_instance_id); ClassDB::bind_method(D_METHOD("instance_set_blend_shape_weight", "instance", "shape", "weight"), &VisualServer::instance_set_blend_shape_weight); ClassDB::bind_method(D_METHOD("instance_set_surface_material", "instance", "surface", "material"), &VisualServer::instance_set_surface_material); @@ -2487,6 +2495,8 @@ void VisualServer::_bind_methods() { BIND_ENUM_CONSTANT(MULTIMESH_CUSTOM_DATA_NONE); BIND_ENUM_CONSTANT(MULTIMESH_CUSTOM_DATA_8BIT); BIND_ENUM_CONSTANT(MULTIMESH_CUSTOM_DATA_FLOAT); + BIND_ENUM_CONSTANT(MULTIMESH_INTERP_QUALITY_FAST); + BIND_ENUM_CONSTANT(MULTIMESH_INTERP_QUALITY_HIGH); BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ONCE); BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ALWAYS); diff --git a/servers/visual_server.h b/servers/visual_server.h index f14060de72b..c8df95039e8 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -362,6 +362,11 @@ public: MULTIMESH_CUSTOM_DATA_MAX, }; + enum MultimeshPhysicsInterpolationQuality { + MULTIMESH_INTERP_QUALITY_FAST, + MULTIMESH_INTERP_QUALITY_HIGH, + }; + virtual void multimesh_allocate(RID p_multimesh, int p_instances, MultimeshTransformFormat p_transform_format, MultimeshColorFormat p_color_format, MultimeshCustomDataFormat p_data_format = MULTIMESH_CUSTOM_DATA_NONE) = 0; virtual int multimesh_get_instance_count(RID p_multimesh) const = 0; @@ -384,7 +389,7 @@ public: // Interpolation virtual void multimesh_set_as_bulk_array_interpolated(RID p_multimesh, const PoolVector &p_array, const PoolVector &p_array_prev) = 0; virtual void multimesh_set_physics_interpolated(RID p_multimesh, bool p_interpolated) = 0; - virtual void multimesh_set_physics_interpolation_quality(RID p_multimesh, int p_quality) = 0; + virtual void multimesh_set_physics_interpolation_quality(RID p_multimesh, MultimeshPhysicsInterpolationQuality p_quality) = 0; virtual void multimesh_instance_reset_physics_interpolation(RID p_multimesh, int p_index) = 0; virtual void multimesh_set_visible_instances(RID p_multimesh, int p_visible) = 0; @@ -1236,6 +1241,7 @@ VARIANT_ENUM_CAST(VisualServer::Features); VARIANT_ENUM_CAST(VisualServer::MultimeshTransformFormat); VARIANT_ENUM_CAST(VisualServer::MultimeshColorFormat); VARIANT_ENUM_CAST(VisualServer::MultimeshCustomDataFormat); +VARIANT_ENUM_CAST(VisualServer::MultimeshPhysicsInterpolationQuality); VARIANT_ENUM_CAST(VisualServer::LightBakeMode); VARIANT_ENUM_CAST(VisualServer::LightOmniShadowMode); VARIANT_ENUM_CAST(VisualServer::LightOmniShadowDetail);