Helpline drawing in transform (semi broken in this commit)

This is only usefull for rotate now, but the axis constraining code has a part that depended on this, so I commit this part first.

For coders:

void constline(float *center, float *dir, int col)
	Draw an infinite line on the screen. col is the color argument. It must be cpack compatible

void project_short_infiniteline(float *vec, float *dir, short *adr1, short *adr2);
	clips infinite line to screen border
This commit is contained in:
2003-10-21 16:25:00 +00:00
parent 8280cab690
commit 41f4940bff
5 changed files with 232 additions and 18 deletions

View File

@@ -47,6 +47,7 @@ struct Base;
void init_draw_rects(void);
void helpline(float *vec);
void constline(float *center, float *dir, int col);
void drawaxes(float size);
void drawcamera(struct Object *ob);
void calc_lattverts_ext(void);

View File

@@ -50,6 +50,7 @@ void initgrabz(float x, float y, float z);
void window_to_3d(float *vec, short mx, short my);
void project_short(float *vec, short *adr);
void project_short_noclip(float *vec, short *adr);
void project_short_infiniteline(float *vec, float *dir, short *adr1, short *adr2); /* clips infinite line to screen border */
void project_float(float *vec, float *adr);
int boundbox_clip(float obmat[][4], struct BoundBox *bb);
void fdrawline(float x1, float y1, float x2, float y2);

View File

