Killed silly modal PoseMode mode! :)

- PoseMode now is a state Armature Objects can be in. So, while in PoseMode
  for an Armature, you can just select another Object or Armature.
- The old PoseMode options (transform, insert keys etc) are accessible
  with making the Armature Object 'active' (and have object in PoseMode).
- At this moment no multiple Poses can be transformed/edited at the same
  time.
- The old hotkey CTRL+TAB, and view3d header menu, still work to set an
  Object's PoseMode

It was quite a lot recode, so tests & reports are welcome.

Oh, as a bonus I added Lasso Select for Bones in PoseMode! It selects using
only the line between root and tip of the Bone.
This commit is contained in:
2005-07-23 18:52:31 +00:00
parent 6e98a38ea2
commit 948f27c0d8
38 changed files with 1403 additions and 1455 deletions

View File

@@ -78,7 +78,6 @@ void calc_armature_deform (struct Object *ob, float *co, int index);
void init_armature_deform(struct Object *parent, struct Object *ob);
struct bArmature* get_armature (struct Object* ob);
struct Bone *get_named_bone (struct bArmature *arm, const char *name);
struct Bone *get_indexed_bone (struct Object *ob, int index);
float dist_to_bone (float vec[3], float b1[3], float b2[3]);

View File

@@ -112,7 +112,6 @@ typedef struct Global {
int save_over;
/* Reevan's __NLA variables */
struct Object *obpose; /* Current posable object */
struct ListBase edbo; /* Armature Editmode bones */
/* Rob's variables */

View File

@@ -1141,27 +1141,6 @@ void where_is_pose (Object *ob)
}
}
/* *************** helper for selection code ****************** */
Bone *get_indexed_bone (Object *ob, int index)
/*
Now using pose channel
*/
{
bPoseChannel *pchan;
int a= 0;
if(ob->pose==NULL) return NULL;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next, a++) {
if(a==index) return pchan->bone;
}
return NULL;
}
/* ****************** Game Blender functions, called by engine ************** */
void GB_build_mats (float parmat[][4], float obmat[][4], float premat[][4], float postmat[][4])

View File

