Revision: 42082
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42082
Author:   campbellbarton
Date:     2011-11-22 19:43:09 +0000 (Tue, 22 Nov 2011)
Log Message:
-----------
ocean sim now works with bmesh

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_ocean.c

Modified: 
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c     
2011-11-22 19:04:40 UTC (rev 42081)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c     
2011-11-22 19:43:09 UTC (rev 42082)
@@ -2496,7 +2496,7 @@
        BLI_edgehash_free(eh, NULL);
 }
 
-
+/* warning, this uses existing edges but CDDM_calc_edges() doesn't */
 void CDDM_calc_edges_poly(DerivedMesh *dm)
 {
        CDDerivedMesh *cddm = (CDDerivedMesh*)dm;

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_ocean.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_ocean.c  
2011-11-22 19:04:40 UTC (rev 42081)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_ocean.c  
2011-11-22 19:43:09 UTC (rev 42082)
@@ -269,7 +269,8 @@
        DerivedMesh *result;
 
        MVert *mverts;
-       MFace *mfaces;
+       MPoly *mpolys;
+       MLoop *mloops;
        int *origindex;
 
        int cdlayer;
@@ -280,7 +281,7 @@
        const int res_y = ry * omd->repeat_y;
 
        const int num_verts = (res_x + 1) * (res_y + 1);
-       const int num_edges = (res_x * res_y * 2) + res_x + res_y;
+       /* const int num_edges = (res_x * res_y * 2) + res_x + res_y; */ /* 
UNUSED BMESH */
        const int num_faces = res_x * res_y;
 
        float sx = omd->size * omd->spatial_size;
@@ -295,11 +296,17 @@
        sx /= rx;
        sy /= ry;
 
-       result = CDDM_new(num_verts, num_edges, num_faces);
+       result = CDDM_new(num_verts, 0, 0, num_faces * 4, num_faces);
 
        mverts = CDDM_get_verts(result);
-       mfaces = CDDM_get_faces(result);
+       mpolys = CDDM_get_polys(result);
+       mloops = CDDM_get_loops(result);
+
+#if 0 // trunk
        origindex= result->getFaceDataArray(result, CD_ORIGINDEX);
+#else // bmesh
+       origindex= CustomData_get_layer(&result->polyData, CD_ORIGINDEX);
+#endif
 
        /* create vertices */
        #pragma omp parallel for private(x, y) if (rx > OMP_MIN_RES)
@@ -319,44 +326,60 @@
                for (x=0; x < res_x; x++) {
                        const int fi = y*res_x + x;
                        const int vi = y*(res_x+1) + x;
-                       MFace *mf= &mfaces[fi];
-                       mf->v1 = vi;
-                       mf->v2 = vi + 1;
-                       mf->v3 = vi + 1 + res_x+1;
-                       mf->v4 = vi + res_x+1;
+                       MPoly *mp= &mpolys[fi];
+                       MLoop *ml= &mloops[fi * 4];
 
-                       mf->flag |= ME_SMOOTH;
+                       ml->v = vi;
+                       ml++;
+                       ml->v = vi + 1;
+                       ml++;
+                       ml->v = vi + 1 + res_x + 1;
+                       ml++;
+                       ml->v = vi + res_x + 1;
+                       ml++;
 
+                       mp->loopstart= fi * 4;
+                       mp->totloop= 4;
+
+                       mp->flag |= ME_SMOOTH;
+
                        /* generated geometry does not map to original faces */
                        origindex[fi] = ORIGINDEX_NONE;
                }
        }
 
-       CDDM_calc_edges(result);
+       CDDM_calc_edges_poly(result);
 
        /* add uvs */
