[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38688] branches/bmesh/blender/source/ blender: sync with r37500, fix for merge, bmesh builds again.

Campbell Barton ideasman42 at gmail.com
Mon Jul 25 12:51:25 CEST 2011


Revision: 38688
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38688
Author:   campbellbarton
Date:     2011-07-25 10:51:24 +0000 (Mon, 25 Jul 2011)
Log Message:
-----------
sync with r37500, fix for merge, bmesh builds again.
also some compiler warning fix.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37500

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/displist.c
    branches/bmesh/blender/source/blender/blenkernel/intern/object.c
    branches/bmesh/blender/source/blender/blenkernel/intern/particle_system.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/editface.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/displist.c	2011-07-25 10:14:02 UTC (rev 38687)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/displist.c	2011-07-25 10:51:24 UTC (rev 38688)
@@ -65,6 +65,9 @@
 #include "BKE_lattice.h"
 #include "BKE_modifier.h"
 
+#include "RE_pipeline.h"
+#include "RE_shader_ext.h"
+
 #include "BLO_sys_types.h" // for intptr_t support
 
 #include "ED_curve.h" /* for BKE_curve_nurbs */
@@ -283,6 +286,499 @@
 	return 1;
 }
 
+/* ***************************** shade displist. note colors now are in rgb(a) order ******************** */
+
+/* create default shade input... save cpu cycles with ugly global */
+/* XXXX bad code warning: local ShadeInput initialize... */
+static ShadeInput shi;
+static void init_fastshade_shadeinput(Render *re)
+{
+	memset(&shi, 0, sizeof(ShadeInput));
+	shi.lay= RE_GetScene(re)->lay;
+	shi.view[2]= -1.0f;
+	shi.passflag= SCE_PASS_COMBINED;
+	shi.combinedflag= -1;
+}
+
+static Render *fastshade_get_render(Scene *UNUSED(scene))
+{
+	// XXX 2.5: this crashes combined with previewrender
+	// due to global R so disabled for now
+#if 0
+	/* XXX ugly global still, but we can't do preview while rendering */
+	if(G.rendering==0) {
+		
+		Render *re= RE_GetRender("_Shade View_");
+		if(re==NULL) {
+			re= RE_NewRender("_Shade View_");
+		
+			RE_Database_Baking(re, scene, 0, 0);	/* 0= no faces */
+		}
+		return re;
+	}
+#endif
+	
+	return NULL;
+}
+
+/* called on file reading */
+void fastshade_free_render(void)
+{
+	Render *re= RE_GetRender("_Shade View_");
+	
+	if(re) {
+		RE_Database_Free(re);
+		RE_FreeRender(re);
+	}
+}
+
+
+static void fastshade_customdata(CustomData *fdata, int a, int j, Material *ma)
+{
+	CustomDataLayer *layer;
+	MTFace *mtface;
+	int index, needuv= ma->texco & TEXCO_UV;
+	char *vertcol;
+
+	shi.totuv= 0;
+	shi.totcol= 0;
+
+	for(index=0; index<fdata->totlayer; index++) {
+		layer= &fdata->layers[index];
+		
+		if(needuv && layer->type == CD_MTFACE && shi.totuv < MAX_MTFACE) {
+			mtface= &((MTFace*)layer->data)[a];
+
+			shi.uv[shi.totuv].uv[0]= 2.0f*mtface->uv[j][0]-1.0f;
+			shi.uv[shi.totuv].uv[1]= 2.0f*mtface->uv[j][1]-1.0f;
+			shi.uv[shi.totuv].uv[2]= 1.0f;
+
+			shi.uv[shi.totuv].name= layer->name;
+			shi.totuv++;
+		}
+		else if(layer->type == CD_MCOL && shi.totcol < MAX_MCOL) {
+			vertcol= (char*)&((MCol*)layer->data)[a*4 + j];
+
+			shi.col[shi.totcol].col[0]= ((float)vertcol[3])/255.0f;
+			shi.col[shi.totcol].col[1]= ((float)vertcol[2])/255.0f;
+			shi.col[shi.totcol].col[2]= ((float)vertcol[1])/255.0f;
+
+			shi.col[shi.totcol].name= layer->name;
+			shi.totcol++;
+		}
+	}
+
+	if(needuv && shi.totuv == 0)
+		VECCOPY(shi.uv[0].uv, shi.lo);
+
+	if(shi.totcol)
+		VECCOPY(shi.vcol, shi.col[0].col);
+}
+
+static void fastshade(float *co, float *nor, float *orco, Material *ma, char *col1, char *col2)
+{
+	ShadeResult shr;
+	int a;
+	
+	VECCOPY(shi.co, co);
+	shi.vn[0]= -nor[0];
+	shi.vn[1]= -nor[1];
+	shi.vn[2]= -nor[2];
+	VECCOPY(shi.vno, shi.vn);
+	VECCOPY(shi.facenor, shi.vn);
+	
+	if(ma->texco) {
+		VECCOPY(shi.lo, orco);
+		
+		if(ma->texco & TEXCO_GLOB) {
+			VECCOPY(shi.gl, shi.lo);
+		}
+		if(ma->texco & TEXCO_WINDOW) {
+			VECCOPY(shi.winco, shi.lo);
+		}
+		if(ma->texco & TEXCO_STICKY) {
+			VECCOPY(shi.sticky, shi.lo);
+		}
+		if(ma->texco & TEXCO_OBJECT) {
+			VECCOPY(shi.co, shi.lo);
+		}
+		if(ma->texco & TEXCO_NORM) {
+			VECCOPY(shi.orn, shi.vn);
+		}
+		if(ma->texco & TEXCO_REFL) {
+			float inp= 2.0f * (shi.vn[2]);
+			shi.ref[0]= (inp*shi.vn[0]);
+			shi.ref[1]= (inp*shi.vn[1]);
+			shi.ref[2]= (-1.0f + inp*shi.vn[2]);
+		}
+	}
+	
+	shi.mat= ma;	/* set each time... node shaders change it */
+	// RE_shade_external(NULL, &shi, &shr);
+	
+	a= 256.0f*(shr.combined[0]);
+	col1[0]= CLAMPIS(a, 0, 255);
+	a= 256.0f*(shr.combined[1]);
+	col1[1]= CLAMPIS(a, 0, 255);
+	a= 256.0f*(shr.combined[2]);
+	col1[2]= CLAMPIS(a, 0, 255);
+	
+	if(col2) {
+		shi.vn[0]= -shi.vn[0];
+		shi.vn[1]= -shi.vn[1];
+		shi.vn[2]= -shi.vn[2];
+		
+		shi.mat= ma;	/* set each time... node shaders change it */
+		// RE_shade_external(NULL, &shi, &shr);
+		
+		a= 256.0f*(shr.combined[0]);
+		col2[0]= CLAMPIS(a, 0, 255);
+		a= 256.0f*(shr.combined[1]);
+		col2[1]= CLAMPIS(a, 0, 255);
+		a= 256.0f*(shr.combined[2]);
+		col2[2]= CLAMPIS(a, 0, 255);
+	}
+}
+
+static void init_fastshade_for_ob(Render *re, Object *ob, int *need_orco_r, float mat[4][4], float imat[3][3])
+{
+	float tmat[4][4];
+	float amb[3]= {0.0f, 0.0f, 0.0f};
+	int a;
+	
+	/* initialize globals in render */
+	// RE_shade_external(re, NULL, NULL);
+
+	/* initialize global here */
+	init_fastshade_shadeinput(re);
+	
+	RE_DataBase_GetView(re, tmat);
+	mul_m4_m4m4(mat, ob->obmat, tmat);
+	
+	invert_m4_m4(tmat, mat);
+	copy_m3_m4(imat, tmat);
+	if(ob->transflag & OB_NEG_SCALE) mul_m3_fl(imat, -1.0);
+	
+	if (need_orco_r) *need_orco_r= 0;
+	for(a=0; a<ob->totcol; a++) {
+		Material *ma= give_current_material(ob, a+1);
+		if(ma) {
+			init_render_material(ma, 0, amb);
+
+			if(ma->texco & TEXCO_ORCO) {
+				if (need_orco_r) *need_orco_r= 1;
+			}
+		}
+	}
+}
+
+static void end_fastshade_for_ob(Object *ob)
+{
+	int a;
+	
+	for(a=0; a<ob->totcol; a++) {
+		Material *ma= give_current_material(ob, a+1);
+		if(ma)
+			end_render_material(ma);
+	}
+}
+
+
+static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, unsigned int **col1_r, unsigned int **col2_r)
+{
+	Mesh *me= ob->data;
+	DerivedMesh *dm;
+	MVert *mvert;
+	MFace *mface;
+	unsigned int *col1, *col2;
+	float *orco, *vnors, *nors, imat[3][3], mat[4][4], vec[3];
+	int a, i, need_orco, totface, totvert;
+	CustomDataMask dataMask = CD_MASK_BAREMESH | CD_MASK_MCOL
+							  | CD_MASK_MTFACE | CD_MASK_NORMAL;
+
+
+	init_fastshade_for_ob(re, ob, &need_orco, mat, imat);
+
+	if(need_orco)
+		dataMask |= CD_MASK_ORCO;
+
+	if (onlyForMesh)
+		dm = mesh_get_derived_deform(RE_GetScene(re), ob, dataMask);
+	else
+		dm = mesh_get_derived_final(RE_GetScene(re), ob, dataMask);
+	
+	mvert = dm->getVertArray(dm);
+	// mface = dm->getFaceArray(dm);
+	// nors = dm->getFaceDataArray(dm, CD_NORMAL);
+	totvert = dm->getNumVerts(dm);
+	totface = dm->getNumFaces(dm);
+	orco= dm->getVertDataArray(dm, CD_ORCO);
+
+	if (onlyForMesh) {
+		col1 = *col1_r;
+		col2 = NULL;
+	} else {
+		*col1_r = col1 = MEM_mallocN(sizeof(*col1)*totface*4, "col1");
+
+		if (col2_r && (me->flag & ME_TWOSIDED))
+			col2 = MEM_mallocN(sizeof(*col2)*totface*4, "col2");
+		else
+			col2 = NULL;
+		
+		if (col2_r) *col2_r = col2;
+	}
+
+		/* vertexnormals */
+	vnors= MEM_mallocN(totvert*3*sizeof(float), "vnors disp");
+	for (a=0; a<totvert; a++) {
+		MVert *mv = &mvert[a];
+		float *vn= &vnors[a*3];
+		float xn= mv->no[0]; 
+		float yn= mv->no[1]; 
+		float zn= mv->no[2];
+		
+			/* transpose ! */
+		vn[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
+		vn[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
+		vn[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
+		normalize_v3(vn);
+	}		
+
+	for (i=0; i<totface; i++) {
+		MFace *mf= &mface[i];
+		Material *ma= give_current_material(ob, mf->mat_nr+1);
+		int j, vidx[4], nverts= mf->v4?4:3;
+		unsigned char *col1base= (unsigned char*) &col1[i*4];
+		unsigned char *col2base= (unsigned char*) (col2?&col2[i*4]:NULL);
+		float nor[3], n1[3];
+		
+		if(ma==NULL) ma= &defmaterial;
+		
+		vidx[0]= mf->v1;
+		vidx[1]= mf->v2;
+		vidx[2]= mf->v3;
+		vidx[3]= mf->v4;
+
+		if (nors) {
+			VECCOPY(nor, &nors[i*3]);
+		} else {
+			if (mf->v4)
+				normal_quad_v3( nor,mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co);
+			else
+				normal_tri_v3( nor,mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co);
+		}
+
+		n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2];
+		n1[1]= imat[1][0]*nor[0]+imat[1][1]*nor[1]+imat[1][2]*nor[2];
+		n1[2]= imat[2][0]*nor[0]+imat[2][1]*nor[1]+imat[2][2]*nor[2];
+		normalize_v3(n1);
+
+		for (j=0; j<nverts; j++) {
+			MVert *mv= &mvert[vidx[j]];
+			char *col1= (char*)&col1base[j*4];
+			char *col2= (char*)(col2base?&col2base[j*4]:NULL);
+			float *vn = (mf->flag & ME_SMOOTH)?&vnors[3*vidx[j]]:n1;
+
+			mul_v3_m4v3(vec, mat, mv->co);
+
+			mul_v3_v3fl(vec, vn, 0.001f);
+
+			fastshade_customdata(&dm->faceData, i, j, ma);
+			fastshade(vec, vn, orco?&orco[vidx[j]*3]:mv->co, ma, col1, col2);
+		}
+	} 
+	MEM_freeN(vnors);
+
+	dm->release(dm);
+
+	end_fastshade_for_ob(ob);
+}
+
+void shadeMeshMCol(Scene *scene, Object *ob, Mesh *me)
+{
+	Render *re= fastshade_get_render(scene);
+	int a;
+	char *cp;
+	unsigned int *mcol= (unsigned int*)me->mcol;
+	
+	if(re) {
+		mesh_create_shadedColors(re, ob, 1, &mcol, NULL);
+		me->mcol= (MCol*)mcol;
+
+		/* swap bytes */
+		for(cp= (char *)me->mcol, a= 4*me->totface; a>0; a--, cp+=4) {
+			SWAP(char, cp[0], cp[3]);
+			SWAP(char, cp[1], cp[2]);
+		}
+	}
+}
+
+/* has base pointer, to check for layer */
+/* called from drawobject.c */
+void shadeDispList(Scene *scene, Base *base)
+{
+	Object *ob= base->object;
+	DispList *dl, *dlob;
+	Material *ma = NULL;
+	Render *re;
+	float imat[3][3], mat[4][4], vec[3];
+	float *fp, *nor, n1[3];
+	unsigned int *col1;
+	int a, need_orco;
+	
+	re= fastshade_get_render(scene);
+	if(re==NULL)
+		return;
+	
+	dl = find_displist(&ob->disp, DL_VERTCOL);
+	if (dl) {
+		BLI_remlink(&ob->disp, dl);
+		free_disp_elem(dl);
+	}
+
+	if(ob->type==OB_MESH) {
+		dl= MEM_callocN(sizeof(DispList), "displistshade");
+		dl->type= DL_VERTCOL;
+
+		mesh_create_shadedColors(re, ob, 0, &dl->col1, &dl->col2);
+
+		/* add dl to ob->disp after mesh_create_shadedColors, because it
+		   might indirectly free ob->disp */
+		BLI_addtail(&ob->disp, dl);
+	}
+	else {
+
+		init_fastshade_for_ob(re, ob, &need_orco, mat, imat);
+		
+		if (ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+		
+			/* now we need the normals */
+			dl= ob->disp.first;
+			
+			while(dl) {
+				dlob= MEM_callocN(sizeof(DispList), "displistshade");
+				BLI_addtail(&ob->disp, dlob);
+				dlob->type= DL_VERTCOL;
+				dlob->parts= dl->parts;
+				dlob->nr= dl->nr;
+				
+				if(dl->type==DL_INDEX3) {
+					col1= dlob->col1= MEM_mallocN(sizeof(int)*dl->nr, "col1");
+				}
+				else {
+					col1= dlob->col1= MEM_mallocN(sizeof(int)*dl->parts*dl->nr, "col1");
+				}
+				
+			
+				ma= give_current_material(ob, dl->col+1);
+				if(ma==NULL) ma= &defmaterial;
+				
+				if(dl->type==DL_INDEX3) {
+					if(dl->nors) {
+						/* there's just one normal */
+						n1[0]= imat[0][0]*dl->nors[0]+imat[0][1]*dl->nors[1]+imat[0][2]*dl->nors[2];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list