[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