[Bf-blender-cvs] [b31083a0085] soc-2021-simulation-display: Constraints: visualisation works with kinematic objects
soumya pochiraju
noreply at git.blender.org
Tue Sep 14 11:04:39 CEST 2021
Commit: b31083a0085fbcfacdf553cdfe5a5d5d14dbde06
Author: soumya pochiraju
Date: Tue Sep 14 14:31:40 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rBb31083a0085fbcfacdf553cdfe5a5d5d14dbde06
Constraints: visualisation works with kinematic objects
Used the transforms obtained from bullet instead of creating them using
rigidbody/ object data, which only worked for active rigidbodies
===================================================================
M source/blender/draw/engines/overlay/overlay_extra.c
===================================================================
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index cad9247ef17..c6b718b7e3d 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -1965,7 +1965,7 @@ static void OVERLAY_linear_limits_single_object_rod(RigidBodyCon *rbc,
int axis,
OVERLAY_ExtraCallBuffers *cb) {
float translation_range;
- float x_dir_color[4] = {1.0f, 0.0f, 0.0f, 1.0f};
+ float color[4] = {0.0f, 1.0f, 0.2f, 1.0f};
float line_start[3] = {0};
float line_end[3] = {0};
@@ -1993,7 +1993,7 @@ static void OVERLAY_linear_limits_single_object_rod(RigidBodyCon *rbc,
mul_m3_v3(mat, line_end);
add_v3_v3(line_start, rb_ob->loc);
add_v3_v3(line_end, rb_ob->loc);
- OVERLAY_extra_line_dashed(cb, line_start, line_end, x_dir_color);
+ OVERLAY_extra_line_dashed(cb, line_start, line_end, color);
}
}
@@ -2013,10 +2013,12 @@ static void OVERLAY_linear_limits_walls(Object *ob,
float distance_from_first_wall[3];
float distance_from_second_wall[3];
float *wall_pos;
+ float ob_pos[3];
float size[3];
- sub_v3_v3v3(distance_from_first_wall, ob->rigidbody_object->pos, upper_wall_pos);
- sub_v3_v3v3(distance_from_second_wall, ob->rigidbody_object->pos, lower_wall_pos);
+ copy_v3_v3(ob_pos, (float *)ob->obmat[3]);
+ sub_v3_v3v3(distance_from_first_wall, ob_pos, upper_wall_pos);
+ sub_v3_v3v3(distance_from_second_wall, ob_pos, lower_wall_pos);
float d1 = fabsf(len_v3(distance_from_first_wall));
float d2 = fabsf(len_v3(distance_from_second_wall));
@@ -2083,19 +2085,16 @@ static void OVERLAY_linear_limits(RigidBodyCon *rbc,
float color[4];
copy_v4_v4(color, G_draw.block.colorLibrary);
- float distance_vec[3];
- float initial_distance_vec[3];
float line_start[3] = {0.0f};
float line_end[3] = {0.0f};
- float ob1_upper_limit[3] = {0.0f};
- float ob2_upper_limit[3] = {0.0f};
- float ob1_lower_limit_mark[3] = {0.0f};
- float ob2_lower_limit_mark[3] = {0.0f};
float ob1_projection[3] = {0.0f};
float ob2_projection[3] = {0.0f};
- sub_v3_v3v3(initial_distance_vec, ob1->loc, ob2->loc);
- sub_v3_v3v3(distance_vec, ob1->rigidbody_object->pos, ob2->rigidbody_object->pos);
+ float ob1_upper_wall_pos[3] = {0.0f};
+ float ob2_upper_wall_pos[3] = {0.0f};
+ float ob1_lower_wall_pos[3] = {0.0f};
+ float ob2_lower_wall_pos[3] = {0.0f};
+
float constrained_axis[3] = {0.0f};
constrained_axis[axis] = 1.0f;
@@ -2105,35 +2104,38 @@ static void OVERLAY_linear_limits(RigidBodyCon *rbc,
float constraint_ob_rot[3][3] = {{0.0f}};
/* Ob1 rotation. */
float ob1_rot[3][3] = {{0.0f}};
- /* Ob1 initial rotation inverse. */
- float ob1_rot_initial_inv[3][3] = {{0.0f}};
+ /* Ob1 frame obained from bullet. */
+ float ob1_frame_offset[3][3] = {{0.0f}};
/* Ob1 final transform matrix. */
float transform_mat1[3][3] = {{0.0f}};
/* Ob2 rotation. */
float ob2_rot[3][3] = {{0.0f}};
- /* Ob2 initial rotation inverse. */
- float ob2_rot_initial_inv[3][3] = {{0.0f}};
+ /* Ob1 frame obained from bullet. */
+ float ob2_frame_offset[3][3] = {{0.0f}};
/* Ob2 final transform matrix. */
float transform_mat2[3][3] = {{0.0f}};
+ /* Constraint origin in objects' frames. */
+ float ob1_origin[3];
+ float ob2_origin[3];
+ /* Rigidbody positions. */
+ float ob1_pos[3];
+ float ob2_pos[3];
- BKE_object_rot_to_mat3(constraint_ob, constraint_ob_rot, false);
-
- mat4_to_rot(ob1_rot, ob1->obmat);
- BKE_object_rot_to_mat3(ob1, ob1_rot_initial_inv, false);
- invert_m3(ob1_rot_initial_inv);
- mul_m3_m3m3(transform_mat1, ob1_rot, ob1_rot_initial_inv);
- mul_m3_m3m3(transform_mat1, transform_mat1, constraint_ob_rot);
+ copy_m3_m4(ob1_rot, ob1->obmat);
+ copy_m3_m4(ob2_rot, ob2->obmat);
+ copy_v3_v3(ob1_pos, (float *)ob1->obmat[3]);
+ copy_v3_v3(ob2_pos, (float *)ob2->obmat[3]);
+ Object *orig_constraint_ob = (Object *)constraint_ob->id.orig_id;
- mat4_to_rot(ob2_rot, ob2->obmat);
- BKE_object_rot_to_mat3(ob2, ob2_rot_initial_inv, false);
- invert_m3(ob2_rot_initial_inv);
- mul_m3_m3m3(transform_mat2, ob2_rot, ob2_rot_initial_inv);
- mul_m3_m3m3(transform_mat2, transform_mat2, constraint_ob_rot);
+ BKE_object_rot_to_mat3(constraint_ob, constraint_ob_rot, false);
+ if(orig_constraint_ob->rigidbody_constraint->physics_constraint != NULL ) {
+ RB_constraint_get_transforms_slider(orig_constraint_ob->rigidbody_constraint->physics_constraint, ob1_frame_offset, ob2_frame_offset, ob1_origin, ob2_origin, NULL);
+ }
+ mul_m3_m3m3(transform_mat1, ob1_rot, ob1_frame_offset);
+ mul_m3_m3m3(transform_mat2, ob2_rot, ob2_frame_offset);
+ mul_m4_v3(ob1->obmat, ob1_origin);
+ mul_m4_v3(ob2->obmat, ob2_origin);
- float cross_product[3];
- cross_v3_v3v3(cross_product, distance_vec, constrained_axis);
- mul_m3_v3(constraint_ob_rot, constrained_axis);
- normalize_v3(constrained_axis);
bool draw_rod = rbc->type == RBC_TYPE_SLIDER;
bool is_constrained;
@@ -2145,30 +2147,30 @@ static void OVERLAY_linear_limits(RigidBodyCon *rbc,
switch(axis){
case 0:
translation_range = (rbc->limit_lin_x_upper - rbc->limit_lin_x_lower);
- ob2_upper_limit[0] += (rbc->limit_lin_x_upper*0.5f);
- ob2_lower_limit_mark[0] += (rbc->limit_lin_x_lower*0.5f);
- ob1_upper_limit[0] -= (rbc->limit_lin_x_upper*0.5f);
- ob1_lower_limit_mark[0] -= (rbc->limit_lin_x_lower*0.5f);
+ ob2_upper_wall_pos[0] += (rbc->limit_lin_x_upper);
+ ob2_lower_wall_pos[0] += (rbc->limit_lin_x_lower);
+ ob1_upper_wall_pos[0] += (rbc->limit_lin_x_upper);
+ ob1_lower_wall_pos[0] += (rbc->limit_lin_x_lower);
ax[1] = 1.0f;
axis_angle_to_mat3(corr_rot, ax, M_PI_2);
is_constrained = (rbc->flag & RBC_FLAG_USE_LIMIT_LIN_X);
break;
case 1:
translation_range = (rbc->limit_lin_y_upper - rbc->limit_lin_y_lower);
- ob2_upper_limit[0] += (rbc->limit_lin_y_upper*0.5f);
- ob2_lower_limit_mark[0] += (rbc->limit_lin_y_lower*0.5f);
- ob1_upper_limit[0] -= (rbc->limit_lin_y_upper*0.5f);
- ob1_lower_limit_mark[0] -= (rbc->limit_lin_y_lower*0.5f);
+ ob2_upper_wall_pos[1] += (rbc->limit_lin_y_upper);
+ ob2_lower_wall_pos[1] += (rbc->limit_lin_y_lower);
+ ob1_upper_wall_pos[1] += (rbc->limit_lin_y_upper);
+ ob1_lower_wall_pos[1] += (rbc->limit_lin_y_lower);
ax[0] = 1.0f;
axis_angle_to_mat3(corr_rot, ax, M_PI_2);
is_constrained = (rbc->flag & RBC_FLAG_USE_LIMIT_LIN_Y);
break;
case 2:
translation_range = (rbc->limit_lin_z_upper - rbc->limit_lin_z_lower);
- ob2_upper_limit[0] += (rbc->limit_lin_z_upper*0.5f);
- ob2_lower_limit_mark[0] += (rbc->limit_lin_z_lower*0.5f);
- ob1_upper_limit[0] -= (rbc->limit_lin_z_upper*0.5f);
- ob1_lower_limit_mark[0] -= (rbc->limit_lin_z_lower*0.5f);
+ ob2_upper_wall_pos[2] += (rbc->limit_lin_z_upper);
+ ob2_lower_wall_pos[2] += (rbc->limit_lin_z_lower);
+ ob1_upper_wall_pos[2] += (rbc->limit_lin_z_upper);
+ ob1_lower_wall_pos[2] += (rbc->limit_lin_z_lower);
/* Artbitrary axis so that the matrix(corr_rot) doesn't remain empty. */
ax[0] = 1.0f;
axis_angle_to_mat3(corr_rot, ax, 0.0f);
@@ -2179,67 +2181,85 @@ static void OVERLAY_linear_limits(RigidBodyCon *rbc,
if(!is_constrained && !draw_rod) {
return;
}
-
- float min_rod_half_length;
- min_rod_half_length = is_constrained ? dot_v3v3(initial_distance_vec, constrained_axis) : dot_v3v3(distance_vec, constrained_axis);
-
- ob2_upper_limit[0] -= (min_rod_half_length*0.5f);
- ob2_lower_limit_mark[0] -= (min_rod_half_length*0.5f);
- ob1_upper_limit[0] += (min_rod_half_length*0.5f);
- ob1_lower_limit_mark[0] += (min_rod_half_length*0.5f);
-
- mul_m3_v3(transform_mat1, ob2_upper_limit);
- mul_m3_v3(transform_mat1, ob1_lower_limit_mark);
- mul_m3_v3(transform_mat1, ob1_upper_limit);
- mul_m3_v3(transform_mat1, ob2_lower_limit_mark);
-
+ mul_m3_v3(transform_mat1, constrained_axis);
float mid_point[3];
- add_v3_v3v3(mid_point, ob1->rigidbody_object->pos, ob2->rigidbody_object->pos);
+ float rod_partA[3];
+ float rod_partB[3];
+ float mid_point_to_wall1[3];
+ float mid_point_to_wall2[3];
+
+ add_v3_v3v3(mid_point, ob1_pos, ob2_pos);
mul_v3_fl(mid_point, 0.5f);
- add_v3_v3(ob2_upper_limit, mid_point);
- add_v3_v3(ob2_lower_limit_mark, mid_point);
- add_v3_v3(ob1_upper_limit, mid_point);
- add_v3_v3(ob1_lower_limit_mark, mid_point);
- if(len_v3v3(ob1_upper_limit, ob2_upper_limit)> len_v3v3(ob1_lower_limit_mark, ob2_lower_limit_mark)) {
- copy_v3_v3(line_start, ob2_upper_limit);
- copy_v3_v3(line_end, ob1_upper_limit);
+ if(is_constrained) {
+ float delta[3];
+ sub_v3_v3v3(delta, ob2_origin, ob1_origin);
+ for(int i=0; i<3; i++) {
+ if(i == axis) {
+ delta[i] = dot_v3v3(delta, constrained_axis);
+ }
+ else {
+ delta[i] = 0.0f;
+ }
+ }
+ sub_v3_v3(ob2_upper_wall_pos, delta);
+ sub_v3_v3(ob2_lower_wall_pos, delta);
+ add_v3_v3(ob1_upper_wall_pos, delta);
+ add_v3_v3(ob1_lower_wall_pos, delta);
+
+ mul_m3_v3(transform_mat1, ob2_upper_wall_pos);
+ mul_m3_v3(transform_mat1, ob1_lower_wall_pos);
+ mul_m3_v3(transform_mat1, ob1_upper_wall_pos);
+ mul_m3_v3(transform_mat1, ob2_lower_wall_pos);
+
+ add_v3_v3(ob2_upper_wall_pos, ob2_pos);
+ add_v3_v3(ob2_lower_wall_pos, ob2_pos);
+ add_v3_v3(ob1_upper_wall_pos, ob1_pos);
+ add_v3_v3(ob1_lower_wall_pos, ob1_pos);
+ add_v3_v3(line_start, mid_point);
+ add_v3_v3(line_end, mid_point);
+
+
+ if(len_v3v3(ob1_lower_wall_pos, ob2_upper_wall_pos)> len_v3v3(ob1_upper_wall_pos, ob2_lower_wall_pos))
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list