[Bf-blender-cvs] [fddc6bc5e95] soc-2021-simulation-display: Physics: Implemented caching previous velocity of rigid bodies so that acceleration can be calculated.
soumya pochiraju
noreply at git.blender.org
Sun Aug 1 16:05:12 CEST 2021
Commit: fddc6bc5e95ab36b52095ca7ec32b445dc8d9ccc
Author: soumya pochiraju
Date: Sun Aug 1 19:31:03 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rBfddc6bc5e95ab36b52095ca7ec32b445dc8d9ccc
Physics: Implemented caching previous velocity of rigid bodies so that acceleration can be calculated.
===================================================================
M source/blender/blenkernel/BKE_pointcache.h
M source/blender/blenkernel/intern/pointcache.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/draw/engines/overlay/overlay_extra.c
M source/blender/makesdna/DNA_pointcache_types.h
M source/blender/makesdna/DNA_rigidbody_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index a7e8f66e5f3..7a78b78dd36 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -108,6 +108,7 @@ typedef struct PTCacheData {
struct sim_data_vec norm_forces[3];
struct sim_data_vec fric_forces[3];
struct sim_data_vec vec_locations[3];
+ float pvel[3];
} PTCacheData;
typedef struct PTCacheFile {
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index dcc9f9b2f1d..bee1ff35530 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -131,6 +131,7 @@ static int ptcache_data_size[] = {
sizeof(sim_data_vec[3]), /* BPHYS_DATA_NORM_FORCES */
sizeof(sim_data_vec[3]), /* BPHYS_DATA_FRIC_FORCES */
sizeof(sim_data_vec[3]), /* BPHYS_DATA_VEC_LOCATIONS */
+ sizeof(float[3]), /* BHYS_DATA_PREV_VELOCITY */
};
static int ptcache_extra_datasize[] = {
@@ -789,6 +790,8 @@ static int ptcache_rigidbody_write(int index, void *rb_v, void **data, int UNUSE
PTCACHE_DATA_FROM(data, BPHYS_DATA_NORM_FORCES, rbo->norm_forces);
PTCACHE_DATA_FROM(data, BPHYS_DATA_FRIC_FORCES, rbo->fric_forces);
PTCACHE_DATA_FROM(data, BPHYS_DATA_VEC_LOCATIONS, rbo->vec_locations);
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_PREV_VELOCITY, rbo->pvel);
+
}
}
@@ -814,9 +817,10 @@ static void ptcache_rigidbody_read(
memcpy(rbo->orn, data + 3, sizeof(float[4]));
memcpy(rbo->vel, data + 7, sizeof(float[3]));
memcpy(rbo->eff_forces, data + 10, sizeof(sim_data_vec[3]));
- memcpy(rbo->norm_forces, data + 13, sizeof(sim_data_vec[3]));
- memcpy(rbo->fric_forces, data + 16, sizeof(sim_data_vec[3]));
- memcpy(rbo->vec_locations, data + 19, sizeof(sim_data_vec[3]));
+ memcpy(rbo->norm_forces, data + 19, sizeof(sim_data_vec[3]));
+ memcpy(rbo->fric_forces, data + 28, sizeof(sim_data_vec[3]));
+ memcpy(rbo->vec_locations, data + 37, sizeof(sim_data_vec[3]));
+ memcpy(rbo->pvel, data + 46, sizeof(float[3]));
}
else {
PTCACHE_DATA_TO(data, BPHYS_DATA_LOCATION, 0, rbo->pos);
@@ -826,6 +830,7 @@ static void ptcache_rigidbody_read(
PTCACHE_DATA_TO(data, BPHYS_DATA_NORM_FORCES, 0, rbo->norm_forces);
PTCACHE_DATA_TO(data, BPHYS_DATA_FRIC_FORCES, 0, rbo->fric_forces);
PTCACHE_DATA_TO(data, BPHYS_DATA_VEC_LOCATIONS, 0, rbo->vec_locations);
+ PTCACHE_DATA_TO(data, BPHYS_DATA_PREV_VELOCITY, 0, rbo->pvel);
}
}
}
@@ -1116,7 +1121,7 @@ void BKE_ptcache_id_from_rigidbody(PTCacheID *pid, Object *ob, RigidBodyWorld *r
pid->data_types = (1 << BPHYS_DATA_LOCATION) | (1 << BPHYS_DATA_ROTATION) |
(1 << BPHYS_DATA_VELOCITY) | (1 << BPHYS_DATA_EFF_FORCES) |
(1 << BPHYS_DATA_NORM_FORCES) | (1 << BPHYS_DATA_FRIC_FORCES) |
- (1 << BPHYS_DATA_VEC_LOCATIONS);
+ (1 << BPHYS_DATA_VEC_LOCATIONS) | (1<<BPHYS_DATA_PREV_VELOCITY);
pid->info_types = 0;
pid->stack_index = pid->cache->index;
@@ -1766,6 +1771,9 @@ static void ptcache_file_pointers_init(PTCacheFile *pf)
pf->cur[BPHYS_DATA_VEC_LOCATIONS] = (data_types & (1 << BPHYS_DATA_VEC_LOCATIONS)) ?
&pf->data.vec_locations :
NULL;
+ pf->cur[BPHYS_DATA_PREV_VELOCITY] = (data_types & (1 << BPHYS_DATA_PREV_VELOCITY)) ?
+ &pf->data.pvel :
+ NULL;
}
/* Check to see if point number "index" is in pm, uses binary search for index data. */
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index fe3230f3d23..0ddc9527212 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2438,6 +2438,7 @@ void BKE_rigidbody_do_simulation(Depsgraph *depsgraph, Scene *scene, float ctime
if (ob->rigidbody_object != NULL) {
rbRigidBody *rbo = (rbRigidBody *)(ob->rigidbody_object->shared->physics_object);
/* Get velocity. */
+ copy_v3_v3(ob->rigidbody_object->pvel, ob->rigidbody_object->vel);
RB_body_get_linear_velocity(rbo, ob->rigidbody_object->vel);
bool norm_flag = (ob->rigidbody_object->display_force_types & RB_SIM_NORMAL) ||
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index aca267574c4..b0a021578eb 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -1800,11 +1800,8 @@ static void OVERLAY_acceleration_extra(OVERLAY_Data *data,
const float frame_diff = ctime - scene->rigidbody_world->ltime;
const float timestep = 1.0f / (float)FPS * frame_diff * scene->rigidbody_world->time_scale;
- rbRigidBody *rb = rbo->shared->physics_object;
float acc[3];
- RB_body_get_linear_velocity(rb, acc);
- sub_v3_v3(acc, rbo->vel);
- RB_body_get_linear_velocity(rb, rbo->vel);
+ sub_v3_v3v3(acc, rbo->pvel, rbo->vel);
mul_v3_fl(acc, 1 / timestep);
OVERLAY_vector_extra(data, acc, rbo->pos, scale, min_clamp, color, text_flag);
}
diff --git a/source/blender/makesdna/DNA_pointcache_types.h b/source/blender/makesdna/DNA_pointcache_types.h
index b5c39acbd53..de420d123c2 100644
--- a/source/blender/makesdna/DNA_pointcache_types.h
+++ b/source/blender/makesdna/DNA_pointcache_types.h
@@ -49,8 +49,9 @@ extern "C" {
#define BPHYS_DATA_NORM_FORCES 9
#define BPHYS_DATA_FRIC_FORCES 10
#define BPHYS_DATA_VEC_LOCATIONS 11
+#define BPHYS_DATA_PREV_VELOCITY 12
-#define BPHYS_TOT_DATA 12
+#define BPHYS_TOT_DATA 13
#define BPHYS_EXTRA_FLUID_SPRINGS 1
#define BPHYS_EXTRA_CLOTH_ACCELERATION 2
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h
index 700600685f4..5b78c4d35a6 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -171,11 +171,13 @@ typedef struct RigidBodyOb {
char _pad1[4];
/** This pointer is shared between all evaluated copies. */
struct RigidBodyOb_Shared *shared;
- /** Options for display simulation data. */
+
+ /** Options for debug drawing. */
short sim_display_options;
short display_force_types;
char _pad2[4];
+ /** Force vectors. */
sim_data_vec eff_forces[3];
char _pad3[4];
sim_data_vec norm_forces[3];
@@ -184,8 +186,11 @@ typedef struct RigidBodyOb {
char _pad5[4];
sim_data_vec vec_locations[3];
- /** Velocity, to display sim data */
+ /** Velocity */
float vel[3];
+ /** Previous velocity, to calculate acceleration. */
+ float pvel[3];
+ char _pad6[4];
Mesh *col_shape_draw_data;
More information about the Bf-blender-cvs
mailing list