@@ -248,7 +248,6 @@ static void clear_global(void)
G.main= NULL;
G.obedit= NULL;
G.obpose= NULL;
G.saction= NULL;
G.buts= NULL;
G.v2d= NULL;
@@ -307,8 +306,6 @@ static void clean_paths(Main *main)
static void setup_app_data(BlendFileData *bfd, char *filename)
{
Object *ob;
Base *base;
bScreen *curscreen= NULL;
Scene *curscene= NULL;
char mode;
@@ -379,17 +376,6 @@ static void setup_app_data(BlendFileData *bfd, char *filename)
G.f= bfd->globalf;
/* check posemode */
for(base= G.scene->base.first; base; base=base->next) {
ob= base->object;
if(ob->flag & OB_POSEMODE) {
if(ob->type==OB_ARMATURE && G.scene->basact && G.scene->basact->object==ob)
G.obpose= ob;
else
ob->flag &= ~OB_POSEMODE;
}
}
if (!G.background) {
setscreen(G.curscreen);
}

View File

@@ -723,9 +723,6 @@ Object *add_object(int type)
Base *base;
char name[32];
if (G.obpose)
exit_posemode(1);
strcpy(name, get_obdata_defname(type));
ob= alloc_libblock(&G.main->object, ID_OB, name);

View File

@@ -2639,3 +2639,163 @@ void spheremap(float x, float y, float z, float *u, float *v)
/* ------------------------------------------------------------------------- */
/* ***************** m1 = m2 ***************** */
void cpy_m3_m3(float m1[][3], float m2[][3])
{
memcpy(m1[0], m2[0], 9*sizeof(float));
}
/* ***************** m1 = m2 ***************** */
void cpy_m4_m4(float m1[][4], float m2[][4])
{
memcpy(m1[0], m2[0], 16*sizeof(float));
}
/* ***************** identity matrix ***************** */
void ident_m4(float m[][4])
{
m[0][0]= m[1][1]= m[2][2]= m[3][3]= 1.0;
m[0][1]= m[0][2]= m[0][3]= 0.0;
m[1][0]= m[1][2]= m[1][3]= 0.0;
m[2][0]= m[2][1]= m[2][3]= 0.0;
m[3][0]= m[3][1]= m[3][2]= 0.0;
}
/* ***************** m1 = m2 (pre) * m3 (post) ***************** */
void mul_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
{
float m[3][3];
m[0][0]= m2[0][0]*m3[0][0] + m2[1][0]*m3[0][1] + m2[2][0]*m3[0][2];
m[0][1]= m2[0][1]*m3[0][0] + m2[1][1]*m3[0][1] + m2[2][1]*m3[0][2];
m[0][2]= m2[0][2]*m3[0][0] + m2[1][2]*m3[0][1] + m2[2][2]*m3[0][2];
m[1][0]= m2[0][0]*m3[1][0] + m2[1][0]*m3[1][1] + m2[2][0]*m3[1][2];
m[1][1]= m2[0][1]*m3[1][0] + m2[1][1]*m3[1][1] + m2[2][1]*m3[1][2];
m[1][2]= m2[0][2]*m3[1][0] + m2[1][2]*m3[1][1] + m2[2][2]*m3[1][2];
m[2][0]= m2[0][0]*m3[2][0] + m2[1][0]*m3[2][1] + m2[2][0]*m3[2][2];
m[2][1]= m2[0][1]*m3[2][0] + m2[1][1]*m3[2][1] + m2[2][1]*m3[2][2];
m[2][2]= m2[0][2]*m3[2][0] + m2[1][2]*m3[2][1] + m2[2][2]*m3[2][2];
cpy_m3_m3(m1, m2);
}
/* ***************** m1 = m2 (pre) * m3 (post) ***************** */
void mul_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
{
float m[4][4];
m[0][0]= m2[0][0]*m3[0][0] + m2[1][0]*m3[0][1] + m2[2][0]*m3[0][2] + m2[3][0]*m3[0][3];
m[0][1]= m2[0][1]*m3[0][0] + m2[1][1]*m3[0][1] + m2[2][1]*m3[0][2] + m2[3][1]*m3[0][3];
m[0][2]= m2[0][2]*m3[0][0] + m2[1][2]*m3[0][1] + m2[2][2]*m3[0][2] + m2[3][2]*m3[0][3];
m[0][3]= m2[0][3]*m3[0][0] + m2[1][3]*m3[0][1] + m2[2][3]*m3[0][2] + m2[3][3]*m3[0][3];
m[1][0]= m2[0][0]*m3[1][0] + m2[1][0]*m3[1][1] + m2[2][0]*m3[1][2] + m2[3][0]*m3[1][3];
m[1][1]= m2[0][1]*m3[1][0] + m2[1][1]*m3[1][1] + m2[2][1]*m3[1][2] + m2[3][1]*m3[1][3];
m[1][2]= m2[0][2]*m3[1][0] + m2[1][2]*m3[1][1] + m2[2][2]*m3[1][2] + m2[3][2]*m3[1][3];
m[1][3]= m2[0][3]*m3[1][0] + m2[1][3]*m3[1][1] + m2[2][3]*m3[1][2] + m2[3][3]*m3[1][3];
m[2][0]= m2[0][0]*m3[2][0] + m2[1][0]*m3[2][1] + m2[2][0]*m3[2][2] + m2[3][0]*m3[2][3];
m[2][1]= m2[0][1]*m3[2][0] + m2[1][1]*m3[2][1] + m2[2][1]*m3[2][2] + m2[3][1]*m3[2][3];
m[2][2]= m2[0][2]*m3[2][0] + m2[1][2]*m3[2][1] + m2[2][2]*m3[2][2] + m2[3][2]*m3[2][3];
m[2][3]= m2[0][3]*m3[2][0] + m2[1][3]*m3[2][1] + m2[2][3]*m3[2][2] + m2[3][3]*m3[2][3];
m[3][0]= m2[0][0]*m3[3][0] + m2[1][0]*m3[3][1] + m2[2][0]*m3[3][2] + m2[3][0]*m3[3][3];
m[3][1]= m2[0][1]*m3[3][0] + m2[1][1]*m3[3][1] + m2[2][1]*m3[3][2] + m2[3][1]*m3[3][3];
m[3][2]= m2[0][2]*m3[3][0] + m2[1][2]*m3[3][1] + m2[2][2]*m3[3][2] + m2[3][2]*m3[3][3];
m[3][3]= m2[0][3]*m3[3][0] + m2[1][3]*m3[3][1] + m2[2][3]*m3[3][2] + m2[3][3]*m3[3][3];
cpy_m4_m4(m1, m2);
}
/* ***************** m1 = inverse(m2) ***************** */
void inv_m3_m3(float m1[][3], float m2[][3])
{
short a,b;
float det;
/* calc adjoint */
Mat3Adj(m1, m2);
/* then determinant old matrix! */
det= m2[0][0]* (m2[1][1]*m2[2][2] - m2[1][2]*m2[2][1])
-m2[1][0]* (m2[0][1]*m2[2][2] - m2[0][2]*m2[2][1])
+m2[2][0]* (m2[0][1]*m2[1][2] - m2[0][2]*m2[1][1]);
if(det==0.0f) det=1.0f;
det= 1.0f/det;
for(a=0;a<3;a++) {
for(b=0;b<3;b++) {
m1[a][b]*=det;
}
}
}
/* ***************** m1 = inverse(m2) ***************** */
int inv_m4_m4(float inverse[][4], float mat[][4])
{
int i, j, k;
double temp;
float tempmat[4][4];
float max;
int maxj;
/* Set inverse to identity */
ident_m4(inverse);
/* Copy original matrix so we don't mess it up */
cpy_m4_m4(tempmat, mat);
for(i = 0; i < 4; i++) {
/* Look for row with max pivot */
max = ABS(tempmat[i][i]);
maxj = i;
for(j = i + 1; j < 4; j++) {
if(ABS(tempmat[j][i]) > max) {
max = ABS(tempmat[j][i]);
maxj = j;
}
}
/* Swap rows if necessary */
if (maxj != i) {
for( k = 0; k < 4; k++) {
SWAP(float, tempmat[i][k], tempmat[maxj][k]);
SWAP(float, inverse[i][k], inverse[maxj][k]);
}
}
temp = tempmat[i][i];
if (temp == 0)
return 0; /* No non-zero pivot */
for(k = 0; k < 4; k++) {
tempmat[i][k] = (float)(tempmat[i][k]/temp);
inverse[i][k] = (float)(inverse[i][k]/temp);
}
for(j = 0; j < 4; j++) {
if(j != i) {
temp = tempmat[j][i];
for(k = 0; k < 4; k++) {
tempmat[j][k] -= (float)(tempmat[i][k]*temp);
inverse[j][k] -= (float)(inverse[i][k]*temp);
}
}
}
}
return 1;
}
/* ***************** v1 = v2 * mat ***************** */
void mul_v3_v3m4(float *v1, float *v2, float mat[][4])
{
float x, y;
x= v2[0]; // work with a copy, v1 can be same as v2
y= v2[1];
v1[0]= x*mat[0][0] + y*mat[1][0] + mat[2][0]*v2[2] + mat[3][0];
v1[1]= x*mat[0][1] + y*mat[1][1] + mat[2][1]*v2[2] + mat[3][1];
v1[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*v2[2] + mat[3][2];
}

View File

@@ -46,7 +46,6 @@ struct BoundBox;
struct Base;
void init_draw_rects(void);
void helpline(float *vec);
void drawaxes(float size);
void drawcamera(struct Object *ob);

View File

@@ -33,6 +33,7 @@
#define BIF_EDITARMATURE_H
struct Object;
struct Base;
struct Bone;
struct bArmature;
@@ -82,10 +83,12 @@ void clear_armature(struct Object *ob, char mode);
void delete_armature(void);
void deselectall_armature(int toggle);
void deselectall_posearmature (int test);
void draw_armature(struct Object *ob, int dt);
void deselectall_posearmature (struct Object *ob, int test);
void draw_armature(struct Base *base, int dt);
void extrude_armature(void);
void free_editArmature(void);
struct Bone *get_indexed_bone (struct Object *ob, int index);
void join_armature(void);
void load_editArmature(void);
@@ -94,7 +97,9 @@ void clear_bone_parent(void);
void make_editArmature(void);
void make_trans_bones (char mode);
void mousepose_armature(void);
void do_pose_selectbuffer(struct Base *base, unsigned int *buffer, short hits);
void mouse_armature(void);
void remake_editArmature(void);
void selectconnected_armature(void);
@@ -116,15 +121,14 @@ int bone_looper(Object *ob, struct Bone *bone, void *data,
int (*bone_func)(Object *, struct Bone *, void *));
int ik_chain_looper(Object *ob, struct Bone *bone, void *data,
int (*bone_func)(Object *, struct Bone *, void *));
int is_delay_deform(void);
void undo_push_armature(char *name);
void armature_bone_rename(struct bArmature *arm, char *oldname, char *newname);
#define BONESEL_ROOT 0x02000000
#define BONESEL_TIP 0x04000000
#define BONESEL_BONE 0x08000000
#define BONESEL_ROOT 0x10000000
#define BONESEL_TIP 0x20000000
#define BONESEL_BONE 0x40000000
#define BONESEL_ANY (BONESEL_TIP|BONESEL_ROOT|BONESEL_BONE)
#define BONESEL_NOSEL 0x80000000 /* Indicates a negative number */

View File

@@ -46,9 +46,8 @@ void set_pose_keys(struct Object *ob);
/**
* Deactivates posemode
* @param freedata 0 or 1 value indicating that posedata should be deleted
*/
void exit_posemode(int freedata);
void exit_posemode(void);
void pose_special_editmenu(void);

View File

@@ -208,9 +208,7 @@
#define B_SCENELOCK 140
#define B_LOCALVIEW 141
#define B_U_CAPSLOCK 142
#define B_EDITMODE 143
#define B_VPAINT 144
#define B_FACESEL 145
#define B_VIEWBUT 146
#define B_PERSP 147
#define B_PROPTOOL 148
@@ -218,9 +216,7 @@
#define B_VIEWTRANS 150
#define B_VIEWZOOM 151
#define B_STARTGAME 152
#define B_POSEMODE 153
#define B_TEXTUREPAINT 154
#define B_WPAINT 155
#define B_MODESELECT 156
#define B_AROUND 157
#define B_SEL_VERT 158

View File

@@ -380,26 +380,7 @@ typedef struct SpaceImaSel {
/* **************** SPACE ********************* */
/* view3d->flag */ /* Now in DNA_view3d_types.h */
/*
#define V3D_DISPIMAGE 1
#define V3D_DISPBGPIC 2
#define V3D_SETUPBUTS 4
#define V3D_NEEDBACKBUFDRAW 8
#define V3D_MODE (16+32+64+128)
#define V3D_EDITMODE 16
#define V3D_VERTEXPAINT 32
#define V3D_FACESELECT 64
#define V3D_POSEMODE 128
*/
/* view3d->around */ /* Now in DNA_view3d_types.h */
/*
#define V3D_CENTRE 0
#define V3D_CENTROID 3
#define V3D_CURSOR 1
#define V3D_LOCAL 2
*/
/* view3d Now in DNA_view3d_types.h */
/* buts defines in BIF_butspace.h */

View File

@@ -1865,6 +1865,8 @@ static void editing_panel_armature_bones(Object *ob, bArmature *arm)
uiBlockEndAlign(block);
by-=42;
if(by < -200) break; // for time being... extreme long panels are very slow
}
}
@@ -1925,7 +1927,9 @@ static void editing_panel_pose_bones(Object *ob, bArmature *arm)
bx+220, by-19, 110, 19, &curBone->ease2, 0.0, 2.0, 10.0, 0.0, "Second length of Bezier handle");
uiBlockEndAlign(block);
by-=42;
if(by < -200) break; // for time being... extreme long panels are very slow
}
}
@@ -2875,7 +2879,7 @@ void editing_panels()
if(G.obedit) {
editing_panel_armature_bones(ob, arm);
}
else if(G.obpose==ob) {
else if(ob->flag & OB_POSEMODE) {
editing_panel_pose_bones(ob, arm);
}
break;

View File

@@ -405,7 +405,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
/* 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 (G.f & G_PICKSEL) { // no bitmap in selection mode, crashes 3d cards...
glLoadName (id | BONESEL_ROOT);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
@@ -426,7 +426,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
glEnd();
/* tip */
if (id != -1) { // no bitmap in selection mode, crashes 3d cards...
if (G.f & G_PICKSEL) { // no bitmap in selection mode, crashes 3d cards...
glLoadName (id | BONESEL_TIP);
glBegin(GL_POINTS);
glVertex3f(0.0f, 1.0f, 0.0f);
@@ -439,7 +439,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
/* further we send no names */
if (id != -1)
glLoadName (-1);
glLoadName (id & 0xFFFF); // object tag, for bordersel optim
if(armflag & ARM_POSEMODE) {
/* inner part in background color or constraint */
@@ -456,7 +456,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
/* 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 ((G.f & G_PICKSEL)==0) { // 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);
@@ -476,7 +476,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
glEnd();
/* tip */
if (id == -1) { // no bitmap in selection mode, crashes 3d cards...
if ((G.f & G_PICKSEL)==0) { // 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);
@@ -678,11 +678,12 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
}
/* assumes object is Armature with pose */
static void draw_pose_channels(Object *ob, int dt)
static void draw_pose_channels(Base *base, int dt)
{
Object *ob= base->object;
bArmature *arm= ob->data;
bPoseChannel *pchan;
Bone *bone;
bArmature *arm= ob->data;
GLfloat tmp;
int index= -1;
int do_dashed= 1;
@@ -698,7 +699,7 @@ static void draw_pose_channels(Object *ob, int dt)
/* if solid we draw that first, with selection codes, but without names, axes etc */
if(dt>OB_WIRE && arm->drawtype!=ARM_LINE) {
if(arm->flag & ARM_POSEMODE) index= 0;
if(arm->flag & ARM_POSEMODE) index= base->selcol;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
@@ -721,9 +722,9 @@ static void draw_pose_channels(Object *ob, int dt)
}
glPopMatrix();
}
if (index!= -1) index++;
if (index!= -1) index+= 0x10000; // pose bones count in higher 2 bytes only
}
glLoadName (-1);
glLoadName (index & 0xFFFF); // object tag, for bordersel optim
index= -1;
}
@@ -732,14 +733,14 @@ static void draw_pose_channels(Object *ob, int dt)
/* draw line check first. we do selection indices */
if (arm->drawtype==ARM_LINE) {
if(G.f & G_PICKSEL) index= 0;
if (arm->flag & ARM_POSEMODE) index= base->selcol;
}
/* if solid && posemode, we draw again with polygonoffset */
else if (dt>OB_WIRE && (arm->flag & ARM_POSEMODE))
bglPolygonOffset(1.0);
else
/* and we use selection indices if not done yet */
if (arm->flag & ARM_POSEMODE) index= 0;
if (arm->flag & ARM_POSEMODE) index= base->selcol;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
@@ -748,7 +749,7 @@ static void draw_pose_channels(Object *ob, int dt)
// Draw a line from our root to the parent's tip
if (do_dashed && bone->parent && !(bone->flag & BONE_IK_TOPARENT) ){
if (arm->flag & ARM_POSEMODE) {
glLoadName (-1);
glLoadName (index & 0xFFFF); // object tag, for bordersel optim
BIF_ThemeColor(TH_WIRE);
}
setlinestyle(3);
@@ -785,7 +786,7 @@ static void draw_pose_channels(Object *ob, int dt)
glPopMatrix();
}
if (index!= -1) index++;
if (index!= -1) index+= 0x10000; // pose bones count in higher 2 bytes only
}
/* restore things */
if (arm->drawtype!=ARM_LINE && dt>OB_WIRE && (arm->flag & ARM_POSEMODE))
@@ -914,7 +915,7 @@ static void draw_ebones(Object *ob, int dt)
/* offset to parent */
if (eBone->parent) {
BIF_ThemeColor(TH_WIRE);
glLoadName (-1);
glLoadName (index & 0xFFFF); // object tag, for bordersel optim
setlinestyle(3);
glBegin(GL_LINES);
@@ -956,14 +957,16 @@ static void draw_ebones(Object *ob, int dt)
}
/* called from drawobject.c */
void draw_armature(Object *ob, int dt)
void draw_armature(Base *base, int dt)
{
Object *ob= base->object;
bArmature *arm= ob->data;
/* we use color for solid lighting */
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW); // only for lighting...
/* arm->flag is being used to detect mode... */
/* editmode? */
if(ob==G.obedit || (G.obedit && ob->data==G.obedit->data)) {
if(ob==G.obedit) arm->flag |= ARM_EDITMODE;
@@ -973,8 +976,13 @@ void draw_armature(Object *ob, int dt)
else{
/* Draw Pose */
if(ob->pose) {
if (G.obpose == ob) arm->flag |= ARM_POSEMODE;
draw_pose_channels(ob, dt);
/* drawing posemode selection indices or colors only in these cases */
if(G.f & G_PICKSEL) {
if(ob->flag & OB_POSEMODE) arm->flag |= ARM_POSEMODE;
}
else if(ob==OBACT && (ob->flag & OB_POSEMODE)) arm->flag |= ARM_POSEMODE;
draw_pose_channels(base, dt);
arm->flag &= ~ARM_POSEMODE;
}
}

View File

@@ -289,38 +289,6 @@ static void draw_icon_centered(float *pos, unsigned int *rect, int rectsize)
glDrawPixels(rectsize, rectsize, GL_RGBA, GL_UNSIGNED_BYTE, rect);
}
/* bad frontbuffer call... because it is used in transform after force_draw() */
void helpline(float *vec)
{
float vecrot[3], cent[2];
short mval[2];
VECCOPY(vecrot, vec);
if(G.obedit) Mat4MulVecfl(G.obedit->obmat, vecrot);
else if(G.obpose) Mat4MulVecfl(G.obpose->obmat, vecrot);
getmouseco_areawin(mval);
project_float(vecrot, cent); // no overflow in extreme cases
if(cent[0]!=3200.0f) {
persp(PERSP_WIN);
glDrawBuffer(GL_FRONT);
BIF_ThemeColor(TH_WIRE);
setlinestyle(3);
glBegin(GL_LINE_STRIP);
glVertex2sv(mval);
glVertex2fv(cent);
glEnd();
setlinestyle(0);
persp(PERSP_VIEW);
glFlush(); // flush display for frontbuffer
glDrawBuffer(GL_BACK);
}
}
void drawaxes(float size)
{
int axis;
@@ -3330,8 +3298,10 @@ static void drawtexspace(Object *ob)
}
/* draws wire outline */
static void drawSolidSelect(Object *ob)
static void drawSolidSelect(Base *base)
{
Object *ob= base->object;
glLineWidth(2.0);
glDepthMask(0);
@@ -3344,8 +3314,8 @@ static void drawSolidSelect(Object *ob)
drawDispListwire(&ob->disp);
}
else if(ob->type==OB_ARMATURE) {
if(ob!=G.obpose) {
draw_armature(ob, OB_WIRE);
if(!(ob->flag & OB_POSEMODE)) {
draw_armature(base, OB_WIRE);
}
}
@@ -3587,7 +3557,7 @@ void draw_object(Base *base)
if((G.vd->flag & V3D_SELECT_OUTLINE) && ob->type!=OB_MESH) {
if(dt>OB_WIRE && dt<OB_TEXTURE && ob!=G.obedit) {
if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(G.f&G_PICKSEL)) {
drawSolidSelect(ob);
drawSolidSelect(base);
}
}
}
@@ -3723,7 +3693,7 @@ void draw_object(Base *base)
break;
case OB_ARMATURE:
if(dt>OB_WIRE) set_gl_material(0); // we use defmaterial
draw_armature(ob, dt);
draw_armature(base, dt);
break;
default:
drawaxes(1.0);

View File

@@ -70,8 +70,6 @@ void set_scene(Scene *sce) /* also see scene.c: set_scene_bg() */
/* ending all modes */
if( G.obedit)
exit_editmode(2);
if(G.obpose)
exit_posemode(1);
if(G.f & G_FACESELECT)
set_faceselect();

View File

@@ -1589,7 +1589,7 @@ void do_viewbuts(unsigned short event)
/* no break, pass on */
case B_ARMATUREPANEL2:
{
DAG_object_flush_update(G.scene, G.obpose, OB_RECALC_DATA);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 1);
}
break;
@@ -1634,7 +1634,7 @@ static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT
if(ob->type==OB_MBALL) v3d_editmetaball_buts(block, ob, lim);
else v3d_editvertex_buts(block, ob, lim);
}
else if(ob==G.obpose) {
else if(ob->flag & OB_POSEMODE) {
v3d_posearmature_buts(block, ob, lim);
}
else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT)) {

View File

@@ -551,7 +551,7 @@ void countall()
{
extern ListBase editNurb;
Base *base;
Object *ob;
Object *ob= OBACT;
Mesh *me;
Nurb *nu;
BezTriple *bezt;
@@ -668,10 +668,10 @@ void countall()
allqueue(REDRAWINFO, 1); /* 1, because header->win==0! */
return;
}
else if(G.obpose) {
if(G.obpose->pose) {
else if(ob && (ob->flag & OB_POSEMODE)) {
if(ob->pose) {
bPoseChannel *pchan;
for(pchan= G.obpose->pose->chanbase.first; pchan; pchan= pchan->next) {
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
G.totbone++;
if(pchan->bone && (pchan->bone->flag & BONE_SELECTED)) G.totbonesel++;
}
@@ -1055,15 +1055,14 @@ void snap_sel_to_grid()
return;
}
if (G.obpose){
allqueue(REDRAWVIEW3D, 0);
return;
}
base= (G.scene->base.first);
while(base) {
if( ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && ((base)->object->id.lib==0))) {
ob= base->object;
if(ob->flag & OB_POSEMODE) {
; // todo
}
else {
ob->recalc |= OB_RECALC_OB;
vec[0]= -ob->obmat[3][0]+G.vd->gridview*floor(.5+ ob->obmat[3][0]/gridf);
@@ -1085,6 +1084,7 @@ void snap_sel_to_grid()
ob->loc[2]+= vec[2];
}
}
}
base= base->next;
}
@@ -1133,15 +1133,14 @@ void snap_sel_to_curs()
return;
}
if (G.obpose){
allqueue(REDRAWVIEW3D, 0);
return;
}
base= (G.scene->base.first);
while(base) {
if( ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && ((base)->object->id.lib==0))) {
ob= base->object;
if(ob->flag & OB_POSEMODE) {
; // todo
}
else {
ob->recalc |= OB_RECALC_OB;
vec[0]= -ob->obmat[3][0] + curs[0];
@@ -1163,6 +1162,7 @@ void snap_sel_to_curs()
ob->loc[2]+= vec[2];
}
}
}
base= base->next;
}
@@ -1422,15 +1422,14 @@ void snap_to_center()
return;
}
if (G.obpose){
allqueue(REDRAWVIEW3D, 0);
return;
}
base= (G.scene->base.first);
while(base) {
if( ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && ((base)->object->id.lib==0))) {
ob= base->object;
if(ob->flag & OB_POSEMODE) {
; // todo
}
else {
ob->recalc |= OB_RECALC_OB;
vec[0]= -ob->obmat[3][0] + snaploc[0];
@@ -1452,6 +1451,7 @@ void snap_to_center()
ob->loc[2]+= vec[2];
}
}
}
base= base->next;
}
@@ -1510,7 +1510,8 @@ void mergemenu(void)
}
void delete_context_selected(void) {
void delete_context_selected(void)
{
if(G.obedit) {
if(G.obedit->type==OB_MESH) delete_mesh();
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) delNurb();
@@ -1520,14 +1521,15 @@ void delete_context_selected(void) {
else delete_obj(0);
}
void duplicate_context_selected(void) {
void duplicate_context_selected(void)
{
if(G.obedit) {
if(G.obedit->type==OB_MESH) adduplicate_mesh();
else if(G.obedit->type==OB_ARMATURE) adduplicate_armature();
else if(G.obedit->type==OB_MBALL) adduplicate_mball();
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) adduplicate_nurb();
}
else if(!(G.obpose)){
else {
adduplicate(0);
}
}

View File

@@ -100,24 +100,11 @@ extern int count_action_levels (bAction *act);
#define BEZSELECTED(bezt) (((bezt)->f1 & 1) || ((bezt)->f2 & 1) || ((bezt)->f3 & 1))
/* Local Function prototypes, some are forward needed */
/* Local Function prototypes, are forward needed */
static void insertactionkey(bAction *act, bActionChannel *achan, bPoseChannel *chan, int adrcode, short makecurve, float time);
static void flip_name (char *name);
static void mouse_actionchannels(bAction *act, short *mval,
short *mvalo, int selectmode);
static void mouse_action(int selectmode);
static void mouse_mesh_action(int selectmode, Key *key);
static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel, bConstraintChannel **conchan);
static void delete_actionchannels(void);
static void select_poseelement_by_name (char *name, int select);
static void hilight_channel (bAction *act, bActionChannel *chan, short hilight);
static void set_action_key_time (bAction *act, bPoseChannel *chan, int adrcode, short makecurve, float time);
static void remake_meshaction_ipos(Ipo *ipo);
static void select_all_keys_frames(bAction *act, short *mval, short *mvalo, int selectmode);
static void select_all_keys_channels(bAction *act, short *mval, short *mvalo, int selectmode);
/* Implementation */
short showsliders = 0;
@@ -127,9 +114,8 @@ static void select_poseelement_by_name (char *name, int select)
{
/* Synchs selection of channels with selection of object elements in posemode */
Object *ob;
Object *ob= OBACT;
ob = G.obpose;
if (!ob)
return;
@@ -233,7 +219,7 @@ bAction* bake_action_with_client (bAction *act, Object *armob, float tolerance)
return result;
}
/* apparently within active object context */
void select_actionchannel_by_name (bAction *act, char *name, int select)
{
bActionChannel *chan;
@@ -541,6 +527,7 @@ static IpoCurve *get_nearest_meshchannel_key (float *index, short *sel)
return firsticu;
}
/* apparently within active object context */
static void mouse_action(int selectmode)
{
bAction *act;
@@ -795,16 +782,15 @@ void free_posebuf(void)
void copy_posebuf (void)
{
Object *ob;
Object *ob= OBACT;
free_posebuf();
ob=G.obpose;
if (!ob){
error ("Copy buffer is empty");
if (!ob || !ob->pose){
error ("No Pose");
return;
}
free_posebuf();
set_pose_keys(ob); // sets chan->flag to POSE_KEY if bone selected
copy_pose(&g_posebuf, ob->pose, 0);
@@ -928,24 +914,22 @@ static void flip_name (char *name)
void paste_posebuf (int flip)
{
Object *ob;
Object *ob= OBACT;
bPoseChannel *chan, *pchan;
float eul[4];
int newchan = 0;
char name[32];
ob=G.obpose;
if (!ob)
if (!ob || !ob->pose)
return;
if (!g_posebuf){
error ("Copy buffer is empty");
return;
};
}
/* Safely merge all of the channels in this pose into
any existing pose */
if (ob->pose){
for (chan=g_posebuf->chanbase.first; chan; chan=chan->next){
if (chan->flag & POSE_KEY) {
BLI_strncpy(name, chan->name, sizeof(name));
@@ -1014,7 +998,6 @@ void paste_posebuf (int flip)
BIF_undo_push("Paste Action Pose");
}
}
void set_action_key (struct bAction *act, struct bPoseChannel *chan, int adrcode, short makecurve)
{
@@ -1545,6 +1528,7 @@ void deselect_meshchannel_keys (Key *key, int test)
set_ipo_key_selection(key->ipo, sel);
}
/* apparently within active object context */
void deselect_actionchannels (bAction *act, int test)
{
bActionChannel *chan;
@@ -1618,8 +1602,10 @@ static void hilight_channel (bAction *act, bActionChannel *chan, short select)
*/
/* exported for outliner (ton) */
/* apparently within active object context */
int select_channel(bAction *act, bActionChannel *chan,
int selectmode) {
int selectmode)
{
/* Select the channel based on the selection mode
*/
int flag;

View File

@@ -430,41 +430,55 @@ void join_armature(void)
/* **************** END tools on Editmode Armature **************** */
/* **************** PoseMode & EditMode *************************** */
/* used by posemode as well editmode */
static void * get_nearest_bone (int findunsel)
/* only for opengl selection indices */
Bone *get_indexed_bone (Object *ob, int index)
{
void *firstunSel=NULL, *firstSel=NULL, *data;
unsigned int buffer[MAXPICKBUF];
short hits;
int i, takeNext=0;
int sel;
unsigned int hitresult;
bPoseChannel *pchan;
int a= 0;
if(ob->pose==NULL) return NULL;
index>>=16; // bone selection codes use left 2 bytes
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next, a++) {
if(a==index) return pchan->bone;
}
return NULL;
}
/* See if there are any selected bones in this buffer */
static void *get_bone_from_selectbuffer(Base *base, unsigned int *buffer, short hits, short findunsel)
{
Object *ob= base->object;
Bone *bone;
EditBone *ebone;
void *firstunSel=NULL, *firstSel=NULL, *data;
unsigned int hitresult;
short i, takeNext=0, sel;
persp(PERSP_VIEW);
glInitNames();
hits= view3d_opengl_select(buffer, MAXPICKBUF, 0, 0, 0, 0);
/* See if there are any selected bones in this group */
if (hits){
for (i=0; i< hits; i++){
hitresult = buffer[3+(i*4)];
if (!(hitresult & BONESEL_NOSEL)){
if (hitresult & BONESEL_ANY){
/* Determine which points are selected */
hitresult &= ~(BONESEL_ANY);
/* Determine what the current bone is */
if (!G.obedit){
bone = get_indexed_bone(OBACT, hitresult);
if (G.obedit==NULL) {
/* no singular posemode, so check for correct object */
if(base->selcol == (hitresult & 0xFFFF)) {
bone = get_indexed_bone(ob, hitresult);
if (findunsel)
sel = (bone->flag & BONE_SELECTED);
else
sel = !(bone->flag & BONE_SELECTED);
data = bone;
}
else {
data= NULL;
sel= 0;
}
}
else{
ebone = BLI_findlink(&G.edbo, hitresult);
if (findunsel)
@@ -475,6 +489,7 @@ static void * get_nearest_bone (int findunsel)
data = ebone;
}
if(data) {
if (sel) {
if(!firstSel) firstSel= data;
takeNext=1;
@@ -487,6 +502,7 @@ static void * get_nearest_bone (int findunsel)
}
}
}
}
if (firstunSel)
return firstunSel;
@@ -494,6 +510,20 @@ static void * get_nearest_bone (int findunsel)
return firstSel;
}
/* used by posemode as well editmode */
static void *get_nearest_bone (short findunsel)
{
unsigned int buffer[MAXPICKBUF];
short hits;
persp(PERSP_VIEW);
glInitNames();
hits= view3d_opengl_select(buffer, MAXPICKBUF, 0, 0, 0, 0);
if (hits)
return get_bone_from_selectbuffer(BASACT, buffer, hits, findunsel);
return NULL;
}
@@ -534,14 +564,14 @@ void select_bone_by_name (bArmature *arm, char *name, int select)
break;
}
static void selectconnected_posebonechildren (Bone *bone)
static void selectconnected_posebonechildren (Object *ob, Bone *bone)
{
Bone *curBone;
if (!(bone->flag & BONE_IK_TOPARENT))
return;
select_actionchannel_by_name (G.obpose->action, bone->name, !(G.qual & LR_SHIFTKEY));
select_actionchannel_by_name (ob->action, bone->name, !(G.qual & LR_SHIFTKEY));
if (G.qual & LR_SHIFTKEY)
bone->flag &= ~BONE_SELECTED;
@@ -549,13 +579,17 @@ static void selectconnected_posebonechildren (Bone *bone)
bone->flag |= BONE_SELECTED;
for (curBone=bone->childbase.first; curBone; curBone=curBone->next){
selectconnected_posebonechildren (curBone);
selectconnected_posebonechildren (ob, curBone);
}
}
/* within active object context */
void selectconnected_posearmature(void)
{
Bone *bone, *curBone, *next;
Object *ob= OBACT;
if(!ob || !ob->pose) return;
if (G.qual & LR_SHIFTKEY)
bone= get_nearest_bone(0);
@@ -567,7 +601,7 @@ void selectconnected_posearmature(void)
/* Select parents */
for (curBone=bone; curBone; curBone=next){
select_actionchannel_by_name (G.obpose->action, curBone->name, !(G.qual & LR_SHIFTKEY));
select_actionchannel_by_name (ob->action, curBone->name, !(G.qual & LR_SHIFTKEY));
if (G.qual & LR_SHIFTKEY)
curBone->flag &= ~BONE_SELECTED;
else
@@ -581,7 +615,7 @@ void selectconnected_posearmature(void)
/* Select children */
for (curBone=bone->childbase.first; curBone; curBone=next){
selectconnected_posebonechildren (curBone);
selectconnected_posebonechildren (ob, curBone);
}
countall(); // flushes selection!
@@ -1608,45 +1642,43 @@ static int clear_active_flag(Object *ob, Bone *bone, void *data)
return 0;
}
/*
Handles right-clicking for selection
of bones in armature pose modes.
*/
void mousepose_armature(void)
/* called from editview.c, for mode-less pose selection */
void do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits)
{
Object *ob= base->object;
Bone *nearBone;
if (!G.obpose) return;
if (!ob || !ob->pose) return;
nearBone = get_nearest_bone(1);
nearBone= get_bone_from_selectbuffer(base, buffer, hits, 1);
if (nearBone) {
if (!(G.qual & LR_SHIFTKEY)){
deselectall_posearmature(0);
deselectall_posearmature(ob, 0);
nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL|BONE_ACTIVE);
select_actionchannel_by_name(G.obpose->action, nearBone->name, 1);
select_actionchannel_by_name(ob->action, nearBone->name, 1);
}
else {
if (nearBone->flag & BONE_SELECTED) {
/* if not active, we make it active */
if((nearBone->flag & BONE_ACTIVE)==0) {
bArmature *arm= G.obpose->data;
bone_looper(G.obpose, arm->bonebase.first, NULL, clear_active_flag);
bArmature *arm= ob->data;
bone_looper(ob, arm->bonebase.first, NULL, clear_active_flag);
nearBone->flag |= BONE_ACTIVE;
}
else {
nearBone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL|BONE_ACTIVE);
select_actionchannel_by_name(G.obpose->action, nearBone->name, 0);
select_actionchannel_by_name(ob->action, nearBone->name, 0);
}
}
else{
bArmature *arm= G.obpose->data;
bone_looper(G.obpose, arm->bonebase.first, NULL, clear_active_flag);
bArmature *arm= ob->data;
bone_looper(ob, arm->bonebase.first, NULL, clear_active_flag);
nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL|BONE_ACTIVE);
select_actionchannel_by_name(G.obpose->action, nearBone->name, 1);
}
select_actionchannel_by_name(ob->action, nearBone->name, 1);
}
}
@@ -1656,8 +1688,9 @@ void mousepose_armature(void)
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWBUTSOBJECT, 0);
allqueue(REDRAWOOPS, 0);
}
rightmouse_transform();
// rightmouse_transform();
}
@@ -1681,24 +1714,24 @@ static void deselect_bonechildren (Object *ob, Bone *bone, int mode)
}
}
void deselectall_posearmature (int test)
void deselectall_posearmature (Object *ob, int test)
{
Object *ob= OBACT;
int selectmode = 0;
bArmature *arm;
Bone *curBone;
int selectmode = 0;
/* we call this from outliner, also without obpose, but with OBACT set OK */
if(G.obpose) ob= G.obpose;
/* we call this from outliner too, but with OBACT set OK */
if(!ob || !ob->pose) return;
arm= get_armature(ob);
/* Determine if we're selecting or deselecting */
if (test){
if (!count_bones (get_armature(ob), BONE_SELECTED, 0))
if (!count_bones (arm, BONE_SELECTED, 0))
selectmode = 1;
}
/* Set the flags accordingly */
for (curBone=get_armature(ob)->bonebase.first; curBone; curBone=curBone->next)
for (curBone=arm->bonebase.first; curBone; curBone=curBone->next)
deselect_bonechildren (ob, curBone, selectmode);
allqueue(REDRAWBUTSEDIT, 0);
@@ -2089,19 +2122,20 @@ static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr)
return 0;
}
/* active object is armature */
void hide_selected_pose_bones(void)
{
bArmature *arm;
arm=get_armature (G.obpose);
arm= get_armature (OBACT);
if (!arm)
return;
bone_looper(G.obpose, arm->bonebase.first, NULL,
bone_looper(OBACT, arm->bonebase.first, NULL,
hide_selected_pose_bone);
force_draw(1);
allqueue(REDRAWVIEW3D, 0);
}
static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr)
@@ -2112,19 +2146,20 @@ static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr)
return 0;
}
/* active object is armature */
void hide_unselected_pose_bones(void)
{
bArmature *arm;
arm=get_armature (G.obpose);
arm=get_armature (OBACT);
if (!arm)
return;
bone_looper(G.obpose, arm->bonebase.first, NULL,
bone_looper(OBACT, arm->bonebase.first, NULL,
hide_unselected_pose_bone);
force_draw(1);
allqueue(REDRAWVIEW3D, 0);
}
static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
@@ -2137,32 +2172,22 @@ static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
return 0;
}
/* active object is armature in posemode */
void show_all_pose_bones(void)
{
bArmature *arm;
arm=get_armature (G.obpose);
arm=get_armature (OBACT);
if (!arm)
return;
bone_looper(G.obpose, arm->bonebase.first, NULL,
bone_looper(OBACT, arm->bonebase.first, NULL,
show_pose_bone);
force_draw(1);
allqueue(REDRAWVIEW3D, 0);
}
int is_delay_deform(void)
{
bArmature *arm;
arm=get_armature (G.obpose);
if (!arm)
return 0;
return (arm->flag & ARM_DELAYDEFORM);
}
/* ************* RENAMING DISASTERS ************ */

View File

@@ -97,26 +97,23 @@ ListBase *get_constraint_client_channels (int forcevalid)
return NULL;
/* See if we are a bone constraint */
if (G.obpose){
switch (G.obpose->type){
case OB_ARMATURE:
{
if (ob->flag & OB_POSEMODE) {
bActionChannel *achan;
bPoseChannel *pchan;
pchan = get_active_posechannel();
if (!pchan) break;
if (pchan) {
/* Make sure we have an action */
if (!G.obpose->action){
if (!ob->action){
if (!forcevalid)
return NULL;
G.obpose->action=add_empty_action();
ob->action=add_empty_action();
}
/* Make sure we have an actionchannel */
achan = get_named_actionchannel(G.obpose->action, pchan->name);
achan = get_named_actionchannel(ob->action, pchan->name);
if (!achan){
if (!forcevalid)
return NULL;
@@ -124,18 +121,17 @@ ListBase *get_constraint_client_channels (int forcevalid)
achan = MEM_callocN (sizeof(bActionChannel), "actionChannel");
strcpy (achan->name, pchan->name);
sprintf (ipstr, "%s.%s", G.obpose->action->id.name+2, achan->name);
sprintf (ipstr, "%s.%s", ob->action->id.name+2, achan->name);
ipstr[23]=0;
achan->ipo= add_ipo(ipstr, ID_AC);
BLI_addtail (&G.obpose->action->chanbase, achan);
BLI_addtail (&ob->action->chanbase, achan);
}
return &achan->constraintChannels;
}
}
}
/* else we return object constraints */
return &ob->constraintChannels;
}
@@ -160,14 +156,11 @@ ListBase *get_constraint_client(char *name, short *clientType, void **clientdata
if (name)
strcpy (name, ob->id.name+2);
if (G.obpose){
switch (G.obpose->type){
case OB_ARMATURE:
{
if (ob->flag & OB_POSEMODE) {
bPoseChannel *pchan;
pchan = get_active_posechannel();
if (!pchan) break;
if (pchan) {
/* Is the bone the client? */
if (clientType)
@@ -179,8 +172,6 @@ ListBase *get_constraint_client(char *name, short *clientType, void **clientdata
list = &pchan->constraints;
}
break;
}
}
return list;

View File

@@ -3877,9 +3877,9 @@ void common_insertkey()
}
else if(curarea->spacetype==SPACE_VIEW3D) {
ob= OBACT;
if (G.obpose) {
if (ob && (ob->flag & OB_POSEMODE)) {
strcpy(menustr, "Insert Key%t|Loc%x0|Rot%x1|Size%x2|LocRot%x3|LocRotSize%x4|Avail%x9");
}
else {
@@ -3888,12 +3888,12 @@ void common_insertkey()
if TESTBASELIB(base) break;
base= base->next;
}
if(base==0) return;
if(base==NULL) return;
strcpy(menustr, "Insert Key%t|Loc%x0|Rot%x1|Size%x2|LocRot%x3|LocRotSize%x4|Layer%x5|Avail%x9");
}
if( (ob = OBACT)) {
if(ob) {
if(ob->type==OB_MESH) strcat(menustr, "| %x6|Mesh%x7");
else if(ob->type==OB_LATTICE) strcat(menustr, "| %x6|Lattice%x7");
else if(ob->type==OB_CURVE) strcat(menustr, "| %x6|Curve%x7");
@@ -3904,7 +3904,7 @@ void common_insertkey()
event= pupmenu(menustr);
if(event== -1) return;
if(event==7) {
if(event==7) { // ob != NULL
if(ob->type==OB_MESH) insert_meshkey(ob->data, 0);
else if ELEM(ob->type, OB_CURVE, OB_SURF) insert_curvekey(ob->data);
else if(ob->type==OB_LATTICE) insert_lattkey(ob->data);
@@ -3924,21 +3924,18 @@ void common_insertkey()
}
}
base= FIRSTBASE;
if (G.obpose){
if (ob && (ob->flag & OB_POSEMODE)){
bAction *act;
bPose *pose;
bPoseChannel *chan;
bActionChannel *achan;
ob = G.obpose;
/* Get action & pose from object */
act=ob->action;
pose=ob->pose;
if (!act){
act= G.obpose->action=add_empty_action();
act= ob->action= add_empty_action();
/* this sets the non-pinned open ipowindow(s) to show the action curve */
ob->ipowin= ID_AC;
allqueue(REDRAWIPO, ob->ipowin);
@@ -3950,14 +3947,13 @@ void common_insertkey()
error ("No pose!"); /* Should never happen */
}
if (act->id.lib)
{
if (act->id.lib) {
error ("Can't key libactions");
return;
}
set_pose_keys(ob); // sets chan->flag to POSE_KEY if bone selected
for (chan=pose->chanbase.first; chan; chan=chan->next)
{
for (chan=pose->chanbase.first; chan; chan=chan->next) {
if (chan->flag & POSE_KEY){
// set_action_key(act, chan);
if(event==0 || event==3 ||event==4) {
@@ -3990,13 +3986,14 @@ void common_insertkey()
remake_action_ipos(act);
}
DAG_object_flush_update(G.scene, G.obpose, OB_RECALC_DATA);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
}
else {
base= FIRSTBASE;
while(base) {
if TESTBASELIB(base) {
id= (ID *)(base->object);

View File

@@ -241,7 +241,6 @@ void delete_obj(int ok)
Base *base;
int islamp= 0;
if(G.obpose) return;
if(G.obedit) return;
if(G.scene->id.lib) return;
@@ -250,7 +249,7 @@ void delete_obj(int ok)
Base *nbase= base->next;
if TESTBASE(base) {
if(ok==0 && (ok=okee("Erase selected"))==0) return;
if(ok==0 && (ok=okee("Erase selected Object(s)"))==0) return;
if(base->object->type==OB_LAMP) islamp= 1;
free_and_unlink_base(base);
@@ -870,24 +869,17 @@ void clear_object(char mode)
else if(mode=='o') str= "Clear origin";
else return;
if (G.obpose){
switch (G.obpose->type){
case OB_ARMATURE:
clear_armature (G.obpose, mode);
break;
}
allqueue(REDRAWVIEW3D, 0);
BIF_undo_push(str);
return;
}
base= FIRSTBASE;
while(base) {
if TESTBASELIB(base) {
ob= base->object;
if(ob->flag & OB_POSEMODE) {
// no test if we got armature; could be in future...
clear_armature(ob, mode);
}
else {
if(mode=='r') {
memset(ob->rot, 0, 3*sizeof(float));
memset(ob->drot, 0, 3*sizeof(float));
@@ -919,7 +911,7 @@ void clear_object(char mode)
}
ob->recalc |= OB_RECALC_OB;
}
}
base= base->next;
}
@@ -1120,10 +1112,8 @@ void make_parent(void)
{
Base *base;
Object *par;
short qual, mode=0;
char *bonestr=NULL;
Bone *bone=NULL;
int bonenr;
short qual, mode=0;
if(G.scene->id.lib) return;
if(G.obedit) {
@@ -1194,6 +1184,8 @@ void make_parent(void)
}
}
else if(par->type == OB_ARMATURE){
int bonenr;
char *bonestr=NULL;
base= FIRSTBASE;
while(base) {
@@ -1228,9 +1220,8 @@ void make_parent(void)
return;
}
bone=get_indexed_bone(par, bonenr);
bone= get_indexed_bone(par, bonenr<<16); // function uses selection codes
if (!bone){
// error ("Invalid bone!");
allqueue(REDRAWVIEW3D, 0);
return;
}
@@ -1449,9 +1440,6 @@ void enter_editmode(void)
}
else G.obedit= NULL;
if (G.obpose)
exit_posemode (1);
scrarea_queue_headredraw(curarea);
}
@@ -1891,21 +1879,22 @@ void split_font()
void special_editmenu(void)
{
Object *ob= OBACT;
extern short editbutflag;
extern float doublimit;
float fac;
int nr,ret;
short randfac,numcuts;
if(G.obpose) {
if(ob==NULL) return;
if(G.obedit==NULL) {
if(ob->flag & OB_POSEMODE) {
pose_special_editmenu();
}
else if(G.obedit==NULL) {
if(!OBACT) return;
if(G.f & G_FACESELECT) {
Mesh *me= get_mesh(OBACT);
else if(G.f & G_FACESELECT) {
Mesh *me= get_mesh(ob);
TFace *tface;
int a;
@@ -1946,7 +1935,7 @@ void special_editmenu(void)
BIF_undo_push("Change texture face");
}
else if(G.f & G_VERTEXPAINT) {
Mesh *me= get_mesh(OBACT);
Mesh *me= get_mesh(ob);
if(me==0 || (me->mcol==NULL && me->tface==NULL) ) return;
@@ -1964,29 +1953,25 @@ void special_editmenu(void)
}
else {
Base *base, *base_select= NULL;
Object *ob= OBACT;
// Get the active object mesh.
Mesh *me= get_mesh(ob);
// If the active object is a mesh...
// Booleans, if the active object is a mesh...
if (me && ob->id.lib==NULL) {
// Bring up a little menu with the boolean operation choices on.
nr= pupmenu("Boolean %t|Intersect%x1|Union%x2|Difference%x3");
if (nr > 0) {
// user has made a choice of a menu element.
// All of the boolean functions require 2 mesh objects
// we search through the object list to find the other
// selected item and make sure it is distinct and a mesh.
base= FIRSTBASE;
while(base) {
for(base= FIRSTBASE; base; base= base->next) {
if TESTBASELIB(base) {
if(base->object != OBACT) base_select= base;
if(base->object != ob) base_select= base;
}
base= base->next;
}
if (base_select) {
@@ -2011,7 +1996,7 @@ void special_editmenu(void)
allqueue(REDRAWVIEW3D, 0);
}
else if (OBACT->type == OB_FONT) {
else if (ob->type == OB_FONT) {
nr= pupmenu("Split %t|Characters%x1");
if (nr > 0) {
switch(nr) {
@@ -2024,7 +2009,6 @@ void special_editmenu(void)
else if(G.obedit->type==OB_MESH) {
nr= pupmenu("Specials%t|Subdivide%x1|Subdivide Multi%x2|Subdivide Multi Fractal%x3|Subdivide Multi Smooth - WIP%x12|Subdivide Smooth Old%x13|Merge%x4|Remove Doubles%x5|Hide%x6|Reveal%x7|Select Swap%x8|Flip Normals %x9|Smooth %x10|Bevel %x11");
//if(nr>0) waitcursor(1);
switch(nr) {
case 1:
@@ -2033,8 +2017,6 @@ void special_editmenu(void)
esubdivideflag(1, 0.0, editbutflag,numcuts,0);
BIF_undo_push("ESubdivide Single");
//subdivideflag(1, 0.0, editbutflag);
//BIF_undo_push("Subdivide");
break;
case 2:
numcuts = 2;
@@ -3949,6 +3931,10 @@ void adduplicate(int noTrans)
if TESTBASELIB(base) {
ob= base->object;
if(ob->flag & OB_POSEMODE) {
; // nothing?
}
else {
obn= copy_object(ob);
obn->recalc |= OB_RECALC;
@@ -4106,6 +4092,7 @@ void adduplicate(int noTrans)
}
}
}
}
}
base= base->next;

View File

@@ -409,7 +409,7 @@ static void do_activate_oops(Oops *oops)
base= base->next;
}
if(base) {
if(G.obedit==NULL && G.obpose==NULL) set_active_base(base); /* editview.c */
if(G.obedit==NULL) set_active_base(base); /* editview.c */
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWOOPS, 0);
allqueue(REDRAWINFO, 1);

View File

@@ -44,6 +44,7 @@
#include "IMB_imbuf.h"
#include "PIL_time.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_meta_types.h"
#include "DNA_mesh_types.h"
@@ -233,6 +234,30 @@ static int lasso_inside_edge(short mcords[][2], short moves, short *v1, short *v
/* warning; lasso select with backbuffer-check draws in backbuf with persp(PERSP_WIN)
and returns with persp(PERSP_VIEW). After lasso select backbuf is not OK
*/
void do_lasso_select_pose(Object *ob, short mcords[][2], short moves, short select)
{
bPoseChannel *pchan;
float vec[3];
short sco1[2], sco2[2];
if(ob->type!=OB_ARMATURE || ob->pose==NULL) return;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
VECCOPY(vec, pchan->pose_head);
Mat4MulVecfl(ob->obmat, vec);
project_short(vec, sco1);
VECCOPY(vec, pchan->pose_tail);
Mat4MulVecfl(ob->obmat, vec);
project_short(vec, sco2);
if(lasso_inside_edge(mcords, moves, sco1, sco2)) {
if(select) pchan->bone->flag |= BONE_SELECTED;
else pchan->bone->flag &= ~(BONE_ACTIVE|BONE_SELECTED);
}
}
}
static void do_lasso_select_objects(short mcords[][2], short moves, short select)
{
Base *base;
@@ -246,6 +271,9 @@ static void do_lasso_select_objects(short mcords[][2], short moves, short select
else base->flag &= ~SELECT;
base->object->flag= base->flag;
}
if(base->object->flag & OB_POSEMODE) {
do_lasso_select_pose(base->object, mcords, moves, select);
}
}
}
}
@@ -622,19 +650,19 @@ static char interpret_move(short mcord[][2], int count)
/* return 1 to denote gesture did something, also does lasso */
int gesture(void)
{
short mcords[MOVES_LASSO][2]; // the larger size
int i= 1, end= 0, a;
unsigned short event=0;
int i= 1, end= 0, a;
short mcords[MOVES_LASSO][2]; // the larger size
short mval[2], val, timer=0, mousebut, lasso=0, maxmoves;
if (U.flag & USER_LMOUSESELECT) mousebut = R_MOUSE;
else mousebut = L_MOUSE;
/* check for lasso */
if(G.qual & LR_CTRLKEY) {
if(curarea->spacetype==SPACE_VIEW3D) {
if(G.obedit==NULL) {
if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) return 0;
if(G.obpose) return 0;
}
lasso= 1;
}
@@ -1016,6 +1044,60 @@ static Base *mouse_select_menu(unsigned int *buffer, int hits, short *mval)
}
}
/* we want a select buffer with bones, if there are... */
/* so check three selection levels and compare */
static short mixed_bones_object_selectbuffer(unsigned int *buffer, short *mval)
{
int offs;
short a, hits15, hits9=0, hits5=0;
short has_bones15=0, has_bones9=0, has_bones5=0;
hits15= view3d_opengl_select(buffer, MAXPICKBUF, mval[0]-14, mval[1]-14, mval[0]+14, mval[1]+14);
if(hits15) {
for(a=0; a<hits15; a++) if(buffer[4*a+3] & 0xFFFF0000) has_bones15= 1;
offs= 4*hits15;
hits9= view3d_opengl_select(buffer+offs, MAXPICKBUF-offs, mval[0]-9, mval[1]-9, mval[0]+9, mval[1]+9);
if(hits9) {
for(a=0; a<hits9; a++) if(buffer[offs+4*a+3] & 0xFFFF0000) has_bones9= 1;
offs+= 4*hits9;
hits5= view3d_opengl_select(buffer+offs, MAXPICKBUF-offs, mval[0]-5, mval[1]-5, mval[0]+5, mval[1]+5);
if(hits5) {
for(a=0; a<hits5; a++) if(buffer[offs+4*a+3] & 0xFFFF0000) has_bones5= 1;
}
}
if(has_bones5) {
offs= 4*hits15 + 4*hits9;
memcpy(buffer, buffer+offs, 4*offs);
return hits5;
}
if(has_bones9) {
offs= 4*hits15;
memcpy(buffer, buffer+offs, 4*offs);
return hits9;
}
if(has_bones15) {
return hits15;
}
if(hits5) {
offs= 4*hits15 + 4*hits9;
memcpy(buffer, buffer+offs, 4*offs);
return hits5;
}
if(hits9) {
offs= 4*hits15;
memcpy(buffer, buffer+offs, 4*offs);
return hits9;
}
return hits15;
}
return 0;
}
void mouse_select(void)
{
Base *base, *startbase=NULL, *basact=NULL, *oldbasact=NULL;
@@ -1057,12 +1139,17 @@ void mouse_select(void)
}
}
else {
hits= view3d_opengl_select(buffer, MAXPICKBUF, mval[0]-7, mval[1]-7, mval[0]+7, mval[1]+7);
if(hits==0) hits= view3d_opengl_select(buffer, MAXPICKBUF, mval[0]-21, mval[1]-21, mval[0]+21, mval[1]+21);
/* if objects have posemode set, the bones are in the same selection buffer */
hits= mixed_bones_object_selectbuffer(buffer, mval);
if(hits>0) {
int has_bones= 0;
if(G.qual & LR_ALTKEY) basact= mouse_select_menu(buffer, hits, mval);
for(a=0; a<hits; a++) if(buffer[4*a+3] & 0xFFFF0000) has_bones= 1;
if(has_bones==0 && (G.qual & LR_ALTKEY))
basact= mouse_select_menu(buffer, hits, mval);
else {
static short lastmval[2]={-100, -100};
int donearest= 0;
@@ -1071,6 +1158,7 @@ void mouse_select(void)
if(G.vd->drawtype>OB_WIRE) {
donearest= 1;
if( ABS(mval[0]-lastmval[0])<3 && ABS(mval[1]-lastmval[1])<3) {
if(!has_bones) // hrms, if theres bones we always do nearest
donearest= 0;
}
}
@@ -1080,16 +1168,28 @@ void mouse_select(void)
unsigned int min= 0xFFFFFFFF;
int selcol= 0, notcol=0;
/* prevent not being able to select active object... */
if(has_bones) {
/* we skip non-bone hits */
for(a=0; a<hits; a++) {
if( min > buffer[4*a+1] && (buffer[4*a+3] & 0xFFFF0000) ) {
min= buffer[4*a+1];
selcol= buffer[4*a+3] & 0xFFFF;
}
}
}
else {
/* only exclude active object when it is selected... */
if(BASACT && (BASACT->flag & SELECT) && hits>1) notcol= BASACT->selcol;
for(a=0; a<hits; a++) {
/* index was converted */
if( min > buffer[4*a+1] && notcol!=buffer[4*a+3]) {
if( min > buffer[4*a+1] && notcol!=(buffer[4*a+3] & 0xFFFF)) {
min= buffer[4*a+1];
selcol= buffer[4*a+3];
selcol= buffer[4*a+3] & 0xFFFF;
}
}
}
base= FIRSTBASE;
while(base) {
if(base->lay & G.vd->lay) {
@@ -1105,8 +1205,15 @@ void mouse_select(void)
while(base) {
if(base->lay & G.vd->lay) {
for(a=0; a<hits; a++) {
/* index was converted */
if(base->selcol==buffer[(4*a)+3]) {
if(has_bones) {
/* skip non-bone objects */
if((buffer[4*a+3] & 0xFFFF0000)) {
if(base->selcol== (buffer[(4*a)+3] & 0xFFFF))
basact= base;
}
}
else {
if(base->selcol== (buffer[(4*a)+3] & 0xFFFF))
basact= base;
}
}
@@ -1115,15 +1222,21 @@ void mouse_select(void)
if(basact) break;
base= base->next;
if(base==0) base= FIRSTBASE;
if(base==NULL) base= FIRSTBASE;
if(base==startbase) break;
}
}
}
if(has_bones && basact) {
do_pose_selectbuffer(basact, buffer, hits);
}
}
}
/* so, do we have something selected? */
if(basact) {
if(G.obedit) {
/* only do select */
deselectall_except(basact);
@@ -1155,11 +1268,17 @@ void mouse_select(void)
// for visual speed, only in wire mode
if(G.vd->drawtype==OB_WIRE) {
/* however, not for posemodes */
if(basact->object->flag & OB_POSEMODE);
else if(oldbasact && (oldbasact->object->flag & OB_POSEMODE));
else {
if(oldbasact && oldbasact != basact && (oldbasact->lay & G.vd->lay))
draw_object_ext(oldbasact);
draw_object_ext(basact);
}
}
/* selecting a non-mesh, should end a couple of modes... */
if(basact->object->type!=OB_MESH) {
if(G.f & G_WEIGHTPAINT) {
set_wpaint(); /* toggle */
@@ -1171,6 +1290,7 @@ void mouse_select(void)
set_faceselect(); /* toggle */
}
}
/* also because multiple 3d windows can be open */
allqueue(REDRAWVIEW3D, 0);
@@ -1183,7 +1303,6 @@ void mouse_select(void)
allqueue(REDRAWHEADERS, 0); /* To force display update for the posebutton */
}
}
countall();
@@ -1230,52 +1349,21 @@ void borderselect(void)
MetaElem *ml;
unsigned int buffer[MAXPICKBUF];
int a, index;
short hits, val, tel;
short hits, val;
if(G.obedit==0 && (G.f & G_FACESELECT)) {
if(G.obedit==NULL && (G.f & G_FACESELECT)) {
face_borderselect();
return;
}
setlinestyle(2);
val= get_border(&rect, 3);
setlinestyle(0);
if(val) {
if (G.obpose){
if(G.obpose->type==OB_ARMATURE) {
Bone *bone;
hits= view3d_opengl_select(buffer, MAXPICKBUF, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
base= FIRSTBASE;
for (a=0; a<hits; a++){
index = buffer[(4*a)+3];
if (val==LEFTMOUSE){
if (index != -1){
bone = get_indexed_bone(G.obpose, index &~(BONESEL_TIP|BONESEL_ROOT));
if(bone) {
bone->flag |= BONE_SELECTED;
select_actionchannel_by_name(G.obpose->action, bone->name, 1);
}
}
}
else{
if (index != -1){
bone = get_indexed_bone(G.obpose, index &~(BONESEL_TIP|BONESEL_ROOT));
if(bone) {
bone->flag &= ~(BONE_ACTIVE|BONE_SELECTED);
select_actionchannel_by_name(G.obpose->action, bone->name, 0);
}
}
}
}
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWBUTSOBJECT, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
allqueue(REDRAWVIEW3D, 0);
}
}
else if(G.obedit) {
/* used to be a bigger test, also included sector and life */
if(val==0)
return;
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
EditMesh *em = G.editMesh;
EditVert *eve;
@@ -1485,9 +1573,9 @@ void borderselect(void)
}
allqueue(REDRAWVIEW3D, 0);
}
}
else {
else { // no editmode, unified for bones and objects
Bone *bone;
unsigned int *vbuffer=NULL; /* selection buffer */
unsigned int *col; /* color in buffer */
short selecting = 0;
@@ -1495,8 +1583,9 @@ void borderselect(void)
if (val==LEFTMOUSE)
selecting = 1;
vbuffer = MEM_mallocN(4 * G.totobj * sizeof(unsigned int), "selection buffer");
hits= view3d_opengl_select(vbuffer, 4*G.totobj, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
/* selection buffer now has bones potentially too, so we add MAXPICKBUF */
vbuffer = MEM_mallocN(4 * (G.totobj+MAXPICKBUF) * sizeof(unsigned int), "selection buffer");
hits= view3d_opengl_select(vbuffer, 4*(G.totobj+MAXPICKBUF), rect.xmin, rect.ymin, rect.xmax, rect.ymax);
/*
LOGIC NOTES (theeth):
The buffer and ListBase have the same relative order, which makes the selection
@@ -1515,16 +1604,33 @@ void borderselect(void)
while(base && hits) {
Base *next = base->next;
if(base->lay & G.vd->lay) {
if (base->selcol == *col) {
while (base->selcol == (*col & 0xFFFF)) { // we got an object
if(*col & 0xFFFF0000) { // we got a bone
bone = get_indexed_bone(base->object, *col & ~(BONESEL_ANY));
if(bone) {
if(selecting) {
bone->flag |= BONE_SELECTED;
select_actionchannel_by_name(base->object->action, bone->name, 1);
}
else {
bone->flag &= ~(BONE_ACTIVE|BONE_SELECTED);
select_actionchannel_by_name(base->object->action, bone->name, 0);
}
}
}
else {
if (selecting)
base->flag |= SELECT;
else
base->flag &= ~SELECT;
base->object->flag= base->flag;
}
col+=4; /* next color */
hits--;
if(hits==0) break;
}
}
@@ -1537,28 +1643,17 @@ void borderselect(void)
MEM_freeN(vbuffer);
allqueue(REDRAWDATASELECT, 0);
/* because backbuf drawing */
tel= 1;
base= FIRSTBASE;
while(base) {
/* each base because of multiple windows */
base->selcol = ((tel & 0xF00)<<12)
+ ((tel & 0xF0)<<8)
+ ((tel & 0xF)<<4);
tel++;
base= base->next;
}
/* new */
allqueue(REDRAWBUTSLOGIC, 0);
allqueue(REDRAWNLA, 0);
}
countall();
allqueue(REDRAWBUTSOBJECT, 0);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWINFO, 0);
}
if(val) BIF_undo_push("Border select");
BIF_undo_push("Border select");
} /* end of borderselect() */

View File

@@ -295,94 +295,6 @@ void buttons_active_id(ID **id, ID **idfrom)
}
}
#if 0
static void validate_bonebutton(void *bonev, void *data2_unused){
Bone *bone= bonev;
bArmature *arm;
arm = get_armature(G.obpose);
unique_bone_name(bone, arm);
}
static int bonename_exists(Bone *orig, char *name, ListBase *list)
{
Bone *curbone;
for (curbone=list->first; curbone; curbone=curbone->next){
/* Check this bone */
if (orig!=curbone){
if (!strcmp(curbone->name, name))
return 1;
}
/* Check Children */
if (bonename_exists(orig, name, &curbone->childbase))
return 1;
}
return 0;
}
static void unique_bone_name (Bone *bone, bArmature *arm)
{
char tempname[64];
char oldname[64];
int number;
char *dot;
if (!arm)
return;
strcpy(oldname, bone->name);
/* See if we even need to do this */
if (!bonename_exists(bone, bone->name, &arm->bonebase))
return;
/* Strip off the suffix */
dot=strchr(bone->name, '.');
if (dot)
*dot=0;
for (number = 1; number <=999; number++){
sprintf (tempname, "%s.%03d", bone->name, number);
if (!bonename_exists(bone, tempname, &arm->bonebase)){
strcpy (bone->name, tempname);
return;
}
}
}
static uiBlock *sbuts_context_menu(void *arg_unused)
{
uiBlock *block;
short yco = 0;
block= uiNewBlock(&curarea->uiblocks, "context_options", UI_EMBOSSP, UI_HELV, curarea->headwin);
/* should be branches from tree */
uiDefIconTextButS(block, BUTM, B_REDR, ICON_SCENE_DEHLT, "Scene|F10", 0, yco-=22, 100, 20, &G.buts->mainb, 0.0, 0.0, 0, 0, "");
uiDefIconTextButS(block, BUTM, B_REDR, ICON_EDIT, "Editing|F9", 0, yco-=22, 100, 20, &G.buts->mainb, 4.0, 0.0, 0, 0, "");
uiDefIconTextButS(block, BUTM, B_REDR, ICON_OBJECT, "Object|F6", 0, yco-=22, 100, 20, &G.buts->mainb, 1.0, 0.0, 0, 0, "");
uiDefIconTextButS(block, BUTM, B_REDR, ICON_MATERIAL_DEHLT, "Shading|F5", 0, yco-=22, 100, 20, &G.buts->mainb, 3.0, 0.0, 0, 0, "");
uiDefIconTextButS(block, BUTM, B_REDR, ICON_GAME, "Logic|F4", 0, yco-=22, 100, 20, &G.buts->mainb, 6.0, 0.0, 0, 0, "");
uiDefIconTextButS(block, BUTM, B_REDR, ICON_SCRIPT, "Script", 0, yco-=22, 100, 20, &G.buts->mainb, 5.0, 0.0, 0, 0, "");
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
else {
uiBlockSetDirection(block, UI_TOP);
uiBlockFlipOrder(block);
}
return block;
}
#endif
static void do_buts_view_shadingmenu(void *arg, int event)
{
G.buts->mainb = CONTEXT_SHADING;
@@ -686,15 +598,6 @@ void buts_buttons(void)
// uiDefIconBut(block, BUT, B_BUTSHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms window to home view showing all items (HOMEKEY)");
// xco+=XIC;
/* mainb menu*/
/* (this could be done later with a dynamic tree and branches, also for python) */
//{
// char mainbname[8][12]= {" Scene", " Object", " Types", " Shading", " Editing", " Script", " Logic"};
// char mainbicon[8]= {ICON_SCENE_DEHLT, ICON_OBJECT, ICON_BBOX, ICON_MATERIAL_DEHLT, ICON_EDIT, ICON_SCRIPT, ICON_GAME};
// uiBut *but= uiDefIconTextBlockBut(block, sbuts_context_menu, NULL, mainbicon[G.buts->mainb], mainbname[G.buts->mainb], xco, 0, 90, YIC, "Set main context for button panels");
// uiButClearFlag(but, UI_ICON_RIGHT); // this type has both flags set, and draws icon right.. uhh
// xco+= 90-XIC+10;
//}
uiBlockBeginAlign(block);
uiDefIconButS(block, ROW, B_REDR, ICON_GAME, xco, 0, XIC, YIC, &(G.buts->mainb), 0.0, (float)CONTEXT_LOGIC, 0, 0, "Logic (F4) ");
uiDefIconButS(block, ROW, B_REDR, ICON_SCRIPT, xco+=XIC, 0, XIC, YIC, &(G.buts->mainb), 0.0, (float)CONTEXT_SCRIPT, 0, 0, "Script ");
@@ -705,8 +608,6 @@ void buts_buttons(void)
xco+= XIC;
// if(curarea->headertype==HEADERTOP) t_base= -3; else t_base= 4;
/* select the context to be drawn, per contex/tab the actual context is tested */
uiBlockSetEmboss(block, UI_EMBOSS); // normal
switch(G.buts->mainb) {

View File

@@ -1765,7 +1765,7 @@ char info_time_str[32]="";
static void info_text(int x, int y)
{
Object *ob;
Object *ob= OBACT;
extern float hashvectf[];
extern int mem_in_use;
unsigned int swatch_color;
@@ -1797,7 +1797,7 @@ static void info_text(int x, int y)
sprintf(s," | Mem:%.2fM ", (mem_in_use>>10)/1024.0);
}
else if(G.obpose) {
else if(ob && (ob->flag & OB_POSEMODE)) {
sprintf(infostr,"Bo:%d-%d | Mem:%.2fM ",
G.totbonesel, G.totbone, (mem_in_use>>10)/1024.0);
}
@@ -1805,7 +1805,6 @@ static void info_text(int x, int y)
sprintf(infostr,"Ve:%d | Fa:%d | Ob:%d-%d | La:%d | Mem:%.2fM | Time:%s | ",
G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp, (mem_in_use>>10)/1024.0, info_time_str);
}
ob= OBACT;
if(ob) {
strcat(infostr, ob->id.name+2);
}

View File

@@ -91,6 +91,7 @@
#include "BIF_editmesh.h"
#include "BIF_editmode_undo.h"
#include "BIF_editview.h"
#include "BIF_gl.h"
#include "BIF_interface.h"
#include "BIF_mainqueue.h"
#include "BIF_meshtools.h"
@@ -101,7 +102,6 @@
#include "BIF_space.h"
#include "BIF_toets.h"
#include "BIF_toolbox.h"
#include "BIF_gl.h"
#include "BIF_transform.h"
#include "BPY_extern.h"
@@ -1075,7 +1075,7 @@ static void do_view3d_select_pose_armaturemenu(void *arg, int event)
borderselect();
break;
case 2: /* Select/Deselect all */
deselectall_posearmature(1);
deselectall_posearmature(OBACT, 1);
break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -3656,136 +3656,12 @@ void do_view3d_buttons(short event)
scrarea_queue_headredraw(curarea);
}
break;
case B_LOCALVIEW:
if(G.vd->localview) initlocalview();
else endlocalview(curarea);
scrarea_queue_headredraw(curarea);
break;
case B_EDITMODE:
if (G.f & G_VERTEXPAINT) {
/* Switch off vertex paint */
G.f &= ~G_VERTEXPAINT;
}
if (G.f & G_WEIGHTPAINT){
/* Switch off weight paint */
G.f &= ~G_WEIGHTPAINT;
}
#ifdef NAN_TPT
if (G.f & G_TEXTUREPAINT) {
/* Switch off texture paint */
G.f &= ~G_TEXTUREPAINT;
}
#endif /* NAN_VPT */
if(G.obedit==NULL) {
enter_editmode();
BIF_undo_push("Original"); // here, because all over code enter_editmode is abused
}
else exit_editmode(2); // freedata, and undo
scrarea_queue_headredraw(curarea);
break;
case B_POSEMODE:
/* if (G.obedit){
error("Unable to perform function in EditMode");
G.vd->flag &= ~V3D_POSEMODE;
scrarea_queue_headredraw(curarea);
}
else{
*/
if (G.obpose==NULL) enter_posemode();
else exit_posemode(1);
allqueue(REDRAWHEADERS, 0);
break;
case B_WPAINT:
if (G.f & G_VERTEXPAINT) {
/* Switch off vertex paint */
G.f &= ~G_VERTEXPAINT;
}
#ifdef NAN_TPT
if ((!(G.f & G_WEIGHTPAINT)) && (G.f & G_TEXTUREPAINT)) {
/* Switch off texture paint */
G.f &= ~G_TEXTUREPAINT;
}
#endif /* NAN_VPT */
if(G.obedit) {
error("Unable to perform function in EditMode");
G.vd->flag &= ~V3D_WEIGHTPAINT;
scrarea_queue_headredraw(curarea);
}
else if(G.obpose) {
error("Unable to perform function in PoseMode");
G.vd->flag &= ~V3D_WEIGHTPAINT;
scrarea_queue_headredraw(curarea);
}
else set_wpaint();
break;
case B_VPAINT:
if ((!(G.f & G_VERTEXPAINT)) && (G.f & G_WEIGHTPAINT)) {
G.f &= ~G_WEIGHTPAINT;
}
#ifdef NAN_TPT
if ((!(G.f & G_VERTEXPAINT)) && (G.f & G_TEXTUREPAINT)) {
/* Switch off texture paint */
G.f &= ~G_TEXTUREPAINT;
}
#endif /* NAN_VPT */
if(G.obedit) {
error("Unable to perform function in EditMode");
G.vd->flag &= ~V3D_VERTEXPAINT;
scrarea_queue_headredraw(curarea);
}
else if(G.obpose) {
error("Unable to perform function in PoseMode");
G.vd->flag &= ~V3D_VERTEXPAINT;
scrarea_queue_headredraw(curarea);
}
else set_vpaint();
break;
#ifdef NAN_TPT
case B_TEXTUREPAINT:
if (G.f & G_TEXTUREPAINT) {
G.f &= ~G_TEXTUREPAINT;
}
else {
if (G.obedit) {
error("Unable to perform function in EditMode");
G.vd->flag &= ~V3D_TEXTUREPAINT;
}
else {
if (G.f & G_WEIGHTPAINT){
/* Switch off weight paint */
G.f &= ~G_WEIGHTPAINT;
}
if (G.f & G_VERTEXPAINT) {
/* Switch off vertex paint */
G.f &= ~G_VERTEXPAINT;
}
if (G.f & G_FACESELECT) {
/* Switch off face select */
G.f &= ~G_FACESELECT;
}
G.f |= G_TEXTUREPAINT;
scrarea_queue_headredraw(curarea);
}
}
break;
#endif /* NAN_TPT */
case B_FACESEL:
if(G.obedit) {
error("Unable to perform function in EditMode");
G.vd->flag &= ~V3D_FACESELECT;
scrarea_queue_headredraw(curarea);
}
else if(G.obpose) {
error("Unable to perform function in PoseMode");
G.vd->flag &= ~V3D_FACESELECT;
scrarea_queue_headredraw(curarea);
}
else set_faceselect();
break;
case B_VIEWBUT:
@@ -3826,27 +3702,31 @@ void do_view3d_buttons(short event)
viewmove(1);
scrarea_queue_headredraw(curarea);
break;
case B_MODESELECT:
if (G.vd->modeselect == V3D_OBJECTMODE_SEL) {
Object *ob= OBACT;
G.vd->flag &= ~V3D_MODE;
G.f &= ~G_VERTEXPAINT; /* Switch off vertex paint */
G.f &= ~G_TEXTUREPAINT; /* Switch off texture paint */
G.f &= ~G_WEIGHTPAINT; /* Switch off weight paint */
G.f &= ~G_FACESELECT; /* Switch off face select */
if (G.obpose) exit_posemode(1); /* exit posemode */
if(ob) exit_posemode(); /* exit posemode for active object */
if(G.obedit) exit_editmode(2); /* exit editmode and undo */
} else if (G.vd->modeselect == V3D_EDITMODE_SEL) {
}
else if (G.vd->modeselect == V3D_EDITMODE_SEL) {
if(!G.obedit) {
G.vd->flag &= ~V3D_MODE;
G.f &= ~G_VERTEXPAINT; /* Switch off vertex paint */
G.f &= ~G_TEXTUREPAINT; /* Switch off texture paint */
G.f &= ~G_WEIGHTPAINT; /* Switch off weight paint */
if (G.obpose) exit_posemode(1); /* exit posemode */
enter_editmode();
BIF_undo_push("Original"); // here, because all over code enter_editmode is abused
}
} else if (G.vd->modeselect == V3D_FACESELECTMODE_SEL) {
}
else if (G.vd->modeselect == V3D_FACESELECTMODE_SEL) {
if ((G.obedit) && (G.f & G_FACESELECT)) {
exit_editmode(2); /* exit editmode and undo */
} else if ((G.f & G_FACESELECT) && (G.f & G_VERTEXPAINT)) {
@@ -3858,43 +3738,45 @@ void do_view3d_buttons(short event)
G.f &= ~G_VERTEXPAINT; /* Switch off vertex paint */
G.f &= ~G_TEXTUREPAINT; /* Switch off texture paint */
G.f &= ~G_WEIGHTPAINT; /* Switch off weight paint */
if (G.obpose) exit_posemode(1); /* exit posemode */
if (G.obedit) exit_editmode(2); /* exit editmode and undo */
set_faceselect();
}
} else if (G.vd->modeselect == V3D_VERTEXPAINTMODE_SEL) {
}
else if (G.vd->modeselect == V3D_VERTEXPAINTMODE_SEL) {
if (!(G.f & G_VERTEXPAINT)) {
G.vd->flag &= ~V3D_MODE;
G.f &= ~G_TEXTUREPAINT; /* Switch off texture paint */
G.f &= ~G_WEIGHTPAINT; /* Switch off weight paint */
if (G.obpose) exit_posemode(1); /* exit posemode */
if(G.obedit) exit_editmode(2); /* exit editmode and undo */
set_vpaint();
}
} else if (G.vd->modeselect == V3D_TEXTUREPAINTMODE_SEL) {
}
else if (G.vd->modeselect == V3D_TEXTUREPAINTMODE_SEL) {
if (!(G.f & G_TEXTUREPAINT)) {
G.vd->flag &= ~V3D_MODE;
G.f &= ~G_VERTEXPAINT; /* Switch off vertex paint */
G.f &= ~G_WEIGHTPAINT; /* Switch off weight paint */
if (G.obpose) exit_posemode(1); /* exit posemode */
if(G.obedit) exit_editmode(2); /* exit editmode and undo */
G.f |= G_TEXTUREPAINT; /* Switch on texture paint flag */
}
} else if (G.vd->modeselect == V3D_WEIGHTPAINTMODE_SEL) {
}
else if (G.vd->modeselect == V3D_WEIGHTPAINTMODE_SEL) {
if (!(G.f & G_WEIGHTPAINT) && (OBACT && OBACT->type == OB_MESH) && ((((Mesh*)(OBACT->data))->dvert))) {
G.vd->flag &= ~V3D_MODE;
G.f &= ~G_VERTEXPAINT; /* Switch off vertex paint */
G.f &= ~G_TEXTUREPAINT; /* Switch off texture paint */
if (G.obpose) exit_posemode(1); /* exit posemode */
if(G.obedit) exit_editmode(2); /* exit editmode and undo */
set_wpaint();
}
} else if (G.vd->modeselect == V3D_POSEMODE_SEL) {
if (!G.obpose) {
}
else if (G.vd->modeselect == V3D_POSEMODE_SEL) {
Object *ob= OBACT;
if (ob && !(ob->flag & OB_POSEMODE)) {
G.vd->flag &= ~V3D_MODE;
if(G.obedit) exit_editmode(2); /* exit editmode and undo */
@@ -3903,6 +3785,7 @@ void do_view3d_buttons(short event)
}
allqueue(REDRAWVIEW3D, 1);
break;
case B_AROUND:
handle_view3d_around(); // copies to other 3d windows
allqueue(REDRAWVIEW3D, 1);
@@ -4027,18 +3910,18 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
if (OBACT && OBACT->type == OB_MESH) {
uiDefPulldownBut(block, view3d_select_faceselmenu, NULL, "Select", xco,-2, xmax-3, 24, "");
}
} else if (G.obpose) {
if (OBACT && OBACT->type == OB_ARMATURE) {
uiDefPulldownBut(block, view3d_select_pose_armaturemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
}
} else if ((G.f & G_VERTEXPAINT) || (G.f & G_TEXTUREPAINT) || (G.f & G_WEIGHTPAINT)) {
uiDefBut(block, LABEL,0,"", xco, 0, xmax, 20, 0, 0, 0, 0, 0, "");
} else {
Object *ob= OBACT;
if (ob && (ob->flag & OB_POSEMODE))
uiDefPulldownBut(block, view3d_select_pose_armaturemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
else
uiDefPulldownBut(block, view3d_select_objectmenu, NULL, "Select", xco,-2, xmax-3, 24, "");
}
xco+= xmax;
if (G.obedit) {
if (OBACT && OBACT->type == OB_MESH) {
xmax= GetButStringLength("Mesh");
@@ -4081,17 +3964,20 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
uiDefPulldownBut(block, view3d_faceselmenu, NULL, "Face", xco,-2, xmax-3, 24, "");
xco+= xmax;
}
} else if (G.obpose) {
if (OBACT && OBACT->type == OB_ARMATURE) {
} else {
Object *ob= OBACT;
if (ob && (ob->flag & OB_POSEMODE)) {
xmax= GetButStringLength("Armature");
uiDefPulldownBut(block, view3d_pose_armaturemenu, NULL, "Armature", xco,-2, xmax-3, 24, "");
xco+= xmax;
}
} else {
else {
xmax= GetButStringLength("Object");
uiDefPulldownBut(block, view3d_edit_objectmenu, NULL, "Object", xco,-2, xmax-3, 24, "");
xco+= xmax;
}
}
*xcoord= xco;
}
@@ -4099,6 +3985,7 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
void view3d_buttons(void)
{
uiBlock *block;
Object *ob= OBACT;
int a;
short xco = 0;
@@ -4134,24 +4021,23 @@ void view3d_buttons(void)
/* mode */
G.vd->modeselect = V3D_OBJECTMODE_SEL;
if (G.f & G_WEIGHTPAINT) G.vd->modeselect = V3D_WEIGHTPAINTMODE_SEL;
if (G.obedit) G.vd->modeselect = V3D_EDITMODE_SEL;
else if(ob && (ob->flag & OB_POSEMODE)) G.vd->modeselect = V3D_POSEMODE_SEL;
else if (G.f & G_WEIGHTPAINT) G.vd->modeselect = V3D_WEIGHTPAINTMODE_SEL;
else if (G.f & G_VERTEXPAINT) G.vd->modeselect = V3D_VERTEXPAINTMODE_SEL;
else if (G.f & G_TEXTUREPAINT) G.vd->modeselect = V3D_TEXTUREPAINTMODE_SEL;
else if(G.f & G_FACESELECT) G.vd->modeselect = V3D_FACESELECTMODE_SEL;
if (G.obpose) G.vd->modeselect = V3D_POSEMODE_SEL;
if (G.obedit) G.vd->modeselect = V3D_EDITMODE_SEL;
G.vd->flag &= ~V3D_MODE;
/* not sure what the G.vd->flag is useful for now... modeselect is confusing */
if(G.obedit) G.vd->flag |= V3D_EDITMODE;
if(ob && (ob->flag & OB_POSEMODE)) G.vd->flag |= V3D_POSEMODE;
if(G.f & G_VERTEXPAINT) G.vd->flag |= V3D_VERTEXPAINT;
if(G.f & G_WEIGHTPAINT) G.vd->flag |= V3D_WEIGHTPAINT;
#ifdef NAN_TPT
if (G.f & G_TEXTUREPAINT) G.vd->flag |= V3D_TEXTUREPAINT;
#endif /* NAN_TPT */
if(G.f & G_FACESELECT) G.vd->flag |= V3D_FACESELECT;
if(G.obpose){
G.vd->flag |= V3D_POSEMODE;
}
uiDefIconTextButS(block, MENU, B_MODESELECT, (G.vd->modeselect),view3d_modeselect_pup() ,
xco,0,126,20, &(G.vd->modeselect), 0, 0, 0, 0, "Mode:");
@@ -4253,13 +4139,13 @@ void view3d_buttons(void)
uiDefIconBut(block, BUT, B_VIEWRENDER, ICON_SCENE_DEHLT, xco,0,XIC,YIC, NULL, 0, 1.0, 0, 0, "Render this window (hold CTRL for anim)");
if (G.obpose){
if (ob && (ob->flag & OB_POSEMODE)) {
xco+= XIC/2;
if(curarea->headertype==HEADERTOP) {
uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYUP,
xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0,
"Copies the current pose to the buffer");
uiSetButLock(G.obpose->id.lib!=0, "Can't edit library data");
uiSetButLock(ob->id.lib!=0, "Can't edit library data");
uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEUP,
xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0,
"Pastes the pose from the buffer");
@@ -4271,7 +4157,7 @@ void view3d_buttons(void)
uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYDOWN,
xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0,
"Copies the current pose to the buffer");
uiSetButLock(G.obpose->id.lib!=0, "Can't edit library data");
uiSetButLock(ob->id.lib!=0, "Can't edit library data");
uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEDOWN,
xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0,
"Pastes the pose from the buffer");

View File

@@ -907,7 +907,6 @@ static void tree_element_active_object(SpaceOops *soops, TreeElement *te)
sce= (Scene *)outliner_search_back(soops, te, ID_SCE);
if(sce && G.scene != sce) {
if(G.obedit) exit_editmode(2);
if(G.obpose) exit_posemode(1);
set_scene(sce);
}
@@ -939,7 +938,6 @@ static void tree_element_active_object(SpaceOops *soops, TreeElement *te)
}
if(ob!=G.obedit) exit_editmode(2);
if(ob!=G.obpose) exit_posemode(1);
}
static int tree_element_active_material(SpaceOops *soops, TreeElement *te, int set)
@@ -1096,7 +1094,6 @@ static int tree_element_active_world(SpaceOops *soops, TreeElement *te, int set)
if(set) { // make new scene active
if(sce && G.scene != sce) {
if(G.obedit) exit_editmode(2);
if(G.obpose) exit_posemode(1);
set_scene(sce);
}
}
@@ -1139,7 +1136,7 @@ static int tree_element_active_ipo(SpaceOops *soops, TreeElement *te, int set)
deselect_actionchannels(ob->action, 0);
select_channel(ob->action, chan, SELECT_ADD);
allqueue(REDRAWACTION, ob->ipowin);
if(G.obpose) allqueue(REDRAWVIEW3D, ob->ipowin);
allqueue(REDRAWVIEW3D, ob->ipowin);
}
allqueue(REDRAWIPO, ob->ipowin);
@@ -1206,7 +1203,7 @@ static int tree_element_active_posechannel(TreeElement *te, TreeStoreElem *tsele
if(set) {
if(G.qual & LR_SHIFTKEY);
else deselectall_posearmature(0);
else deselectall_posearmature(ob, 0);
pchan->bone->flag |= BONE_SELECTED|BONE_ACTIVE;
allqueue(REDRAWVIEW3D, 0);
@@ -1295,11 +1292,11 @@ static int tree_element_active_pose(TreeElement *te, TreeStoreElem *tselem, int
if(set) {
if(G.obedit) exit_editmode(2);
if(G.obpose) exit_posemode(1);
if(ob->flag & OB_POSEMODE) exit_posemode();
else enter_posemode();
}
else {
if(ob==G.obpose) return 1;
if(ob->flag & OB_POSEMODE) return 1;
}
return 0;
}
@@ -1378,12 +1375,10 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
if(te->idcode==ID_SCE) {
if(G.scene!=(Scene *)tselem->id) {
if(G.obedit) exit_editmode(2);
if(G.obpose) exit_posemode(1);
set_scene((Scene *)tselem->id);
}
}
else if(ELEM5(te->idcode, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR)) {
if(G.obpose) exit_posemode(1);
if(G.obedit) exit_editmode(2);
else {
enter_editmode();
@@ -1719,7 +1714,6 @@ static void object_delete_cb(TreeElement *te, TreeStoreElem *tselem)
if(base) {
// check also library later
if(G.obpose==base->object) exit_posemode(1);
if(G.obedit==base->object) exit_editmode(2);
if(base==BASACT) {

View File

@@ -78,10 +78,8 @@ void enter_posemode(void)
if(G.scene->id.lib) return;
base= BASACT;
if(base==NULL) return;
if((base->lay & G.vd->lay)==0) return;
ob= base->object;
if(ob->data==NULL) return;
if (ob->id.lib){
error ("Can't pose libdata");
@@ -93,7 +91,6 @@ void enter_posemode(void)
arm= get_armature(ob);
if( arm==NULL ) return;
G.obpose= ob;
ob->flag |= OB_POSEMODE;
base->flag= ob->flag;
@@ -108,8 +105,6 @@ void enter_posemode(void)
if (G.obedit) exit_editmode(1);
G.f &= ~(G_VERTEXPAINT | G_FACESELECT | G_TEXTUREPAINT | G_WEIGHTPAINT);
}
void set_pose_keys (Object *ob)
@@ -130,41 +125,34 @@ void set_pose_keys (Object *ob)
}
void exit_posemode (int freedata)
void exit_posemode(void)
{
Object *ob;
Object *ob= OBACT;
Base *base= BASACT;
if(G.obpose==NULL) return;
if(ob==NULL) return;
ob= G.obpose;
ob->flag &= ~OB_POSEMODE;
base->flag= ob->flag;
G.obpose= NULL;
if(freedata) {
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
countall();
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWOOPS, 0);
allqueue(REDRAWHEADERS, 0);
allqueue(REDRAWBUTSALL, 0);
}
else {
G.obpose= ob;
}
scrarea_queue_headredraw(curarea);
}
void pose_special_editmenu(void)
{
Object *ob= OBACT;
bPoseChannel *pchan;
short nr;
for(pchan= G.obpose->pose->chanbase.first; pchan; pchan= pchan->next)
if(!ob && !ob->pose) return;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next)
if(pchan->bone->flag & BONE_ACTIVE) break;
if(pchan==NULL) return;
@@ -174,11 +162,11 @@ void pose_special_editmenu(void)
for(con= pchan->constraints.first; con; con= con->next) {
char *subtarget;
Object *ob= get_constraint_target(con, &subtarget);
Object *target= get_constraint_target(con, &subtarget);
if(ob==G.obpose) {
if(ob==target) {
if(subtarget) {
pchan= get_pose_channel(G.obpose->pose, subtarget);
pchan= get_pose_channel(ob->pose, subtarget);
pchan->bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
}
}

View File

@@ -66,6 +66,7 @@
#include "DNA_vec_types.h"
#include "BKE_global.h"
#include "BKE_scene.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"

View File

@@ -717,13 +717,13 @@ void BIF_undo_menu(void)
static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
View3D *v3d= sa->spacedata.first;
Object *ob= OBACT; // do not change!
float *curs;
int doredraw= 0, pupval;
unsigned short event= evt->event;
short val= evt->val;
char ascii= evt->ascii;
View3D *v3d= sa->spacedata.first;
Object *ob;
float *curs;
int doredraw= 0, pupval;
if(curarea->win==0) return; /* when it comes from sa->headqread() */
@@ -931,10 +931,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
mouse_mesh(); // loop select for 1 mousebutton dudes
else if((G.obedit) && (G.qual == (LR_CTRLKEY|LR_ALTKEY|LR_SHIFTKEY)))
mouse_mesh(); // loop select for 1 mousebutton dudes
else if(G.obpose) {
if (G.obpose->type==OB_ARMATURE)
mousepose_armature();
}
else if(G.qual==LR_CTRLKEY)
mouse_select(); // also allow in editmode, for vertex parenting
else if(G.f & G_FACESELECT)
@@ -942,7 +938,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if( G.f & (G_VERTEXPAINT|G_TEXTUREPAINT))
sample_vpaint();
else
mouse_select();
mouse_select(); // does poses too
break;
case WHEELUPMOUSE:
/* Regular: Zoom in */
@@ -1006,7 +1002,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case ONEKEY:
ob= OBACT;
if(G.qual==LR_CTRLKEY) {
if(ob && ob->type == OB_MESH) {
flip_subdivison(ob, 1);
@@ -1016,7 +1011,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case TWOKEY:
ob= OBACT;
if(G.qual==LR_CTRLKEY) {
if(ob && ob->type == OB_MESH) {
flip_subdivison(ob, 2);
@@ -1026,7 +1020,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case THREEKEY:
ob= OBACT;
if(G.qual==LR_CTRLKEY) {
if(ob && ob->type == OB_MESH) {
flip_subdivison(ob, 3);
@@ -1036,7 +1029,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case FOURKEY:
ob= OBACT;
if(G.qual==LR_CTRLKEY) {
if(ob && ob->type == OB_MESH) {
flip_subdivison(ob, 4);
@@ -1110,12 +1102,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if(G.obedit->type==OB_ARMATURE)
deselectall_armature(1); // 1 == toggle
}
else if (G.obpose){
switch (G.obpose->type){
case OB_ARMATURE:
deselectall_posearmature(1);
break;
}
else if (ob && (ob->flag & OB_POSEMODE)){
deselectall_posearmature(ob, 1);
}
else {
if(G.f & G_FACESELECT) deselectall_tface();
@@ -1167,9 +1155,9 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
duplicate_context_selected();
}
else if(G.qual==LR_ALTKEY) {
if(G.obpose)
if(ob && (ob->flag & OB_POSEMODE))
error ("Duplicate not possible in posemode.");
else if((G.obedit==0))
else if((G.obedit==NULL))
adduplicate(0);
}
else if(G.qual==LR_CTRLKEY) {
@@ -1303,7 +1291,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
else if(G.f & G_FACESELECT)
hide_tface();
else if(G.obpose) {
else if(ob && (ob->flag & OB_POSEMODE)) {
if (G.qual==0)
hide_selected_pose_bones();
else if (G.qual==LR_SHIFTKEY)
@@ -1317,7 +1305,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case JKEY:
if(G.qual==LR_CTRLKEY) {
if( (ob= OBACT) ) {
if( ob ) {
if(ob->type == OB_MESH)
join_mesh();
else if(ob->type == OB_CURVE)
@@ -1371,8 +1359,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
selectconnected_nurb();
}
else if(G.obpose) {
if(G.obpose->type==OB_ARMATURE)
else if(ob && (ob->flag & OB_POSEMODE)) {
selectconnected_posearmature();
}
else {
@@ -1452,7 +1439,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case OKEY:
ob= OBACT;
if (G.obedit) {
if (G.qual==LR_SHIFTKEY) {
G.scene->prop_mode = (G.scene->prop_mode+1)%6;
@@ -1646,7 +1632,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case VKEY:
ob= OBACT;
if((G.qual==LR_SHIFTKEY)) {
if ((G.obedit) && G.obedit->type==OB_MESH) {
align_view_to_selected(v3d);
@@ -1751,7 +1736,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case PADASTERKEY: /* '*' */
if(G.qual==0) {
ob= OBACT;
if(ob) {
if ((G.obedit) && (G.obedit->type == OB_MESH)) {
editmesh_align_view_to_selected(G.vd, 2);

View File

@@ -761,7 +761,7 @@ int blenderqread(unsigned short event, short val)
Object *ob= OBACT;
if(ob) {
if(ob->type==OB_ARMATURE) {
if(G.obpose) exit_posemode(1);
if(ob->flag & OB_POSEMODE) exit_posemode();
else enter_posemode();
}
else if(ob->type==OB_MESH) {
@@ -769,7 +769,7 @@ int blenderqread(unsigned short event, short val)
}
}
}
else if(G.qual==LR_SHIFTKEY) {
else if(G.qual==LR_SHIFTKEY) { // ??
if(G.obedit)
exit_editmode(2); // freedata, and undo
if(G.f & G_FACESELECT)
@@ -783,8 +783,6 @@ int blenderqread(unsigned short event, short val)
}
if(G.f & G_WEIGHTPAINT)
set_wpaint();
if(G.obpose)
exit_posemode(1);
}
break;
@@ -869,7 +867,7 @@ int blenderqread(unsigned short event, short val)
break;
case SKEY:
if(G.obpose==0 && G.obedit==0) {
if(G.obedit==NULL) {
if(G.qual==LR_CTRLKEY) {
strcpy(dir, G.sce);
if (untitled(dir)) {

View File

@@ -71,6 +71,9 @@
#include "DNA_vfont_types.h"
#include "BIF_editview.h" /* arrows_move_cursor */
#include "BIF_gl.h"
#include "BIF_mywindow.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_space.h" /* undo */
#include "BIF_toets.h" /* persptoetsen */
@@ -93,9 +96,6 @@
#include "mydevice.h"
extern void helpline(float *vec);
#include "transform.h"
/* GLOBAL VARIABLE THAT SHOULD MOVED TO SCREEN MEMBER OR SOMETHING */
@@ -103,6 +103,42 @@ TransInfo Trans = {TFM_INIT, 0}; // enforce init on first usage
ListBase CSpaces = {0,0};
float MatSpace[3][3];
/* ************************** Dashed help line **************************** */
/* bad frontbuffer call... because it is used in transform after force_draw() */
static void helpline(float *vec, int local)
{
float vecrot[3], cent[2];
short mval[2];
VECCOPY(vecrot, vec);
if(local) {
Object *ob= OBACT;
if(ob) Mat4MulVecfl(ob->obmat, vecrot);
}
getmouseco_areawin(mval);
project_float(vecrot, cent); // no overflow in extreme cases
if(cent[0]!=3200.0f) {
persp(PERSP_WIN);
glDrawBuffer(GL_FRONT);
BIF_ThemeColor(TH_WIRE);
setlinestyle(3);
glBegin(GL_LINE_STRIP);
glVertex2sv(mval);
glVertex2fv(cent);
glEnd();
setlinestyle(0);
persp(PERSP_VIEW);
glFlush(); // flush display for frontbuffer
glDrawBuffer(GL_BACK);
}
}
/* ************************** TRANSFORMATIONS **************************** */
static void view_editmove(unsigned short event)
@@ -861,7 +897,7 @@ int Warp(TransInfo *t, short mval[2])
force_draw(0);
helpline(gcursor);
helpline(gcursor, t->flag & (T_EDIT|T_POSE));
return 1;
}
@@ -945,7 +981,7 @@ int Shear(TransInfo *t, short mval[2])
force_draw(0);
helpline (t->center);
helpline (t->center, t->flag & (T_EDIT|T_POSE));
return 1;
}
@@ -1197,7 +1233,7 @@ int Resize(TransInfo *t, short mval[2])
force_draw(0);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center, t->flag & (T_EDIT|T_POSE));
return 1;
}
@@ -1291,7 +1327,7 @@ int ToSphere(TransInfo *t, short mval[2])
force_draw(0);
helpline (t->center);
helpline (t->center, t->flag & (T_EDIT|T_POSE));
return 1;
}
@@ -1529,7 +1565,7 @@ int Rotation(TransInfo *t, short mval[2])
force_draw(0);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center, t->flag & (T_EDIT|T_POSE));
return 1;
}
@@ -1631,7 +1667,7 @@ int Trackball(TransInfo *t, short mval[2])
force_draw(0);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center, t->flag & (T_EDIT|T_POSE));
return 1;
}
@@ -1908,7 +1944,7 @@ int Tilt(TransInfo *t, short mval[2])
force_draw(0);
helpline (t->center);
helpline (t->center, t->flag & (T_EDIT|T_POSE));
return 1;
}
@@ -2080,7 +2116,7 @@ int Crease(TransInfo *t, short mval[2])
force_draw(0);
helpline (t->center);
helpline (t->center, t->flag & (T_EDIT|T_POSE));
return 1;
}
@@ -2280,7 +2316,7 @@ int BoneSize(TransInfo *t, short mval[2])
force_draw(0);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center, t->flag & (T_EDIT|T_POSE));
return 1;
}

View File

@@ -443,8 +443,10 @@ static int add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tra
return 0;
}
/* only called with pose mode active object now */
static void createTransPose(TransInfo *t)
{
Object *ob= OBACT;
bArmature *arm;
bPoseChannel *pchan;
TransData *td;
@@ -452,14 +454,14 @@ static void createTransPose(TransInfo *t)
int i;
/* check validity of state */
arm=get_armature (G.obpose);
if (arm==NULL || G.obpose->pose==NULL) return;
arm=get_armature (ob);
if (arm==NULL || ob->pose==NULL) return;
if (arm->flag & ARM_RESTPOS){
notice ("Pose edit not possible while Rest Position is enabled");
return;
}
if (!(G.obpose->lay & G.vd->lay)) return;
if (!(ob->lay & G.vd->lay)) return;
/* count total */
count_bone_select(t, &arm->bonebase, 1);
@@ -481,8 +483,8 @@ static void createTransPose(TransInfo *t)
/* use pose channels to fill trans data */
td= t->data;
for(pchan= G.obpose->pose->chanbase.first; pchan; pchan= pchan->next) {
if( add_pose_transdata(t, pchan, G.obpose, td) ) td++;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if( add_pose_transdata(t, pchan, ob, td) ) td++;
}
if(td != (t->data+t->total)) printf("Bone selection count error\n");
@@ -1343,25 +1345,26 @@ static void clear_trans_object_base_flags(void)
/* inserting keys, refresh ipo-keys, softbody, redraw events... (ton) */
void special_aftertrans_update(short cancelled)
{
Object *ob;
Object *ob= OBACT;
Base *base;
int redrawipo=0;
if (G.obpose){
if (ob && (ob->flag & OB_POSEMODE)) {
bArmature *arm= ob->data;
bAction *act;
bPose *pose;
bPoseChannel *pchan;
if(cancelled) /* if cancelled we do the update always */
DAG_object_flush_update(G.scene, G.obpose, OB_RECALC_DATA);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
else if(G.flags & G_RECORDKEYS) {
act=G.obpose->action;
pose=G.obpose->pose;
act= ob->action;
pose= ob->pose;
if (!act)
act=G.obpose->action=add_empty_action();
act= ob->action= add_empty_action();
set_pose_keys(G.obpose); // sets chan->flag to POSE_KEY if bone selected
set_pose_keys(ob); // sets chan->flag to POSE_KEY if bone selected
for (pchan=pose->chanbase.first; pchan; pchan=pchan->next){
if (pchan->flag & POSE_KEY){
@@ -1386,12 +1389,12 @@ void special_aftertrans_update(short cancelled)
allqueue(REDRAWIPO, 0);
allqueue(REDRAWNLA, 0);
DAG_object_flush_update(G.scene, G.obpose, OB_RECALC_DATA);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
else if(is_delay_deform()) {
else if(arm->flag & ARM_DELAYDEFORM) {
/* old optimize trick... this enforces to bypass the depgraph */
DAG_object_flush_update(G.scene, G.obpose, OB_RECALC_DATA);
G.obpose->recalc= 0; // is set on OK position already by recalcData()
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
ob->recalc= 0; // is set on OK position already by recalcData()
}
/* do not call DAG_object_flush_update always, we dont want actions to update, for inserting keys */
}
@@ -1458,15 +1461,6 @@ static void createTransObject(TransInfo *t)
set_trans_object_base_flags(t);
{
/* this has to be done, or else constraints on armature
* bones that point to objects/bones that are outside
* of the armature don't work outside of posemode
* (and yes, I know it's confusing ...).
*/
//figure_pose_updating();
}
/* count */
for(base= FIRSTBASE; base; base= base->next) {
if TESTBASELIB(base) {
@@ -1573,6 +1567,8 @@ static void createTransObject(TransInfo *t)
void createTransData(TransInfo *t)
{
Object *ob= OBACT;
if (t->context == CTX_TEXTURE) {
t->flag |= T_TEXTURE;
createTransTexspace(t);
@@ -1587,7 +1583,7 @@ void createTransData(TransInfo *t)
sort_trans_data_dist(t);
}
}
else if (G.obpose) {
else if (ob && (ob->flag & OB_POSEMODE)) {
t->flag |= T_POSE;
createTransPose(t);
}

View File

@@ -112,14 +112,16 @@ void getViewVector(float coord[3], float vec[3]) {
/* called for objects updating while transform acts, once per redraw */
void recalcData(TransInfo *t)
{
Base *base;
Object *ob= OBACT;
if(ob && (ob->flag & OB_POSEMODE)) {
bArmature *arm= ob->data;
if(G.obpose) {
/* old optimize trick... this enforces to bypass the depgraph */
if (!is_delay_deform())
DAG_object_flush_update(G.scene, G.obpose, OB_RECALC_DATA); /* sets recalc flags */
if (!(arm->flag & ARM_DELAYDEFORM))
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(G.obpose);
where_is_pose(ob);
}
else if (G.obedit) {
@@ -166,6 +168,7 @@ void recalcData(TransInfo *t)
}
}
else {
Base *base;
base= FIRSTBASE;
while(base) {
@@ -266,9 +269,10 @@ void drawLine(float *center, float *dir, char axis, short options)
void initTrans (TransInfo *t)
{
Object *ob= OBACT;
/* moving: is shown in drawobject() (transform color) */
if(G.obedit || G.obpose) G.moving= G_TRANSFORM_EDIT;
if(G.obedit || (ob && (ob->flag & OB_POSEMODE)) ) G.moving= G_TRANSFORM_EDIT;
else G.moving= G_TRANSFORM_OBJ;
t->data = NULL;
@@ -468,7 +472,7 @@ void calculateCenterCursor(TransInfo *t)
VECCOPY(t->center, cursor);
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= G.obedit?G.obedit:G.obpose;
Object *ob= G.obedit?G.obedit:OBACT;
float mat[3][3], imat[3][3];
float vec[3];
@@ -506,7 +510,7 @@ void calculateCenterMedian(TransInfo *t)
VECCOPY(t->center, partial);
if (t->flag & (T_EDIT|T_POSE)) {
Object *ob= G.obedit?G.obedit:G.obpose;
Object *ob= G.obedit?G.obedit:OBACT;
float vec[3];
VECCOPY(vec, t->center);
@@ -545,7 +549,7 @@ void calculateCenterBound(TransInfo *t)
VecMulf(t->center, 0.5);
if (t->flag & (T_EDIT|T_POSE)) {
Object *ob= G.obedit?G.obedit:G.obpose;
Object *ob= G.obedit?G.obedit:OBACT;
float vec[3];
VECCOPY(vec, t->center);
@@ -589,7 +593,7 @@ void calculateCenter(TransInfo *t)
/* setting constraint center */
VECCOPY(t->con.center, t->center);
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= G.obedit?G.obedit:G.obpose;
Object *ob= G.obedit?G.obedit:OBACT;
Mat4MulVecfl(ob->obmat, t->con.center);
}

View File

@@ -155,7 +155,7 @@ int calc_manipulator_stats(ScrArea *sa)
extern ListBase editNurb;
View3D *v3d= sa->spacedata.first;
Base *base;
Object *ob=NULL;
Object *ob= OBACT;
float normal[3]={0.0, 0.0, 0.0};
float plane[3]={0.0, 0.0, 0.0};
int a, totsel=0;
@@ -331,11 +331,10 @@ int calc_manipulator_stats(ScrArea *sa)
Mat4MulVecfl(G.obedit->obmat, G.scene->twmax);
}
}
else if(G.obpose) {
bArmature *arm= G.obpose->data;
else if(ob && (ob->flag & OB_POSEMODE)) {
bArmature *arm= ob->data;
bPoseChannel *pchan;
ob= G.obpose;
if((ob->lay & G.vd->lay)==0) return 0;
Trans.mode= TFM_ROTATION; // mislead counting bones... bah
@@ -353,9 +352,9 @@ int calc_manipulator_stats(ScrArea *sa)
VecMulf(plane, -1.0);
VecMulf(G.scene->twcent, 1.0f/(float)totsel); // centroid!
Mat4MulVecfl(G.obpose->obmat, G.scene->twcent);
Mat4MulVecfl(G.obpose->obmat, G.scene->twmin);
Mat4MulVecfl(G.obpose->obmat, G.scene->twmax);
Mat4MulVecfl(ob->obmat, G.scene->twcent);
Mat4MulVecfl(ob->obmat, G.scene->twmin);
Mat4MulVecfl(ob->obmat, G.scene->twmax);
}
}
else if(G.f & (G_FACESELECT + G_VERTEXPAINT + G_TEXTUREPAINT +G_WEIGHTPAINT)) {
@@ -391,7 +390,7 @@ int calc_manipulator_stats(ScrArea *sa)
break;
case V3D_MANIP_NORMAL:
if(G.obedit || G.obpose) {
if(G.obedit || (ob->flag & OB_POSEMODE)) {
if(normal[0]!=0.0 || normal[1]!=0.0 || normal[2]!=0.0) {
float imat[3][3], mat[3][3];
@@ -418,7 +417,7 @@ int calc_manipulator_stats(ScrArea *sa)
}
/* no break we define 'normal' as 'local' in Object mode */
case V3D_MANIP_LOCAL:
if(totsel==1 || v3d->around==V3D_LOCAL || G.obedit || G.obpose) {
if(totsel==1 || v3d->around==V3D_LOCAL || G.obedit || (ob->flag & OB_POSEMODE)) {
Mat4CpyMat4(v3d->twmat, ob->obmat);
Mat4Ortho(v3d->twmat);
}
@@ -1346,9 +1345,10 @@ void BIF_draw_manipulator(ScrArea *sa)
v3d->twmat[3][0]= (G.scene->twmin[0] + G.scene->twmax[0])/2.0f;
v3d->twmat[3][1]= (G.scene->twmin[1] + G.scene->twmax[1])/2.0f;
v3d->twmat[3][2]= (G.scene->twmin[2] + G.scene->twmax[2])/2.0f;
if(v3d->around==V3D_ACTIVE && G.obedit==NULL && G.obpose==NULL) {
if(v3d->around==V3D_ACTIVE && G.obedit==NULL) {
Object *ob= OBACT;
if(ob) VECCOPY(v3d->twmat[3], ob->obmat[3]);
if(ob && !(ob->flag & OB_POSEMODE))
VECCOPY(v3d->twmat[3], ob->obmat[3]);
}
break;
case V3D_LOCAL:

View File

@@ -458,7 +458,7 @@ void viewmove(int mode)
/* cumultime(0); */
if (G.obedit==0 && G.obpose==0 && U.uiflag & USER_ORBIT_SELECTION) {
if (G.obedit==NULL && ob && !(ob->flag & OB_POSEMODE) && U.uiflag & USER_ORBIT_SELECTION) {
use_sel = 1;
VECCOPY(ofs, G.vd->ofs);
if (ob) {
@@ -862,7 +862,6 @@ void setcameratoview3d(void)
short view3d_opengl_select(unsigned int *buffer, unsigned int bufsize, short x1, short y1, short x2, short y2)
{
rctf rect;
Base *base;
short mval[2], code, hits;
G.f |= G_PICKSEL;
@@ -899,23 +898,24 @@ short view3d_opengl_select(unsigned int *buffer, unsigned int bufsize, short x1
if(G.obedit && G.obedit->type==OB_MBALL) {
draw_object(BASACT);
}
else if ((G.obedit && G.obedit->type==OB_ARMATURE)||(G.obpose && G.obpose->type==OB_ARMATURE)) {
else if ((G.obedit && G.obedit->type==OB_ARMATURE)) {
draw_object(BASACT);
}
else {
Base *base;
G.vd->xray= TRUE; // otherwise it postpones drawing
base= G.scene->base.first;
while(base) {
for(base= G.scene->base.first; base; base= base->next) {
if(base->lay & G.vd->lay) {
base->selcol= code;
glLoadName(code);
draw_object(base);
code++;
}
base= base->next;
}
G.vd->xray= FALSE; // restore
}
glPopName(); /* see above (pushname) */
hits= glRenderMode(GL_RENDER);
if(hits<0) error("Too many objects in select buffer");
@@ -1077,7 +1077,7 @@ void initlocalview()
void centreview() /* like a localview without local! */
{
Base *base;
Object *ob= OBACT;
float size, min[3], max[3], afm[3];
int ok=0;
@@ -1088,18 +1088,18 @@ void centreview() /* like a localview without local! */
minmax_verts(min, max); // ony selected
ok= 1;
}
else if(G.obpose) {
if(G.obpose->pose) {
else if(ob && (ob->flag & OB_POSEMODE)) {
if(ob->pose) {
bPoseChannel *pchan;
float vec[3];
for(pchan= G.obpose->pose->chanbase.first; pchan; pchan= pchan->next) {
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if(pchan->bone->flag & BONE_SELECTED) {
ok= 1;
VECCOPY(vec, pchan->pose_head);
Mat4MulVecfl(G.obpose->obmat, vec);
Mat4MulVecfl(ob->obmat, vec);
DO_MINMAX(vec, min, max);
VECCOPY(vec, pchan->pose_tail);
Mat4MulVecfl(G.obpose->obmat, vec);
Mat4MulVecfl(ob->obmat, vec);
DO_MINMAX(vec, min, max);
}
}
@@ -1110,7 +1110,7 @@ void centreview() /* like a localview without local! */
ok= 1;
}
else {
base= FIRSTBASE;
Base *base= FIRSTBASE;
while(base) {
if TESTBASE(base) {
minmax_object(base->object, min, max);

View File

@@ -753,7 +753,6 @@ void weight_paint(void)
if((G.f & G_WEIGHTPAINT)==0) return;
if(G.obedit) return;
if(G.obpose) return;
if(indexar==NULL) init_vertexpaint();