The revised patch from Leon for new particle effects.
[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<=B_EFFECTSBUTS) {
322                 /*here we put the effects buttons do commands*/
323                 do_effects_panels(event);
324         }
325         else if(event==REDRAWVIEW3D) allqueue(event, 1);        // 1=do header too
326         else if(event>REDRAWVIEW3D) allqueue(event, 0);
327 }
328
329 void butspace_context_switch(SpaceButs *buts, Base *new)
330 {
331         // change type automatically
332         if(new) {
333                 int tab= buts->tab[CONTEXT_SHADING];
334                 
335                 if(tab == TAB_SHADING_WORLD) {
336                         if(new->object->type==OB_LAMP) {
337                                 buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
338                         }
339                         else buts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
340                         
341                 }
342                 else if(tab == TAB_SHADING_TEX) {
343                         if(new->object->type==OB_LAMP) buts->texfrom= 2;
344                         else if(new->object->type==OB_CAMERA) buts->texfrom= 1;
345                         else buts->texfrom= 0;
346                 }
347                 else if(tab == TAB_SHADING_RAD) {
348                 }
349                 else if(new->object->type==OB_CAMERA) {
350                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_WORLD;
351                 }
352                 else if(new->object->type==OB_LAMP) {
353                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
354                 }
355                 else {
356                         buts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
357                 }
358         }
359 }
360
361 /* new active object */
362 void redraw_test_buttons(Base *new)
363 {
364         ScrArea *sa;
365         SpaceButs *buts;
366         
367         sa= G.curscreen->areabase.first;
368         while(sa) {
369                 if(sa->spacetype==SPACE_BUTS) {
370                         buts= sa->spacedata.first;
371                         
372                         if(ELEM5(buts->mainb, CONTEXT_OBJECT, CONTEXT_EDITING, CONTEXT_SHADING, CONTEXT_LOGIC, CONTEXT_SCRIPT)) {
373                                 addqueue(sa->win, REDRAW, 1);
374                                 buts->re_align= 1;
375                         
376                                 if(new) {
377                                         BIF_preview_changed(buts);
378                                 }
379                         }
380                         // always to context switch
381                         if(new) butspace_context_switch(buts, new);
382
383                 }
384                 sa= sa->next;
385         }
386 }
387
388
389 /* callback */
390 void drawbutspace(ScrArea *sa, void *spacedata)
391 {
392         SpaceButs *sbuts= sa->spacedata.first;
393         View2D *v2d= &sbuts->v2d;
394         float col[3];
395         int tab, align=0;
396         
397         myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax);
398
399         BIF_GetThemeColor3fv(TH_BACK, col);
400         glClearColor(col[0], col[1], col[2], 0.0); 
401         glClear(GL_COLOR_BUFFER_BIT);
402
403         uiSetButLock(G.scene->id.lib!=0, "Can't edit library data");    
404         uiFreeBlocksWin(&sa->uiblocks, sa->win);
405  
406         /* select the context to be drawn, per contex/tab the actual context is tested */
407         switch(sbuts->mainb) {
408         case CONTEXT_SCENE:
409                 tab= sbuts->tab[CONTEXT_SCENE];
410
411                 if(tab== TAB_SCENE_RENDER) 
412                         render_panels();
413                 else if(tab == TAB_SCENE_ANIM) 
414                         anim_panels();
415                 else if(tab == TAB_SCENE_SOUND) 
416                         sound_panels();
417
418                 break;
419         case CONTEXT_OBJECT:
420                 tab= sbuts->tab[CONTEXT_OBJECT];
421                 if(tab== TAB_OBJECT_OBJECT) {
422                         object_panels();
423                 }
424                 else if(tab == TAB_OBJECT_EFFECTS)  {
425                         effects_panels();
426                 }
427
428                 break;
429         case CONTEXT_SHADING:
430                 tab= sbuts->tab[CONTEXT_SHADING];
431                 
432                 if(tab==TAB_SHADING_MAT)
433                         material_panels();
434                 else if(tab==TAB_SHADING_LAMP)
435                         lamp_panels();
436                 else if(tab==TAB_SHADING_WORLD)
437                         world_panels();
438                 else if(tab==TAB_SHADING_RAD)
439                         radio_panels();
440                 else if(tab==TAB_SHADING_TEX)
441                         texture_panels();
442                         
443                 break;
444         case CONTEXT_EDITING:
445                 /* no tabs */
446                 editing_panels();
447
448                 break;
449         case CONTEXT_SCRIPT:
450                 script_panels();
451                 
452                 break;
453         case CONTEXT_LOGIC:
454                 /* no tabs */
455                 logic_buts();
456                 break;
457         }
458
459         uiClearButLock();
460
461         /* when align changes, also do this for new panels */
462         /* don't always align, this function is called during AnmatePanels too */
463         if(sbuts->align)
464                 if(sbuts->re_align || sbuts->mainbo!=sbuts->mainb || sbuts->tabo!=sbuts->tab[sbuts->mainb])
465                         align= 1;
466
467         uiDrawBlocksPanels(sa, align);  
468         
469         /* since panels give different layouts, we have to make sure v2d.tot matches */
470         uiMatchPanel_view2d(sa);
471
472         sbuts->re_align= 0;
473         // also for memory for finding which texture you'd like to see
474         sbuts->mainbo= sbuts->mainb;
475         sbuts->tabo= sbuts->tab[sbuts->mainb];
476
477         myortho2(-0.375, (float)(sa->winx)-0.375, -0.375, (float)(sa->winy)-0.375);
478         draw_area_emboss(sa);
479         myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax);
480
481         /* always in end */
482         sa->win_swap= WIN_BACK_OK;
483 }
484
485