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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to