[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