diff options
Diffstat (limited to 'source/blender/blenkernel/intern/blender.c')
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c new file mode 100644 index 00000000000..23927fd793c --- /dev/null +++ b/source/blender/blenkernel/intern/blender.c @@ -0,0 +1,343 @@ + +/* blender.c jan 94 MIXED MODEL + * + * algemene hulp funkties en data + * + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef WIN32 + #include <unistd.h> // for read close + #include <sys/param.h> // for MAXPATHLEN +#else + #include <io.h> // for open close read +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> // for open + +#include "MEM_guardedalloc.h" +#include "DNA_listBase.h" +#include "DNA_sdna_types.h" +#include "DNA_userdef_types.h" +#include "DNA_object_types.h" +#include "DNA_curve_types.h" + +#include "BLI_blenlib.h" +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" + +#ifdef WIN32 +#include "BLI_winstuff.h" +#endif + +#include "DNA_screen_types.h" + +#include "BKE_library.h" +#include "BKE_blender.h" +#include "BKE_displist.h" +#include "BKE_global.h" +#include "BKE_main.h" +#include "BKE_object.h" +#include "BKE_scene.h" +#include "BKE_effect.h" +#include "BKE_curve.h" +#include "BKE_font.h" + +#include "BKE_bad_level_calls.h" /* for BPY_do_pyscript */ + +#include "BLO_readfile.h" /* for BLO_read_file */ + +#include "BKE_bad_level_calls.h" // for freeAllRad editNurb free_editMesh free_editText free_editArmature +#include "BKE_utildefines.h" // O_BINARY FALSE + +#include "nla.h" + +Global G; +UserDef U; + +char versionstr[48]= ""; + +/* ************************************************ */ +/* pushpop faciliteit: om tijdelijk data te bewaren */ + +ListBase ppmain={0, 0}; + +typedef struct PushPop { + struct PushPop *next, *prev; + void *data; + int len; +} PushPop; + +void pushdata(void *data, int len) +{ + PushPop *pp; + + pp= MEM_mallocN(sizeof(PushPop), "pushpop"); + BLI_addtail(&ppmain, pp); + pp->data= MEM_mallocN(len, "pushpop"); + pp->len= len; + memcpy(pp->data, data, len); +} + +void popfirst(void *data) +{ + PushPop *pp; + + pp= ppmain.first; + if(pp) { + memcpy(data, pp->data, pp->len); + BLI_remlink(&ppmain, pp); + MEM_freeN(pp->data); + MEM_freeN(pp); + } + else printf("error in popfirst\n"); +} + +void poplast(void *data) +{ + PushPop *pp; + + pp= ppmain.last; + if(pp) { + memcpy(data, pp->data, pp->len); + BLI_remlink(&ppmain, pp); + MEM_freeN(pp->data); + MEM_freeN(pp); + } + else printf("error in poplast\n"); +} + +void free_pushpop() +{ + PushPop *pp; + + pp= ppmain.first; + while(pp) { + BLI_remlink(&ppmain, pp); + MEM_freeN(pp->data); + MEM_freeN(pp); + } +} + +void pushpop_test() +{ + if(ppmain.first) printf("pushpop not empty\n"); + free_pushpop(); +} + + + +/* ********** vrijgeven ********** */ + +void free_blender(void) +{ + free_main(G.main); + G.main= NULL; + + IMB_freeImBufdata(); /* imbuf lib */ +} + +void duplicatelist(ListBase *list1, ListBase *list2) /* kopie van 2 naar 1 */ +{ + struct Link *link1, *link2; + + list1->first= list1->last= 0; + + link2= list2->first; + while(link2) { + + link1= MEM_dupallocN(link2); + BLI_addtail(list1, link1); + + link2= link2->next; + } +} + +void initglobals(void) +{ + memset(&G, 0, sizeof(Global)); + + U.savetime= 1; + + G.animspeed= 4; + + G.main= MEM_callocN(sizeof(Main), "initglobals"); + + strcpy(G.ima, "//"); + + G.version= BLENDER_VERSION; + + G.order= 1; + G.order= (((char*)&G.order)[0])?L_ENDIAN:B_ENDIAN; + + sprintf(versionstr, "www.blender.nl %d", G.version); + + clear_workob(); /* object.c */ +} + +/***/ + +static void clear_global(void) { + extern short winqueue_break; /* screen.c */ + + freeAllRad(); + free_main(G.main); /* free all lib data */ + freefastshade(); /* anders oude lampgegevens */ + + + /* hangende vars voorkomen */ + R.backbuf= 0; + + /* force all queues to be left */ + winqueue_break= 1; + + if (G.obedit) { + freeNurblist(&editNurb); + free_editMesh(); + free_editText(); + free_editArmature(); + } + + G.curscreen= NULL; + G.scene= NULL; + G.main= NULL; + + G.obedit= NULL; + G.obpose= NULL; + G.saction= NULL; + G.buts= NULL; + G.v2d= NULL; + G.vd= NULL; + G.soops= NULL; + G.sima= NULL; + G.sipo= NULL; + + G.f &= ~(G_WEIGHTPAINT + G_VERTEXPAINT + G_FACESELECT); +} + +static void setup_app_data(BlendFileData *bfd, char *filename) { + Object *ob; + + clear_global(); + + G.save_over = 1; + + G.main= bfd->main; + if (bfd->user) { + U= *bfd->user; + MEM_freeN(bfd->user); + } + + R.winpos= bfd->winpos; + R.displaymode= bfd->displaymode; + G.curscreen= bfd->curscreen; + G.fileflags= bfd->fileflags; + + G.scene= G.curscreen->scene; + + /* weinig DispListen, wel text_to_curve */ + // this should be removed!!! But first a better displist system (ton) + for (ob= G.main->object.first; ob; ob= ob->id.next) { + if(ob->type==OB_FONT) { + Curve *cu= ob->data; + if(cu->nurb.first==0) text_to_curve(ob, 0); + } + else if(ob->type==OB_MESH) { + makeDispList(ob); + if(ob->effect.first) object_wave(ob); + } + } + + if (!G.background) { + setscreen(G.curscreen); + } + /* baseflags */ + set_scene_bg(G.scene); + + if (G.f & G_SCENESCRIPT) { + BPY_do_pyscript(&G.scene->id, SCRIPT_ONLOAD); + } + + strcpy(G.sce, filename); + strcpy(G.main->name, filename); /* is gegarandeerd current file */ + + MEM_freeN(bfd); +} + +int BKE_read_file(char *dir, void *type_r) { + BlendReadError bre; + BlendFileData *bfd; + + if (!G.background) + waitcursor(1); + + bfd= BLO_read_from_file(dir, &bre); + if (bfd) { + if (type_r) + *((BlenFileType*)type_r)= bfd->type; + + setup_app_data(bfd, dir); + } else { + error("Loading %s failed: %s", dir, BLO_bre_as_string(bre)); + } + + if (!G.background) + waitcursor(0); + + return (bfd?1:0); +} + +int BKE_read_file_from_memory(char* filebuf, int filelength, void *type_r) +{ + BlendReadError bre; + BlendFileData *bfd; + + if (!G.background) + waitcursor(1); + + bfd= BLO_read_from_memory(filebuf, filelength, &bre); + if (bfd) { + if (type_r) + *((BlenFileType*)type_r)= bfd->type; + + setup_app_data(bfd, "<memory>"); + } else { + error("Loading failed: %s", BLO_bre_as_string(bre)); + } + + if (!G.background) + waitcursor(0); + + return (bfd?1:0); +} |