@@ -271,6 +271,40 @@ void helpline(float *vec)
glDrawBuffer(GL_BACK);
}
void constline(float *center, float *dir, int col)
{
float v1[3], v2[3];
short val1[2], val2[2];
VecCopyf(v1, center);
VecCopyf(v2, dir);
if(G.obedit){
Mat4Mul3Vecfl(G.obedit->obmat, v1);
VecAddf(v1, v1, G.obedit->obmat[3]);
}
if(G.obedit) Mat4Mul3Vecfl(G.obedit->obmat, v2);
project_short_infiniteline(v1, v2, val1, val2);
persp(0);
glDrawBuffer(GL_FRONT);
cpack(col);
setlinestyle(0);
glBegin(GL_LINE_STRIP);
glVertex2sv(val1);
glVertex2sv(val2);
glEnd();
persp(PERSP_VIEW);
glFinish(); // flush display for frontbuffer
glDrawBuffer(GL_BACK);
}
void drawaxes(float size)
{
int axis;

View File

@@ -3852,6 +3852,9 @@ void transform(int mode)
char str[100];
int keyflags = 0;
short drawhelpline = 0; // for new help lines code.
float vx[3] = {1,0,0}, vy[3] = {0,1,0}, vz[3] = {0,0,1};
if (mode % 'x' == 0)
axismode = XTRANSLOCAL;
else if (mode % 'X' == 0)
@@ -4698,6 +4701,72 @@ void transform(int mode)
screen_swapbuffers();
}
}
/* Help line drawing starts here */
/* Drawing stuff I choose to put it in here so it can draw one line per object or per vertex */
if (((drawhelpline)||(axismode)) && (mode != 'C') && (mode != 'w') && (mode!='N') && (! (((mode=='R')||(mode=='r')) && (midtog)) ) ){
if (G.obedit && ((mode=='R')||(mode=='r')||(G.totvertsel > 5))){
if(axismode==XTRANSLOCAL) constline(centre, vx, 0xFF);
if(axismode==YTRANSLOCAL) constline(centre, vy, 0xFF00);
if(axismode==ZTRANSLOCAL) constline(centre, vz, 0xFF0000);
if(axismode==XTRANS) constline(centre, imat[0], 0xFF);
if(axismode==YTRANS) constline(centre, imat[1], 0xFF00);
if(axismode==ZTRANS) constline(centre, imat[2], 0xFF0000);
if((axismode==0)&&(drawhelpline==2)){
constline(centre, vx, 0xFF);
constline(centre, vy, 0xFF00);
constline(centre, vz, 0xFF0000);
}
if((axismode==0)&&(drawhelpline==1)){
constline(centre, imat[0], 0xFF);
constline(centre, imat[1], 0xFF00);
constline(centre, imat[2], 0xFF0000);
}
}
else {
tob= transmain;
tv= transvmain;
for(a=0; a<tottrans; a++, tob++, tv++) {
if(transmain) {
if(axismode==XTRANSLOCAL) constline(tob->loc, tob->axismat[0], 0xFF);
if(axismode==YTRANSLOCAL) constline(tob->loc, tob->axismat[1], 0xFF00);
if(axismode==ZTRANSLOCAL) constline(tob->loc, tob->axismat[2], 0xFF0000);
if(axismode==XTRANS) constline(tob->loc, vx, 0xFF);
if(axismode==YTRANS) constline(tob->loc, vy, 0xFF00);
if(axismode==ZTRANS) constline(tob->loc, vz, 0xFF0000);
if((axismode==0)&&(drawhelpline==1)){
constline(tob->oldloc, vx, 0xFF);
constline(tob->oldloc, vy, 0xFF00);
constline(tob->oldloc, vz, 0xFF0000);
}
if((axismode==0)&&(drawhelpline==2)){
constline(tob->oldloc, tob->axismat[0], 0xFF);
constline(tob->oldloc, tob->axismat[1], 0xFF00);
constline(tob->oldloc, tob->axismat[2], 0xFF0000);
}
}
else {
if(axismode==XTRANSLOCAL) constline(tv->loc, vx, 0xFF);
if(axismode==YTRANSLOCAL) constline(tv->loc, vy, 0xFF00);
if(axismode==ZTRANSLOCAL) constline(tv->loc, vz, 0xFF0000);
if(axismode==XTRANS) constline(tv->loc, imat[0], 0xFF);
if(axismode==YTRANS) constline(tv->loc, imat[1], 0xFF00);
if(axismode==ZTRANS) constline(tv->loc, imat[2], 0xFF0000);
if((axismode==0)&&(drawhelpline==2)){
constline(G.obedit->obmat[4], vx, 0xFF);
constline(G.obedit->obmat[4], vy, 0xFF00);
constline(G.obedit->obmat[4], vz, 0xFF0000);
}
if((axismode==0)&&(drawhelpline==1)){
constline(G.obedit->obmat[4], imat[0], 0xFF);
constline(G.obedit->obmat[4], imat[1], 0xFF00);
constline(G.obedit->obmat[4], imat[2], 0xFF0000);
}
}
}
}
}
}
while( qtest() ) {
@@ -4760,40 +4829,94 @@ void transform(int mode)
break;
case XKEY:
if (drawhelpline==0){
if (axismode==XTRANS)
axismode=XTRANSLOCAL;
else if (axismode==XTRANSLOCAL)
axismode=0;
else{
xref= -xref;
//xref= -xref;
axismode= XTRANS;
}
}
else if (drawhelpline==1){
if (axismode==XTRANS)
axismode=0;
else{
axismode= XTRANS;
}
}
else{
if (axismode==XTRANSLOCAL)
axismode=0;
else{
axismode=XTRANSLOCAL;
}
}
firsttime=1;
break;
case YKEY:
if (drawhelpline==0){
if (axismode==YTRANS)
axismode=YTRANSLOCAL;
else if (axismode==YTRANSLOCAL)
axismode=0;
else{
yref= -yref;
//yref= -yref;
axismode= YTRANS;
}
}
else if (drawhelpline==1){
if (axismode==YTRANS)
axismode=0;
else{
axismode= YTRANS;
}
}
else{
if (axismode==YTRANSLOCAL)
axismode=0;
else{
axismode=YTRANSLOCAL;
}
}
firsttime=1;
break;
case ZKEY:
if (drawhelpline==0){
if (axismode==ZTRANS)
axismode=ZTRANSLOCAL;
else if (axismode==ZTRANSLOCAL)
axismode=0;
else{
zref= -zref;
//zref= -zref;
axismode= ZTRANS;
}
}
else if (drawhelpline==1){
if (axismode==ZTRANS)
axismode=0;
else{
axismode= ZTRANS;
}
}
else{
if (axismode==ZTRANSLOCAL)
axismode=0;
else{
axismode=ZTRANSLOCAL;
}
}
firsttime=1;
break;
case LKEY:
// toggle between drawhelpline = 0,1,2 (None, Global, Local)
drawhelpline += 1;
if (drawhelpline==3) drawhelpline = 0;
firsttime = 1;
break;
case WHEELDOWNMOUSE:
case PADPLUSKEY:

View File

@@ -227,6 +227,61 @@ void project_float(float *vec, float *adr)
}
}
void project_short_infiniteline(float *vec, float *dir, short *adr1, short *adr2) /* clips infinite line to screen border */
{
float vp[2], vd[2], temp[2];
short min, max;
float tvec[3], tmp;
project_float(vec, vp);
VecMulf(dir, 10);
VecAddf(tvec, vec, dir);
project_float(tvec, temp);
vd[0] = temp[0] - vp[0];
vd[1] = temp[1] - vp[1];
if ((vd[0] == 0) && (vd[1] == 0)){
adr1[0] = adr2[0] = vp[0];
adr1[1] = adr2[1] = vp[1];
}
else if (vd[0] == 0){
adr1[0] = adr2[0] = vp[0];
adr1[1] = 0;
adr2[1] = curarea->winy;
}
else if (vd[1] == 0){
adr1[0] = 0;
adr2[0] = curarea->winx;
adr1[1] = adr2[1] = vp[1];
}
else{
tmp = vd[0];
max = (curarea->winx - vp[0]) / tmp * vd[1] + vp[1];
if (max > curarea->winy){
tmp = vd[1];
adr2[0] = ((curarea->winy) - vp[1]) / tmp * vd[0] + vp[0];
adr2[1] = curarea->winy;
}
else{
adr2[0] = curarea->winx;
adr2[1] = max;
}
tmp = vd[0];
min = (-vp[0]) / tmp * vd[1] + vp[1];
if (min < 0){
tmp = vd[1];
adr1[0] = (-vp[1]) / tmp * vd[0] + vp[0];
adr1[1] = 0;
}
else{
adr1[0] = 0;
adr1[1] = min;
}
}
}
int boundbox_clip(float obmat[][4], BoundBox *bb)
{
/* return 1: draw */