Commit: 3bf31c6d234537e2207fc71b1ef016f800803ca9
Author: Campbell Barton
Date:   Thu May 4 01:32:16 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB3bf31c6d234537e2207fc71b1ef016f800803ca9

Move pose-bone colors into draw_data

Also only allocate necessary number of bone segments.

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

M       source/blender/blenkernel/intern/action.c
M       source/blender/draw/intern/draw_armature.c
M       source/blender/makesdna/DNA_action_types.h

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

diff --git a/source/blender/blenkernel/intern/action.c 
b/source/blender/blenkernel/intern/action.c
index 9889ebc56ef..30097a98b40 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -580,7 +580,7 @@ void BKE_pose_copy_data(bPose **dst, bPose *src, const bool 
copy_constraints)
                        pchan->prop = IDP_CopyProperty(pchan->prop);
                }
 
-               pchan->draw_data = NULL;  /* Drawing cache of bbone matrices, 
no need to copy. */
+               pchan->draw_data = NULL;  /* Drawing cache, no need to copy. */
        }
 
        /* for now, duplicate Bone Groups too when doing this */
@@ -770,7 +770,7 @@ void BKE_pose_channel_free_ex(bPoseChannel *pchan, bool 
do_id_user)
                MEM_freeN(pchan->prop);
        }
 
-       /* Cached bbone matrices, for new draw manager rendering code. */
+       /* Cached data, for new draw manager rendering code. */
        MEM_SAFE_FREE(pchan->draw_data);
 }
 
