[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55796] trunk/blender/source/blender: Fix #34867: cycles viewport render did not respect viewport visibility for

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Apr 5 02:33:59 CEST 2013


Revision: 55796
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55796
Author:   blendix
Date:     2013-04-05 00:33:59 +0000 (Fri, 05 Apr 2013)
Log Message:
-----------
Fix #34867: cycles viewport render did not respect viewport visibility for
modifiers with text/curve/surface objects.

This is because the code here did not yet support the distinction between
generating the tesselated mesh at viewport/render resolution and generating a
separate displist/derivedmesh for render that is not stored in the object but
created and freed on the fly.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/BKE_displist.h
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/makesrna/intern/rna_main_api.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2013-04-05 00:30:32 UTC (rev 55795)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2013-04-05 00:33:59 UTC (rev 55796)
@@ -87,7 +87,7 @@
 float *BKE_curve_surf_make_orco(struct Object *ob);
 
 void BKE_curve_bevelList_make(struct Object *ob);
-void BKE_curve_bevel_make(struct Scene *scene, struct Object *ob,  struct ListBase *disp, int forRender);
+void BKE_curve_bevel_make(struct Scene *scene, struct Object *ob,  struct ListBase *disp, int forRender, int renderResolution);
 
 void BKE_curve_forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride);
 

Modified: trunk/blender/source/blender/blenkernel/BKE_displist.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_displist.h	2013-04-05 00:30:32 UTC (rev 55795)
+++ trunk/blender/source/blender/blenkernel/BKE_displist.h	2013-04-05 00:33:59 UTC (rev 55796)
@@ -87,9 +87,9 @@
 void BKE_displist_free(struct ListBase *lb);
 bool BKE_displist_has_faces(struct ListBase *lb);
 
-void BKE_displist_make_surf(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, struct DerivedMesh **derivedFinal, int forRender, int forOrco);
+void BKE_displist_make_surf(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, struct DerivedMesh **derivedFinal, int forRender, int forOrco, int renderResolution);
 void BKE_displist_make_curveTypes(struct Scene *scene, struct Object *ob, int forOrco);
-void BKE_displist_make_curveTypes_forRender(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, struct DerivedMesh **derivedFinal, int forOrco);
+void BKE_displist_make_curveTypes_forRender(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, struct DerivedMesh **derivedFinal, int forOrco, int renderResolution);
 void BKE_displist_make_curveTypes_forOrco(struct Scene *scene, struct Object *ob, struct ListBase *dispbase);
 void BKE_displist_make_mball(struct Scene *scene, struct Object *ob);
 void BKE_displist_make_mball_forRender(struct Scene *scene, struct Object *ob, struct ListBase *dispbase);
@@ -100,6 +100,6 @@
 float BKE_displist_calc_taper(struct Scene *scene, struct Object *taperobj, int cur, int tot);
 
 /* add Orco layer to the displist object which has got derived mesh and return orco */
-float *BKE_displist_make_orco(struct Scene *scene, struct Object *ob, struct DerivedMesh *derivedFinal, int forRender);
+float *BKE_displist_make_orco(struct Scene *scene, struct Object *ob, struct DerivedMesh *derivedFinal, int forRender, int renderResolution);
 
 #endif

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2013-04-05 00:30:32 UTC (rev 55795)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2013-04-05 00:33:59 UTC (rev 55796)
@@ -1418,7 +1418,7 @@
 
 /* ***************** BEVEL ****************** */
 
-void BKE_curve_bevel_make(Scene *scene, Object *ob, ListBase *disp, int forRender)
+void BKE_curve_bevel_make(Scene *scene, Object *ob, ListBase *disp, int forRender, int renderResolution)
 {
 	DispList *dl, *dlnew;
 	Curve *bevcu, *cu;
@@ -1442,7 +1442,7 @@
 			facy = cu->bevobj->size[1];
 
 			if (forRender) {
-				BKE_displist_make_curveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0);
+				BKE_displist_make_curveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0, renderResolution);
 				dl = bevdisp.first;
 			}
 			else {

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2013-04-05 00:30:32 UTC (rev 55795)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2013-04-05 00:33:59 UTC (rev 55796)
@@ -302,7 +302,7 @@
 
 /* ****************** make displists ********************* */
 
-static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase, int forRender)
+static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase, int forRender, int renderResolution)
 {
 	Nurb *nu;
 	DispList *dl;
@@ -315,7 +315,7 @@
 	nu = nubase->first;
 	while (nu) {
 		if (nu->hide == 0 || editmode == 0) {
-			if (forRender && cu->resolu_ren != 0)
+			if (renderResolution && cu->resolu_ren != 0)
 				resolu = cu->resolu_ren;
 			else
 				resolu = nu->resolu;
@@ -731,13 +731,13 @@
 	object_deform_mball(ob, dispbase);
 }
 
-static ModifierData *curve_get_tessellate_point(Scene *scene, Object *ob, int forRender, int editmode)
+static ModifierData *curve_get_tessellate_point(Scene *scene, Object *ob, int renderResolution, int editmode)
 {
 	ModifierData *md = modifiers_getVirtualModifierList(ob);
 	ModifierData *pretessellatePoint;
 	int required_mode;
 
-	if (forRender)
+	if (renderResolution)
 		required_mode = eModifierMode_Render;
 	else
 		required_mode = eModifierMode_Realtime;
@@ -771,7 +771,8 @@
 	return pretessellatePoint;
 }
 
-static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, float (**originalVerts_r)[3],
+static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, int renderResolution,
+                                     float (**originalVerts_r)[3],
                                      float (**deformedVerts_r)[3], int *numVerts_r)
 {
 	ModifierData *md = modifiers_getVirtualModifierList(ob);
@@ -788,14 +789,14 @@
 
 	if (editmode)
 		app_flag |= MOD_APPLY_USECACHE;
-	if (forRender) {
+	if (renderResolution) {
 		app_flag |= MOD_APPLY_RENDER;
 		required_mode = eModifierMode_Render;
 	}
 	else
 		required_mode = eModifierMode_Realtime;
 
-	pretessellatePoint = curve_get_tessellate_point(scene, ob, forRender, editmode);
+	pretessellatePoint = curve_get_tessellate_point(scene, ob, renderResolution, editmode);
 
 	if (editmode)
 		required_mode |= eModifierMode_Editmode;
@@ -885,7 +886,8 @@
 }
 
 static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispbase, DerivedMesh **derivedFinal,
-                                      int forRender, float (*originalVerts)[3], float (*deformedVerts)[3])
+                                      int forRender, int renderResolution,
+                                      float (*originalVerts)[3], float (*deformedVerts)[3])
 {
 	ModifierData *md = modifiers_getVirtualModifierList(ob);
 	ModifierData *pretessellatePoint;
@@ -898,14 +900,14 @@
 	int useCache = !forRender;
 	ModifierApplyFlag app_flag = 0;
 
-	if (forRender) {
+	if (renderResolution) {
 		app_flag |= MOD_APPLY_RENDER;
 		required_mode = eModifierMode_Render;
 	}
 	else
 		required_mode = eModifierMode_Realtime;
 
-	pretessellatePoint = curve_get_tessellate_point(scene, ob, forRender, editmode);
+	pretessellatePoint = curve_get_tessellate_point(scene, ob, renderResolution, editmode);
 
 	if (editmode)
 		required_mode |= eModifierMode_Editmode;
@@ -1109,7 +1111,7 @@
 		DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, orco);
 }
 
