[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13667] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Feb 13 12:18:09 CET 2008


Revision: 13667
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13667
Author:   blendix
Date:     2008-02-13 12:18:08 +0100 (Wed, 13 Feb 2008)

Log Message:
-----------

Render Simplification

This adds a few settings to control global render quality, for faster
renders when tweaking lighting etc. The implementation is not so great,
and this should really be part of a proper render profile and preset
system. So for now it's a hidden Peach feature, enabled by setting rt
to 1. Before the next release, I'll either remove or improve it.

Settings are:

- Maximum subsurf level
- Child particles percentage
- Maximum shadow map samples
- AO and SSS quality factor

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_scene.h
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/render/intern/include/shadbuf.h
    trunk/blender/source/blender/render/intern/source/occlusion.c
    trunk/blender/source/blender/render/intern/source/pixelshading.c
    trunk/blender/source/blender/render/intern/source/shadbuf.c
    trunk/blender/source/blender/render/intern/source/shadeoutput.c
    trunk/blender/source/blender/render/intern/source/sss.c
    trunk/blender/source/blender/src/buttons_scene.c

Modified: trunk/blender/source/blender/blenkernel/BKE_scene.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_scene.h	2008-02-13 10:44:36 UTC (rev 13666)
+++ trunk/blender/source/blender/blenkernel/BKE_scene.h	2008-02-13 11:18:08 UTC (rev 13667)
@@ -41,6 +41,7 @@
 struct AviCodecData;
 struct QuicktimeCodecData;
 struct SculptData;
+struct RenderData;
 
 /* sequence related defines */
 #define WHILE_SEQ(base)	{											\
@@ -82,5 +83,11 @@
 
 void scene_add_render_layer(struct Scene *sce);
 
+/* render profile */
+int get_render_subsurf_level(struct RenderData *r, int level);
+int get_render_child_particle_number(struct RenderData *r, int num);
+int get_render_shadow_samples(struct RenderData *r, int samples);
+float get_render_aosss_error(struct RenderData *r, float error);
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-02-13 10:44:36 UTC (rev 13666)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-02-13 11:18:08 UTC (rev 13667)
@@ -63,7 +63,6 @@
 #include "BKE_bad_level_calls.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_displist.h"
-
 #include "BKE_particle.h"
 #include "BKE_global.h"
 #include "BKE_utildefines.h"
@@ -77,6 +76,7 @@
 #include "BKE_pointcache.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
+#include "BKE_scene.h"
 
 #include "BSE_headerbuttons.h"
 
@@ -145,17 +145,26 @@
 	psys->totpart=totpart;
 }
 
-static int get_alloc_child_particles_tot(ParticleSystem *psys)
+static int get_psys_child_number(ParticleSystem *psys)
 {
-	int child_nbr;
+	int nbr;
 
 	if(!psys->part->childtype)
 		return 0;
 
-	child_nbr= (psys->renderdata)? psys->part->ren_child_nbr: psys->part->child_nbr;
-	return psys->totpart*child_nbr;
+	if(psys->renderdata) {
+		nbr= psys->part->ren_child_nbr;
+		return get_render_child_particle_number(&G.scene->r, nbr);
+	}
+	else
+		return psys->part->child_nbr;
 }
 
