[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27326] trunk/blender/source/blender: - Fixed trouble with rendering curves with disabled modifiers, which are

Sergey Sharybin g.ulairi at gmail.com
Mon Mar 8 14:49:13 CET 2010


Revision: 27326
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27326
Author:   nazgul
Date:     2010-03-08 14:49:13 +0100 (Mon, 08 Mar 2010)

Log Message:
-----------
- Fixed trouble with rendering curves with disabled modifiers, which are
  disabled for realtime displaying but enabled for rendering.
- Calculate tex space for curves before modifiers applying.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
    trunk/blender/source/blender/blenkernel/BKE_displist.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h	2010-03-08 13:49:05 UTC (rev 27325)
+++ trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h	2010-03-08 13:49:13 UTC (rev 27326)
@@ -57,6 +57,10 @@
 /* creates a CDDerivedMesh from the given curve object */
 struct DerivedMesh *CDDM_from_curve(struct Object *ob);
 
+/* creates a CDDerivedMesh from the given curve object and specified dispbase */
+/* useful for OrcoDM creation for curves with constructive modifiers */
+DerivedMesh *CDDM_from_curve_customDB(struct Object *ob, struct ListBase *dispbase);
+
 /* Copies the given DerivedMesh with verts, faces & edges stored as
  * custom element data.
  */

Modified: trunk/blender/source/blender/blenkernel/BKE_displist.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_displist.h	2010-03-08 13:49:05 UTC (rev 27325)
+++ trunk/blender/source/blender/blenkernel/BKE_displist.h	2010-03-08 13:49:13 UTC (rev 27326)
@@ -87,8 +87,10 @@
 extern void freedisplist(struct ListBase *lb);
 extern int displist_has_faces(struct ListBase *lb);
 
-extern void makeDispListSurf(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, int forRender, int forOrco);
+extern void makeDispListSurf(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, struct DerivedMesh **derivedFinal, int forRender, int forOrco);
 extern void makeDispListCurveTypes(struct Scene *scene, struct Object *ob, int forOrco);
+extern void makeDispListCurveTypes_forRender(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, struct DerivedMesh **derivedFinal, int forOrco);
+extern void makeDispListCurveTypes_forOrco(struct Scene *scene, struct Object *ob, struct ListBase *dispbase);
 extern void makeDispListMBall(struct Scene *scene, struct Object *ob);
 extern void shadeDispList(struct Scene *scene, struct Base *base);
 extern void shadeMeshMCol(struct Scene *scene, struct Object *ob, struct Mesh *me);
@@ -103,7 +105,7 @@
 float 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 *makeOrcoDispList(struct Scene *scene, struct Object *ob, int forRender);
+float *makeOrcoDispList(struct Scene *scene, struct Object *ob, struct DerivedMesh *derivedFinal, int forRender);
 
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2010-03-08 13:49:05 UTC (rev 27325)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2010-03-08 13:49:13 UTC (rev 27326)
@@ -72,6 +72,9 @@
 void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
 int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *_totvert,
 	struct MEdge **alledge, int *_totedge, struct MFace **allface, int *_totface);
+int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase,
+	struct MVert **allvert, int *_totvert, struct MEdge **alledge, int *_totedge,
+	struct MFace **allface, int *_totface);
 void nurbs_to_mesh(struct Object *ob);
 void mesh_to_curve(struct Scene *scene, struct Object *ob);
 void free_dverts(struct MDeformVert *dvert, int totvert);

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-03-08 13:49:05 UTC (rev 27325)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-03-08 13:49:13 UTC (rev 27326)
@@ -57,6 +57,7 @@
 #include "DNA_object_fluidsim.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_curve_types.h" /* for Curve */
 
 #include "MEM_guardedalloc.h"
 