diff --git a/source/blender/draw/intern/draw_armature.c 
b/source/blender/draw/intern/draw_armature.c
index cd04ecc62f7..68104dafc07 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -551,7 +551,7 @@ static const float *get_bone_solid_color(
 #endif
 
        if (arm->flag & ARM_POSEMODE) {
-               float *disp_color = (float *)pchan->disp_solid_color;
+               float *disp_color = pchan->draw_data->solid_color;
                set_pchan_color(PCHAN_COLOR_SOLID, boneflag, constflag, 
disp_color);
                disp_color[3] = 1.0;
                return disp_color;
@@ -586,7 +586,7 @@ static const float *get_bone_wire_color(
                }
        }
        else if (arm->flag & ARM_POSEMODE) {
-               float *disp_color = (float *)pchan->disp_wire_color;
+               float *disp_color = pchan->draw_data->wire_color;
                set_pchan_color(PCHAN_COLOR_NORMAL, boneflag, constflag, 
disp_color);
                disp_color[3] = 1.0;
                return disp_color;
@@ -623,6 +623,23 @@ static const float *get_bone_wire_color(
 /** \name Helper Utils
  * \{ */
 
+static void pchan_draw_data_init(bPoseChannel *pchan)
+{
+
+       if (pchan->draw_data != NULL) {
+               if (pchan->draw_data->bbone_matrix_len != 
pchan->bone->segments) {
+                       MEM_SAFE_FREE(pchan->draw_data);
+               }
+       }
+
+       if (pchan->draw_data == NULL) {
+               bPoseChannelDrawData *draw_data;
+               /* We just allocate max allowed segcount, we can always refine 
this later if really needed. */
+               pchan->draw_data = MEM_mallocN(sizeof(*draw_data) + 
sizeof(Mat4) * pchan->bone->segments, __func__);
+               pchan->draw_data->bbone_matrix_len = pchan->bone->segments;
+       }
+}
+
 static void draw_bone_update_disp_matrix_default(EditBone *eBone, bPoseChannel 
*pchan)
 {
        float s[4][4], ebmat[4][4];
@@ -737,7 +754,6 @@ static void draw_bone_update_disp_matrix_bbone(EditBone 
*eBone, bPoseChannel *pc
        float length, xwidth, zwidth;
        float (*bone_mat)[4];
        float (*disp_mat)[4];
-       float (*disp_tail_mat)[4];
        short bbone_segments;
 
        /* TODO : This should be moved to depsgraph or armature refresh
@@ -749,7 +765,6 @@ static void draw_bone_update_disp_matrix_bbone(EditBone 
*eBone, bPoseChannel *pc
                zwidth = pchan->bone->zwidth;
                bone_mat = pchan->pose_mat;
                disp_mat = pchan->disp_mat;
-               disp_tail_mat = pchan->disp_tail_mat;
                bbone_segments = pchan->bone->segments;
        }
        else {
@@ -761,7 +776,6 @@ static void draw_bone_update_disp_matrix_bbone(EditBone 
*eBone, bPoseChannel *pc
                zwidth = eBone->zwidth;
                bone_mat = ebmat;
                disp_mat = eBone->disp_mat;
-               disp_tail_mat = eBone->disp_tail_mat;
                bbone_segments = eBone->segments;
        }
 
@@ -771,12 +785,7 @@ static void draw_bone_update_disp_matrix_bbone(EditBone 
*eBone, bPoseChannel *pc
        /* Note that we need this even for one-segment bones, because box 
drawing need specific weirdo matrix for the box,
         * that we cannot use to draw end points & co. */
        if (pchan) {
-               Mat4 *bbones_mat = pchan->draw_data;
-               if (bbones_mat == NULL) {
-                       /* We just allocate max allowed segcount, we can always 
refine this later if really needed. */
-                       bbones_mat = pchan->draw_data = 
MEM_mallocN(sizeof(*bbones_mat) * MAX_BBONE_SUBDIV, __func__);
-               }
-
+               Mat4 *bbones_mat = (Mat4 *)pchan->draw_data->bbone_matrix;
                if (bbone_segments > 1) {
                        b_bone_spline_setup(pchan, 0, bbones_mat);
 
@@ -957,7 +966,7 @@ static void draw_bone_wire(
        }
 
        if (pchan) {
-               Mat4 *bbones_mat = pchan->draw_data;
+               Mat4 *bbones_mat = (Mat4 *)pchan->draw_data->bbone_matrix;
                BLI_assert(bbones_mat != NULL);
 
                for (int i = pchan->bone->segments; i--; bbones_mat++) {
@@ -992,7 +1001,7 @@ static void draw_bone_box(
        }
 
        if (pchan) {
-               Mat4 *bbones_mat = pchan->draw_data;
+               Mat4 *bbones_mat = (Mat4 *)pchan->draw_data->bbone_matrix;
                BLI_assert(bbones_mat != NULL);
 
                for (int i = pchan->bone->segments; i--; bbones_mat++) {
@@ -1163,6 +1172,8 @@ static void draw_armature_pose(Object *ob, const float 
const_color[4])
 
                                const short constflag = pchan->constflag;
 
+                               pchan_draw_data_init(pchan);
+
                                if (const_color) {
                                        /* keep color */
                                }
diff --git a/source/blender/makesdna/DNA_action_types.h 
b/source/blender/makesdna/DNA_action_types.h
index d4fd54ce7ad..87749c3b768 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -180,6 +180,16 @@ typedef enum eMotionPaths_BakeFlag {
        MOTIONPATH_BAKE_HAS_PATHS       = (1 << 2)
 } eMotionPath_BakeFlag;
 
+#
+#
+typedef struct bPoseChannelDrawData {
+       float solid_color[4];
+       float wire_color[4];
+
+       int bbone_matrix_len;
+       float bbone_matrix[32][4][4];
+} bPoseChannelDrawData;
+
 /* ************************************************ */
 /* Poses */
 
@@ -261,11 +271,9 @@ typedef struct bPoseChannel {
        struct bPoseChannel *bbone_prev; /* next/prev bones to use as handle 
references when calculating bbones (optional) */
        struct bPoseChannel *bbone_next;
 
-       float disp_solid_color[4];      /* for display only */
-       float disp_wire_color[4];
-
        void        *temp;              /* use for outliner */
-       void *draw_data;                /* Used to cache each bbone's segment 
matrix. */
+       /* Runtime data for color and bbone segment matrix. */
+       bPoseChannelDrawData *draw_data;
 } bPoseChannel;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to