diff options
author | Ton Roosendaal <ton@blender.org> | 2005-07-22 02:03:27 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-07-22 02:03:27 +0400 |
commit | 96a6a38e00fe150d297cf3f80eb97250d9fafd82 (patch) | |
tree | d9b6e44fdc97d4dec8369933f60bc13a336a6ba7 /source/blender/src | |
parent | 24f2b61fdba0721ba76839570ea44cefc0ea0e63 (diff) |
New drawmode for the Armature geeks!
It was noticed that Bones dont perform well in 'xray' drawing, for that
purpose a very minimal style would serve best.
This new option "Line" draws a solid line with bitmap circles in endings.
http://www.blender.org/cms/Armature_draw_modes.629.0.html
Or temporal pics:
http://www.blender.org/bf/rt1.jpg
http://www.blender.org/bf/rt.jpg
Diffstat (limited to 'source/blender/src')
-rw-r--r-- | source/blender/src/buttons_editing.c | 21 | ||||
-rw-r--r-- | source/blender/src/drawarmature.c | 151 | ||||
-rw-r--r-- | source/blender/src/editnla.c | 5 |
3 files changed, 155 insertions, 22 deletions
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 09db99e7bf5..a0f983b5b2d 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -1778,24 +1778,25 @@ static void editing_panel_armature_type(Object *ob, bArmature *arm) { uiBlock *block; uiBut *but; - int bx=148, by=120; block= uiNewBlock(&curarea->uiblocks, "editing_panel_armature_type", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Armature", "Editing", 320, 0, 318, 204)==0) return; + uiBlockBeginAlign(block); but = uiDefButI(block, TOG|BIT|ARM_RESTPOSBIT,REDRAWVIEW3D, - "Rest Pos", bx,by,97,20, &arm->flag, 0, 0, 0, 0, - "Disable all animation for this object"); + "Rest Position", 10,180,150,20, &arm->flag, 0, 0, 0, 0, "Disable all animation for this object"); uiButSetFunc(but, armature_rest_pos_func, ob, arm); + uiDefButI(block, TOG|BIT|ARM_DELAYBIT,REDRAWVIEW3D, "Delay Deform", 160, 180,150,20, &arm->flag, 0, 0, 0, 0, "Don't deform children when manipulating bones in pose mode"); + + uiBlockBeginAlign(block); + uiDefButI(block, ROW, REDRAWVIEW3D, "Octahedron", 10, 140,100,20, &arm->drawtype, 0, ARM_OCTA, 0, 0, "Draw bone as octahedra"); + uiDefButI(block, ROW, REDRAWVIEW3D, "Lines", 110, 140,100,20, &arm->drawtype, 0, ARM_LINE, 0, 0, "Draw bone as simple 2d lines with dots"); + uiDefButI(block, ROW, REDRAWVIEW3D, "B-Bones", 210, 140,100,20, &arm->drawtype, 0, ARM_B_BONE, 0, 0, "Draw bone as boxes, showing subdivision and b-splines"); - by-= 23; uiBlockBeginAlign(block); - uiDefButBitI(block, TOG, ARM_B_BONES, REDRAWVIEW3D, "B-Bones", bx, by-23,97,20, &arm->flag, 0, 0, 0, 0, "Draw bone as boxes, showing subdivision and b-splines"); - uiDefButI(block, TOG|BIT|ARM_DRAWAXESBIT,REDRAWVIEW3D, "Draw Axes", bx, by-46,97,20, &arm->flag, 0, 0, 0, 0, "Draw bone axes"); - uiDefButI(block, TOG|BIT|ARM_DRAWNAMESBIT,REDRAWVIEW3D, "Draw Names", bx,by-69,97,20, &arm->flag, 0, 0, 0, 0, "Draw bone names"); - uiDefButBitC(block, TOG, OB_DRAWXRAY,REDRAWVIEW3D, "X-Ray", bx, by-92,97,20, &ob->dtx, 0, 0, 0, 0, "Draw armature in front of solid objects"); - uiDefButI(block, TOG|BIT|ARM_DELAYBIT,REDRAWVIEW3D, "Delay Deform", bx, by-115,97,20, &arm->flag, 0, 0, 0, 0, "Don't deform children when manipulating bones in pose mode"); - + uiDefButI(block, TOG|BIT|ARM_DRAWAXESBIT,REDRAWVIEW3D, "Draw Axes", 10, 110,100,20, &arm->flag, 0, 0, 0, 0, "Draw bone axes"); + uiDefButI(block, TOG|BIT|ARM_DRAWNAMESBIT,REDRAWVIEW3D, "Draw Names", 110,110,100,20, &arm->flag, 0, 0, 0, 0, "Draw bone names"); + uiDefButBitC(block, TOG, OB_DRAWXRAY,REDRAWVIEW3D, "X-Ray", 210,110,100,20, &ob->dtx, 0, 0, 0, 0, "Draw armature in front of solid objects"); } static void editing_panel_armature_bones(Object *ob, bArmature *arm) diff --git a/source/blender/src/drawarmature.c b/source/blender/src/drawarmature.c index 395cfb7340f..3fdbf861099 100644 --- a/source/blender/src/drawarmature.c +++ b/source/blender/src/drawarmature.c @@ -373,6 +373,123 @@ static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id) } +static char bm_dot6[]= {0x0, 0x18, 0x3C, 0x7E, 0x7E, 0x3C, 0x18, 0x0}; +static char bm_dot8[]= {0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C}; + +static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned int id, bPoseChannel *pchan, EditBone *ebone) +{ + float length; + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + if(pchan) + length= pchan->bone->length; + else + length= ebone->length; + + glPushMatrix(); + glScalef(length, length, length); + + /* this chunk not in object mode */ + if(armflag & (ARM_EDITMODE|ARM_POSEMODE)) { + glLineWidth(4.0); + if(armflag & ARM_POSEMODE) { + /* outline in black or selection color */ + if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40); + else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE); + else BIF_ThemeColor(TH_WIRE); + } + else if (armflag & ARM_EDITMODE) { + BIF_ThemeColor(TH_WIRE); + } + + /* Draw root point if we have no IK parent */ + if (!(boneflag & BONE_IK_TOPARENT)){ + if (id != -1) { // no bitmap in selection mode, crashes 3d cards... + glLoadName (id | BONESEL_ROOT); + glBegin(GL_POINTS); + glVertex3f(0.0f, 0.0f, 0.0f); + glEnd(); + } + else { + glRasterPos3f(0.0f, 0.0f, 0.0f); + glBitmap(8, 8, 4, 4, 0, 0, bm_dot8); + } + } + + if (id != -1) + glLoadName ((GLuint) id|BONESEL_BONE); + + glBegin(GL_LINES); + glVertex3f(0.0f, 0.0f, 0.0f); + glVertex3f(0.0f, 1.0f, 0.0f); + glEnd(); + + /* tip */ + if (id != -1) { // no bitmap in selection mode, crashes 3d cards... + glLoadName (id | BONESEL_TIP); + glBegin(GL_POINTS); + glVertex3f(0.0f, 1.0f, 0.0f); + glEnd(); + } + else { + glRasterPos3f(0.0f, 1.0f, 0.0f); + glBitmap(8, 8, 4, 4, 0, 0, bm_dot8); + } + + /* further we send no names */ + if (id != -1) + glLoadName (-1); + + if(armflag & ARM_POSEMODE) { + /* inner part in background color or constraint */ + if(constflag) { + if(constflag & PCHAN_HAS_IK) glColor3ub(255, 255, 0); + else if(constflag & PCHAN_HAS_CONST) glColor3ub(0, 255, 120); + else BIF_ThemeColor(TH_BONE_POSE); // PCHAN_HAS_ACTION + } + else BIF_ThemeColor(TH_BACK); + } + } + + glLineWidth(2.0); + + /* Draw root point if we have no IK parent */ + if (!(boneflag & BONE_IK_TOPARENT)){ + if (id == -1) { // no bitmap in selection mode, crashes 3d cards... + if(armflag & ARM_EDITMODE) { + if (boneflag & BONE_ROOTSEL) BIF_ThemeColor(TH_VERTEX_SELECT); + else BIF_ThemeColor(TH_VERTEX); + } + glRasterPos3f(0.0f, 0.0f, 0.0f); + glBitmap(8, 8, 4, 4, 0, 0, bm_dot6); + } + } + + if(armflag & ARM_EDITMODE) { + if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_EDGE_SELECT); + else BIF_ThemeColor(TH_BACK); + } + glBegin(GL_LINES); + glVertex3f(0.0f, 0.0f, 0.0f); + glVertex3f(0.0f, 1.0f, 0.0f); + glEnd(); + + /* tip */ + if (id == -1) { // no bitmap in selection mode, crashes 3d cards... + if(armflag & ARM_EDITMODE) { + if (boneflag & BONE_TIPSEL) BIF_ThemeColor(TH_VERTEX_SELECT); + else BIF_ThemeColor(TH_VERTEX); + } + glRasterPos3f(0.0f, 1.0f, 0.0f); + glBitmap(8, 8, 4, 4, 0, 0, bm_dot6); + } + + glLineWidth(1.0); + + glPopMatrix(); +} + static void draw_b_bone_boxes(int dt, bPoseChannel *pchan, float xwidth, float length, float zwidth) { int segments= 0; @@ -580,7 +697,7 @@ static void draw_pose_channels(Object *ob, int dt) if(tmp > 1.1) do_dashed= 0; /* if solid we draw that first, with selection codes, but without names, axes etc */ - if(dt>OB_WIRE) { + if(dt>OB_WIRE && arm->drawtype!=ARM_LINE) { if(arm->flag & ARM_POSEMODE) index= 0; for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { @@ -594,7 +711,7 @@ static void draw_pose_channels(Object *ob, int dt) if(bone->parent && (bone->parent->flag & BONE_HIDDEN)) flag &= ~BONE_IK_TOPARENT; - if(arm->flag & ARM_B_BONES) + if(arm->drawtype==ARM_B_BONE) draw_b_bone(OB_SOLID, arm->flag, flag, 0, index, pchan, NULL); else { /* scale the matrix to unit bone space */ @@ -611,10 +728,14 @@ static void draw_pose_channels(Object *ob, int dt) } /* wire draw over solid only in posemode */ - if(dt<=OB_WIRE || (arm->flag & ARM_POSEMODE)) { + if( dt<=OB_WIRE || (arm->flag & ARM_POSEMODE) || arm->drawtype==ARM_LINE) { + /* draw line check first. we do selection indices */ + if (arm->drawtype==ARM_LINE) { + if(G.f & G_PICKSEL) index= 0; + } /* if solid && posemode, we draw again with polygonoffset */ - if (dt>OB_WIRE && (arm->flag & ARM_POSEMODE)) + else if (dt>OB_WIRE && (arm->flag & ARM_POSEMODE)) bglPolygonOffset(1.0); else /* and we use selection indices if not done yet */ @@ -651,7 +772,9 @@ static void draw_pose_channels(Object *ob, int dt) if(pchan->flag & (POSE_ROT|POSE_LOC|POSE_SIZE)) constflag |= PCHAN_HAS_ACTION; - if(arm->flag & ARM_B_BONES) + if(arm->drawtype==ARM_LINE) + draw_line_bone(arm->flag, flag, constflag, index, pchan, NULL); + else if(arm->drawtype==ARM_B_BONE) draw_b_bone(OB_WIRE, arm->flag, flag, constflag, index, pchan, NULL); else { /* scale the matrix to unit bone space */ @@ -737,13 +860,13 @@ static void draw_ebones(Object *ob, int dt) unsigned int index; /* if solid we draw it first */ - if(dt>OB_WIRE) { + if(dt>OB_WIRE && arm->drawtype!=ARM_LINE) { index= 0; for (eBone=G.edbo.first, index=0; eBone; eBone=eBone->next, index++){ glPushMatrix(); set_matrix_editbone(eBone); - if(arm->flag & ARM_B_BONES) + if(arm->drawtype==ARM_B_BONE) draw_b_bone(OB_SOLID, arm->flag, eBone->flag, 0, index, NULL, eBone); else { /* scale the matrix to unit bone space */ @@ -757,15 +880,23 @@ static void draw_ebones(Object *ob, int dt) /* if wire over solid, set offset */ index= -1; - if (dt>OB_WIRE) bglPolygonOffset(1.0); - else if(arm->flag & ARM_EDITMODE) index= 0; // do selection codes + if(arm->drawtype==ARM_LINE) { + if(G.f & G_PICKSEL) + index= 0; + } + else if (dt>OB_WIRE) + bglPolygonOffset(1.0); + else if(arm->flag & ARM_EDITMODE) + index= 0; // do selection codes for (eBone=G.edbo.first; eBone; eBone=eBone->next){ glPushMatrix(); set_matrix_editbone(eBone); - if(arm->flag & ARM_B_BONES) + if(arm->drawtype==ARM_LINE) + draw_line_bone(arm->flag, eBone->flag, 0, index, NULL, eBone); + else if(arm->drawtype==ARM_B_BONE) draw_b_bone(OB_WIRE, arm->flag, eBone->flag, 0, index, NULL, eBone); else { /* scale the matrix to unit bone space */ diff --git a/source/blender/src/editnla.c b/source/blender/src/editnla.c index 4091d07dc86..1cfb308164a 100644 --- a/source/blender/src/editnla.c +++ b/source/blender/src/editnla.c @@ -40,11 +40,12 @@ #include "PIL_time.h" +#include "BKE_action.h" #include "BKE_global.h" -#include "BKE_main.h" +#include "BKE_ipo.h" #include "BKE_library.h" +#include "BKE_main.h" #include "BKE_nla.h" -#include "BKE_action.h" #include "MEM_guardedalloc.h" |