+static int get_psys_tot_child(ParticleSystem *psys)
+{
+	return psys->totpart*get_psys_child_number(psys);
+}
+
 static void alloc_child_particles(ParticleSystem *psys, int tot)
 {
 	if(psys->child){
@@ -863,7 +872,7 @@
 
 			BLI_kdtree_balance(tree);
 
-			totpart=get_alloc_child_particles_tot(psys);
+			totpart=get_psys_tot_child(psys);
 			cfrom=from=PART_FROM_FACE;
 
 			if(part->flag&PART_CHILD_SEAMS){
@@ -912,9 +921,9 @@
 		}
 		else{
 			/* no need to figure out distribution */
-			int child_nbr= (psys->renderdata)? part->ren_child_nbr: part->child_nbr;
+			int child_nbr= get_psys_child_number(psys);
 
-			totpart= get_alloc_child_particles_tot(psys);
+			totpart= get_psys_tot_child(psys);
 			alloc_child_particles(psys, totpart);
 			cpa=psys->child;
 			for(i=0; i<child_nbr; i++){
@@ -4219,9 +4228,8 @@
 	ParticleSettings *part=psys->part;
 	ParticleEditSettings *pset=&G.scene->toolsettings->particle;
 	int distr=0,alloc=0;
-	int child_nbr= (psys->renderdata)? part->ren_child_nbr: part->child_nbr;
 
-	if((psys->part->childtype && psys->totchild != psys->totpart*child_nbr) || psys->recalc&PSYS_ALLOC)
+	if((psys->part->childtype && psys->totchild != get_psys_tot_child(psys)) || psys->recalc&PSYS_ALLOC)
 		alloc=1;
 
 	if(alloc || psys->recalc&PSYS_DISTR || (psys->vgroup[PSYS_VG_DENSITY] && (G.f & G_WEIGHTPAINT)))
@@ -4231,7 +4239,7 @@
 		if(alloc)
 			alloc_particles(ob,psys,psys->totpart);
 
-		if(get_alloc_child_particles_tot(psys)) {
+		if(get_psys_tot_child(psys)) {
 			/* don't generate children while computing the hair keys */
 			if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE)) {
 				distribute_particles(ob,psys,PART_FROM_CHILD);
@@ -4386,7 +4394,6 @@
 	int totpart,oldtotpart=0,p;
 	float disp, *vg_vel=0, *vg_tan=0, *vg_rot=0, *vg_size=0;
 	int init=0,distr=0,alloc=0;
-	int child_nbr;
 
 	/*----start validity checks----*/
 
@@ -4457,8 +4464,7 @@
 	else
 		totpart = psys->part->totpart;
 
-	child_nbr= (psys->renderdata)? part->ren_child_nbr: part->child_nbr;
-	if(oldtotpart != totpart || psys->recalc&PSYS_ALLOC || (psys->part->childtype && psys->totchild != psys->totpart*child_nbr))
+	if(oldtotpart != totpart || psys->recalc&PSYS_ALLOC || (psys->part->childtype && psys->totchild != get_psys_tot_child(psys)))
 		alloc = 1;
 
 	if(alloc || psys->recalc&PSYS_DISTR || (psys->vgroup[PSYS_VG_DENSITY] && (G.f & G_WEIGHTPAINT) && ob==OBACT))
@@ -4477,7 +4483,7 @@
 			if((psys->part->type == PART_HAIR) && !(psys->flag & PSYS_HAIR_DONE))
 				/* don't generate children while growing hair - waste of time */
 				psys_free_children(psys);
-			else if(get_alloc_child_particles_tot(psys))
+			else if(get_psys_tot_child(psys))
 				distribute_particles(ob, psys, PART_FROM_CHILD);
 		}
 		initialize_all_particles(ob, psys, psmd);

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2008-02-13 10:44:36 UTC (rev 13666)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2008-02-13 11:18:08 UTC (rev 13667)
@@ -220,6 +220,11 @@
 	
 	sce->r.stereomode = 1;  // no stereo
 
+	sce->r.simplify_subsurf= 6;
+	sce->r.simplify_particles= 1.0f;
+	sce->r.simplify_shadowsamples= 16;
+	sce->r.simplify_aosss= 1.0f;
+
 	sce->toolsettings = MEM_callocN(sizeof(struct ToolSettings),"Tool Settings Struct");
 	sce->toolsettings->cornertype=1;
 	sce->toolsettings->degr = 90; 
@@ -701,3 +706,38 @@
 
 	curvemapping_changed(sd->cumap, 0);
 }
+
+/* render simplification */
+
+int get_render_subsurf_level(RenderData *r, int lvl)
+{
+	if(G.rt == 1 && (r->mode & R_SIMPLIFY))
+		return MIN2(r->simplify_subsurf, lvl);
+	else
+		return lvl;
+}
+
+int get_render_child_particle_number(RenderData *r, int num)
+{
+	if(G.rt == 1 && (r->mode & R_SIMPLIFY))
+		return (int)(r->simplify_particles*num);
+	else
+		return num;
+}
+
+int get_render_shadow_samples(RenderData *r, int samples)
+{
+	if(G.rt == 1 && (r->mode & R_SIMPLIFY) && samples > 0)
+		return MIN2(r->simplify_shadowsamples, samples);
+	else
+		return samples;
+}
+
+float get_render_aosss_error(RenderData *r, float error)
+{
+	if(G.rt == 1 && (r->mode & R_SIMPLIFY))
+		return ((1.0f-r->simplify_aosss)*10.0f + 1.0f)*error;
+	else
+		return error;
+}
+

Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2008-02-13 10:44:36 UTC (rev 13666)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2008-02-13 11:18:08 UTC (rev 13667)
@@ -42,16 +42,18 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
+#include "DNA_scene_types.h"
 
 #include "BKE_bad_level_calls.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_customdata.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_displist.h"
 #include "BKE_utildefines.h"
 #include "BKE_global.h"
 #include "BKE_mesh.h"
+#include "BKE_scene.h"
 #include "BKE_subsurf.h"
-#include "BKE_displist.h"
-#include "BKE_DerivedMesh.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
@@ -2421,7 +2423,14 @@
 	                                            useSubsurfUv, dm);
 	} else if(useRenderParams) {
 		/* Do not use cache in render mode. */
-		CCGSubSurf *ss = _getSubSurf(NULL, smd->renderLevels, 0, 1, useSimple);
+		CCGSubSurf *ss;
+		int levels;
+		
+		levels= get_render_subsurf_level(&G.scene->r, smd->renderLevels);
+		if(levels == 0)
+			return dm;
+		
+		ss = _getSubSurf(NULL, levels, 0, 1, useSimple);
 
 		ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2008-02-13 10:44:36 UTC (rev 13666)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2008-02-13 11:18:08 UTC (rev 13667)
@@ -7007,10 +7007,18 @@
 				wrld->ao_approx_error= 0.25f;
 		}
 
-		for(sce= main->scene.first; sce; sce= sce->id.next)
+		for(sce= main->scene.first; sce; sce= sce->id.next) {
 			if(sce->nodetree)
 				ntree_version_245(sce->nodetree);
 
+			if(sce->r.simplify_shadowsamples == 0) {
+				sce->r.simplify_subsurf= 6;
+				sce->r.simplify_particles= 1.0f;
+				sce->r.simplify_shadowsamples= 16;
+				sce->r.simplify_aosss= 1.0f;
+			}
+		}
+
 		for(ntree=main->nodetree.first; ntree; ntree= ntree->id.next)
 			ntree_version_245(ntree);
 

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-02-13 10:44:36 UTC (rev 13666)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-02-13 11:18:08 UTC (rev 13667)
@@ -298,6 +298,12 @@
 	/* foreground/background color. */
 	float fg_stamp[4];
 	float bg_stamp[4];
+
+	/* render simplify */
+	int simplify_subsurf;
+	int simplify_shadowsamples;
+	float simplify_particles;
+	float simplify_aosss;
 } RenderData;
 
 
@@ -558,6 +564,7 @@
 #define R_SSS			0x200000
 #define R_NO_OVERWRITE	0x400000 /* skip existing files */
 #define R_TOUCH			0x800000 /* touch files before rendering */
+#define R_SIMPLIFY		0x1000000
 
 
 /* filtertype */

Modified: trunk/blender/source/blender/render/intern/include/shadbuf.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/shadbuf.h	2008-02-13 10:44:36 UTC (rev 13666)
+++ trunk/blender/source/blender/render/intern/include/shadbuf.h	2008-02-13 11:18:08 UTC (rev 13667)
@@ -57,7 +57,7 @@
  * @param inp The inproduct between viewvector and ?
  *
  */
-float testshadowbuf(struct ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp, float mat_bias);	
+float testshadowbuf(struct Render *re, struct ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp, float mat_bias);	
 
 /**
  * Determines the shadow factor for lamp <lar>, between <p1>

Modified: trunk/blender/source/blender/render/intern/source/occlusion.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/occlusion.c	2008-02-13 10:44:36 UTC (rev 13666)
+++ trunk/blender/source/blender/render/intern/source/occlusion.c	2008-02-13 11:18:08 UTC (rev 13667)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list