#include "BLO_readfile.h"
#include "BLO_undofile.h"
+#include "RE_engine.h"
+
#include "readfile.h"
#include "PIL_time.h"
}
}
+static void ntree_tmp_cycles_emission_version_patch(FileData *fd, Library *lib, bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+ bNodeSocketValueFloat *valfloat;
+
+ for(node=ntree->nodes.first; node; node=node->next) {
+ if(node->type == SH_NODE_EMISSION) {
+ for(sock=node->inputs.first; sock; sock=sock->next) {
+ if(strcmp(sock->name, "Strength") == 0) {
+ valfloat= sock->default_value;
+ valfloat->value /= M_PI;
+ }
+ }
+ }
+ else if(node->type == NODE_GROUP) {
+ bNodeTree *ntree= newlibadr(fd, lib, node->id);
+
+ if(ntree)
+ ntree_tmp_cycles_emission_version_patch(fd, lib, ntree);
+ }
+ }
+}
+
+static void ntree_tmp_cycles_version_patch(bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+
+ for(node=ntree->nodes.first; node; node=node->next) {
+ if(node->type == SH_NODE_FRESNEL) {
+
+ for(sock=node->inputs.first; sock; sock=sock->next) {
+ if(strcmp(sock->name, "Fresnel") == 0) {
+ bNodeSocket *osock;
+
+ node->type = SH_NODE_BLEND_WEIGHT;
+ strcpy(sock->name, "Blend");
+
+ for(osock=node->outputs.first; osock; osock=osock->next)
+ if(strcmp(osock->name, "Fac") == 0)
+ strcpy(osock->name, "Fresnel");
+ }
+ }
+ }
+ else {
+ for(sock=node->inputs.first; sock; sock=sock->next) {
+ if(strcmp(sock->name, "Closure1") == 0)
+ strcpy(sock->name, "Shader1");
+ if(strcmp(sock->name, "Closure2") == 0)
+ strcpy(sock->name, "Shader2");
+
+ if(strcmp(sock->name, "Color1") == 0)
+ strcpy(sock->name, "Color");
+ if(strcmp(sock->name, "Color2") == 0)
+ strcpy(sock->name, "Color");
+
+ if(strcmp(sock->name, "Vector1") == 0)
+ strcpy(sock->name, "Vector");
+ if(strcmp(sock->name, "Vector2") == 0)
+ strcpy(sock->name, "Vector");
+
+ if(strcmp(sock->name, "Value1") == 0)
+ strcpy(sock->name, "Value");
+ if(strcmp(sock->name, "Value2") == 0)
+ strcpy(sock->name, "Value");
+
+ if(strcmp(sock->name, "Shader1") == 0)
+ strcpy(sock->name, "Shader");
+ if(strcmp(sock->name, "Shader2") == 0)
+ strcpy(sock->name, "Shader");
+
+ if(node->type == SH_NODE_OUTPUT_MATERIAL ||
+ node->type == SH_NODE_OUTPUT_WORLD ||
+ node->type == SH_NODE_OUTPUT_LAMP) {
+ if(strcmp(sock->name, "Shader") == 0)
+ strcpy(sock->name, "Surface");
+ }
+
+ if(strcmp(sock->name, "Fresnel") == 0) {
+ strcpy(sock->name, "IOR");
+ sock->ns.vec[0] = 1.0f/MAX2(1.0f - sock->ns.vec[0], 1e-5f);
+ }
+ }
+
+ for(sock=node->outputs.first; sock; sock=sock->next)
+ if(strcmp(sock->name, "Closure") == 0)
+ strcpy(sock->name, "Shader");
+ }
+ }
+}
+
static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
{
bNode *node;
+
+ ntree_tmp_cycles_version_patch(ntree);
ntreeInitTypes(ntree);
for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
if (ntree->update)
ntreeUpdateTree(ntree);
+
for (i=0; i < NUM_NTREE_TYPES; ++i) {
ntreetype= ntreeGetType(i);
if (ntreetype && ntreetype->foreach_nodetree)
}
la->ipo= newlibadr_us(fd, la->id.lib, la->ipo); // XXX depreceated - old animation system
+
+ if(la->nodetree)
+ lib_link_ntree(fd, &la->id, la->nodetree);
la->id.flag -= LIB_NEEDLINK;
}
la->curfalloff= newdataadr(fd, la->curfalloff);
if(la->curfalloff)
direct_link_curvemapping(fd, la->curfalloff);
+
+ la->nodetree= newdataadr(fd, la->nodetree);
+ if(la->nodetree)
+ direct_link_nodetree(fd, la->nodetree);
la->preview = direct_link_preview_image(fd, la->preview);
}
mtex->object= newlibadr(fd, wrld->id.lib, mtex->object);
}
}
+
+ if(wrld->nodetree)
+ lib_link_ntree(fd, &wrld->id, wrld->nodetree);
wrld->id.flag -= LIB_NEEDLINK;
}
for(a=0; a<MAX_MTEX; a++) {
wrld->mtex[a]= newdataadr(fd, wrld->mtex[a]);
}
+
+ wrld->nodetree= newdataadr(fd, wrld->nodetree);
+ if(wrld->nodetree)
+ direct_link_nodetree(fd, wrld->nodetree);
+
wrld->preview = direct_link_preview_image(fd, wrld->preview);
}
if(snode->id) {
if(GS(snode->id->name)==ID_MA)
snode->nodetree= ((Material *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_WO)
+ snode->nodetree= ((World *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_LA)
+ snode->nodetree= ((Lamp *)snode->id)->nodetree;
else if(GS(snode->id->name)==ID_SCE)
snode->nodetree= ((Scene *)snode->id)->nodetree;
else if(GS(snode->id->name)==ID_TE)
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D*) sl;
BGpic *bgpic;
+ ARegion *ar;
if(v3d->scenelock)
v3d->camera= NULL; /* always get from scene */
/* not very nice, but could help */
if((v3d->layact & v3d->lay)==0) v3d->layact= v3d->lay;
+ /* free render engines for now */
+ for(ar= sa->regionbase.first; ar; ar= ar->next) {
+ RegionView3D *rv3d= ar->regiondata;
+
+ if(rv3d && rv3d->render_engine) {
+ RE_engine_free(rv3d->render_engine);
+ rv3d->render_engine= NULL;
+ }
+ }
}
else if(sl->spacetype==SPACE_IPO) {
SpaceIpo *sipo= (SpaceIpo *)sl;
rv3d->depths= NULL;
rv3d->ri= NULL;
+ rv3d->render_engine= NULL;
rv3d->sms= NULL;
rv3d->smooth_timer= NULL;
}
v3d->afterdraw_xray.first= v3d->afterdraw_xray.last= NULL;
v3d->afterdraw_xraytransp.first= v3d->afterdraw_xraytransp.last= NULL;
v3d->properties_storage= NULL;
+
+ /* render can be quite heavy, set to wire on load */
+ if(v3d->drawtype == OB_RENDER)
+ v3d->drawtype = OB_WIRE;
view3d_split_250(v3d, &sl->regionbase);
}
else if(sl->spacetype==SPACE_BUTS) {
SpaceButs *sbuts= (SpaceButs *)sl;
sbuts->path= NULL;
+ sbuts->texuser= NULL;
}
else if(sl->spacetype==SPACE_CONSOLE) {
SpaceConsole *sconsole= (SpaceConsole *)sl;
if(id->flag & LIB_FAKEUSER) id->us= 1;
else id->us= 0;
id->icon_id = 0;
- id->flag &= ~LIB_ID_RECALC;
+ id->flag &= ~(LIB_ID_RECALC|LIB_ID_RECALC_DATA);
/* this case cannot be direct_linked: it's just the ID part */
if(bhead->code==ID_ID) {
do_versions_socket_default_value(sock);
}
+static void do_versions_nodetree_clear_dynamic_sockets(bNodeTree *ntree)
+{
+ /* conflict with cycles flag .. */
+ bNodeSocket *sock;
+
+ for (sock=ntree->inputs.first; sock; sock=sock->next) {
+ if (sock->flag & SOCK_DYNAMIC) {
+ sock->flag &= ~SOCK_DYNAMIC;
+ sock->flag |= SOCK_COLLAPSED;
+ }
+ }
+ for (sock=ntree->outputs.first; sock; sock=sock->next) {
+ if (sock->flag & SOCK_DYNAMIC) {
+ sock->flag &= ~SOCK_DYNAMIC;
+ sock->flag |= SOCK_COLLAPSED;
+ }
+ }
+}
+
static void do_versions_nodetree_dynamic_sockets(bNodeTree *ntree)
{
bNodeSocket *sock;
- for (sock=ntree->inputs.first; sock; sock=sock->next)
- sock->flag |= SOCK_DYNAMIC;
- for (sock=ntree->outputs.first; sock; sock=sock->next)
- sock->flag |= SOCK_DYNAMIC;
+ for (sock=ntree->inputs.first; sock; sock=sock->next) {
+ if(sock->flag & SOCK_DYNAMIC)
+ sock->flag |= SOCK_COLLAPSED;
+ else
+ sock->flag |= SOCK_DYNAMIC;
+ }
+ for (sock=ntree->outputs.first; sock; sock=sock->next) {
+ if(sock->flag & SOCK_DYNAMIC)
+ sock->flag |= SOCK_COLLAPSED;
+ else
+ sock->flag |= SOCK_DYNAMIC;
+ }
}
void convert_tface_mt(FileData *fd, Main *main)
Object *ob=main->object.first;
while (ob) {
/* shaded mode disabled for now */
- if (ob->dt == OB_SHADED) ob->dt = OB_TEXTURE;
+ if (ob->dt == OB_MATERIAL) ob->dt = OB_TEXTURE;
ob=ob->id.next;
}
}
for(sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d = (View3D *)sl;
- if (v3d->drawtype == OB_SHADED) v3d->drawtype = OB_SOLID;
+ if (v3d->drawtype == OB_MATERIAL) v3d->drawtype = OB_SOLID;
}
}
}
/* Convert default socket values from bNodeStack */
Scene *sce;
Material *mat;
+ Lamp *la;
Tex *tex;
bNodeTree *ntree;
+ World *wo;
+
for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
do_versions_nodetree_default_value(ntree);
ntree->update |= NTREE_UPDATE;
}
for (sce=main->scene.first; sce; sce=sce->id.next)
if (sce->nodetree) {
+ do_versions_nodetree_clear_dynamic_sockets(sce->nodetree);
do_versions_nodetree_default_value(sce->nodetree);
sce->nodetree->update |= NTREE_UPDATE;
}
for (mat=main->mat.first; mat; mat=mat->id.next)
if (mat->nodetree) {
+ do_versions_nodetree_clear_dynamic_sockets(mat->nodetree);
do_versions_nodetree_default_value(mat->nodetree);
mat->nodetree->update |= NTREE_UPDATE;
}
+ for (la=main->lamp.first; la; la=la->id.next)
+ if (la->nodetree) {
+ do_versions_nodetree_clear_dynamic_sockets(la->nodetree);
+ do_versions_nodetree_default_value(la->nodetree);
+ la->nodetree->update |= NTREE_UPDATE;
+ }
+ for (wo=main->world.first; wo; wo=wo->id.next)
+ if (wo->nodetree) {
+ do_versions_nodetree_clear_dynamic_sockets(wo->nodetree);
+ do_versions_nodetree_default_value(wo->nodetree);
+ wo->nodetree->update |= NTREE_UPDATE;
+ }
for (tex=main->tex.first; tex; tex=tex->id.next)
if (tex->nodetree) {
+ do_versions_nodetree_clear_dynamic_sockets(tex->nodetree);
do_versions_nodetree_default_value(tex->nodetree);
tex->nodetree->update |= NTREE_UPDATE;
}
}
+ if(main->versionfile < 259 || (main->versionfile == 259 && main->subversionfile < 5)) {
+ Scene *sce;
+ Base *base;
+ Material *ma;
+
+ /* compatibility tweak */
+ for(sce = main->scene.first; sce; sce = sce->id.next) {
+ if(strcmp(sce->r.engine, "CYCLES") == 0) {
+ for(base = sce->base.first; base; base=base->next) {
+ Object *ob= newlibadr(fd, lib, base->object);
+
+ if(ob && ob->type == OB_LAMP) {
+ Lamp *la= newlibadr(fd, lib, ob->data);
+ if(la)
+ la->area_size= 0.0f;
+ }
+ }
+ }
+ }
+
+ for(ma = main->mat.first; ma; ma= ma->id.next)
+ if(ma->nodetree)
+ ntree_tmp_cycles_emission_version_patch(fd, lib, ma->nodetree);
+ }
+
/* put compatibility code here until next subversion bump */
{
{
if (la->adt)
expand_animdata(fd, mainvar, la->adt);
+
+ if(la->nodetree)
+ expand_nodetree(fd, mainvar, la->nodetree);
}
static void expand_lattice(FileData *fd, Main *mainvar, Lattice *lt)
if (wrld->adt)
expand_animdata(fd, mainvar, wrld->adt);
+
+ if(wrld->nodetree)
+ expand_nodetree(fd, mainvar, wrld->nodetree);
}