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 /* do not free scene itself */
118 void free_scene(Scene *sce)
122 base= sce->base.first;
124 base->object->id.us--;
127 /* do not free objects! */
129 BLI_freelistN(&sce->base);
130 free_editing(sce->ed);
131 if(sce->radio) MEM_freeN(sce->radio);
134 BPY_free_scriptlink(&sce->scriptlink);
135 if (sce->r.avicodecdata) {
136 free_avicodecdata(sce->r.avicodecdata);
137 MEM_freeN(sce->r.avicodecdata);
138 sce->r.avicodecdata = NULL;
140 if (sce->r.qtcodecdata) {
141 free_qtcodecdata(sce->r.qtcodecdata);
142 MEM_freeN(sce->r.qtcodecdata);
143 sce->r.qtcodecdata = NULL;
146 BLI_freelistN(&sce->markers);
148 if(sce->toolsettings){
149 MEM_freeN(sce->toolsettings);
150 sce->toolsettings = NULL;
154 free_forest(sce->theDag);
155 MEM_freeN(sce->theDag);
159 ntreeFreeTree(sce->nodetree);
160 MEM_freeN(sce->nodetree);
164 Scene *add_scene(char *name)
168 sce= alloc_libblock(&G.main->scene, ID_SCE, name);
170 sce->selectmode= SCE_SELECT_VERTEX;
171 sce->editbutsize= 0.1;
173 sce->r.mode= R_GAMMA;
186 sce->r.framapto= 100;
188 sce->r.framelen= 1.0;
191 sce->r.postgamma= 1.0;
206 sce->r.stereomode = 1; // no stereo
208 sce->toolsettings = MEM_mallocN(sizeof(struct ToolSettings),"Tool Settings Struct");
209 sce->toolsettings->cornertype=1;
210 sce->toolsettings->degr = 90;
211 sce->toolsettings->step = 9;
212 sce->toolsettings->turn = 1;
213 sce->toolsettings->extr_offs = 1;
214 sce->toolsettings->doublimit = 0.001;
215 sce->toolsettings->segments = 32;
216 sce->toolsettings->rings = 32;
217 sce->toolsettings->vertices = 32;
218 sce->toolsettings->editbutflag = 1;
220 strcpy(sce->r.backbuf, "//backbuf");
221 strcpy(sce->r.pic, U.renderdir);
222 strcpy(sce->r.ftype, "//ftype");
224 BLI_init_rctf(&sce->r.safety, 0.1f, 0.9f, 0.1f, 0.9f);
230 Base *object_in_scene(Object *ob, Scene *sce)
234 base= sce->base.first;
236 if(base->object == ob) return base;
242 void set_scene_bg(Scene *sce)
252 /* deselect objects (for dataselect) */
253 ob= G.main->object.first;
255 ob->flag &= ~(SELECT|OB_FROMGROUP);
259 /* group flags again */
260 group= G.main->group.first;
262 go= group->gobject.first;
264 if(go->ob) go->ob->flag |= OB_FROMGROUP;
267 group= group->id.next;
273 /* copy layers and flags from bases to objects */
274 base= G.scene->base.first;
280 base->flag &= ~(OB_FROMGROUP);
281 flag= ob->flag & (OB_FROMGROUP);
284 ob->flag= base->flag;
286 ob->ctime= -1234567.0; /* force ipo to be calculated later */
289 // full animation update
290 scene_update_for_newframe(sce, sce->lay);
292 /* do we need FRAMECHANGED in set_scene? */
293 // if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED);
296 void set_scene_name(char *name)
300 for (sce= G.main->scene.first; sce; sce= sce->id.next) {
301 if (BLI_streq(name, sce->id.name+2)) {
307 error("Can't find scene: %s", name);
311 * doesnt return the original duplicated object, only dupli's
313 int next_object(int val, Base **base, Object **ob)
315 static ListBase *duplilist= NULL;
316 static DupliObject *dupob;
327 /* run_again is set when a duplilist has been ended */
333 *base= G.scene->base.first;
335 *ob= (*base)->object;
339 /* exception: empty scene */
340 if(G.scene->set && G.scene->set->base.first) {
341 *base= G.scene->set->base.first;
342 *ob= (*base)->object;
348 if(*base && fase!=F_DUPLI) {
349 *base= (*base)->next;
350 if(*base) *ob= (*base)->object;
353 /* scene is finished, now do the set */
354 if(G.scene->set && G.scene->set->base.first) {
355 *base= G.scene->set->base.first;
356 *ob= (*base)->object;
364 if(*base == NULL) fase= F_START;
367 if( (*base)->object->transflag & OB_DUPLI) {
369 duplilist= object_duplilist(G.scene, (*base)->object);
371 dupob= duplilist->first;
378 Mat4CpyMat4(dupob->ob->obmat, dupob->mat);
380 (*base)->flag |= OB_FROMDUPLI;
386 else if(fase==F_DUPLI) {
388 (*base)->flag &= ~OB_FROMDUPLI;
390 for(dupob= duplilist->first; dupob; dupob= dupob->next) {
391 Mat4CpyMat4(dupob->ob->obmat, dupob->omat);
394 BLI_freelistN(duplilist);
405 Object *scene_find_camera(Scene *sc)
409 for (base= sc->base.first; base; base= base->next)
410 if (base->object->type==OB_CAMERA)
417 Base *scene_add_base(Scene *sce, Object *ob)
419 Base *b= MEM_callocN(sizeof(*b), "scene_add_base");
420 BLI_addhead(&sce->base, b);
429 void scene_deselect_all(Scene *sce)
433 for (b= sce->base.first; b; b= b->next) {
435 b->object->flag= b->flag;
439 void scene_select_base(Scene *sce, Base *selbase)
441 scene_deselect_all(sce);
443 selbase->flag |= SELECT;
444 selbase->object->flag= selbase->flag;
446 sce->basact= selbase;
449 /* applies changes right away */
450 void scene_update_for_newframe(Scene *sce, unsigned int lay)
456 /* object ipos are calculated in where_is_object */
459 if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED);
461 /* for time being; sets otherwise can be cyclic */
462 while(sce && setcount<2) {
463 if(sce->theDag==NULL)
466 DAG_scene_update_flags(sce, lay); // only stuff that moves
468 for(base= sce->base.first; base; base= base->next) {
471 object_handle_update(ob); // bke_object.h
473 /* only update layer when an ipo */
474 if(ob->ipo && has_ipo_code(ob->ipo, OB_LAY) ) {