Commit: 94de2bf12cca16b6b21794ff3a9d186cc588be59
Author: soumya pochiraju
Date:   Fri Aug 13 18:23:39 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rB94de2bf12cca16b6b21794ff3a9d186cc588be59

Physics: Changed hinge constraint visualisation so that it uses the transform 
matrices in the format obtained from bullet, created functions to get 
transforms from bullet

===================================================================

M       intern/rigidbody/RBI_api.h
M       intern/rigidbody/rb_bullet_api.cpp
M       source/blender/draw/engines/overlay/overlay_extra.c

===================================================================

diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 19b05b849ea..45029c32e50 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -371,6 +371,9 @@ void RB_constraint_set_target_velocity_motor(rbConstraint 
*con,
                                              float velocity_lin,
                                              float velocity_ang);
 
+/* Get object transforms */
+void RB_constraint_get_transforms_hinge(rbConstraint *con, float 
r_ob1_transform[4][4], float r_ob2_transform[4][4]);
+
 /* Set number of constraint solver iterations made per step, this overrided 
world setting
  * To use default set it to -1 */
 void RB_constraint_set_solver_iterations(rbConstraint *con, int 
num_solver_iterations);
diff --git a/intern/rigidbody/rb_bullet_api.cpp 
b/intern/rigidbody/rb_bullet_api.cpp
index c9ac3d9f2d3..92fd935e8ba 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -1395,4 +1395,16 @@ void 
RB_constraint_set_target_velocity_motor(rbConstraint *con,
   constraint->getRotationalLimitMotor(0)->m_targetVelocity = velocity_ang;
 }
 
