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

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Feb 26 17:20:37 CET 2008


Revision: 13876
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13876
Author:   blendix
Date:     2008-02-26 17:20:36 +0100 (Tue, 26 Feb 2008)

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

Fix for bug #6854: meta object crash with preview render. Meta objects
were using an ugly trick to store render orco's, but there's really no
reason for it, now it works like other primitives.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mball.h
    trunk/blender/source/blender/blenkernel/intern/mball.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mball.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mball.h	2008-02-26 14:25:29 UTC (rev 13875)
+++ trunk/blender/source/blender/blenkernel/BKE_mball.h	2008-02-26 16:20:36 UTC (rev 13876)
@@ -165,8 +165,8 @@
 struct MetaBall *add_mball(char *name);
 struct MetaBall *copy_mball(struct MetaBall *mb);
 void make_local_mball(struct MetaBall *mb);
-void tex_space_mball( struct Object *ob);
-void make_orco_mball( struct Object *ob);
+void tex_space_mball(struct Object *ob);
+float *make_orco_mball(struct Object *ob);
 struct Object *find_basis_mball( struct Object *ob);
 int is_basis_mball(struct Object *ob);
 void metaball_polygonize(struct Object *ob);

Modified: trunk/blender/source/blender/blenkernel/intern/mball.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mball.c	2008-02-26 14:25:29 UTC (rev 13875)
+++ trunk/blender/source/blender/blenkernel/intern/mball.c	2008-02-26 16:20:36 UTC (rev 13876)
@@ -233,13 +233,15 @@
 	boundbox_set_from_min_max(bb, min, max);
 }
 
-void make_orco_mball(Object *ob)
+float *make_orco_mball(Object *ob)
 {
 	BoundBox *bb;
 	DispList *dl;
-	float *data;
+	float *data, *orco, *orcodata;
 	float loc[3], size[3];
 	int a;
+
+	orcodata= MEM_mallocN(sizeof(float)*3*dl->nr, "MballOrco");
 	
 	/* restore size and loc */
 	bb= ob->bb;
@@ -252,14 +254,18 @@
 
 	dl= ob->disp.first;
 	data= dl->verts;
+	orco= orcodata;
 	a= dl->nr;
 	while(a--) {
-		data[0]= (data[0]-loc[0])/size[0];
-		data[1]= (data[1]-loc[1])/size[1];
-		data[2]= (data[2]-loc[2])/size[2];
+		orco[0]= (data[0]-loc[0])/size[0];
+		orco[1]= (data[1]-loc[1])/size[1];
+		orco[2]= (data[2]-loc[2])/size[2];
 
 		data+= 3;
+		orco+= 3;
 	}
+
+	return orcodata;
 }
 /** \brief Test, if Object *ob is basic MetaBall.
  *

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-02-26 14:25:29 UTC (rev 13875)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-02-26 16:20:36 UTC (rev 13876)
@@ -930,6 +930,8 @@
 			orco = make_orco_curve(ob);
 		} else if (ob->type==OB_SURF) {
 			orco = make_orco_surf(ob);
+		} else if (ob->type==OB_MBALL) {
+			orco = make_orco_mball(ob);
 		}
 		
 		if (orco)
@@ -2346,7 +2348,7 @@
 	VertRen *ver;
 	VlakRen *vlr, *vlr1;
 	Material *ma;
-	float *data, *nors, mat[4][4], imat[3][3], xn, yn, zn;
+	float *data, *nors, *orco, mat[4][4], imat[3][3], xn, yn, zn;
 	int a, need_orco, *index;
 
 	if (ob!=find_basis_mball(ob))
@@ -2369,8 +2371,9 @@
 
 	data= dl->verts;
 	nors= dl->nors;
+	orco= get_object_orco(re, ob);
 
-	for(a=0; a<dl->nr; a++, data+=3, nors+=3) {
+	for(a=0; a<dl->nr; a++, data+=3, nors+=3, orco+=3) {
 
 		ver= RE_findOrAddVert(obr, obr->totvert++);
 		VECCOPY(ver->co, data);
@@ -2388,7 +2391,7 @@
 		Normalize(ver->n);
 		//if(ob->transflag & OB_NEG_SCALE) VecMulf(ver->n. -1.0);
 		
-		if(need_orco) ver->orco= data;
+		if(need_orco) ver->orco= orco;
 	}
 
 	index= dl->index;
@@ -2422,14 +2425,8 @@
 		}
 	}
 
-	if(need_orco) {
-		/* store displist and scale */
-		make_orco_mball(ob);
-	}
-	else {
-		/* enforce display lists remade */
-		freedisplist(&ob->disp);
-	}
+	/* enforce display lists remade */
+	freedisplist(&ob->disp);
 	
 	/* this enforces remake for real, orco displist is small (in scale) */
 	ob->recalc |= OB_RECALC_DATA;





More information about the Bf-blender-cvs mailing list