-       cdlayer= CustomData_number_of_layers(&result->faceData, CD_MTFACE);
+       cdlayer= CustomData_number_of_layers(&result->loopData, CD_MLOOPUV);
        if(cdlayer < MAX_MTFACE) {
-               MTFace *tfaces= CustomData_add_layer(&result->faceData, 
CD_MTFACE, CD_CALLOC, NULL, num_faces);
+               MLoopUV *mloopuvs= CustomData_add_layer(&result->loopData, 
CD_MLOOPUV, CD_CALLOC, NULL, num_faces * 4);
 
-               if (tfaces) { /* unlikely to fail */
+               if (mloopuvs) { /* unlikely to fail */
                        ix = 1.0 / rx;
                        iy = 1.0 / ry;
                        #pragma omp parallel for private(x, y) if (rx > 
OMP_MIN_RES)
                        for (y=0; y < res_y; y++) {
                                for (x=0; x < res_x; x++) {
                                        const int i = y*res_x + x;
-                                       tfaces[i].uv[0][0] = x * ix;
-                                       tfaces[i].uv[0][1] = y * iy;
+                                       MLoopUV *luv= &mloopuvs[i * 4];
 
-                                       tfaces[i].uv[1][0] = (x+1) * ix;
-                                       tfaces[i].uv[1][1] = y * iy;
+                                       luv->uv[0] = x * ix;
+                                       luv->uv[1] = y * iy;
+                                       luv++;
 
-                                       tfaces[i].uv[2][0] = (x+1) * ix;
-                                       tfaces[i].uv[2][1] = (y+1) * iy;
+                                       luv->uv[0] = (x+1) * ix;
+                                       luv->uv[1] = y * iy;
+                                       luv++;
 
-                                       tfaces[i].uv[3][0] = x * ix;
-                                       tfaces[i].uv[3][1] = (y+1) * iy;
+                                       luv->uv[0] = (x+1) * ix;
+                                       luv->uv[1] = (y+1) * iy;
+                                       luv++;
+
+                                       luv->uv[0] = x * ix;
+                                       luv->uv[1] = (y+1) * iy;
+                                       luv++;
+
                                }
                        }
                }
@@ -375,6 +398,7 @@
        OceanResult ocr;
 
        MVert *mverts, *mv;
+       MLoop *mloops;
 
        int i, j;
 
@@ -413,7 +437,7 @@
        if (omd->geometry_mode == MOD_OCEAN_GEOM_GENERATE)
                dm = generate_ocean_geometry(omd);
        else if (omd->geometry_mode == MOD_OCEAN_GEOM_DISPLACE) {
-               dm = CDDM_copy(derivedData);
+               dm = CDDM_copy(derivedData, 0);
        }
 
        cfra = md->scene->r.cfra;
@@ -424,26 +448,31 @@
        num_faces = dm->getNumFaces(dm);
 
        mverts = dm->getVertArray(dm);
+       mloops = dm->getLoopArray(dm);
 
        /* add vcols before displacement - allows lookup based on position */
 
        if (omd->flag & MOD_OCEAN_GENERATE_FOAM) {
-               int cdlayer= CustomData_number_of_layers(&dm->faceData, 
CD_MCOL);
+               int cdlayer= CustomData_number_of_layers(&dm->loopData, 
CD_MLOOPCOL);
 
                if(cdlayer < MAX_MCOL) {
-                       MCol *mcols= CustomData_add_layer_named(&dm->faceData, 
CD_MCOL, CD_CALLOC, NULL, num_faces, omd->foamlayername);
+                       MLoopCol *mloopcols= 
CustomData_add_layer_named(&dm->loopData, CD_MLOOPCOL, CD_CALLOC, NULL, 
num_faces * 4, omd->foamlayername);
 
-                       if (mcols) { /* unlikely to fail */
-                               MCol *mc;
-                               MFace *mfaces= dm->getFaceArray(dm);
-                               MFace *mf;
+                       if (mloopcols) { /* unlikely to fail */
+                               MLoopCol *mlcol;
+                               MPoly *mpolys= dm->getPolyArray(dm);
+                               MPoly *mp;
 
                                float foam;
 
-                               for (i = 0, mf= mfaces; i < num_faces; i++, 
mf++) {
-                                       j= mf->v4 ? 3 : 2;
+                               for (i = 0, mp= mpolys; i < num_faces; i++, 
mp++) {
+                                       j= mp->totloop - 1;
+
+                                       /* highly unlikely */
+                                       if (j <= 0) continue;
+
                                        do {
-                                               const float *co= 
mverts[*(&mf->v1 + j)].co;
+                                               const float *co= 
mverts[mloops[mp->loopstart + j].v].co;
                                                const float u = 
OCEAN_CO(size_co_inv, co[0]);
                                                const float v = 
OCEAN_CO(size_co_inv, co[1]);
 
@@ -457,8 +486,8 @@
                                                        foam = 
BKE_ocean_jminus_to_foam(ocr.Jminus, omd->foam_coverage);
                                                }
 
-                                               mc= &mcols[i*4 + j];
-                                               mc->r = mc->g = mc->b = 
(char)(foam * 255);
+                                               mlcol= &mloopcols[mp->loopstart 
+ j];
+                                               mlcol->r = mlcol->g = mlcol->b 
= (char)(foam * 255);
                                                /* mc->a = 255; */ /* no need 
to set */
                                        } while (j--);
                                }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to