diff --git a/scene/resources/multimesh.cpp b/scene/resources/multimesh.cpp index 2eb74ef15af8..8b5b5856d1c4 100644 --- a/scene/resources/multimesh.cpp +++ b/scene/resources/multimesh.cpp @@ -198,6 +198,12 @@ void MultiMesh::set_buffer(const Vector &p_buffer) { if (instance_count == 0) { return; } + + uint32_t stride = transform_format == TRANSFORM_2D ? 8 : 12; + stride += use_colors ? 4 : 0; + stride += use_custom_data ? 4 : 0; + ERR_FAIL_COND_MSG(stride * instance_count != p_buffer.size(), "Cannot set a buffer on a Multimesh that is a different size from the Multimeshes existing buffer."); + RS::get_singleton()->multimesh_set_buffer(multimesh, p_buffer); } @@ -249,39 +255,56 @@ void MultiMesh::set_physics_interpolation_quality(PhysicsInterpolationQuality p_ } void MultiMesh::set_instance_transform(int p_instance, const Transform3D &p_transform) { + ERR_FAIL_INDEX_MSG(p_instance, instance_count, "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); + ERR_FAIL_COND_MSG(transform_format == TRANSFORM_2D, "Can't set Transform3D on a Multimesh configured to use Transform2D. Ensure that you have set the `transform_format` to `TRANSFORM_3D`."); RenderingServer::get_singleton()->multimesh_instance_set_transform(multimesh, p_instance, p_transform); } void MultiMesh::set_instance_transform_2d(int p_instance, const Transform2D &p_transform) { + ERR_FAIL_INDEX_MSG(p_instance, instance_count, "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); + ERR_FAIL_COND_MSG(transform_format == TRANSFORM_3D, "Can't set Transform2D on a Multimesh configured to use Transform3D. Ensure that you have set the `transform_format` to `TRANSFORM_2D`."); RenderingServer::get_singleton()->multimesh_instance_set_transform_2d(multimesh, p_instance, p_transform); emit_changed(); } Transform3D MultiMesh::get_instance_transform(int p_instance) const { + ERR_FAIL_INDEX_V_MSG(p_instance, instance_count, Transform3D(), "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); + ERR_FAIL_COND_V_MSG(transform_format == TRANSFORM_2D, Transform3D(), "Can't get Transform3D on a Multimesh configured to use Transform2D. Ensure that you have set the `transform_format` to `TRANSFORM_3D`."); return RenderingServer::get_singleton()->multimesh_instance_get_transform(multimesh, p_instance); } Transform2D MultiMesh::get_instance_transform_2d(int p_instance) const { + ERR_FAIL_INDEX_V_MSG(p_instance, instance_count, Transform2D(), "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); + ERR_FAIL_COND_V_MSG(transform_format == TRANSFORM_3D, Transform2D(), "Can't get Transform2D on a Multimesh configured to use Transform3D. Ensure that you have set the `transform_format` to `TRANSFORM_2D`."); return RenderingServer::get_singleton()->multimesh_instance_get_transform_2d(multimesh, p_instance); } void MultiMesh::set_instance_color(int p_instance, const Color &p_color) { + ERR_FAIL_INDEX_MSG(p_instance, instance_count, "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); + ERR_FAIL_COND_MSG(!use_colors, "Can't set instance color on a Multimesh that isn't using colors. Ensure that you have `use_colors` property of this Multimesh set to `true`."); RenderingServer::get_singleton()->multimesh_instance_set_color(multimesh, p_instance, p_color); } Color MultiMesh::get_instance_color(int p_instance) const { + ERR_FAIL_INDEX_V_MSG(p_instance, instance_count, Color(), "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); + ERR_FAIL_COND_V_MSG(!use_colors, Color(), "Can't get instance color on a Multimesh that isn't using colors. Ensure that you have `use_colors` property of this Multimesh set to `true`."); return RenderingServer::get_singleton()->multimesh_instance_get_color(multimesh, p_instance); } void MultiMesh::set_instance_custom_data(int p_instance, const Color &p_custom_data) { + ERR_FAIL_INDEX_MSG(p_instance, instance_count, "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); + ERR_FAIL_COND_MSG(!use_custom_data, "Can't get instance custom data on a Multimesh that isn't using custom data. Ensure that you have `use_custom_data` property of this Multimesh set to `true`."); RenderingServer::get_singleton()->multimesh_instance_set_custom_data(multimesh, p_instance, p_custom_data); } Color MultiMesh::get_instance_custom_data(int p_instance) const { + ERR_FAIL_INDEX_V_MSG(p_instance, instance_count, Color(), "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); + ERR_FAIL_COND_V_MSG(!use_custom_data, Color(), "Can't get instance custom data on a Multimesh that isn't using custom data. Ensure that you have `use_custom_data` property of this Multimesh set to `true`."); return RenderingServer::get_singleton()->multimesh_instance_get_custom_data(multimesh, p_instance); } void MultiMesh::reset_instance_physics_interpolation(int p_instance) { + ERR_FAIL_INDEX_MSG(p_instance, instance_count, "Instance index out of bounds. Instance index must be a positive number that is less than `instance_count`."); RenderingServer::get_singleton()->multimesh_instance_reset_physics_interpolation(multimesh, p_instance); } @@ -308,7 +331,7 @@ RID MultiMesh::get_rid() const { } void MultiMesh::set_use_colors(bool p_enable) { - ERR_FAIL_COND(instance_count > 0); + ERR_FAIL_COND_MSG(instance_count > 0, "Instance count must be 0 to toggle whether colors are used."); use_colors = p_enable; } @@ -317,7 +340,7 @@ bool MultiMesh::is_using_colors() const { } void MultiMesh::set_use_custom_data(bool p_enable) { - ERR_FAIL_COND(instance_count > 0); + ERR_FAIL_COND_MSG(instance_count > 0, "Instance count must be 0 to toggle whether custom data is used."); use_custom_data = p_enable; } @@ -326,7 +349,7 @@ bool MultiMesh::is_using_custom_data() const { } void MultiMesh::set_transform_format(TransformFormat p_transform_format) { - ERR_FAIL_COND(instance_count > 0); + ERR_FAIL_COND_MSG(instance_count > 0, "Instance count must be 0 to change the transform format."); transform_format = p_transform_format; }