New option "move texture channel up/down" lacked redraw calls.

Featurette:
There's still no manipulator handles for lamps to set cone size, dist, 
clipping. To save our poor Peach artists hours of work I've added a
quick method to at least be able to do it interactive.
Option is hidden behind Wkey, and uses a similar function like Scaling.
(Put mouse cursor close to start value, move mouse to center of lamp)

Ultimately this should move to custom manipulator handles...
This commit is contained in:
2008-03-01 14:54:18 +00:00
parent d560b17088
commit ea05fef650
2 changed files with 157 additions and 0 deletions

View File

@@ -1947,6 +1947,7 @@ void do_worldbuts(unsigned short event)
wrld->mtex[(int)wrld->texact] = wrld->mtex[((int)wrld->texact)-1];
wrld->mtex[((int)wrld->texact)-1] = mtexswap;
wrld->texact--;
allqueue(REDRAWBUTSSHADING, 0);
}
break;
case B_WMTEXMOVEDOWN:
@@ -1956,6 +1957,7 @@ void do_worldbuts(unsigned short event)
wrld->mtex[(int)wrld->texact] = wrld->mtex[((int)wrld->texact)+1];
wrld->mtex[((int)wrld->texact)+1] = mtexswap;
wrld->texact++;
allqueue(REDRAWBUTSSHADING, 0);
}
break;
case B_AO_FALLOFF:
@@ -2424,6 +2426,7 @@ void do_lampbuts(unsigned short event)
la->mtex[(int)la->texact] = la->mtex[((int)la->texact)-1];
la->mtex[((int)la->texact)-1] = mtexswap;
la->texact--;
allqueue(REDRAWBUTSSHADING, 0);
}
break;
case B_LMTEXMOVEDOWN:
@@ -2433,6 +2436,7 @@ void do_lampbuts(unsigned short event)
la->mtex[(int)la->texact] = la->mtex[((int)la->texact)+1];
la->mtex[((int)la->texact)+1] = mtexswap;
la->texact++;
allqueue(REDRAWBUTSSHADING, 0);
}
break;
case B_LFALLOFFCHANGED:
@@ -3077,6 +3081,7 @@ void do_matbuts(unsigned short event)
ma->mtex[(int)ma->texact] = ma->mtex[((int)ma->texact)-1];
ma->mtex[((int)ma->texact)-1] = mtexswap;
ma->texact--;
allqueue(REDRAWBUTSSHADING, 0);
}
break;
case B_MTEXMOVEDOWN:
@@ -3085,6 +3090,7 @@ void do_matbuts(unsigned short event)
ma->mtex[(int)ma->texact] = ma->mtex[((int)ma->texact)+1];
ma->mtex[((int)ma->texact)+1] = mtexswap;
ma->texact++;
allqueue(REDRAWBUTSSHADING, 0);
}
break;
case B_MATZTRANSP:

View File

@@ -2216,6 +2216,149 @@ void split_font()
}
}
static void helpline(short *mval, int *center2d)
{
/* helpline, copied from transform.c actually */
persp(PERSP_WIN);
glDrawBuffer(GL_FRONT);
BIF_ThemeColor(TH_WIRE);
setlinestyle(3);
glBegin(GL_LINE_STRIP);
glVertex2sv(mval);
glVertex2iv((GLint *)center2d);
glEnd();
setlinestyle(0);
persp(PERSP_VIEW);
bglFlush(); // flush display for frontbuffer
glDrawBuffer(GL_BACK);
}
/* context: ob = lamp */
/* code should be replaced with proper (custom) transform handles for lamp properties */
static void spot_interactive(Object *ob, int mode)
{
Lamp *la= ob->data;
float transfac, dx, dy, ratio, origval;
int keep_running= 1, center2d[2];
short mval[2], mvalo[2];
getmouseco_areawin(mval);
getmouseco_areawin(mvalo);
project_int(ob->obmat[3], center2d);
if( center2d[0] > 100000 ) { /* behind camera */
center2d[0]= curarea->winx/2;
center2d[1]= curarea->winy/2;
}
helpline(mval, center2d);
/* ratio is like scaling */
dx = (float)(center2d[0] - mval[0]);
dy = (float)(center2d[1] - mval[1]);
transfac = (float)sqrt( dx*dx + dy*dy);
if(transfac==0.0f) transfac= 1.0f;
if(mode==1)
origval= la->spotsize;
else if(mode==2)
origval= la->dist;
else if(mode==3)
origval= la->clipsta;
else
origval= la->clipend;
while (keep_running>0) {
getmouseco_areawin(mval);
/* essential for idling subloop */
if(mval[0]==mvalo[0] && mval[1]==mvalo[1]) {
PIL_sleep_ms(2);
}
else {
char str[32];
dx = (float)(center2d[0] - mval[0]);
dy = (float)(center2d[1] - mval[1]);
ratio = (float)(sqrt( dx*dx + dy*dy))/transfac;
/* do the trick */
if(mode==1) { /* spot */
la->spotsize = ratio*origval;
CLAMP(la->spotsize, 1.0f, 180.0f);
sprintf(str, "Spot size %.2f\n", la->spotsize);
}
else if(mode==2) { /* dist */
la->dist = ratio*origval;
CLAMP(la->dist, 0.01f, 5000.0f);
sprintf(str, "Distance %.2f\n", la->dist);
}
else if(mode==3) { /* sta */
la->clipsta = ratio*origval;
CLAMP(la->clipsta, 0.001f, 5000.0f);
sprintf(str, "Distance %.2f\n", la->clipsta);
}
else if(mode==4) { /* end */
la->clipend = ratio*origval;
CLAMP(la->clipend, 0.1f, 5000.0f);
sprintf(str, "Clip End %.2f\n", la->clipend);
}
/* cleanup */
mvalo[0]= mval[0];
mvalo[1]= mval[1];
/* DRAW */
headerprint(str);
force_draw_plus(SPACE_BUTS, 0);
helpline(mval, center2d);
}
while( qtest() ) {
short val;
unsigned short event= extern_qread(&val);
switch (event){
case ESCKEY:
case RIGHTMOUSE:
keep_running= 0;
break;
case LEFTMOUSE:
case SPACEKEY:
case PADENTER:
case RETKEY:
if(val)
keep_running= -1;
break;
}
}
}
if(keep_running==0) {
if(mode==1)
la->spotsize= origval;
else if(mode==2)
la->dist= origval;
else if(mode==3)
la->clipsta= origval;
else
la->clipend= origval;
}
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSSHADING, 0);
}
void special_editmenu(void)
{
static short numcuts= 2;
@@ -2403,6 +2546,14 @@ void special_editmenu(void)
allqueue(REDRAWVIEW3D, 0);
}
else if (ob->type == OB_LAMP) {
Lamp *la= ob->data;
if(la->type==LA_SPOT) {
short nr= pupmenu("Lamp Tools%t|Spot Size%x1|Distance%x2|Clip Start%x3|Clip End%x4");
if(nr>0)
spot_interactive(ob, nr);
}
}
else if (ob->type == OB_FONT) {
/* removed until this gets a decent implementation (ton) */
/* nr= pupmenu("Split %t|Characters%x1");