[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