else
re= RE_NewRender(sce->id.name, RE_SLOT_VIEW);
- RE_BlenderFrame(re, sce, NULL, frame);
+ RE_BlenderFrame(re, sce, sce->lay, NULL, frame);
RE_AcquireResultImage(re, &rres);
RE_test_break_cb(bkr->re, NULL, thread_break);
G.afbreek= 0; /* blender_test_break uses this global */
- RE_Database_Baking(bkr->re, scene, scene->r.bake_mode, bkr->actob);
+ RE_Database_Baking(bkr->re, scene, scene->r.bake_mode, bkr->actob, scene->lay);
/* baking itself is threaded, cannot use test_break in threads. we also update optional imagewindow */
bkr->tot= RE_bake_shade_all_selected(bkr->re, scene->r.bake_mode, bkr->actob, bkr->do_update);
RE_test_break_cb(bkr.re, NULL, thread_break);
G.afbreek= 0; /* blender_test_break uses this global */
- RE_Database_Baking(bkr.re, scene, scene->r.bake_mode, (scene->r.bake_flag & R_BAKE_TO_ACTIVE)? OBACT: NULL);
+ RE_Database_Baking(bkr.re, scene, scene->r.bake_mode, (scene->r.bake_flag & R_BAKE_TO_ACTIVE)? OBACT: NULL, scene->lay);
/* baking itself is threaded, cannot use test_break in threads */
BLI_init_threads(&threads, do_bake_render, 1);
{
Scene *scene= CTX_data_scene(C);
Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW);
+ View3D *v3d= CTX_wm_view3d(C);
+ int lay= (v3d)? v3d->lay|scene->lay: scene->lay;
if(re==NULL) {
re= RE_NewRender(scene->id.name, RE_SLOT_VIEW);
RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break);
if(RNA_boolean_get(op->ptr, "animation"))
- RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
+ RE_BlenderAnim(re, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
else
- RE_BlenderFrame(re, scene, NULL, scene->r.cfra);
+ RE_BlenderFrame(re, scene, NULL, lay, scene->r.cfra);
// no redraw needed, we leave state as we entered it
ED_update_for_newframe(C, 1);
Render *re;
wmWindow *win;
SceneRenderLayer *srl;
+ int lay;
int anim;
Image *image;
ImageUser iuser;
rj->do_update= do_update;
if(rj->anim)
- RE_BlenderAnim(rj->re, rj->scene, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
+ RE_BlenderAnim(rj->re, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
else
- RE_BlenderFrame(rj->re, rj->scene, rj->srl, rj->scene->r.cfra);
+ RE_BlenderFrame(rj->re, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra);
// if(mainp)
// free_main(mainp);
/* new render clears all callbacks */
Scene *scene= CTX_data_scene(C);
SceneRenderLayer *srl=NULL;
+ View3D *v3d= CTX_wm_view3d(C);
Render *re;
wmJob *steve;
RenderJob *rj;
rj->scene= scene;
rj->win= CTX_wm_window(C);
rj->srl = srl;
+ rj->lay = (v3d)? v3d->lay|scene->lay: scene->lay;
rj->anim= RNA_boolean_get(op->ptr, "animation");
rj->iuser.scene= scene;
rj->iuser.ok= 1;
/* allow localview render for objects with lights in normal layers */
if(v3d->lay & 0xFF000000)
- scene->lay |= v3d->lay;
- else scene->lay= v3d->lay;
+ lay |= v3d->lay;
+ else lay= v3d->lay;
- RE_Database_FromScene(re, scene, 0); // 0= dont use camera view
- scene->lay= lay;
+ RE_Database_FromScene(re, scene, lay, 0); // 0= dont use camera view
rstats= RE_GetStats(re);
if(rstats->convertdone)
/* entire cycle for render engine */
RE_SetCamera(re, sce->camera);
- RE_Database_FromScene(re, sce, 1);
+ RE_Database_FromScene(re, sce, sce->lay, 1);
RE_TileProcessor(re, 0, 1); // actual render engine
RE_Database_Free(re);
void RE_SetView (struct Render *re, float mat[][4]);
/* make or free the dbase */
-void RE_Database_FromScene(struct Render *re, struct Scene *scene, int use_camera_view);
+void RE_Database_FromScene(struct Render *re, struct Scene *scene, unsigned int lay, int use_camera_view);
void RE_Database_Free (struct Render *re);
/* project dbase again, when viewplane/perspective changed */
void RE_TileProcessor(struct Render *re, int firsttile, int threaded);
/* only RE_NewRender() needed, main Blender render calls */
-void RE_BlenderFrame(struct Render *re, struct Scene *scene, struct SceneRenderLayer *srl, int frame);
-void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra, int tfra, struct ReportList *reports);
+void RE_BlenderFrame(struct Render *re, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame);
+void RE_BlenderAnim(struct Render *re, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports);
void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
#define RE_BAKE_DISPLACEMENT 5
#define RE_BAKE_SHADOW 6
-void RE_Database_Baking(struct Render *re, struct Scene *scene, int type, struct Object *actob);
+void RE_Database_Baking(struct Render *re, struct Scene *scene, unsigned int lay, int type, struct Object *actob);
void RE_DataBase_GetView(struct Render *re, float mat[][4]);
void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]);
Scene *scene;
RenderData r;
World wrld;
+ unsigned int lay;
ListBase parts;
/* convertblender.c */
void init_render_world(Render *re);
-void RE_Database_FromScene_Vectors(Render *re, struct Scene *sce);
+void RE_Database_FromScene_Vectors(Render *re, struct Scene *sce, unsigned int lay);
#endif /* RENDERDATABASE_H */
for(go= group->gobject.first; go; go= go->next) {
go->lampren= NULL;
- if(go->ob->lay & re->scene->lay) {
+ if(go->ob->lay & re->lay) {
if(go->ob && go->ob->type==OB_LAMP) {
for(gol= re->lights.first; gol; gol= gol->next) {
if(gol->ob==go->ob) {
static int get_vector_renderlayers(Scene *sce)
{
SceneRenderLayer *srl;
- int lay= 0;
+ unsigned int lay= 0;
for(srl= sce->r.layers.first; srl; srl= srl->next)
if(srl->passflag & SCE_PASS_VECTOR)
}
}
}
- else if((base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->scene->lay)) ) {
+ else if((base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->lay)) ) {
if((ob->transflag & OB_DUPLI) && (ob->type!=OB_MBALL)) {
DupliObject *dob;
ListBase *lb;
}
/* used to be 'rotate scene' */
-void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
+void RE_Database_FromScene(Render *re, Scene *scene, unsigned int lay, int use_camera_view)
{
extern int slurph_opt; /* key.c */
Scene *sce;
float mat[4][4];
float amb[3];
- unsigned int lay;
re->scene= scene;
+ re->lay= lay;
/* per second, per object, stats print this */
re->i.infostr= "Preparing Scene data";
re->i.partsdone= 0; /* signal now in use for previewrender */
/* in localview, lamps are using normal layers, objects only local bits */
- if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000;
- else lay= re->scene->lay;
+ if(re->lay & 0xFF000000)
+ lay &= 0xFF000000;
/* applies changes fully */
if((re->r.scemode & R_PREVIEWBUTS)==0)
/* Speed Vectors */
/* ------------------------------------------------------------------------- */
-static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
+static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int lay, int timeoffset)
{
extern int slurph_opt; /* key.c */
float mat[4][4];
- unsigned int lay;
re->scene= scene;
+ re->lay= lay;
/* XXX add test if dbase was filled already? */
slurph_opt= 0;
/* in localview, lamps are using normal layers, objects only local bits */
- if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000;
- else lay= re->scene->lay;
+ if(re->lay & 0xFF000000)
+ lay &= 0xFF000000;
/* applies changes fully */
scene->r.cfra += timeoffset;
BLI_freelistN(lb);
}
-void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
+void RE_Database_FromScene_Vectors(Render *re, Scene *sce, unsigned int lay)
{
ObjectInstanceRen *obi, *oldobi;
StrandSurface *mesh;
speedvector_project(re, NULL, NULL, NULL); /* initializes projection code */
/* creates entire dbase */
- database_fromscene_vectors(re, sce, -1);
+ database_fromscene_vectors(re, sce, lay, -1);
/* copy away vertex info */
copy_dbase_object_vectors(re, &oldtable);
/* creates entire dbase */
re->i.infostr= "Calculating next frame vectors";
- database_fromscene_vectors(re, sce, +1);
+ database_fromscene_vectors(re, sce, lay, +1);
}
/* copy away vertex info */
copy_dbase_object_vectors(re, &newtable);
re->strandsurface= strandsurface;
if(!re->test_break(re->tbh))
- RE_Database_FromScene(re, sce, 1);
+ RE_Database_FromScene(re, sce, lay, 1);
if(!re->test_break(re->tbh)) {
for(step= 0; step<2; step++) {
RE_BAKE_DISPLACEMENT:for baking, no lamps, only selected objects
RE_BAKE_SHADOW: for baking, only shadows, but all objects
*/
-void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
+void RE_Database_Baking(Render *re, Scene *scene, unsigned int lay, int type, Object *actob)
{
float mat[4][4];
float amb[3];
- unsigned int lay;
int onlyselected, nolamps;
re->scene= scene;
+ re->lay= lay;
/* renderdata setup and exceptions */
re->r= scene->r;
re->lampren.first= re->lampren.last= NULL;
/* in localview, lamps are using normal layers, objects only local bits */
- if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000;
- else lay= re->scene->lay;
+ if(re->lay & 0xFF000000)
+ lay &= 0xFF000000;
/* if no camera, set unit */
if(re->scene->camera) {
RE_InitState(envre, NULL, &envre->r, NULL, cuberes, cuberes, NULL);
envre->scene= re->scene; /* unsure about this... */
+ envre->lay= re->lay;
/* view stuff in env render */
envre->lens= 16.0f;
if(tex->env && tex->env->object) {
EnvMap *env= tex->env;
- if(env->object->lay & re->scene->lay) {
+ if(env->object->lay & re->lay) {
if(env->stype==ENV_LOAD) {
float orthmat[4][4], mat[4][4], tmat[4][4];
/* setup shade sample with correct passes */
memset(&ssamp, 0, sizeof(ShadeSample));
- ssamp.shi[0].lay= re->scene->lay;
+ ssamp.shi[0].lay= re->lay;
ssamp.shi[0].passflag= SCE_PASS_DIFFUSE|SCE_PASS_RGBA;
ssamp.shi[0].combinedflag= ~(SCE_PASS_SPEC);
ssamp.tot= 1;
/* make render verts/faces/halos/lamps */
if(render_scene_needs_vector(re))
- RE_Database_FromScene_Vectors(re, re->scene);
+ RE_Database_FromScene_Vectors(re, re->scene, re->lay);
else
- RE_Database_FromScene(re, re->scene, 1);
+ RE_Database_FromScene(re, re->scene, re->lay, 1);
threaded_tile_processor(re);
R.stats_draw= re->stats_draw;
if (update_newframe)
- scene_update_for_newframe(re->scene, re->scene->lay);
+ scene_update_for_newframe(re->scene, re->lay);
if(re->r.scemode & R_FULL_SAMPLE)
do_merge_fullsample(re, ntree);
BKE_ptcache_make_cache(&baker);
}
/* evaluating scene options for general Blender render */
-static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLayer *srl, int anim, int anim_init)
+static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int anim, int anim_init)
{
int winx, winy;
rcti disprect;
}
re->scene= scene;
+ re->lay= lay;
/* not too nice, but it survives anim-border render */
if(anim) {
}
/* general Blender frame render call */
-void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, int frame)
+void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame)
{
/* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */
RenderGlobal.renderingslot= re->slot;
scene->r.cfra= frame;
- if(render_initialize_from_scene(re, scene, srl, 0, 0)) {
+ if(render_initialize_from_scene(re, scene, srl, lay, 0, 0)) {
do_render_all_options(re);
}
}
/* saves images to disk */
-void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, ReportList *reports)
+void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int efra, int tfra, ReportList *reports)
{
bMovieHandle *mh= BKE_get_movie_handle(scene->r.imtype);
- unsigned int lay;
int cfrao= scene->r.cfra;
int nfra;
/* do not fully call for each frame, it initializes & pops output window */
- if(!render_initialize_from_scene(re, scene, NULL, 0, 1))
+ if(!render_initialize_from_scene(re, scene, NULL, lay, 0, 1))
return;
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
char name[FILE_MAX];
/* only border now, todo: camera lens. (ton) */
- render_initialize_from_scene(re, scene, NULL, 1, 0);
+ render_initialize_from_scene(re, scene, NULL, lay, 1, 0);
if(nfra!=scene->r.cfra) {
/*
* From convertblender.c:
* in localview, lamps are using normal layers, objects only local bits.
*/
- if(scene->lay & 0xFF000000)
- lay= scene->lay & 0xFF000000;
+ unsigned int updatelay;
+
+ if(re->lay & 0xFF000000)
+ updatelay= re->lay & 0xFF000000;
else
- lay= scene->lay;
+ updatelay= re->lay;
- scene_update_for_newframe(scene, lay);
+ scene_update_for_newframe(scene, updatelay);
continue;
}
else
/* get the threads running */
for(a=0; a<re->r.threads; a++) {
/* set defaults in handles */
- handles[a].ssamp.shi[0].lay= re->scene->lay;
+ handles[a].ssamp.shi[0].lay= re->lay;
if (type==RE_BAKE_SHADOW) {
handles[a].ssamp.shi[0].passflag= SCE_PASS_SHADOW;
shi->har= shi->mat->har;
shi->obi= obi;
shi->obr= obi->obr;
- shi->lay = re->scene->lay;
+ shi->lay = re->lay;
}
static void precache_init_parts(Render *re, RayObject *tree, ShadeInput *shi, ObjectInstanceRen *obi, int totthread, int *parts)
frame = MIN2(MAXFRAME, MAX2(MINAFRAME, frame));
- RE_BlenderAnim(re, scene, frame, frame, scene->r.frame_step, &reports);
+ RE_BlenderAnim(re, scene, scene->lay, frame, frame, scene->r.frame_step, &reports);
return 1;
} else {
printf("\nError: frame number must follow '-f'.\n");
Render *re= RE_NewRender(scene->id.name, RE_SLOT_DEFAULT);
ReportList reports;
BKE_reports_init(&reports, RPT_PRINT);
- RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->r.frame_step, &reports);
+ RE_BlenderAnim(re, scene, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, &reports);
} else {
printf("\nError: no blend loaded. cannot use '-a'.\n");
}