Fix T48582: Rigidbody simulation issue with new depsgraph
Being granular means we need to re-build depsgraph a bit more often.. The issue was caused by rigidbody requiring some special nodes to handle physics which were not created with just tagging object for update.
This commit is contained in:
parent
c276480b0f
commit
122c59fba4
Notes:
blender-bot
2023-02-14 07:50:22 +01:00
Referenced by issue #48582, Rigidbody simulation issue with new depsgraph
|
@ -45,12 +45,12 @@ int PE_hair_poll(struct bContext *C);
|
|||
int PE_poll_view3d(struct bContext *C);
|
||||
|
||||
/* rigidbody_object.c */
|
||||
bool ED_rigidbody_object_add(struct Scene *scene, struct Object *ob, int type, struct ReportList *reports);
|
||||
void ED_rigidbody_object_remove(struct Scene *scene, struct Object *ob);
|
||||
bool ED_rigidbody_object_add(struct Main *bmain, struct Scene *scene, struct Object *ob, int type, struct ReportList *reports);
|
||||
void ED_rigidbody_object_remove(struct Main *bmain, struct Scene *scene, struct Object *ob);
|
||||
|
||||
/* rigidbody_constraint.c */
|
||||
bool ED_rigidbody_constraint_add(struct Scene *scene, struct Object *ob, int type, struct ReportList *reports);
|
||||
void ED_rigidbody_constraint_remove(struct Scene *scene, struct Object *ob);
|
||||
bool ED_rigidbody_constraint_add(struct Main *bmain, struct Scene *scene, struct Object *ob, int type, struct ReportList *reports);
|
||||
void ED_rigidbody_constraint_remove(struct Main *bmain, struct Scene *scene, struct Object *ob);
|
||||
|
||||
/* operators */
|
||||
void ED_operatortypes_physics(void);
|
||||
|
|
|
@ -1601,7 +1601,7 @@ static int convert_exec(bContext *C, wmOperator *op)
|
|||
|
||||
if (newob->type == OB_CURVE) {
|
||||
BKE_object_free_modifiers(newob); /* after derivedmesh calls! */
|
||||
ED_rigidbody_object_remove(scene, newob);
|
||||
ED_rigidbody_object_remove(bmain, scene, newob);
|
||||
}
|
||||
}
|
||||
else if (ob->type == OB_MESH && ob->modifiers.first) { /* converting a mesh with no modifiers causes a segfault */
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#include "BKE_depsgraph.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_group.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_report.h"
|
||||
#include "BKE_rigidbody.h"
|
||||
|
||||
|
@ -70,7 +71,7 @@ static int ED_operator_rigidbody_con_active_poll(bContext *C)
|
|||
}
|
||||
|
||||
|
||||
bool ED_rigidbody_constraint_add(Scene *scene, Object *ob, int type, ReportList *reports)
|
||||
bool ED_rigidbody_constraint_add(Main *bmain, Scene *scene, Object *ob, int type, ReportList *reports)
|
||||
{
|
||||
RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
|
||||
|
||||
|
@ -81,7 +82,7 @@ bool ED_rigidbody_constraint_add(Scene *scene, Object *ob, int type, ReportList
|
|||
}
|
||||
/* create constraint group if it doesn't already exits */
|
||||
if (rbw->constraints == NULL) {
|
||||
rbw->constraints = BKE_group_add(G.main, "RigidBodyConstraints");
|
||||
rbw->constraints = BKE_group_add(bmain, "RigidBodyConstraints");
|
||||
}
|
||||
/* make rigidbody constraint settings */
|
||||
ob->rigidbody_constraint = BKE_rigidbody_create_constraint(scene, ob, type);
|
||||
|
@ -90,11 +91,12 @@ bool ED_rigidbody_constraint_add(Scene *scene, Object *ob, int type, ReportList
|
|||
/* add constraint to rigid body constraint group */
|
||||
BKE_group_object_add(rbw->constraints, ob, scene, NULL);
|
||||
|
||||
DAG_relations_tag_update(bmain);
|
||||
DAG_id_tag_update(&ob->id, OB_RECALC_OB);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ED_rigidbody_constraint_remove(Scene *scene, Object *ob)
|
||||
void ED_rigidbody_constraint_remove(Main *bmain, Scene *scene, Object *ob)
|
||||
{
|
||||
RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
|
||||
|
||||
|
@ -102,6 +104,7 @@ void ED_rigidbody_constraint_remove(Scene *scene, Object *ob)
|
|||
if (rbw)
|
||||
BKE_group_object_unlink(rbw->constraints, ob, scene, NULL);
|
||||
|
||||
DAG_relations_tag_update(bmain);
|
||||
DAG_id_tag_update(&ob->id, OB_RECALC_OB);
|
||||
}
|
||||
|
||||
|
@ -112,6 +115,7 @@ void ED_rigidbody_constraint_remove(Scene *scene, Object *ob)
|
|||
|
||||
static int rigidbody_con_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
|
||||
Object *ob = (scene) ? OBACT : NULL;
|
||||
|
@ -124,7 +128,7 @@ static int rigidbody_con_add_exec(bContext *C, wmOperator *op)
|
|||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
/* apply to active object */
|
||||
changed = ED_rigidbody_constraint_add(scene, ob, type, op->reports);
|
||||
changed = ED_rigidbody_constraint_add(bmain, scene, ob, type, op->reports);
|
||||
|
||||
if (changed) {
|
||||
/* send updates */
|
||||
|
@ -160,6 +164,7 @@ void RIGIDBODY_OT_constraint_add(wmOperatorType *ot)
|
|||
|
||||
static int rigidbody_con_remove_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob = (scene) ? OBACT : NULL;
|
||||
|
||||
|
@ -173,7 +178,7 @@ static int rigidbody_con_remove_exec(bContext *C, wmOperator *op)
|
|||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
else {
|
||||
ED_rigidbody_constraint_remove(scene, ob);
|
||||
ED_rigidbody_constraint_remove(bmain, scene, ob);
|
||||
}
|
||||
|
||||
/* send updates */
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
#include "BKE_depsgraph.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_group.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_report.h"
|
||||
#include "BKE_rigidbody.h"
|
||||
|
||||
|
@ -87,7 +88,7 @@ static int ED_operator_rigidbody_add_poll(bContext *C)
|
|||
|
||||
/* ----------------- */
|
||||
|
||||
bool ED_rigidbody_object_add(Scene *scene, Object *ob, int type, ReportList *reports)
|
||||
bool ED_rigidbody_object_add(Main *bmain, Scene *scene, Object *ob, int type, ReportList *reports)
|
||||
{
|
||||
RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
|
||||
|
||||
|
@ -107,7 +108,7 @@ bool ED_rigidbody_object_add(Scene *scene, Object *ob, int type, ReportList *rep
|
|||
scene->rigidbody_world = rbw;
|
||||
}
|
||||
if (rbw->group == NULL) {
|
||||
rbw->group = BKE_group_add(G.main, "RigidBodyWorld");
|
||||
rbw->group = BKE_group_add(bmain, "RigidBodyWorld");
|
||||
}
|
||||
|
||||
/* make rigidbody object settings */
|
||||
|
@ -120,12 +121,13 @@ bool ED_rigidbody_object_add(Scene *scene, Object *ob, int type, ReportList *rep
|
|||
/* add object to rigid body group */
|
||||
BKE_group_object_add(rbw->group, ob, scene, NULL);
|
||||
|
||||
DAG_relations_tag_update(bmain);
|
||||
DAG_id_tag_update(&ob->id, OB_RECALC_OB);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ED_rigidbody_object_remove(Scene *scene, Object *ob)
|
||||
void ED_rigidbody_object_remove(Main *bmain, Scene *scene, Object *ob)
|
||||
{
|
||||
RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
|
||||
|
||||
|
@ -133,6 +135,7 @@ void ED_rigidbody_object_remove(Scene *scene, Object *ob)
|
|||
if (rbw)
|
||||
BKE_group_object_unlink(rbw->group, ob, scene, NULL);
|
||||
|
||||
DAG_relations_tag_update(bmain);
|
||||
DAG_id_tag_update(&ob->id, OB_RECALC_OB);
|
||||
}
|
||||
|
||||
|
@ -143,13 +146,14 @@ void ED_rigidbody_object_remove(Scene *scene, Object *ob)
|
|||
|
||||
static int rigidbody_object_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
int type = RNA_enum_get(op->ptr, "type");
|
||||
bool changed;
|
||||
|
||||
/* apply to active object */
|
||||
changed = ED_rigidbody_object_add(scene, ob, type, op->reports);
|
||||
changed = ED_rigidbody_object_add(bmain, scene, ob, type, op->reports);
|
||||
|
||||
if (changed) {
|
||||
/* send updates */
|
||||
|
@ -186,13 +190,14 @@ void RIGIDBODY_OT_object_add(wmOperatorType *ot)
|
|||
|
||||
static int rigidbody_object_remove_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bool changed = false;
|
||||
|
||||
/* apply to active object */
|
||||
if (!ELEM(NULL, ob, ob->rigidbody_object)) {
|
||||
ED_rigidbody_object_remove(scene, ob);
|
||||
ED_rigidbody_object_remove(bmain, scene, ob);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
|
@ -232,13 +237,14 @@ void RIGIDBODY_OT_object_remove(wmOperatorType *ot)
|
|||
|
||||
static int rigidbody_objects_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
int type = RNA_enum_get(op->ptr, "type");
|
||||
bool changed = false;
|
||||
|
||||
/* create rigid body objects and add them to the world's group */
|
||||
CTX_DATA_BEGIN(C, Object *, ob, selected_objects) {
|
||||
changed |= ED_rigidbody_object_add(scene, ob, type, op->reports);
|
||||
changed |= ED_rigidbody_object_add(bmain, scene, ob, type, op->reports);
|
||||
}
|
||||
CTX_DATA_END;
|
||||
|
||||
|
@ -277,6 +283,7 @@ void RIGIDBODY_OT_objects_add(wmOperatorType *ot)
|
|||
|
||||
static int rigidbody_objects_remove_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
bool changed = false;
|
||||
|
||||
|
@ -284,7 +291,7 @@ static int rigidbody_objects_remove_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
CTX_DATA_BEGIN(C, Object *, ob, selected_objects)
|
||||
{
|
||||
if (ob->rigidbody_object) {
|
||||
ED_rigidbody_object_remove(scene, ob);
|
||||
ED_rigidbody_object_remove(bmain, scene, ob);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue