Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2019-08-08 18:16:54 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2019-08-08 18:20:39 +0300
commit1342d1879e121b1cf4118a232139d906a7da1ee6 (patch)
treea59dc6874e1922b595bce62f5c21ccc98e1a7f6f
parent45ec08dc991c29f60d1ec4a39df7c7364cde631c (diff)
Fix T52551: undo causes crash after enabling a new rigid body when scene uses a referenced rigid body world.
Poll functions were not correct here, we cannot make objects part of rigidbody sim if the RB collection is a linked one...
-rw-r--r--source/blender/editors/physics/rigidbody_constraint.c32
-rw-r--r--source/blender/editors/physics/rigidbody_object.c22
-rw-r--r--source/blender/editors/screen/screen_ops.c4
3 files changed, 49 insertions, 9 deletions
diff --git a/source/blender/editors/physics/rigidbody_constraint.c b/source/blender/editors/physics/rigidbody_constraint.c
index 2c454448b9b..a1d76174cc8 100644
--- a/source/blender/editors/physics/rigidbody_constraint.c
+++ b/source/blender/editors/physics/rigidbody_constraint.c
@@ -46,6 +46,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_object.h"
#include "ED_physics.h"
#include "ED_screen.h"
@@ -56,12 +57,37 @@
static bool ED_operator_rigidbody_con_active_poll(bContext *C)
{
+ Scene *scene = CTX_data_scene(C);
+ if (scene == NULL || ID_IS_LINKED(&scene->id) ||
+ (scene->rigidbody_world != NULL && scene->rigidbody_world->constraints != NULL &&
+ ID_IS_LINKED(&scene->rigidbody_world->constraints->id))) {
+ return false;
+ }
+
if (ED_operator_object_active_editable(C)) {
- Object *ob = CTX_data_active_object(C);
+ Object *ob = ED_object_active_context(C);
return (ob && ob->rigidbody_constraint);
}
else {
- return 0;
+ return false;
+ }
+}
+
+static bool ED_operator_rigidbody_con_add_poll(bContext *C)
+{
+ Scene *scene = CTX_data_scene(C);
+ if (scene == NULL || ID_IS_LINKED(&scene->id) ||
+ (scene->rigidbody_world != NULL && scene->rigidbody_world->constraints != NULL &&
+ ID_IS_LINKED(&scene->rigidbody_world->constraints->id))) {
+ return false;
+ }
+
+ if (ED_operator_object_active_editable(C)) {
+ Object *ob = ED_object_active_context(C);
+ return (ob && ob->type == OB_MESH);
+ }
+ else {
+ return false;
}
}
@@ -152,7 +178,7 @@ void RIGIDBODY_OT_constraint_add(wmOperatorType *ot)
/* callbacks */
ot->exec = rigidbody_con_add_exec;
- ot->poll = ED_operator_object_active_editable;
+ ot->poll = ED_operator_rigidbody_con_add_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c
index 70142b790c0..bc8a1799fa0 100644
--- a/source/blender/editors/physics/rigidbody_object.c
+++ b/source/blender/editors/physics/rigidbody_object.c
@@ -62,6 +62,13 @@
static bool ED_operator_rigidbody_active_poll(bContext *C)
{
+ Scene *scene = CTX_data_scene(C);
+ if (scene == NULL || ID_IS_LINKED(&scene->id) ||
+ (scene->rigidbody_world != NULL && scene->rigidbody_world->group != NULL &&
+ ID_IS_LINKED(&scene->rigidbody_world->group->id))) {
+ return false;
+ }
+
if (ED_operator_object_active_editable(C)) {
Object *ob = ED_object_active_context(C);
return (ob && ob->rigidbody_object);
@@ -73,12 +80,19 @@ static bool ED_operator_rigidbody_active_poll(bContext *C)
static bool ED_operator_rigidbody_add_poll(bContext *C)
{
+ Scene *scene = CTX_data_scene(C);
+ if (scene == NULL || ID_IS_LINKED(&scene->id) ||
+ (scene->rigidbody_world != NULL && scene->rigidbody_world->group != NULL &&
+ ID_IS_LINKED(&scene->rigidbody_world->group->id))) {
+ return false;
+ }
+
if (ED_operator_object_active_editable(C)) {
Object *ob = ED_object_active_context(C);
return (ob && ob->type == OB_MESH);
}
else {
- return 0;
+ return false;
}
}
@@ -286,7 +300,7 @@ void RIGIDBODY_OT_objects_remove(wmOperatorType *ot)
/* callbacks */
ot->exec = rigidbody_objects_remove_exec;
- ot->poll = ED_operator_scene_editable;
+ ot->poll = ED_operator_rigidbody_active_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -341,7 +355,7 @@ void RIGIDBODY_OT_shape_change(wmOperatorType *ot)
/* callbacks */
ot->invoke = WM_menu_invoke;
ot->exec = rigidbody_objects_shape_change_exec;
- ot->poll = ED_operator_scene_editable;
+ ot->poll = ED_operator_rigidbody_active_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -534,7 +548,7 @@ void RIGIDBODY_OT_mass_calculate(wmOperatorType *ot)
/* callbacks */
ot->invoke = WM_menu_invoke; // XXX
ot->exec = rigidbody_objects_calc_mass_exec;
- ot->poll = ED_operator_scene_editable;
+ ot->poll = ED_operator_rigidbody_active_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index eccd85ab276..4fb5e0c1af3 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -186,9 +186,9 @@ bool ED_operator_scene_editable(bContext *C)
{
Scene *scene = CTX_data_scene(C);
if (scene && !ID_IS_LINKED(scene)) {
- return 1;
+ return true;
}
- return 0;
+ return false;
}
bool ED_operator_objectmode(bContext *C)