Orange branch: Revived hidden treasure, the Groups!
[blender.git] / source / blender / src / butspace.c
1 /**
2  * $Id: 
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #include <time.h>
34 #include <math.h>
35 #include <stdlib.h>
36 #include <string.h>
37
38 #ifdef HAVE_CONFIG_H
39 #include <config.h>
40 #endif
41
42 #include "MEM_guardedalloc.h"
43
44 #include "DNA_object_types.h"
45 #include "DNA_scene_types.h"
46 #include "DNA_screen_types.h"
47 #include "DNA_view3d_types.h"
48 #include "DNA_space_types.h"
49 #include "DNA_texture_types.h"
50
51 #include "BKE_global.h"
52 #include "BKE_main.h"
53 #include "BKE_library.h"
54 #include "BKE_utildefines.h"
55
56 #include "BLI_blenlib.h"
57
58 #include "BSE_drawview.h"       // for do_viewbuttons.c .... hurms
59
60 #include "BIF_gl.h"
61 #include "BIF_graphics.h"
62 #include "BIF_keyval.h"
63 #include "BIF_interface.h"
64 #include "BIF_toolbox.h"
65 #include "BIF_space.h"
66 #include "BIF_screen.h"
67 #include "BIF_butspace.h"
68 #include "BSE_headerbuttons.h"
69 #include "BIF_previewrender.h"
70 #include "BIF_mywindow.h"
71 #include "BIF_glutil.h"
72 #include "BIF_resources.h"
73
74 #include "mydevice.h"
75 #include "butspace.h" // own module
76
77 /************************ function prototypes ***************************/
78 void drawbutspace(ScrArea *, void *);
79
80
81 /* Local vars ---------------------------------------------------------- */
82 short bgpicmode=0, near=1000, far=1000;
83 MTex emptytex;
84 MTex mtexcopybuf;
85
86 char texstr[20][12]= {"None"  , "Clouds" , "Wood", "Marble", "Magic"  , "Blend",
87                                          "Stucci", "Noise"  , "Image", "Plugin", "EnvMap" , "Musgrave",
88                                          "Voronoi", "DistNoise", "", "", "", "", "", ""};
89 /*  ---------------------------------------------------------------------- */
90
91 void test_idbutton_cb(void *namev, void *arg2_unused)
92 {
93         char *name= namev;
94         test_idbutton(name+2);
95 }
96
97
98 void test_scriptpoin_but(char *name, ID **idpp)
99 {
100         ID *id;
101         
102         id= G.main->text.first;
103         while(id) {
104                 if( strcmp(name, id->name+2)==0 ) {
105                         *idpp= id;
106                         return;
107                 }
108                 id= id->next;
109         }
110         *idpp= NULL;
111 }
112
113 void test_actionpoin_but(char *name, ID **idpp)
114 {
115         ID *id;
116         
117         id= G.main->action.first;
118         while(id) {
119                 if( strcmp(name, id->name+2)==0 ) {
120                         *idpp= id;
121                         return;
122                 }
123                 id= id->next;
124         }
125         *idpp= NULL;
126 }
127
128
129 void test_obpoin_but(char *name, ID **idpp)
130 {
131         ID *id;
132         
133         if(idpp == (ID **)&(emptytex.object)) {
134                 error("You must add a texture first");
135                 *idpp= 0;
136                 return;
137         }
138         
139         id= G.main->object.first;
140         while(id) {
141                 if( strcmp(name, id->name+2)==0 ) {
142                         *idpp= id;
143                         return;
144                 }
145                 id= id->next;
146         }
147         *idpp= NULL;
148 }
149
150 void test_meshpoin_but(char *name, ID **idpp)
151 {
152         ID *id;
153
154         if( *idpp ) (*idpp)->us--;
155         
156         id= G.main->mesh.first;
157         while(id) {
158                 if( strcmp(name, id->name+2)==0 ) {
159                         *idpp= id;
160                         id_us_plus(id);
161                         return;
162                 }
163                 id= id->next;
164         }
165         *idpp= NULL;
166 }
167
168 void test_matpoin_but(char *name, ID **idpp)
169 {
170         ID *id;
171
172         if( *idpp ) (*idpp)->us--;
173         
174         id= G.main->mat.first;
175         while(id) {
176                 if( strcmp(name, id->name+2)==0 ) {
177                         *idpp= id;
178                         id_us_plus(id);
179                         return;
180                 }
181                 id= id->next;
182         }
183         *idpp= NULL;
184 }
185
186 void test_scenepoin_but(char *name, ID **idpp)
187 {
188         ID *id;
189         
190         if( *idpp ) (*idpp)->us--;
191         
192         id= G.main->scene.first;
193         while(id) {
194                 if( strcmp(name, id->name+2)==0 ) {
195                         *idpp= id;
196                         id_us_plus(id);
197                         return;
198                 }
199                 id= id->next;
200         }
201         *idpp= NULL;
202 }
203
204 void test_grouppoin_but(char *name, ID **idpp)
205 {
206         ID *id;
207         
208         if( *idpp ) (*idpp)->us--;
209         
210         id= G.main->group.first;
211         while(id) {
212                 if( strcmp(name, id->name+2)==0 ) {
213                         *idpp= id;
214                         id_us_plus(id);
215                         return;
216                 }
217                 id= id->next;
218         }
219         *idpp= NULL;
220 }
221
222
223 /* --------------------------------- */
224
225
226 void do_butspace(unsigned short event)
227 {
228         SpaceButs *buts;
229
230         /* redraw windows of the same type? */
231         buts= curarea->spacedata.first;
232         if(buts->mainb==CONTEXT_SCENE) allqueue(REDRAWBUTSSCENE, curarea->win);
233         if(buts->mainb==CONTEXT_OBJECT) allqueue(REDRAWBUTSOBJECT, curarea->win);
234         if(buts->mainb==CONTEXT_SHADING) allqueue(REDRAWBUTSSHADING, curarea->win);
235         if(buts->mainb==CONTEXT_EDITING) allqueue(REDRAWBUTSEDIT, curarea->win);
236         if(buts->mainb==CONTEXT_SCRIPT) allqueue(REDRAWBUTSSCRIPT, curarea->win);
237         if(buts->mainb==CONTEXT_LOGIC) allqueue(REDRAWBUTSLOGIC, curarea->win);
238
239         if (event <=50){
240                 do_global_buttons2(event);
241         }
242         else if(event<=100) {
243                 do_global_buttons(event);
244         }
245         else if(event < 1000) {
246                 do_headerbuttons(event);
247         }
248         else if(event<=B_VIEWBUTS) {
249                 do_viewbuts(event);
250         }
251         else if(event<=B_LAMPBUTS) {
252                 do_lampbuts(event);
253         }
254         else if(event<=B_MATBUTS) {
255                 do_matbuts(event);
256         }
257         else if(event<=B_TEXBUTS) {
258                 do_texbuts(event);
259         }
260         else if(event<=B_ANIMBUTS) {
261                 do_object_panels(event);
262         }
263         else if(event<=B_WORLDBUTS) {
264                 do_worldbuts(event);
265         }
266         else if(event<=B_RENDERBUTS) {
267                 do_render_panels(event);        // buttons_scene.c
268         }
269         else if(event<=B_COMMONEDITBUTS) {
270                 do_common_editbuts(event);
271         }
272         else if(event<=B_MESHBUTS) {
273                 do_meshbuts(event);
274         }
275         else if(event<=B_CURVEBUTS) {
276                 do_curvebuts(event);
277         }
278         else if(event<=B_FONTBUTS) {
279                 do_fontbuts(event);
280         }
281         else if(event<=B_ARMBUTS) {
282                 do_armbuts(event);
283         }
284         else if(event<=B_CAMBUTS) {
285                 do_cambuts(event);
286         }
287         else if(event<=B_MBALLBUTS) {
288                 do_mballbuts(event);
289         }
290         else if(event<=B_LATTBUTS) {
291                 do_latticebuts(event);
292         }
293         else if(event<=B_GAMEBUTS) {
294                 do_logic_buts(event);   // buttons_logic.c
295         }
296         else if(event<=B_FPAINTBUTS) {
297                 do_fpaintbuts(event);
298         }
299         else if(event<=B_RADIOBUTS) {
300                 do_radiobuts(event);
301         }
302         else if(event<=B_SCRIPTBUTS) {
303                 do_scriptbuts(event);
304         }
305         else if(event<=B_SOUNDBUTS) {
306                 do_soundbuts(event);
307         }
308         else if(event<=B_CONSTRAINTBUTS) {
309                 do_constraintbuts(event);
310         }
311         else if(event<=B_UVAUTOCALCBUTS) {
312                 do_uvautocalculationbuts(event);
313         }
314         else if(event<=B_EFFECTSBUTS) {
315                 do_effects_panels(event);
316         }
317         else if(event<=B_MODIFIER_BUTS) {
318                 extern void do_modifier_panels(unsigned short event);
319                 do_modifier_panels(event);
320         }
321         else if(event==REDRAWVIEW3D) allqueue(event, 1);        // 1=do header too
322         else if(event>REDRAWVIEW3D) allqueue(event, 0);
323 }
324
325 static void butspace_context_switch(SpaceButs *buts, Object *new)
326 {
327         // change type automatically
328         if(new) {
329                 int tab= buts->tab[CONTEXT_SHADING];
330                 
331                 if(tab == TAB_SHADING_WORLD) {
332                         if(new->type==OB_CAMERA);
333                         else if(new->type==OB_LAMP) {
334                                 buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
335                         }
336                         else buts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
337                         
338                 }
339                 else if(tab == TAB_SHADING_TEX) {
340                         if(new->type==OB_LAMP) buts->texfrom= 2;
341                         else if(new->type==OB_CAMERA) buts->texfrom= 1;
342                         else buts->texfrom= 0;
343                 }
344                 else if(tab == TAB_SHADING_RAD) {
345                 }
346                 else if(new->type==OB_CAMERA) {
347                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_WORLD;
348                 }
349                 else if(new->type==OB_LAMP) {
350                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
351                 }
352                 else {
353                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
354                 }
355         }
356 }
357
358 /* new active object */
359 void redraw_test_buttons(Object *new)
360 {
361         ScrArea *sa;
362         SpaceButs *buts;
363         
364         sa= G.curscreen->areabase.first;
365         while(sa) {
366                 if(sa->spacetype==SPACE_BUTS) {
367                         buts= sa->spacedata.first;
368                         
369                         if(ELEM5(buts->mainb, CONTEXT_OBJECT, CONTEXT_EDITING, CONTEXT_SHADING, CONTEXT_LOGIC, CONTEXT_SCRIPT)) {
370                                 addqueue(sa->win, REDRAW, 1);
371                                 buts->re_align= 1;
372                         
373                                 if(new) {
374                                         BIF_preview_changed(buts);
375                                 }
376                         }
377                         // always to context switch
378                         if(new) butspace_context_switch(buts, new);
379
380                 }
381                 sa= sa->next;
382         }
383 }
384
385
386 /* callback */
387 void drawbutspace(ScrArea *sa, void *spacedata)
388 {
389         SpaceButs *sbuts= sa->spacedata.first;
390         View2D *v2d= &sbuts->v2d;
391         float col[3];
392         int tab, align=0;
393         
394         myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax);
395
396         BIF_GetThemeColor3fv(TH_BACK, col);
397         glClearColor(col[0], col[1], col[2], 0.0); 
398         glClear(GL_COLOR_BUFFER_BIT);
399
400         uiSetButLock(G.scene->id.lib!=0, "Can't edit library data");    
401         uiFreeBlocksWin(&sa->uiblocks, sa->win);
402  
403         /* select the context to be drawn, per contex/tab the actual context is tested */
404         switch(sbuts->mainb) {
405         case CONTEXT_SCENE:
406                 tab= sbuts->tab[CONTEXT_SCENE];
407
408                 if(tab== TAB_SCENE_RENDER) 
409                         render_panels();
410                 else if(tab == TAB_SCENE_ANIM) 
411                         anim_panels();
412                 else if(tab == TAB_SCENE_SOUND) 
413                         sound_panels();
414
415                 break;
416         case CONTEXT_OBJECT:
417                 tab= sbuts->tab[CONTEXT_OBJECT];
418                 
419                 if(tab==TAB_OBJECT_OBJECT)
420                    object_panels();
421                 else if(tab==TAB_OBJECT_PHYSICS)
422                         physics_panels();
423                    
424                 break;
425         case CONTEXT_SHADING:
426                 tab= sbuts->tab[CONTEXT_SHADING];
427                 
428                 if(tab==TAB_SHADING_MAT)
429                         material_panels();
430                 else if(tab==TAB_SHADING_LAMP)
431                         lamp_panels();
432                 else if(tab==TAB_SHADING_WORLD)
433                         world_panels();
434                 else if(tab==TAB_SHADING_RAD)
435                         radio_panels();
436                 else if(tab==TAB_SHADING_TEX)
437                         texture_panels();
438                         
439                 break;
440         case CONTEXT_EDITING:
441                 /* no tabs */
442                 editing_panels();
443
444                 break;
445         case CONTEXT_SCRIPT:
446                 script_panels();
447                 
448                 break;
449         case CONTEXT_LOGIC:
450                 /* no tabs */
451                 logic_buts();
452                 break;
453         }
454
455         uiClearButLock();
456
457         /* when align changes, also do this for new panels */
458         /* don't always align, this function is called during AnmatePanels too */
459         if(sbuts->align)
460                 if(sbuts->re_align || sbuts->mainbo!=sbuts->mainb || sbuts->tabo!=sbuts->tab[sbuts->mainb])
461                         align= 1;
462
463         uiDrawBlocksPanels(sa, align);  
464         
465         /* since panels give different layouts, we have to make sure v2d.tot matches */
466         uiMatchPanel_view2d(sa);
467
468         sbuts->re_align= 0;
469         // also for memory for finding which texture you'd like to see
470         sbuts->mainbo= sbuts->mainb;
471         sbuts->tabo= sbuts->tab[sbuts->mainb];
472
473         myortho2(-0.375, (float)(sa->winx)-0.375, -0.375, (float)(sa->winy)-0.375);
474         draw_area_emboss(sa);
475         myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax);
476
477         /* always in end */
478         sa->win_swap= WIN_BACK_OK;
479 }
480
481