[Bf-blender-cvs] [0d09f5e4862] soc-2021-simulation-display: Fix incorrect position of disks in hinge constraint
soumya pochiraju
noreply at git.blender.org
Wed Aug 11 07:41:19 CEST 2021
Commit: 0d09f5e486252942b419ff153fa9e9803f2cf673
Author: soumya pochiraju
Date: Mon Aug 9 09:23:20 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rB0d09f5e486252942b419ff153fa9e9803f2cf673
Fix incorrect position of disks in hinge constraint
===================================================================
M source/blender/draw/engines/overlay/overlay_extra.c
M source/blender/draw/engines/overlay/shaders/constraint_angular_limits_vert.glsl
===================================================================
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 82ccdbd3514..1cce1f53c7b 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -2344,10 +2344,18 @@ static void OVERLAY_angular_limits_arc(OVERLAY_Data *data,
sub_v3_v3v3(ob1_pivot_dist_initial, constraint_ob->loc, ob1->loc);
float constrained_axis_rot;
- float arc_start[3] = {cosf((angle/2) + angular_offset), sinf((angle/2) + angular_offset), 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);
- angular_offset += ( M_PI - constrained_axis_rot);
+
+ if(ob1 == rbc->ob1) {
+ float arc_start[3] = {cosf(0.0f), sinf(0.0f), 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};
+ 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);
+ }
+ angular_offset += (M_PI - constrained_axis_rot);
float disk_pos[3];
copy_v3_v3(disk_pos, real_pivot);
@@ -2355,24 +2363,15 @@ static void OVERLAY_angular_limits_arc(OVERLAY_Data *data,
float final_mat[4][4] = {{0.0f}};
- float ob1_initial_rot[3][3];
- float ob1_transform_inv[4][4] = {{0.0f}};
float ob2_initial_rot_inv[3][3];
float ob2_transform[4][4];
- /* copy_m4_m4(ob1_transform_inv, ob2->obmat);
- invert_m4(ob1_transform_inv);
- BKE_object_rot_to_mat3(ob2, ob1_initial_rot, false); */
-
BKE_object_rot_to_mat3(ob2, ob2_initial_rot_inv, false);
invert_m3(ob2_initial_rot_inv);
copy_m4_m4(ob2_transform, ob2->obmat);
zero_v4(ob2_transform[3]);
mul_m4_m4m3(final_mat, ob2_transform, ob2_initial_rot_inv);
- // mul_m4_m4m4(final_mat, final_mat, ob2_transform);
- // mul_m4_m4m3(final_mat, final_mat, ob2_initial_rot_inv);
-
mul_m4_m4m3(final_mat, final_mat, transform_mat);
copy_v3_v3(final_mat[3], disk_pos);
@@ -2401,20 +2400,27 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
int axis) {
float color1[4] = {0.0f, 0.0f, 1.0f, 1.0f};
float color2[4] = {0.0f, 0.5f, 0.8f, 1.0f};
- float angle;
- float angular_offset;
+ float angle = 0.0f;
+ float angular_offset = 0.0f;
float ob1_pivot_dist_initial[3];
sub_v3_v3v3(ob1_pivot_dist_initial, constraint_ob->loc, ob1->loc);
- float real_pivot[3];
- float ob1_initial_rot_inv[3][3];
- float ob1_rot[3][3];
+ float real_pivot[3] = {0.0f};
+ float ob1_initial_rot_inv[3][3] = {{0.0f}};
+ float ob1_rot[3][3] = {{0.0}};
copy_m3_m4(ob1_rot, ob1->obmat);
BKE_object_rot_to_mat3(ob1, ob1_initial_rot_inv, false);
invert_m3(ob1_initial_rot_inv);
- mul_v3_m3v3(real_pivot, ob1_initial_rot_inv, ob1_pivot_dist_initial);
- mul_v3_m4v3(real_pivot, ob1->obmat, real_pivot);
-
+ if(constraint_ob == ob1) {
+ copy_v3_v3(real_pivot, ob1->rigidbody_object->pos);
+ }
+ else if(constraint_ob == ob2) {
+ 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);
+ }
/* Rotate arc to correct initial orientation */
float rot1[3][3] = {{0}};
/* Constraint object transform. */
@@ -2428,7 +2434,7 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
constrained_axis_w_initial[axis] = 1.0f;
/* Get constrained axis rotation from constraint object. */
- copy_m3_m4(rot2, constraint_ob->obmat);
+ BKE_object_rot_to_mat3(constraint_ob, rot2, false);
mul_m3_v3(rot2, constrained_axis_w_initial);
copy_v3_v3(constrained_axis_w, constrained_axis_w_initial);
@@ -2445,19 +2451,19 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
switch(axis){
case 0:
angle = (rbc->limit_ang_x_upper - rbc->limit_ang_x_lower);
- angular_offset = rbc->limit_lin_x_lower;
+ angular_offset = rbc->limit_ang_x_lower;
ax[1] = 1.0f;
axis_angle_to_mat3(rot1, ax, M_PI_2);
break;
case 1:
angle = (rbc->limit_ang_y_upper - rbc->limit_ang_y_lower);
- angular_offset = rbc->limit_lin_y_lower;
+ angular_offset = rbc->limit_ang_y_lower;
ax[0] = 1.0f;
axis_angle_to_mat3(rot1, ax, M_PI_2);
break;
case 2:
angle = (rbc->limit_ang_z_upper - rbc->limit_ang_z_lower);
- angular_offset = rbc->limit_lin_z_lower;
+ angular_offset = rbc->limit_ang_z_lower;
unit_m3(rot1);
break;
}
@@ -2622,7 +2628,9 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob)
}
if(ob->rigidbody_constraint != NULL) {
- OVERLAY_rb_constraint_limits(cb, vedata, ob);
+ if(ob->rigidbody_constraint->flag & RBC_FLAG_DRAW_CONSTRAINT_LIMITS) {
+ OVERLAY_rb_constraint_limits(cb, vedata, ob);
+ }
}
if (ob->dtx & OB_AXIS) {
diff --git a/source/blender/draw/engines/overlay/shaders/constraint_angular_limits_vert.glsl b/source/blender/draw/engines/overlay/shaders/constraint_angular_limits_vert.glsl
index 7e042a6a83c..7881f49a0c5 100644
--- a/source/blender/draw/engines/overlay/shaders/constraint_angular_limits_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/constraint_angular_limits_vert.glsl
@@ -8,7 +8,7 @@ flat out vec4 finalColor;
const float PI = 3.141592653589;
const float segment_angular_width = PI * 10/180;
-int n_segments = int(ceil(angle/segment_angular_width));
+int n_segments = int(floor(angle/segment_angular_width));
int indices[74];
@@ -23,10 +23,10 @@ void main(void)
vec4 p[37];
p[0] = vec4(0.0, 0.0, 0.0, 1.0);
- for (int i = 0; i <= n_segments; i++) {
+ for (int i = 0; i < n_segments; i++) {
p[i+1] = vec4(cos((angle * i / n_segments)+ offset), sin((angle * i / n_segments)+offset), 0.0, 1.0);
}
- // p[n_segments] = vec4(cos((angle - (angle * (n_segments-1) / n_segments))+ offset), sin((angle - (angle * (n_segments-1) / n_segments))+ offset), 0.0, 1.0);
+ p[n_segments+1] = vec4(cos(angle + offset), sin(angle + offset), 0.0, 1.0);
int ind = indices[gl_VertexID%74];
More information about the Bf-blender-cvs
mailing list