-static void curve_calc_orcodm(Scene *scene, Object *ob, DerivedMesh *derivedFinal, int forRender)
+static void curve_calc_orcodm(Scene *scene, Object *ob, DerivedMesh *derivedFinal, int forRender, int renderResolution)
 {
 	/* this function represents logic of mesh's orcodm calculation
 	 * for displist-based objects
@@ -1121,14 +1123,14 @@
 	int required_mode;
 	int editmode = (!forRender && (cu->editnurb || cu->editfont));
 	DerivedMesh *ndm, *orcodm = NULL;
-	const ModifierApplyFlag app_flag = forRender ? MOD_APPLY_RENDER : 0;
+	const ModifierApplyFlag app_flag = renderResolution ? MOD_APPLY_RENDER : 0;
 
-	if (forRender)
+	if (renderResolution)
 		required_mode = eModifierMode_Render;
 	else
 		required_mode = eModifierMode_Realtime;
 
-	pretessellatePoint = curve_get_tessellate_point(scene, ob, forRender, editmode);
+	pretessellatePoint = curve_get_tessellate_point(scene, ob, renderResolution, editmode);
 
 	if (editmode)
 		required_mode |= eModifierMode_Editmode;
@@ -1169,7 +1171,7 @@
 }
 
 void BKE_displist_make_surf(Scene *scene, Object *ob, ListBase *dispbase,
-                            DerivedMesh **derivedFinal, int forRender, int forOrco)
+                            DerivedMesh **derivedFinal, int forRender, int forOrco, int renderResolution)
 {
 	ListBase *nubase;
 	Nurb *nu;
@@ -1187,13 +1189,13 @@
 		nubase = &cu->nurb;
 
 	if (!forOrco)
-		curve_calc_modifiers_pre(scene, ob, forRender, &originalVerts, &deformedVerts, &numVerts);
+		curve_calc_modifiers_pre(scene, ob, forRender, renderResolution, &originalVerts, &deformedVerts, &numVerts);
 
 	for (nu = nubase->first; nu; nu = nu->next) {
 		if (forRender || nu->hide == 0) {
 			int resolu = nu->resolu, resolv = nu->resolv;
 
-			if (forRender) {
+			if (renderResolution) {
 				if (cu->resolu_ren)
 					resolu = cu->resolu_ren;
 				if (cu->resolv_ren)
@@ -1263,7 +1265,8 @@
 
 	if (!forOrco) {
 		curve_calc_modifiers_post(scene, ob, dispbase, derivedFinal,
-		                          forRender, originalVerts, deformedVerts);
+		                          forRender, renderResolution,
+		                          originalVerts, deformedVerts);
 	}
 }
 
@@ -1350,7 +1353,7 @@
 }
 
 static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispbase,
-                                      DerivedMesh **derivedFinal, int forRender, int forOrco)
+                                      DerivedMesh **derivedFinal, int forRender, int forOrco, int renderResolution)
 {
 	Curve *cu = ob->data;
 
@@ -1358,7 +1361,7 @@
 	if (!ELEM3(ob->type, OB_SURF, OB_CURVE, OB_FONT)) return;
 
 	if (ob->type == OB_SURF) {
-		BKE_displist_make_surf(scene, ob, dispbase, derivedFinal, forRender, forOrco);
+		BKE_displist_make_surf(scene, ob, dispbase, derivedFinal, forRender, forOrco, renderResolution);
 	}
 	else if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
 		ListBase dlbev;
@@ -1378,16 +1381,16 @@
 			BKE_vfont_to_curve(G.main, scene, ob, 0);
 
 		if (!forOrco)
-			curve_calc_modifiers_pre(scene, ob, forRender, &originalVerts, &deformedVerts, &numVerts);
+			curve_calc_modifiers_pre(scene, ob, forRender, renderResolution, &originalVerts, &deformedVerts, &numVerts);
 
 		BKE_curve_bevelList_make(ob);
 
 		/* If curve has no bevel will return nothing */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list