b23eabd118ebfb083efc68f29952d923d0e2ff8b
[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 #ifdef WIN32
43 #include "BLI_winstuff.h"
44 #endif
45
46 #include "MEM_guardedalloc.h"
47
48 #include "DNA_object_types.h"
49 #include "DNA_scene_types.h"
50 #include "DNA_screen_types.h"
51 #include "DNA_view3d_types.h"
52 #include "DNA_space_types.h"
53 #include "DNA_texture_types.h"
54
55 #include "BKE_global.h"
56 #include "BKE_main.h"
57 #include "BKE_library.h"
58 #include "BKE_utildefines.h"
59
60 #include "BLI_blenlib.h"
61
62 #include "BSE_drawview.h"       // for do_viewbuttons.c .... hurms
63
64 #include "BIF_gl.h"
65 #include "BIF_graphics.h"
66 #include "BIF_keyval.h"
67 #include "BIF_interface.h"
68 #include "BIF_toolbox.h"
69 #include "BIF_space.h"
70 #include "BIF_screen.h"
71 #include "BIF_butspace.h"
72 #include "BSE_headerbuttons.h"
73 #include "BIF_previewrender.h"
74 #include "BIF_mywindow.h"
75 #include "BIF_glutil.h"
76 #include "BIF_resources.h"
77
78 #include "mydevice.h"
79 #include "butspace.h" // own module
80
81
82 /* Local vars ---------------------------------------------------------- */
83 short bgpicmode=0, near=1000, far=1000;
84 MTex emptytex;
85 MTex mtexcopybuf;
86
87 char texstr[20][12]= {"None"  , "Clouds" , "Wood", "Marble", "Magic"  , "Blend",
88                                          "Stucci", "Noise"  , "Image", "Plugin", "EnvMap" , "Musgrave",
89                                          "Voronoi", "DistNoise", "", "", "", "", "", ""};
90 /*  ---------------------------------------------------------------------- */
91
92 void test_idbutton_cb(void *namev, void *arg2_unused)
93 {
94         char *name= namev;
95         test_idbutton(name+2);
96 }
97
98
99 void test_scriptpoin_but(char *name, ID **idpp)
100 {
101         ID *id;
102         
103         id= G.main->text.first;
104         while(id) {
105                 if( strcmp(name, id->name+2)==0 ) {
106                         *idpp= id;
107                         return;
108                 }
109                 id= id->next;
110         }
111         *idpp= 0;
112 }
113
114 void test_actionpoin_but(char *name, ID **idpp)
115 {
116         ID *id;
117         
118         id= G.main->action.first;
119         while(id) {
120                 if( strcmp(name, id->name+2)==0 ) {
121                         *idpp= id;
122                         return;
123                 }
124                 id= id->next;
125         }
126         *idpp= 0;
127 }
128
129
130 void test_obpoin_but(char *name, ID **idpp)
131 {
132         ID *id;
133         
134         if(idpp == (ID **)&(emptytex.object)) {
135                 error("You must add a texture first");
136                 *idpp= 0;
137                 return;
138         }
139         
140         id= G.main->object.first;
141         while(id) {
142                 if( strcmp(name, id->name+2)==0 ) {
143                         *idpp= id;
144                         return;
145                 }
146                 id= id->next;
147         }
148         *idpp= 0;
149 }
150
151 void test_obcurpoin_but(char *name, ID **idpp)
152 {
153         ID *id;
154         
155         if(idpp == (ID **)&(emptytex.object)) {
156                 error("You must add a texture first");
157                 *idpp= 0;
158                 return;
159         }
160         
161         id= G.main->object.first;
162         while(id) {
163                 if( strcmp(name, id->name+2)==0 ) {
164                         if (((Object *)id)->type != OB_CURVE) {
165                                 error ("Bevel object must be a curve");
166                                 break;
167                         } 
168                         *idpp= id;
169                         return;
170                 }
171                 id= id->next;
172         }
173         *idpp= 0;
174 }
175
176 void test_meshpoin_but(char *name, ID **idpp)
177 {
178         ID *id;
179
180         if( *idpp ) (*idpp)->us--;
181         
182         id= G.main->mesh.first;
183         while(id) {
184                 if( strcmp(name, id->name+2)==0 ) {
185                         *idpp= id;
186                         id_us_plus(id);
187                         return;
188                 }
189                 id= id->next;
190         }
191         *idpp= 0;
192 }
193
194 void test_matpoin_but(char *name, ID **idpp)
195 {
196         ID *id;
197
198         if( *idpp ) (*idpp)->us--;
199         
200         id= G.main->mat.first;
201         while(id) {
202                 if( strcmp(name, id->name+2)==0 ) {
203                         *idpp= id;
204                         id_us_plus(id);
205                         return;
206                 }
207                 id= id->next;
208         }
209         *idpp= 0;
210 }
211
212 void test_scenepoin_but(char *name, ID **idpp)
213 {
214         ID *id;
215         
216         if( *idpp ) (*idpp)->us--;
217         
218         id= G.main->scene.first;
219         while(id) {
220                 if( strcmp(name, id->name+2)==0 ) {
221                         *idpp= id;
222                         id_us_plus(id);
223                         return;
224                 }
225                 id= id->next;
226         }
227         *idpp= 0;
228 }
229
230
231 /* --------------------------------- */
232
233
234
235
236 void do_butspace(unsigned short event)
237 {
238         SpaceButs *buts;
239
240         /* redraw windows of the same type? */
241         buts= curarea->spacedata.first;
242         if(buts->mainb==CONTEXT_SCENE) allqueue(REDRAWBUTSSCENE, curarea->win);
243         if(buts->mainb==CONTEXT_OBJECT) allqueue(REDRAWBUTSOBJECT, curarea->win);
244         if(buts->mainb==CONTEXT_SHADING) allqueue(REDRAWBUTSSHADING, curarea->win);
245         if(buts->mainb==CONTEXT_EDITING) allqueue(REDRAWBUTSEDIT, curarea->win);
246         if(buts->mainb==CONTEXT_SCRIPT) allqueue(REDRAWBUTSSCRIPT, curarea->win);
247         if(buts->mainb==CONTEXT_LOGIC) allqueue(REDRAWBUTSLOGIC, curarea->win);
248         
249         if (event <=50){
250                 do_global_buttons2(event);
251         }
252         else if(event<=100) {
253                 do_global_buttons(event);
254         }
255         else if(event < 1000) {
256                 do_headerbuttons(event);
257         }
258         else if(event<=B_VIEWBUTS) {
259                 do_viewbuts(event);
260         }
261         else if(event<=B_LAMPBUTS) {
262                 do_lampbuts(event);
263         }
264         else if(event<=B_MATBUTS) {
265                 do_matbuts(event);
266         }
267         else if(event<=B_TEXBUTS) {
268                 do_texbuts(event);
269         }
270         else if(event<=B_ANIMBUTS) {
271                 do_object_panels(event);
272         }
273         else if(event<=B_WORLDBUTS) {
274                 do_worldbuts(event);
275         }
276         else if(event<=B_RENDERBUTS) {
277                 do_render_panels(event);        // buttons_scene.c
278         }
279         else if(event<=B_COMMONEDITBUTS) {
280                 do_common_editbuts(event);
281         }
282         else if(event<=B_MESHBUTS) {
283                 do_meshbuts(event);
284         }
285         else if(event<=B_CURVEBUTS) {
286                 do_curvebuts(event);
287         }
288         else if(event<=B_FONTBUTS) {
289                 do_fontbuts(event);
290         }
291         else if(event<=B_CAMBUTS) {
292                 ;
293         }
294         else if(event<=B_MBALLBUTS) {
295                 do_mballbuts(event);
296         }
297         else if(event<=B_LATTBUTS) {
298                 do_latticebuts(event);
299         }
300         else if(event<=B_GAMEBUTS) {
301                 do_logic_buts(event);   // buttons_logic.c
302         }
303         else if(event<=B_FPAINTBUTS) {
304                 do_fpaintbuts(event);
305         }
306         else if(event<=B_RADIOBUTS) {
307                 do_radiobuts(event);
308         }
309         else if(event<=B_SCRIPTBUTS) {
310                 do_scriptbuts(event);
311         }
312         else if(event<=B_SOUNDBUTS) {
313                 do_soundbuts(event);
314         }
315         else if(event<=B_CONSTRAINTBUTS) {
316                 do_constraintbuts(event);
317         }
318         else if(event<=B_UVAUTOCALCBUTS) {
319                 do_uvautocalculationbuts(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 void butspace_context_switch(SpaceButs *buts, Base *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->object->type==OB_LAMP) {
333                                 buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
334                         }
335                         else buts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
336                         
337                 }
338                 else if(tab == TAB_SHADING_TEX) {
339                         if(new->object->type==OB_LAMP) buts->texfrom= 2;
340                         else if(new->object->type==OB_CAMERA) buts->texfrom= 1;
341                         else buts->texfrom= 0;
342                 }
343                 else if(tab == TAB_SHADING_RAD) {
344                 }
345                 else if(new->object->type==OB_CAMERA) {
346                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_WORLD;
347                 }
348                 else if(new->object->type==OB_LAMP) {
349                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
350                 }
351                 else {
352                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
353                 }
354         }
355 }
356
357 /* new active object */
358 void redraw_test_buttons(Base *new)
359 {
360         ScrArea *sa;
361         SpaceButs *buts;
362         
363         sa= G.curscreen->areabase.first;
364         while(sa) {
365                 if(sa->spacetype==SPACE_BUTS) {
366                         buts= sa->spacedata.first;
367                         
368                         if(ELEM5(buts->mainb, CONTEXT_OBJECT, CONTEXT_EDITING, CONTEXT_SHADING, CONTEXT_LOGIC, CONTEXT_SCRIPT)) {
369                                 addqueue(sa->win, REDRAW, 1);
370                                 buts->re_align= 1;
371                         
372                                 if(new) {
373                                         BIF_preview_changed(buts);
374                                 }
375                         }
376                         // always to context switch
377                         if(new) butspace_context_switch(buts, new);
378
379                 }
380                 sa= sa->next;
381         }
382 }
383
384
385 /* callback */
386 void drawbutspace(ScrArea *sa, void *spacedata)
387 {
388         SpaceButs *sbuts= sa->spacedata.first;
389         View2D *v2d= &sbuts->v2d;
390         float col[3];
391         int tab, align=0;
392         
393         myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax);
394
395         BIF_GetThemeColor3fv(TH_BACK, col);
396         glClearColor(col[0], col[1], col[2], 0.0); 
397         glClear(GL_COLOR_BUFFER_BIT);
398
399         uiSetButLock(G.scene->id.lib!=0, "Can't edit library data");    
400         uiFreeBlocksWin(&sa->uiblocks, sa->win);
401  
402         /* select the context to be drawn, per contex/tab the actual context is tested */
403         switch(sbuts->mainb) {
404         case CONTEXT_SCENE:
405                 tab= sbuts->tab[CONTEXT_SCENE];
406
407                 if(tab== TAB_SCENE_RENDER) 
408                         render_panels();
409                 else if(tab == TAB_SCENE_ANIM) 
410                         anim_panels();
411                 else if(tab == TAB_SCENE_SOUND) 
412                         sound_panels();
413
414                 break;
415         case CONTEXT_OBJECT:
416                 /* no tabs */
417                 object_panels();
418                 break;
419                 
420                 break;
421         case CONTEXT_SHADING:
422                 tab= sbuts->tab[CONTEXT_SHADING];
423                 
424                 if(tab==TAB_SHADING_MAT)
425                         material_panels();
426                 else if(tab==TAB_SHADING_LAMP)
427                         lamp_panels();
428                 else if(tab==TAB_SHADING_WORLD)
429                         world_panels();
430                 else if(tab==TAB_SHADING_RAD)
431                         radio_panels();
432                 else if(tab==TAB_SHADING_TEX)
433                         texture_panels();
434                         
435                 break;
436         case CONTEXT_EDITING:
437                 /* no tabs */
438                 editing_panels();
439
440                 break;
441         case CONTEXT_SCRIPT:
442                 script_panels();
443                 
444                 break;
445         case CONTEXT_LOGIC:
446                 /* no tabs */
447                 logic_buts();
448                 break;
449         }
450
451         uiClearButLock();
452
453         /* when align changes, also do this for new panels */
454         /* don't always align, this function is called during AnmatePanels too */
455         if(sbuts->align)
456                 if(sbuts->re_align || sbuts->mainbo!=sbuts->mainb || sbuts->tabo!=sbuts->tab[sbuts->mainb])
457                         align= 1;
458
459         uiDrawBlocksPanels(sa, align);  
460         
461         /* since panels give different layouts, we have to make sure v2d.tot matches */
462         uiMatchPanel_view2d(sa);
463
464         sbuts->re_align= 0;
465         // also for memory for finding which texture you'd like to see
466         sbuts->mainbo= sbuts->mainb;
467         sbuts->tabo= sbuts->tab[sbuts->mainb];
468
469         myortho2(-0.375, (float)(sa->winx)-0.375, -0.375, (float)(sa->winy)-0.375);
470         draw_area_emboss(sa);
471         myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax);
472
473         /* always in end */
474         sa->win_swap= WIN_BACK_OK;
475 }
476
477