@@ -1587,6 +1588,11 @@
 
 DerivedMesh *CDDM_from_curve(Object *ob)
 {
+	return CDDM_from_curve_customDB(ob, &((Curve *)ob->data)->disp);
+}
+
+DerivedMesh *CDDM_from_curve_customDB(Object *ob, ListBase *dispbase)
+{
 	DerivedMesh *dm;
 	CDDerivedMesh *cddm;
 	MVert *allvert;
@@ -1594,7 +1600,8 @@
 	MFace *allface;
 	int totvert, totedge, totface;
 
-	if (nurbs_to_mdata (ob, &allvert, &totvert, &alledge, &totedge, &allface, &totface) != 0) {
+	if (nurbs_to_mdata_customdb(ob, dispbase, &allvert, &totvert, &alledge,
+		&totedge, &allface, &totface) != 0) {
 		/* Error initializing mdata. This often happens when curve is empty */
 		return CDDM_new(0, 0, 0);
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2010-03-08 13:49:05 UTC (rev 27325)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2010-03-08 13:49:13 UTC (rev 27326)
@@ -1099,17 +1099,12 @@
 	DispList *dl;
 	int u, v, numVerts;
 	float *fp, *coord_array;
-	int remakeDisp = 0;
+	ListBase disp = {NULL, NULL};
 
-	if (!(cu->flag&CU_UV_ORCO) && cu->key && cu->key->block.first) {
-		makeDispListCurveTypes(scene, ob, 1);
-		remakeDisp = 1;
-	}
+	makeDispListCurveTypes_forOrco(scene, ob, &disp);
 
-	/* Assumes displist has been built */
-
 	numVerts = 0;
-	for (dl=cu->disp.first; dl; dl=dl->next) {
+	for (dl=disp.first; dl; dl=dl->next) {
 		if (dl->type==DL_INDEX3) {
 			numVerts += dl->nr;
 		} else if (dl->type==DL_SURF) {
@@ -1126,7 +1121,7 @@
 	}
 
 	fp= coord_array= MEM_mallocN(3*sizeof(float)*numVerts, "cu_orco");
-	for (dl=cu->disp.first; dl; dl=dl->next) {
+	for (dl=disp.first; dl; dl=dl->next) {
 		if (dl->type==DL_INDEX3) {
 			for (u=0; u<dl->nr; u++, fp+=3) {
 				if (cu->flag & CU_UV_ORCO) {
@@ -1174,9 +1169,7 @@
 		}
 	}
 
-	if (remakeDisp) {
-		makeDispListCurveTypes(scene, ob, 0);
-	}
+	freedisplist(&disp);
 
 	return coord_array;
 }

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2010-03-08 13:49:05 UTC (rev 27325)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2010-03-08 13:49:13 UTC (rev 27326)
@@ -1280,7 +1280,7 @@
 				deformedVerts = curve_getVertexCos(cu, nurb, &numVerts);
 				originalVerts = MEM_dupallocN(deformedVerts);
 			}
-			
+
 			mti->deformVerts(md, ob, NULL, deformedVerts, numVerts, forRender, editmode);
 
 			if (md==preTesselatePoint)
@@ -1292,7 +1292,7 @@
 		curve_applyVertexCos(cu, nurb, deformedVerts);
 	if (keyVerts) /* these are not passed through modifier stack */
 		curve_applyKeyVertexTilts(cu, nurb, keyVerts);
-	
+
 	if(keyVerts)
 		MEM_freeN(keyVerts);
 
@@ -1301,7 +1301,8 @@
 	*numVerts_r = numVerts;
 }
 
-static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispbase, int forRender, float (*originalVerts)[3], float (*deformedVerts)[3])
+static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispbase,
+	DerivedMesh **derivedFinal, int forRender, float (*originalVerts)[3], float (*deformedVerts)[3])
 {
 	ModifierData *md = modifiers_getVirtualModifierList(ob);
 	ModifierData *preTesselatePoint;
@@ -1325,8 +1326,8 @@
 		md = preTesselatePoint->next;
 	}
 
-	if (ob->derivedFinal) {
-		ob->derivedFinal->release (ob->derivedFinal);
+	if (*derivedFinal) {
+		(*derivedFinal)->release (*derivedFinal);
 	}
 
 	for (; md; md=md->next) {
@@ -1427,7 +1428,7 @@
 		MEM_freeN(dmDeformedVerts);
 	}
 
-	ob->derivedFinal = dm;
+	(*derivedFinal) = dm;
 
 	if (deformedVerts) {
 		curve_applyVertexCos(ob->data, nurb, originalVerts);
@@ -1469,14 +1470,13 @@
 static DerivedMesh *create_orco_dm(Scene *scene, Object *ob)
 {
 	DerivedMesh *dm;
-	float (*orco)[3];
+	ListBase disp= {NULL, NULL};
 
-	dm= CDDM_from_curve(ob);
-	orco= (float(*)[3])make_orco_curve(scene, ob);
+	/* OrcoDM should be created from underformed disp lists */
+	makeDispListCurveTypes_forOrco(scene, ob, &disp);
+	dm= CDDM_from_curve_customDB(ob, &disp);
 
-	CDDM_apply_vert_coords(dm, orco);
-	CDDM_calc_normals(dm);
-	MEM_freeN(orco);
+	freedisplist(&disp);
 
 	return dm;
 }
@@ -1516,7 +1516,7 @@
 		DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, orco);
 }
 
-static void curve_calc_orcodm(Scene *scene, Object *ob, int forRender)
+static void curve_calc_orcodm(Scene *scene, Object *ob, DerivedMesh *derivedFinal, int forRender)
 {
 	/* this function represents logic of mesh's orcodm calculation */
 	/* for displist-based objects */
@@ -1526,7 +1526,7 @@
 	Curve *cu= ob->data;
 	int required_mode;
 	int editmode = (!forRender && cu->editnurb);
-	DerivedMesh *dm= ob->derivedFinal, *ndm, *orcodm= NULL;
+	DerivedMesh *ndm, *orcodm= NULL;
 
 	if(forRender) required_mode = eModifierMode_Render;
 	else required_mode = eModifierMode_Realtime;
@@ -1563,13 +1563,14 @@
 	}
 
 	/* add an orco layer if needed */
-	add_orco_dm(scene, ob, dm, orcodm);
+	add_orco_dm(scene, ob, derivedFinal, orcodm);
 
 	if(orcodm)
 		orcodm->release(orcodm);
 }
 
-void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRender, int forOrco)
+void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
+	DerivedMesh **derivedFinal, int forRender, int forOrco)
 {
 	ListBase *nubase;
 	Nurb *nu;
@@ -1642,23 +1643,20 @@
 	}
 
 	if(!forOrco)
