Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2008-03-01 17:54:18 +0300
committerTon Roosendaal <ton@blender.org>2008-03-01 17:54:18 +0300
commitea05fef650f46ce5dd8305b76f0a652fe22c3d09 (patch)
tree125850010db1c8a7cc197082824899532a03e633 /source
parentd560b1708818bb412cf1bc2429a88444258d8083 (diff)
Bugfix:
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...
Diffstat (limited to 'source')
-rw-r--r--source/blender/src/buttons_shading.c6
-rw-r--r--source/blender/src/editobject.c151
2 files changed, 157 insertions, 0 deletions
diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c
index 7eb2f388021..e0196017727 100644
--- a/source/blender/src/buttons_shading.c
+++ b/source/blender/src/buttons_shading.c
@@ -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:
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 5ee7e60110e..a98020aea35 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -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");