6 * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version. The Blender
12 * Foundation also sells licenses for use in proprietary software under
13 * the Blender License. See http://www.blender.org/BL/ for information
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software Foundation,
23 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
26 * All rights reserved.
28 * The Original Code is: all of this file.
30 * Contributor(s): none yet.
32 * ***** END GPL/BL DUAL LICENSE BLOCK *****
47 #include "MEM_guardedalloc.h"
49 #include "DNA_armature_types.h"
50 #include "DNA_constraint_types.h"
51 #include "DNA_curve_types.h"
52 #include "DNA_group_types.h"
53 #include "DNA_lamp_types.h"
54 #include "DNA_material_types.h"
55 #include "DNA_meta_types.h"
56 #include "DNA_object_types.h"
57 #include "DNA_scene_types.h"
58 #include "DNA_scriptlink_types.h"
59 #include "DNA_userdef_types.h"
61 #include "BKE_action.h"
63 #include "BKE_armature.h"
64 #include "BKE_bad_level_calls.h"
65 #include "BKE_constraint.h"
66 #include "BKE_depsgraph.h"
67 #include "BKE_global.h"
68 #include "BKE_group.h"
71 #include "BKE_library.h"
74 #include "BKE_object.h"
75 #include "BKE_scene.h"
76 #include "BKE_world.h"
77 #include "BKE_utildefines.h"
79 #include "BPY_extern.h"
80 #include "BLI_arithb.h"
81 #include "BLI_blenlib.h"
90 void free_avicodecdata(AviCodecData *acd)
94 MEM_freeN(acd->lpFormat);
99 MEM_freeN(acd->lpParms);
106 void free_qtcodecdata(QuicktimeCodecData *qcd)
110 MEM_freeN(qcd->cdParms);
117 /* copy_scene moved to src/header_info.c... should be back */
119 /* do not free scene itself */
120 void free_scene(Scene *sce)
124 base= sce->base.first;
126 base->object->id.us--;
129 /* do not free objects! */
131 BLI_freelistN(&sce->base);
132 free_editing(sce->ed);
133 if(sce->radio) MEM_freeN(sce->radio);
136 BPY_free_scriptlink(&sce->scriptlink);
137 if (sce->r.avicodecdata) {
138 free_avicodecdata(sce->r.avicodecdata);
139 MEM_freeN(sce->r.avicodecdata);
140 sce->r.avicodecdata = NULL;
142 if (sce->r.qtcodecdata) {
143 free_qtcodecdata(sce->r.qtcodecdata);
144 MEM_freeN(sce->r.qtcodecdata);
145 sce->r.qtcodecdata = NULL;
148 BLI_freelistN(&sce->markers);
149 BLI_freelistN(&sce->r.layers);
151 if(sce->toolsettings){
152 MEM_freeN(sce->toolsettings);
153 sce->toolsettings = NULL;
157 free_forest(sce->theDag);
158 MEM_freeN(sce->theDag);
162 ntreeFreeTree(sce->nodetree);
163 MEM_freeN(sce->nodetree);
167 Scene *add_scene(char *name)
171 sce= alloc_libblock(&G.main->scene, ID_SCE, name);
173 sce->selectmode= SCE_SELECT_VERTEX;
174 sce->editbutsize= 0.1;
176 sce->r.mode= R_GAMMA;
189 sce->r.framapto= 100;
191 sce->r.framelen= 1.0;
194 sce->r.postgamma= 1.0;
209 sce->r.stereomode = 1; // no stereo
211 sce->toolsettings = MEM_mallocN(sizeof(struct ToolSettings),"Tool Settings Struct");
212 sce->toolsettings->cornertype=1;
213 sce->toolsettings->degr = 90;
214 sce->toolsettings->step = 9;
215 sce->toolsettings->turn = 1;
216 sce->toolsettings->extr_offs = 1;
217 sce->toolsettings->doublimit = 0.001;
218 sce->toolsettings->segments = 32;
219 sce->toolsettings->rings = 32;
220 sce->toolsettings->vertices = 32;
221 sce->toolsettings->editbutflag = 1;
223 strcpy(sce->r.backbuf, "//backbuf");
224 strcpy(sce->r.pic, U.renderdir);
225 strcpy(sce->r.ftype, "//ftype");
227 BLI_init_rctf(&sce->r.safety, 0.1f, 0.9f, 0.1f, 0.9f);
230 scene_add_render_layer(sce);
235 Base *object_in_scene(Object *ob, Scene *sce)
239 base= sce->base.first;
241 if(base->object == ob) return base;
247 void set_scene_bg(Scene *sce)
257 /* deselect objects (for dataselect) */
258 ob= G.main->object.first;
260 ob->flag &= ~(SELECT|OB_FROMGROUP);
264 /* group flags again */
265 group= G.main->group.first;
267 go= group->gobject.first;
269 if(go->ob) go->ob->flag |= OB_FROMGROUP;
272 group= group->id.next;
278 /* copy layers and flags from bases to objects */
279 base= G.scene->base.first;
285 base->flag &= ~(OB_FROMGROUP);
286 flag= ob->flag & (OB_FROMGROUP);
289 ob->flag= base->flag;
291 ob->ctime= -1234567.0; /* force ipo to be calculated later */
294 // full animation update
295 scene_update_for_newframe(sce, sce->lay);
297 /* do we need FRAMECHANGED in set_scene? */
298 // if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED);
301 void set_scene_name(char *name)
305 for (sce= G.main->scene.first; sce; sce= sce->id.next) {
306 if (BLI_streq(name, sce->id.name+2)) {
312 error("Can't find scene: %s", name);
316 * doesnt return the original duplicated object, only dupli's
318 int next_object(int val, Base **base, Object **ob)
320 static ListBase *duplilist= NULL;
321 static DupliObject *dupob;
332 /* run_again is set when a duplilist has been ended */
338 *base= G.scene->base.first;
340 *ob= (*base)->object;
344 /* exception: empty scene */
345 if(G.scene->set && G.scene->set->base.first) {
346 *base= G.scene->set->base.first;
347 *ob= (*base)->object;
353 if(*base && fase!=F_DUPLI) {
354 *base= (*base)->next;
355 if(*base) *ob= (*base)->object;
358 /* scene is finished, now do the set */
359 if(G.scene->set && G.scene->set->base.first) {
360 *base= G.scene->set->base.first;
361 *ob= (*base)->object;
369 if(*base == NULL) fase= F_START;
372 if( (*base)->object->transflag & OB_DUPLI) {
374 duplilist= object_duplilist(G.scene, (*base)->object);
376 dupob= duplilist->first;
383 Mat4CpyMat4(dupob->ob->obmat, dupob->mat);
385 (*base)->flag |= OB_FROMDUPLI;
391 else if(fase==F_DUPLI) {
393 (*base)->flag &= ~OB_FROMDUPLI;
395 for(dupob= duplilist->first; dupob; dupob= dupob->next) {
396 Mat4CpyMat4(dupob->ob->obmat, dupob->omat);
399 BLI_freelistN(duplilist);
410 Object *scene_find_camera(Scene *sc)
414 for (base= sc->base.first; base; base= base->next)
415 if (base->object->type==OB_CAMERA)
422 Base *scene_add_base(Scene *sce, Object *ob)
424 Base *b= MEM_callocN(sizeof(*b), "scene_add_base");
425 BLI_addhead(&sce->base, b);
434 void scene_deselect_all(Scene *sce)
438 for (b= sce->base.first; b; b= b->next) {
440 b->object->flag= b->flag;
444 void scene_select_base(Scene *sce, Base *selbase)
446 scene_deselect_all(sce);
448 selbase->flag |= SELECT;
449 selbase->object->flag= selbase->flag;
451 sce->basact= selbase;
454 /* applies changes right away */
455 void scene_update_for_newframe(Scene *sce, unsigned int lay)
461 /* object ipos are calculated in where_is_object */
464 if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED);
466 /* for time being; sets otherwise can be cyclic */
467 while(sce && setcount<2) {
468 if(sce->theDag==NULL)
471 DAG_scene_update_flags(sce, lay); // only stuff that moves
473 for(base= sce->base.first; base; base= base->next) {
476 object_handle_update(ob); // bke_object.h
478 /* only update layer when an ipo */
479 if(ob->ipo && has_ipo_code(ob->ipo, OB_LAY) ) {
488 /* return default layer, also used to patch old files */
489 void scene_add_render_layer(Scene *sce)
491 SceneRenderLayer *srl;
492 int tot= 1 + BLI_countlist(&sce->r.layers);
494 srl= MEM_callocN(sizeof(SceneRenderLayer), "new render layer");
495 sprintf(srl->name, "%d RenderLayer", tot);
496 BLI_addtail(&sce->r.layers, srl);
498 srl->lay= (1<<20) -1;
499 srl->layflag= 0x7FFF; /* solid ztra halo strand */
500 srl->passflag= SCE_PASS_COMBINED|SCE_PASS_Z;