-		curve_calc_modifiers_post(scene, ob, dispbase, forRender, originalVerts, deformedVerts);
+		curve_calc_modifiers_post(scene, ob, dispbase, derivedFinal,
+			forRender, originalVerts, deformedVerts);
 }
 
-void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
+static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispbase,
+	DerivedMesh **derivedFinal, int forRender, int forOrco)
 {
 	Curve *cu = ob->data;
-	ListBase *dispbase;
-	
+
 	/* we do allow duplis... this is only displist on curve level */
 	if(!ELEM3(ob->type, OB_SURF, OB_CURVE, OB_FONT)) return;
 
-	freedisplist(&(ob->disp));
-	dispbase= &(cu->disp);
-	freedisplist(dispbase);
-	
 	if(ob->type==OB_SURF) {
-		makeDispListSurf(scene, ob, dispbase, 0, forOrco);
+		makeDispListSurf(scene, ob, dispbase, derivedFinal, forRender, forOrco);
 	}
 	else if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
 		ListBase dlbev;
@@ -1671,16 +1669,16 @@
 			nubase= cu->editnurb;
 		else
 			nubase= &cu->nurb;
-		
+
 		BLI_freelistN(&(cu->bev));
-		
+
 		if(cu->path) free_path(cu->path);
 		cu->path= NULL;
-		
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list