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...
This commit is contained in:
parent
45ec08dc99
commit
1342d1879e
Notes:
blender-bot
2023-02-14 06:38:17 +01:00
Referenced by commit 2cec4af124
, Fix T69582: Empties no longer support Rigid Body Constraints
Referenced by issue #69582, Empties no longer support Rigid Body Constraints
Referenced by issue #52551, undo causes crash after enabling a new rigid body when scene uses a referenced rigid body world
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue