[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32856] trunk/blender/source/blender: [ #23095] If no camera is present, a render starts but does nothing, and we have no "No camera" warning

Sergey Sharybin g.ulairi at gmail.com
Wed Nov 3 14:10:09 CET 2010


Revision: 32856
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32856
Author:   nazgul
Date:     2010-11-03 14:10:09 +0100 (Wed, 03 Nov 2010)

Log Message:
-----------
[#23095] If no camera is present, a render starts but does nothing, and we have no "No camera" warning

Improve camera checking and move it before starting render jobs

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2010-11-03 12:53:55 UTC (rev 32855)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2010-11-03 13:10:09 UTC (rev 32856)
@@ -637,6 +637,10 @@
 	if(WM_jobs_test(CTX_wm_manager(C), scene))
 		return OPERATOR_CANCELLED;
 
+	if(!RE_is_rendering_allowed(scene, op->reports, render_error_reports)) {
+		return OPERATOR_CANCELLED;
+	}
+
 	/* stop all running jobs, currently previews frustrate Render */
 	WM_jobs_stop_all(CTX_wm_manager(C));
 

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2010-11-03 12:53:55 UTC (rev 32855)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2010-11-03 13:10:09 UTC (rev 32856)
@@ -300,5 +300,7 @@
 void RE_engines_init(void);
 void RE_engines_exit(void);
 
+int RE_is_rendering_allowed(struct Scene *scene, void *erh, void (*error)(void *handle, char *str));
+
 #endif /* RE_PIPELINE_H */
 

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2010-11-03 12:53:55 UTC (rev 32855)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2010-11-03 13:10:09 UTC (rev 32856)
@@ -448,7 +448,7 @@
 	return 0;
 }
 
-static void render_unique_exr_name(Render *re, char *str, int sample)
+static void scene_unique_exr_name(Scene *scene, char *str, int sample)
 {
 	char di[FILE_MAX], name[FILE_MAXFILE+MAX_ID_NAME+100], fi[FILE_MAXFILE];
 	
@@ -456,13 +456,18 @@
 	BLI_splitdirstring(di, fi);
 	
 	if(sample==0)
-		sprintf(name, "%s_%s.exr", fi, re->scene->id.name+2);
+		sprintf(name, "%s_%s.exr", fi, scene->id.name+2);
 	else
-		sprintf(name, "%s_%s%d.exr", fi, re->scene->id.name+2, sample);
+		sprintf(name, "%s_%s%d.exr", fi, scene->id.name+2, sample);
 
 	BLI_make_file_string("/", str, btempdir, name);
 }
 
+static void render_unique_exr_name(Render *re, char *str, int sample)
+{
+	scene_unique_exr_name(re->scene, str, sample);
+}
+
 static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, int passtype)
 {
 	char *typestr= get_pass_name(passtype, 0);
@@ -2588,61 +2593,112 @@
 	}
 }
 
-static int is_rendering_allowed(Render *re)
+static int check_valid_camera(Scene *scene)
 {
+	int check_comp= 1;
+
+	if (scene->camera == NULL)
+		scene->camera= scene_find_camera(scene);
+
+	if(scene->r.scemode&R_DOSEQ) {
+		if(scene->ed) {
+			Sequence *seq= scene->ed->seqbase.first;
+
+			check_comp= 0;
+
+			while(seq) {
+				if(seq->type == SEQ_SCENE) {
+					if(!seq->scene_camera) {
+						if(!seq->scene->camera && !scene_find_camera(seq->scene)) {
+							if(seq->scene == scene) {
+								/* for current scene camera could be unneeded due to compisite nodes */
+								check_comp= 1;
+							} else {
+								/* for other scenes camera is necessary */
+								return 0;
+							}
+						}
+					}
+				}
+
+				seq= seq->next;
+			}
+		}
+	}
+
+	if(check_comp) { /* no sequencer or sequencer depends on compositor */
+		if(scene->r.scemode&R_DOCOMP && scene->use_nodes) {
+			bNode *node= scene->nodetree->nodes.first;
+
+			while(node) {
+				if(node->type == CMP_NODE_R_LAYERS) {
+					Scene *sce= node->id ? (Scene*)node->id : scene;
+
+					if(!sce->camera && !scene_find_camera(sce)) {
+						/* all render layers nodes need camera */
+						return 0;
+					}
+				}
+
+				node= node->next;
+			}
+		} else return scene->camera != NULL;
+	}
+
+	return 1;
+}
+
+int RE_is_rendering_allowed(Scene *scene, void *erh, void (*error)(void *handle, char *str))
+{
 	SceneRenderLayer *srl;
 	
 	/* forbidden combinations */
-	if(re->r.mode & R_PANORAMA) {
-		if(re->r.mode & R_BORDER) {
-			re->error(re->erh, "No border supported for Panorama");
+	if(scene->r.mode & R_PANORAMA) {
+		if(scene->r.mode & R_BORDER) {
+			error(erh, "No border supported for Panorama");
 			return 0;
 		}
-		if(re->r.mode & R_ORTHO) {
-			re->error(re->erh, "No Ortho render possible for Panorama");
+		if(scene->r.mode & R_ORTHO) {
+			error(erh, "No Ortho render possible for Panorama");
 			return 0;
 		}
 	}
 	
-	if(re->r.mode & R_BORDER) {
-		if(re->r.border.xmax <= re->r.border.xmin || 
-		   re->r.border.ymax <= re->r.border.ymin) {
-			re->error(re->erh, "No border area selected.");
+	if(scene->r.mode & R_BORDER) {
+		if(scene->r.border.xmax <= scene->r.border.xmin ||
+		   scene->r.border.ymax <= scene->r.border.ymin) {
+			error(erh, "No border area selected.");
 			return 0;
 		}
 	}
 	
-	if(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
+	if(scene->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
 		char str[FILE_MAX];
 		
-		render_unique_exr_name(re, str, 0);
+		scene_unique_exr_name(scene, str, 0);
 		
 		if (BLI_is_writable(str)==0) {
-			re->error(re->erh, "Can not save render buffers, check the temp default path");
+			error(erh, "Can not save render buffers, check the temp default path");
 			return 0;
 		}
 		
-		/* no osa + fullsample won't work... */
-		if(re->osa==0)
-			re->r.scemode &= ~R_FULL_SAMPLE;
-		
 		/* no fullsample and edge */
-		if((re->r.scemode & R_FULL_SAMPLE) && (re->r.mode & R_EDGE)) {
-			re->error(re->erh, "Full Sample doesn't support Edge Enhance");
+		if((scene->r.scemode & R_FULL_SAMPLE) && (scene->r.mode & R_EDGE)) {
+			error(erh, "Full Sample doesn't support Edge Enhance");
 			return 0;
 		}
 		
 	}
 	else
-		re->r.scemode &= ~R_FULL_SAMPLE;	/* clear to be sure */
+		scene->r.scemode &= ~R_FULL_SAMPLE;	/* clear to be sure */
 	
-	if(re->r.scemode & R_DOCOMP) {
-		if(re->scene->use_nodes) {
-			bNodeTree *ntree= re->scene->nodetree;
+	if(scene->r.scemode & R_DOCOMP) {
+		if(scene->use_nodes) {
+			bNodeTree *ntree= scene->nodetree;
 			bNode *node;
 		
 			if(ntree==NULL) {
-				re->error(re->erh, "No Nodetree in Scene");
+				error(erh, "No Nodetree in Scene");
 				return 0;
 			}
 			
@@ -2652,46 +2708,51 @@
 			
 			
 			if(node==NULL) {
-				re->error(re->erh, "No Render Output Node in Scene");
+				error(erh, "No Render Output Node in Scene");
 				return 0;
 			}
 		}
 	}
 	
 	 /* check valid camera, without camera render is OK (compo, seq) */
-	if(re->scene->camera==NULL)
-		re->scene->camera= scene_find_camera(re->scene);
-	
-	if(!(re->r.scemode & (R_DOSEQ|R_DOCOMP))) {
-		if(re->scene->camera==NULL) {
-			re->error(re->erh, "No camera");
-			return 0;
-		}
+	if(!check_valid_camera(scene)) {
+		error(erh, "No camera");
+		return 0;
 	}
 	
 	/* layer flag tests */
-	if(re->r.scemode & R_SINGLE_LAYER) {
-		srl= BLI_findlink(&re->scene->r.layers, re->r.actlay);
+	if(scene->r.scemode & R_SINGLE_LAYER) {
+		srl= BLI_findlink(&scene->r.layers, scene->r.actlay);
 		/* force layer to be enabled */
 		srl->layflag &= ~SCE_LAY_DISABLE;
 	}
 	
-	for(srl= re->scene->r.layers.first; srl; srl= srl->next)
+	for(srl= scene->r.layers.first; srl; srl= srl->next)
 		if(!(srl->layflag & SCE_LAY_DISABLE))
 			break;
 	if(srl==NULL) {
-		re->error(re->erh, "All RenderLayers are disabled");
+		error(erh, "All RenderLayers are disabled");
 		return 0;
 	}
 	
 	/* renderer */
-	if(!ELEM(re->r.renderer, R_INTERN, R_YAFRAY)) {
-		re->error(re->erh, "Unknown render engine set");
+	if(!ELEM(scene->r.renderer, R_INTERN, R_YAFRAY)) {
+		error(erh, "Unknown render engine set");
 		return 0;
 	}
+
 	return 1;
 }
 
+static void validate_render_settings(Render *re)
+{
+	if(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
+		/* no osa + fullsample won't work... */
+		if(re->r.osa==0)
+			re->r.scemode &= ~R_FULL_SAMPLE;
+	} else re->r.scemode &= ~R_FULL_SAMPLE;	/* clear to be sure */
+}
+
 static void update_physics_cache(Render *re, Scene *scene, int UNUSED(anim_init))
 {
 	PTCacheBaker baker;
@@ -2768,10 +2829,9 @@
 	
 	/* initstate makes new result, have to send changed tags around */
 	ntreeCompositTagRender(re->scene);
-	
-	if(!is_rendering_allowed(re))
-		return 0;
-	
+
+	validate_render_settings(re);
+
 	re->display_init(re->dih, re->result);
 	re->display_clear(re->dch, re->result);
 	





More information about the Bf-blender-cvs mailing list