b2b3cc4e06439ea630c4907392e403b56c845c69
[blender-staging.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 #include "DNA_action_types.h"
48 #include "DNA_armature_types.h"
49 #include "DNA_camera_types.h"
50 #include "DNA_constraint_types.h"
51 #include "DNA_curve_types.h"
52 #include "DNA_effect_types.h"
53 #include "DNA_group_types.h"
54 #include "DNA_ika_types.h"
55 #include "DNA_image_types.h"
56 #include "DNA_key_types.h"
57 #include "DNA_lamp_types.h"
58 #include "DNA_lattice_types.h"
59 #include "DNA_material_types.h"
60 #include "DNA_meta_types.h"
61 #include "DNA_mesh_types.h"
62 #include "DNA_object_types.h"
63 #include "DNA_packedFile_types.h"
64 #include "DNA_radio_types.h"
65 #include "DNA_scene_types.h"
66 #include "DNA_screen_types.h"
67 #include "DNA_sound_types.h"
68 #include "DNA_space_types.h"
69 #include "DNA_texture_types.h"
70 #include "DNA_userdef_types.h"
71 #include "DNA_vfont_types.h"
72 #include "DNA_view3d_types.h"
73 #include "DNA_world_types.h"
74
75 #include "BKE_anim.h"
76 #include "BKE_armature.h"
77 #include "BKE_constraint.h"
78 #include "BKE_curve.h"
79 #include "BKE_displist.h"
80 #include "BKE_effect.h"
81 #include "BKE_font.h"
82 #include "BKE_global.h"
83 #include "BKE_ika.h"
84 #include "BKE_image.h"
85 #include "BKE_ipo.h"
86 #include "BKE_lattice.h"
87 #include "BKE_library.h"
88 #include "BKE_main.h"
89 #include "BKE_material.h"
90 #include "BKE_mball.h"
91 #include "BKE_mesh.h"
92 #include "BKE_object.h"
93 #include "BKE_packedFile.h"
94 #include "BKE_plugin_types.h"
95 #include "BKE_sound.h"
96 #include "BKE_texture.h"
97 #include "BKE_utildefines.h"
98 #include "BKE_writeavi.h"
99
100 #include "BLI_blenlib.h"
101
102 #include "BIF_gl.h"
103 #include "BIF_graphics.h"
104 #include "BIF_keyval.h"
105 #include "BIF_mainqueue.h"
106 #include "BIF_resources.h"
107 #include "BIF_screen.h"
108 #include "BIF_mywindow.h"
109 #include "BIF_space.h"
110 #include "BIF_glutil.h"
111 #include "BIF_interface.h"
112 #include "BIF_editsca.h"
113 #include "BIF_butspace.h"
114 #include "BIF_previewrender.h"
115 #include "BIF_toolbox.h"
116
117 #include "BSE_headerbuttons.h"
118
119 #include "mydevice.h"
120
121
122 /* Local vars ---------------------------------------------------------- */
123 short bgpicmode=0, near=1000, far=1000;
124 short degr= 90, step= 9, turn= 1, editbutflag= 1;
125 float hspeed=0.1f, prspeed=0.0f, prlen=0.0f, doublimit= 0.001f;
126 int decim_faces=0;
127
128 float editbutvweight=1;
129 float extr_offs= 1.0, editbutweight=1.0, editbutsize=0.1, cumapsize= 1.0;
130 MTex emptytex;
131 MTex mtexcopybuf;
132
133 char texstr[15][8]= {"None"  , "Clouds" , "Wood", "Marble", "Magic"  , "Blend",
134                                          "Stucci", "Noise"  , "Image", "Plugin", "EnvMap" , "",
135                                          ""      , ""       , ""};
136 /*  ---------------------------------------------------------------------- */
137
138
139 void test_scriptpoin_but(char *name, ID **idpp)
140 {
141         ID *id;
142         
143         id= G.main->text.first;
144         while(id) {
145                 if( strcmp(name, id->name+2)==0 ) {
146                         *idpp= id;
147                         return;
148                 }
149                 id= id->next;
150         }
151         *idpp= 0;
152 }
153
154 void test_actionpoin_but(char *name, ID **idpp)
155 {
156         ID *id;
157         
158         id= G.main->action.first;
159         while(id) {
160                 if( strcmp(name, id->name+2)==0 ) {
161                         *idpp= id;
162                         return;
163                 }
164                 id= id->next;
165         }
166         *idpp= 0;
167 }
168
169
170 void test_obpoin_but(char *name, ID **idpp)
171 {
172         ID *id;
173         
174         if(idpp == (ID **)&(emptytex.object)) {
175                 error("You must add a Texture first!");
176                 *idpp= 0;
177                 return;
178         }
179         
180         id= G.main->object.first;
181         while(id) {
182                 if( strcmp(name, id->name+2)==0 ) {
183                         *idpp= id;
184                         return;
185                 }
186                 id= id->next;
187         }
188         *idpp= 0;
189 }
190
191 void test_obcurpoin_but(char *name, ID **idpp)
192 {
193         ID *id;
194         
195         if(idpp == (ID **)&(emptytex.object)) {
196                 error("You must add a Texture first!");
197                 *idpp= 0;
198                 return;
199         }
200         
201         id= G.main->object.first;
202         while(id) {
203                 if( strcmp(name, id->name+2)==0 ) {
204                         if (((Object *)id)->type != OB_CURVE) {
205                                 error ("Bevel object must be a Curve.");
206                                 break;
207                         } 
208                         *idpp= id;
209                         return;
210                 }
211                 id= id->next;
212         }
213         *idpp= 0;
214 }
215
216 void test_meshpoin_but(char *name, ID **idpp)
217 {
218         ID *id;
219
220         if( *idpp ) (*idpp)->us--;
221         
222         id= G.main->mesh.first;
223         while(id) {
224                 if( strcmp(name, id->name+2)==0 ) {
225                         *idpp= id;
226                         id_us_plus(id);
227                         return;
228                 }
229                 id= id->next;
230         }
231         *idpp= 0;
232 }
233
234 void test_matpoin_but(char *name, ID **idpp)
235 {
236         ID *id;
237
238         if( *idpp ) (*idpp)->us--;
239         
240         id= G.main->mat.first;
241         while(id) {
242                 if( strcmp(name, id->name+2)==0 ) {
243                         *idpp= id;
244                         id_us_plus(id);
245                         return;
246                 }
247                 id= id->next;
248         }
249         *idpp= 0;
250 }
251
252 void test_scenepoin_but(char *name, ID **idpp)
253 {
254         ID *id;
255         
256         if( *idpp ) (*idpp)->us--;
257         
258         id= G.main->scene.first;
259         while(id) {
260                 if( strcmp(name, id->name+2)==0 ) {
261                         *idpp= id;
262                         id_us_plus(id);
263                         return;
264                 }
265                 id= id->next;
266         }
267         *idpp= 0;
268 }
269
270
271 /* --------------------------------- */
272
273
274
275
276 void do_butspace(unsigned short event)
277 {
278         SpaceButs *buts;
279         
280         /* redraw windows of the same type? */
281         buts= curarea->spacedata.first;
282         if(buts->mainb==CONTEXT_SCENE) allqueue(REDRAWBUTSSCENE, curarea->win);
283         if(buts->mainb==CONTEXT_OBJECT) allqueue(REDRAWBUTSOBJECT, curarea->win);
284         if(buts->mainb==CONTEXT_TYPES) allqueue(REDRAWBUTSTYPES, curarea->win);
285         if(buts->mainb==CONTEXT_SHADING) allqueue(REDRAWBUTSSHADING, curarea->win);
286         if(buts->mainb==CONTEXT_EDITING) allqueue(REDRAWBUTSEDIT, curarea->win);
287         if(buts->mainb==CONTEXT_SCRIPT) allqueue(REDRAWBUTSSCRIPT, curarea->win);
288         if(buts->mainb==CONTEXT_LOGIC) allqueue(REDRAWBUTSLOGIC, curarea->win);
289         
290         if(event<=100) {
291                 do_global_buttons(event);
292         }
293         else if(event<=B_VIEWBUTS) {
294                 //do_viewbuts(event);
295         }
296         else if(event<=B_LAMPBUTS) {
297                 //do_lampbuts(event);
298         }
299         else if(event<=B_MATBUTS) {
300                 //do_matbuts(event);
301         }
302         else if(event<=B_TEXBUTS) {
303                 //do_texbuts(event);
304         }
305         else if(event<=B_ANIMBUTS) {
306                 //do_animbuts(event);
307         }
308         else if(event<=B_WORLDBUTS) {
309                 //do_worldbuts(event);
310         }
311         else if(event<=B_RENDERBUTS) {
312                 do_render_panels(event);        // buttons_scene.c
313         }
314         else if(event<=B_COMMONEDITBUTS) {
315                 //do_common_editbuts(event);
316         }
317         else if(event<=B_MESHBUTS) {
318                 //do_meshbuts(event);
319         }
320         else if(event<=B_CURVEBUTS) {
321                 //do_curvebuts(event);
322         }
323         else if(event<=B_FONTBUTS) {
324                 //do_fontbuts(event);
325         }
326         else if(event<=B_IKABUTS) {
327                 //do_ikabuts(event);
328         }
329         else if(event<=B_CAMBUTS) {
330                 ;
331         }
332         else if(event<=B_MBALLBUTS) {
333                 //do_mballbuts(event);
334         }
335         else if(event<=B_LATTBUTS) {
336                 //do_latticebuts(event);
337         }
338         else if(event<=B_GAMEBUTS) {
339                 do_gamebuts(event);     // editsca.c
340         }
341         else if(event<=B_FPAINTBUTS) {
342                 //do_fpaintbuts(event);
343         }
344         else if(event<=B_RADIOBUTS) {
345                 //do_radiobuts(event);
346         }
347         else if(event<=B_SCRIPTBUTS) {
348                 //do_scriptbuts(event);
349         }
350         else if(event<=B_SOUNDBUTS) {
351                 //do_soundbuts(event);
352         }
353         else if(event<=B_CONSTRAINTBUTS) {
354                 //do_constraintbuts(event);
355         }
356         else if(event>=REDRAWVIEW3D) allqueue(event, 0);
357 }
358
359 /* new active object */
360 void redraw_test_buttons(Base *new)
361 {
362         ScrArea *sa;
363         SpaceButs *buts;
364         
365         sa= G.curscreen->areabase.first;
366         while(sa) {
367                 if(sa->spacetype==SPACE_BUTS) {
368                         buts= sa->spacedata.first;
369                         
370                         if(ELEM5(buts->mainb, CONTEXT_OBJECT, CONTEXT_TYPES, CONTEXT_EDITING, CONTEXT_SHADING, CONTEXT_LOGIC)) {
371                                 addqueue(sa->win, REDRAW, 1);
372                         }
373                         
374                         if(buts->mainb==CONTEXT_SHADING) {
375                                 // change type automatically
376                                 
377                                 if(new) {
378                                         if(buts->tab[CONTEXT_SHADING] == TAB_SHADING_WORLD);
379                                         else if(buts->tab[CONTEXT_SHADING] == TAB_SHADING_TEX);
380                                         else if(new->object->type==OB_LAMP) {
381                                                 buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
382                                                 BIF_preview_changed(buts);
383                                                 addqueue(sa->win, REDRAW, 1);
384                                         }
385                                         else {
386                                                 buts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
387                                                 BIF_preview_changed(buts);
388                                                 addqueue(sa->win, REDRAW, 1);
389                                         }
390                                 }
391                         }
392                 }
393                 sa= sa->next;
394         }
395 }
396
397
398
399 /* here the calls for building the button main/tabs tree */
400
401
402 static void context_scene_buttons(ScrArea *sa, SpaceButs *sbuts)
403 {
404
405         /* select tabs */
406         if(sbuts->tab[CONTEXT_SCENE] == TAB_SCENE_RENDER) 
407                 render_panels();
408         
409 }
410
411 static void context_object_buttons(ScrArea *sa, SpaceButs *sbuts)
412 {
413
414         /* select tabs */
415         
416 }
417
418 static void context_types_buttons(ScrArea *sa, SpaceButs *sbuts)
419 {
420
421         /* select tabs */
422         
423 }
424
425 static void context_shading_buttons(ScrArea *sa, SpaceButs *sbuts)
426 {
427
428         /* select tabs */
429         
430 }
431
432 static void context_editing_buttons(ScrArea *sa, SpaceButs *sbuts)
433 {
434
435         /* select tabs */
436         
437 }
438
439 static void context_logic_buttons(ScrArea *sa, SpaceButs *sbuts)
440 {
441
442         /* no tabs */
443         gamebuts();             /* (editsca.c) */
444         
445 }
446
447 static void context_script_buttons(ScrArea *sa, SpaceButs *sbuts)
448 {
449
450         /* select tabs */
451         
452 }
453
454 /* callback */
455 void drawbutspace(ScrArea *sa, void *spacedata)
456 {
457         SpaceButs *sbuts= sa->spacedata.first;
458         View2D *v2d= &sbuts->v2d;
459
460         myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax);
461
462         glClearColor(0.73, 0.73, 0.73, 0.0);
463         glClear(GL_COLOR_BUFFER_BIT);
464
465         uiSetButLock(G.scene->id.lib!=0, "Can't edit library data");    
466         uiFreeBlocksWin(&sa->uiblocks, sa->win);
467  
468         /* select the context to be drawn, per contex/tab the actual context is tested */
469         switch(sbuts->mainb) {
470         case CONTEXT_SCENE:
471                 context_scene_buttons(sa, sbuts);
472                 break;
473         case CONTEXT_OBJECT:
474                 context_object_buttons(sa, sbuts);
475                 break;
476         case CONTEXT_TYPES:
477                 context_types_buttons(sa, sbuts);
478                 break;
479         case CONTEXT_SHADING:
480                 context_shading_buttons(sa, sbuts);
481                 break;
482         case CONTEXT_EDITING:
483                 context_editing_buttons(sa, sbuts);
484                 break;
485         case CONTEXT_SCRIPT:
486                 context_script_buttons(sa, sbuts);
487                 break;
488         case CONTEXT_LOGIC:
489                 context_logic_buttons(sa, sbuts);
490                 break;
491         }
492
493         uiClearButLock();
494
495         myortho2(-0.5, (float)(sa->winx)-.05, -0.5, (float)(sa->winy)-0.5);
496         draw_area_emboss(sa);
497         myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax);
498
499         /* always in end */
500         sa->win_swap= WIN_BACK_OK;
501 }
502
503 void clever_numbuts_buts()
504 {
505 }
506
507 #if 0
508         bring back in buttons_shading.c!
509
510 void clever_numbuts_buts()
511 {
512         Material *ma;
513         Lamp *la;
514         World *wo;
515         static char     hexrgb[8]; /* Uh... */
516         static char     hexspec[8]; /* Uh... */
517         static char     hexmir[8]; /* Uh... */
518         static char hexho[8];
519         static char hexze[8];
520         int             rgb[3];
521         
522         switch (G.buts->mainb){
523         case BUTS_FPAINT:
524
525                 sprintf(hexrgb, "%02X%02X%02X", (int)(Gvp.r*255), (int)(Gvp.g*255), (int)(Gvp.b*255));
526
527                 add_numbut(0, TEX, "RGB:", 0, 6, hexrgb, "HTML Hex value for the RGB color");
528                 do_clever_numbuts("Vertex Paint RGB Hex Value", 1, REDRAW); 
529                 
530                 /* Assign the new hex value */
531                 sscanf(hexrgb, "%02X%02X%02X", &rgb[0], &rgb[1], &rgb[2]);
532                 Gvp.r= (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ;
533                 Gvp.g = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ;
534                 Gvp.b = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ;
535
536                 break;
537         case BUTS_LAMP:
538                 la= G.buts->lockpoin;
539                 if (la){
540                         sprintf(hexrgb, "%02X%02X%02X", (int)(la->r*255), (int)(la->g*255), (int)(la->b*255));
541                         add_numbut(0, TEX, "RGB:", 0, 6, hexrgb, "HTML Hex value for the lamp color");
542                         do_clever_numbuts("Lamp RGB Hex Values", 1, REDRAW); 
543                         sscanf(hexrgb, "%02X%02X%02X", &rgb[0], &rgb[1], &rgb[2]);
544                         la->r = (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ;
545                         la->g = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ;
546                         la->b = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ;
547                         BIF_preview_changed(G.buts);
548                 }
549                 break;
550         case BUTS_WORLD:
551                 wo= G.buts->lockpoin;
552                 if (wo){
553                         sprintf(hexho, "%02X%02X%02X", (int)(wo->horr*255), (int)(wo->horg*255), (int)(wo->horb*255));
554                         sprintf(hexze, "%02X%02X%02X", (int)(wo->zenr*255), (int)(wo->zeng*255), (int)(wo->zenb*255));
555                         add_numbut(0, TEX, "Zen:", 0, 6, hexze, "HTML Hex value for the Zenith color");
556                         add_numbut(1, TEX, "Hor:", 0, 6, hexho, "HTML Hex value for the Horizon color");
557                         do_clever_numbuts("World RGB Hex Values", 2, REDRAW); 
558
559                         sscanf(hexho, "%02X%02X%02X", &rgb[0], &rgb[1], &rgb[2]);
560                         wo->horr = (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ;
561                         wo->horg = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ;
562                         wo->horb = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ;
563                         sscanf(hexze, "%02X%02X%02X", &rgb[0], &rgb[1], &rgb[2]);
564                         wo->zenr = (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ;
565                         wo->zeng = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ;
566                         wo->zenb = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ;
567                         BIF_preview_changed(G.buts);
568
569                 }
570                 break;
571         case BUTS_MAT:
572
573                 ma= G.buts->lockpoin;
574
575                 /* Build a hex value */
576                 if (ma){
577                         sprintf(hexrgb, "%02X%02X%02X", (int)(ma->r*255), (int)(ma->g*255), (int)(ma->b*255));
578                         sprintf(hexspec, "%02X%02X%02X", (int)(ma->specr*255), (int)(ma->specg*255), (int)(ma->specb*255));
579                         sprintf(hexmir, "%02X%02X%02X", (int)(ma->mirr*255), (int)(ma->mirg*255), (int)(ma->mirb*255));
580
581                         add_numbut(0, TEX, "Col:", 0, 6, hexrgb, "HTML Hex value for the RGB color");
582                         add_numbut(1, TEX, "Spec:", 0, 6, hexspec, "HTML Hex value for the Spec color");
583                         add_numbut(2, TEX, "Mir:", 0, 6, hexmir, "HTML Hex value for the Mir color");
584                         do_clever_numbuts("Material RGB Hex Values", 3, REDRAW); 
585                         
586                         /* Assign the new hex value */
587                         sscanf(hexrgb, "%02X%02X%02X", &rgb[0], &rgb[1], &rgb[2]);
588                         ma->r = (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ;
589                         ma->g = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ;
590                         ma->b = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ;
591                         sscanf(hexspec, "%02X%02X%02X", &rgb[0], &rgb[1], &rgb[2]);
592                         ma->specr = (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ;
593                         ma->specg = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ;
594                         ma->specb = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ;
595                         sscanf(hexmir, "%02X%02X%02X", &rgb[0], &rgb[1], &rgb[2]);
596                         ma->mirr = (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ;
597                         ma->mirg = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ;
598                         ma->mirb = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ;
599                         
600                         BIF_preview_changed(G.buts);
601                 }
602                 break;
603         }
604 }
605
606 #endif
607