+void RB_constraint_get_transforms_hinge(rbConstraint *con, float 
r_ob1_transform[4][4], float r_ob2_transform[4][4]) {
+    btHingeConstraint *constraint = reinterpret_cast<btHingeConstraint *>(con);
+    btTransform transform1;
+    btTransform transform2;
+
+    transform1 = constraint->getAFrame();
+    transform2 = constraint->getBFrame();
+
+    transform1.getOpenGLMatrix((btScalar *)r_ob1_transform);
+    transform2.getOpenGLMatrix((btScalar *)r_ob2_transform);
+}
+
 /* ********************************** */
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c 
b/source/blender/draw/engines/overlay/overlay_extra.c
index ae3bf319cb0..a6aba422013 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -2291,7 +2291,6 @@ static void OVERLAY_linear_limits_rod(RigidBodyCon *rbc,
 
 static void OVERLAY_angular_limits_rods( OVERLAY_ExtraCallBuffers *cb,
                                      Object *ob,
-                                     const float axis_in_w[3],
                                      const float pivot[3],
                                      const float ob_offset_vec[3],
                                      const float coupled_ob_offset_vec[3],
@@ -2301,9 +2300,6 @@ static void OVERLAY_angular_limits_rods( 
OVERLAY_ExtraCallBuffers *cb,
 
     float mid[3];
 
-    float axis[3];
-    copy_v3_v3(axis, axis_in_w);
-
     float ob_pivot_dist_vec[3];
     sub_v3_v3v3(ob_pivot_dist_vec, ob->rigidbody_object->pos, pivot);
 
@@ -2335,25 +2331,26 @@ static void OVERLAY_angular_limits_arc(OVERLAY_Data 
*data,
                                      const float transform_mat[3][3],
                                      const float angle,
                                      float angular_offset,
+                                     const float delta_angle,
                                      const float axis_in_w[3],
                                      const float offset_vec[3],
                                      const float real_pivot[3],
                                      const float color[4]) {
 
     float ob1_pivot_dist_initial[3];
-    sub_v3_v3v3(ob1_pivot_dist_initial, constraint_ob->loc, ob->loc);
+    sub_v3_v3v3(ob1_pivot_dist_initial, real_pivot, ob->rigidbody_object->pos);
 
     /* Rotate the arc about constrained axis by required amount.
      * The arc should lie along the object-pivot distance vector. */
     float constrained_axis_rot;
 
     if(ob == rbc->ob1) {
-        float arc_start[3] = {cosf(0.0f), sinf(0.0f), 0.0f};
+        float arc_start[3] = {cosf(0.0f+delta_angle), sinf(0.0f+delta_angle), 
0.0f};
         mul_m3_v3(transform_mat, arc_start);
         constrained_axis_rot = angle_signed_on_axis_v3v3_v3(arc_start, 
ob1_pivot_dist_initial, axis_in_w);
     }
     else {
-        float arc_start1[3] = {cosf(angle + (2*angular_offset)), sinf(angle + 
(2*angular_offset)), 0.0f};
+        float arc_start1[3] = {cosf(angle + (2*angular_offset)-delta_angle), 
sinf(angle + (2*angular_offset)-delta_angle), 0.0f};
         mul_m3_v3(transform_mat, arc_start1);
         constrained_axis_rot = angle_signed_on_axis_v3v3_v3(arc_start1, 
ob1_pivot_dist_initial, axis_in_w);
     }
@@ -2365,22 +2362,11 @@ static void OVERLAY_angular_limits_arc(OVERLAY_Data 
*data,
 
     float final_mat[4][4] = {{0.0f}};
 
-    float coupled_ob_initial_rot_inv[3][3];
-    float coupled_ob_transform[4][4];
-
-    BKE_object_rot_to_mat3(coupled_ob, coupled_ob_initial_rot_inv, false);
-    invert_m3(coupled_ob_initial_rot_inv);
-    copy_m4_m4(coupled_ob_transform, coupled_ob->obmat);
-    zero_v4(coupled_ob_transform[3]);
-
-    mul_m4_m4m3(final_mat, coupled_ob_transform, coupled_ob_initial_rot_inv);
-    mul_m4_m4m3(final_mat, final_mat, transform_mat);
+    copy_m4_m3(final_mat, transform_mat);
 
     copy_v3_v3(final_mat[3], disk_pos);
     final_mat[3][3] = 1.0f;
 
-    normalize_m4(final_mat);
-
     float segment_width = M_PI*10/180;
     int n_segments = (int)(angle/segment_width) + 2;
 
@@ -2406,6 +2392,38 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
     float angle = 0.0f;
     float angular_offset = 0.0f;
 
+    float t1[3][3] = {{0.0f}};
+    float t2[3][3] = {{0.0f}};
+    float ob_init[3][3] = {{0.0f}};
+    float ob_curr[3][3] = {{0.0f}};
+
+    float ob1_transform[4][4];
+    float ob2_transform[4][4];
+
+    if(rbc->physics_constraint != NULL) {
+      printf("yes ");
+      RB_constraint_get_transforms_hinge(rbc->physics_constraint, 
ob1_transform, ob2_transform);
+      copy_m3_m4(t1, ob1_transform);
+      copy_m3_m4(t2, ob2_transform);
+    }
+
+    else {
+      printf("No ");
+      BKE_object_rot_to_mat3(constraint_ob, t1, false);
+      BKE_object_rot_to_mat3(ob1, ob_init, false);
+      invert_m3(ob_init);
+      copy_m3_m4(ob_curr, ob1->obmat);
+      mul_m3_m3m3(t1, ob_init, t1);
+      mul_m3_m3m3(t1, ob_curr, t1);
+
+      BKE_object_rot_to_mat3(constraint_ob, t2, false);
+      BKE_object_rot_to_mat3(ob2, ob_init, false);
+      invert_m3(ob_init);
+      copy_m3_m4(ob_curr, ob2->obmat);
+      mul_m3_m3m3(t2, ob_init, t2);
+      mul_m3_m3m3(t2, ob_curr, t2);
+    }
+
     float ob1_pivot_dist_initial[3];
     sub_v3_v3v3(ob1_pivot_dist_initial, constraint_ob->loc, ob1->loc);
     float real_pivot[3] = {0.0f};
@@ -2421,6 +2439,7 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
         copy_v3_v3(real_pivot, ob2->rigidbody_object->pos);
     }
     else{
+
       mul_v3_m3v3(real_pivot, ob1_initial_rot_inv, ob1_pivot_dist_initial);
       mul_v3_m4v3(real_pivot, ob1->obmat, real_pivot);
     }
@@ -2429,11 +2448,9 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
     /* Constraint axis transform. */
     float constrained_axis_transoform[3][3] = {{0}};
 
-    float constrained_axis_local[3] = {0.0f};
     float constrained_axis_w_initial[3] = {0.0f};
     float constrained_axis_w[3] = {0.0f};
 
-    constrained_axis_local[axis] = 1.0f;
     constrained_axis_w_initial[axis] = 1.0f;
 
     /* Get constrained axis rotation from constraint object. */
@@ -2444,11 +2461,6 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
     mul_m3_v3(ob1_initial_rot_inv, constrained_axis_w);
     mul_m3_v3(ob1_rot, constrained_axis_w);
 
-    float rot_axis[3];
-    cross_v3_v3v3(rot_axis, constrained_axis_local, 
constrained_axis_w_initial);
-    float rot_angle = angle_on_axis_v3v3_v3(constrained_axis_local, 
constrained_axis_w_initial, rot_axis);
-    axis_angle_to_mat3(constrained_axis_transoform, rot_axis, rot_angle);
-
     float ax[3] = {0.0f};
 
     switch(axis){
@@ -2467,10 +2479,11 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
        case 2:
         angle = (rbc->limit_ang_z_upper - rbc->limit_ang_z_lower);
         angular_offset = rbc->limit_ang_z_lower;
+        ax[0] = 1.0f;
         unit_m3(corr_rot);
         break;
     }
-    mul_m3_m3m3(constrained_axis_transoform, constrained_axis_transoform, 
corr_rot);
+
 
     float ob1_pivot_dist[3];
     float ob2_pivot_dist[3];
@@ -2495,16 +2508,24 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
     mul_v3_fl(ob1_offset_vec, ob1_offset);
     mul_v3_fl(ob2_offset_vec, ob2_offset);
 
+    float axis_ob1[3];
+    float axis_ob2[3];
+    copy_v3_v3(axis_ob1, ax);
+    copy_v3_v3(axis_ob2, ax);
+    mul_m3_v3(t1, axis_ob1);
+    mul_m3_v3(t2, axis_ob2);
+    float delta_angle = angle_signed_on_axis_v3v3_v3(axis_ob1, axis_ob2, 
constrained_axis_w);
+
     OVERLAY_PrivateData *pd = data->stl->pd;
     cb = &pd->extra_call_buffers[1];
 
     if(ob1->rigidbody_object->type == RBO_TYPE_ACTIVE) {
-      OVERLAY_angular_limits_arc(data, rbc, ob1, ob2, constraint_ob, 
constrained_axis_transoform, angle, angular_offset, constrained_axis_w_initial, 
ob1_offset_vec, real_pivot, color1);
-      OVERLAY_angular_limits_rods(cb, ob1, constrained_axis_w_initial, 
real_pivot, ob1_offset_vec, ob2_offset_vec, color2);
+      OVERLAY_angular_limits_arc(data, rbc, ob1, ob2, constraint_ob, t2, 
angle, angular_offset, delta_angle, constrained_axis_w, ob1_offset_vec, 
real_pivot, color1);
+      OVERLAY_angular_limits_rods(cb, ob1, real_pivot, ob1_offset_vec, 
ob2_offset_vec, color2);
     }
     if(ob2->rigidbody_object->type == RBO_TYPE_ACTIVE) {
-      OVERLAY_angular_limits_arc(data, rbc, ob2, ob1, constraint_ob, 
constrained_axis_transoform, angle, angular_offset, constrained_axis_w_initial, 
ob2_offset_vec, real_pivot, color2);
-      OVERLAY_angular_limits_rods(cb, ob2, constrained_axis_w_initial, 
real_pivot, ob2_offset_vec, ob1_offset_vec, color1);
+      OVERLAY_angular_limits_arc(data, rbc, ob2, ob1, constraint_ob, t1, 
angle, angular_offset, delta_angle, constrained_axis_w, ob2_offset_vec, 
real_pivot, color2);
+      OVERLAY_angular_limits_rods(cb, ob2, real_pivot, ob2_offset_vec, 
ob1_offset_vec, color1);
     }
 
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to