Commit: 790c47be71a4e00ebc6951d46616d20935ea1110
Author: Antony Riakiotakis
Date:   Wed Jul 15 17:36:59 2015 +0200
Branches: temp-derivedmesh-looptri
https://developer.blender.org/rB790c47be71a4e00ebc6951d46616d20935ea1110

Start move drawing code for cdderivedmesh to indexed/mpoly design.
This is WIP mostly to merge some work that gets rid of code we
don't really need to port.

===================================================================

M       source/blender/blenkernel/intern/cdderivedmesh.c

===================================================================

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c 
b/source/blender/blenkernel/intern/cdderivedmesh.c
index 11ca69a..4a727c8 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -38,6 +38,7 @@
 #include "BLI_edgehash.h"
 #include "BLI_utildefines.h"
 #include "BLI_stackdefines.h"
+#include "BLI_array.h"
 
 #include "BKE_pbvh.h"
 #include "BKE_cdderivedmesh.h"
@@ -1283,9 +1284,9 @@ static void cdDM_buffer_copy_triangles(
                start = gpumat->counter;
 
                /* v1 v2 v3 */
-               varray[start++] = findex;
-               varray[start++] = findex + 1;
-               varray[start++] = findex + 2;
+               varray[start++] = lt->tri[0];
+               varray[start++] = lt->tri[1];
+               varray[start++] = lt->tri[2];
 
                gpumat->counter += 3;
                findex += 3;
@@ -1296,23 +1297,23 @@ static void cdDM_buffer_copy_vertex(
         DerivedMesh *dm, float *varray)
 {
        const MVert *mvert;
-       int i, j, start, tottri;
-
+       const MPoly *mpoly;
        const MLoop *mloop;
-       const MLoopTri *lt;
 
-       mloop = dm->getLoopArray(dm);
+       int i, j, start, totpoly;
+
        mvert = dm->getVertArray(dm);
-       lt = dm->looptris.array;
-       tottri = dm->looptris.num;
+       mpoly = dm->getPolyArray(dm);
+       mloop = dm->getLoopArray(dm);
+       totpoly = dm->getNumPolys(dm);
 
        start = 0;
 
-       for (i = 0; i < tottri; i++, lt++) {
-               copy_v3_v3(&varray[start + 0], mvert[mloop[lt->tri[0]].v].co);
-               copy_v3_v3(&varray[start + 3], mvert[mloop[lt->tri[1]].v].co);
-               copy_v3_v3(&varray[start + 6], mvert[mloop[lt->tri[2]].v].co);
-               start += 9;
+       for (i = 0; i < totpoly; i++, mpoly++) {
+               for (j = 0; j < mpoly->totloop; j++) {
+                       copy_v3_v3(&varray[start], mvert[mloop[mpoly->loopstart 
+ j].v].co);
+                       start += 3;
+               }
        }
 
        /* copy loose points */
@@ -1328,98 +1329,94 @@ static void cdDM_buffer_copy_vertex(
 static void cdDM_buffer_copy_normal(
         DerivedMesh *dm, short *varray)
 {
-       int i, tottri;
+       int i, j, totpoly;
        int start;
 
+       const float **v_coords = NULL;
+       BLI_array_staticdeclare(v_coords, BM_DEFAULT_NGON_STACK_SIZE);
+
        const float (*nors)[3] = dm->getPolyDataArray(dm, CD_NORMAL);
        const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL);
-       const MVert *mvert = dm->getVertArray(dm);
 
+       const bool normal_loop_face = (nors || lnors) != 0;
+
+       const MVert *mvert;
        const MPoly *mpoly;
        const MLoop *mloop;
-       const MLoopTri *lt;
 
+       short f_no_s[3];
+
+       mvert = dm->getVertArray(dm);
        mpoly = dm->getPolyArray(dm);
        mloop = dm->getLoopArray(dm);
-       mvert = dm->getVertArray(dm);
-       lt = dm->looptris.array;
-       tottri = dm->looptris.num;
+       totpoly = dm->getNumPolys(dm);
 
        start = 0;
-       for (i = 0; i < tottri; i++, lt++) {
-               const MPoly *mp = &mpoly[lt->poly];
-               const unsigned int *ltri = lt->tri;
-               const bool smoothnormal = (mp->flag & ME_SMOOTH) != 0;
-
-               if (lnors) {
-                       /* Copy loop normals */
-                       normal_float_to_short_v3(&varray[start + 0], 
lnors[ltri[0]]);
-                       normal_float_to_short_v3(&varray[start + 4], 
lnors[ltri[1]]);
-                       normal_float_to_short_v3(&varray[start + 8], 
lnors[ltri[2]]);
-               }
-               else if (smoothnormal) {
-                       /* copy vertex normal */
-                       copy_v3_v3_short(&varray[start + 0], 
mvert[mloop[ltri[0]].v].no);
-                       copy_v3_v3_short(&varray[start + 4], 
mvert[mloop[ltri[1]].v].no);
-                       copy_v3_v3_short(&varray[start + 8], 
mvert[mloop[ltri[2]].v].no);
-               }
-               else if (nors) {
-                       /* copy cached face normal */
-                       short f_no_s[3];
+       for (i = 0; i < totpoly; i++, mpoly++) {
+               const bool smoothnormal = (mpoly->flag & ME_SMOOTH) != 0;
 
-                       normal_float_to_short_v3(f_no_s, nors[lt->poly]);
-
-                       copy_v3_v3_short(&varray[start + 0], f_no_s);
-                       copy_v3_v3_short(&varray[start + 4], f_no_s);
-                       copy_v3_v3_short(&varray[start + 8], f_no_s);
-               }
-               else {
+               /* if needed calculate the face normal now */
+               if (!(normal_loop_face || smoothnormal)) {
                        /* calculate face normal */
                        float f_no[3];
-                       short f_no_s[3];
 
-                       normal_tri_v3(
-                               f_no,
-                               mvert[mloop[ltri[0]].v].co,
-                               mvert[mloop[ltri[1]].v].co,
-                               mvert[mloop[ltri[2]].v].co);
+                       for (j = 0; j < mpoly->totloop; j++)
+                               BLI_array_append(v_coords, 
mvert[mloop[mpoly->loopstart + j].v].co);
+                       normal_poly_v3(f_no, (const float (*)[3]) v_coords, 
mpoly->totloop);
 
                        normal_float_to_short_v3(f_no_s, f_no);
-
-                       copy_v3_v3_short(&varray[start + 0], f_no_s);
-                       copy_v3_v3_short(&varray[start + 4], f_no_s);
-                       copy_v3_v3_short(&varray[start + 8], f_no_s);
+                       BLI_array_empty(v_coords);
                }
 
-               start += 12;
+               for (j = 0; j < mpoly->totloop; j++) {
+                       if (lnors) {
+                               /* Copy loop normals */
+                               normal_float_to_short_v3(&varray[start], 
lnors[mpoly->loopstart + j]);
+                       }
+                       else if (smoothnormal) {
+                               /* copy vertex normal */
+                               copy_v3_v3_short(&varray[start], 
mvert[mloop[mpoly->loopstart + j].v].no);
+                       }
+                       else if (nors) {
+                               /* copy cached face normal */
+                               short f_no_s[3];
+
+                               normal_float_to_short_v3(f_no_s, nors[i]);
+
+                               copy_v3_v3_short(&varray[start], f_no_s);
+                       }
+                       else {
+                               copy_v3_v3_short(&varray[start], f_no_s);
+                       }
+                       start += 4;
+               }
        }
+
+       BLI_array_free(v_coords);
 }
 
 static void cdDM_buffer_copy_uv(
         DerivedMesh *dm, float *varray)
 {
-       int i, tottri;
+       int i, j, totpoly;
        int start;
 
-       const MLoopTri *lt;
+       const MPoly *mpoly;
        const MLoopUV *mloopuv;
 
        if ((mloopuv = DM_get_loop_data_layer(dm, CD_MLOOPUV)) == NULL) {
                return;
        }
 
-       lt = dm->looptris.array;
-       tottri = dm->looptris.num;
+       mpoly = dm->getPolyArray(dm);
+       totpoly = dm->getNumPolys(dm);
 
        start = 0;
-       for (i = 0; i < tottri; i++, lt++) {
-               const unsigned int *ltri = lt->tri;
-
-               /* v1 v2 v3 */
-               copy_v2_v2(&varray[start + 0], mloopuv[ltri[0]].uv);
-               copy_v2_v2(&varray[start + 2], mloopuv[ltri[1]].uv);
-               copy_v2_v2(&varray[start + 4], mloopuv[ltri[2]].uv);
-               start += 6;
+       for (i = 0; i < totpoly; i++, mpoly++) {
+               for (j = 0; j < mpoly->totloop; j++) {
+                       copy_v2_v2(&varray[start], mloopuv[mpoly->loopstart + 
j].uv);
+                       start += 2;
+               }
        }
 }
 
@@ -1659,32 +1656,17 @@ static void 
cdDM_drawobject_add_vert_point(GPUDrawObject *gdo, int vert_index, i
 
 #endif  /* USE_GPU_POINT_LINK */
 
-/* update the vert_points and triangle_to_mface fields with a new
- * triangle */
-static void cdDM_drawobject_add_triangle(
-        GPUDrawObject *gdo,
-        const MLoop *mloop,
-        const MLoopTri *lt,
-        const int loop_index)
-{
-       int i;
-       for (i = 0; i < 3; i++) {
-               cdDM_drawobject_add_vert_point(gdo, mloop[lt->tri[i]].v, 
loop_index + i);
-       }
-}
-
 /* for each vertex, build a list of points related to it; these lists
  * are stored in an array sized to the number of vertices */
 static void cdDM_drawobject_init_vert_points(
         GPUDrawObject *gdo,
         const MPoly *mpoly, const MLoop *mloop,
-        const MLoopTri *mlooptri, int mlooptri_num,
+        int tot_poly,
         int totmat)
 {
        GPUBufferMaterial *mat;
        int i, *mat_orig_to_new;
        int tot_loops = 0;
-       const MLoopTri *lt;
 
        mat_orig_to_new = MEM_callocN(sizeof(*mat_orig_to_new) * totmat,
                                                     
"GPUDrawObject.mat_orig_to_new");
@@ -1712,16 +1694,18 @@ static void cdDM_drawobject_init_vert_points(
                gdo->vert_points[i].point_index = -1;
        }
 
-       for (i = 0, lt = mlooptri; i < mlooptri_num; i++, lt++) {
-               const MPoly *mp = &mpoly[lt->poly];
+       for (i = 0; i < tot_poly; i++) {
+               int j;
+               const MPoly *mp = &mpoly[i];
                mat = &gdo->materials[mat_orig_to_new[mp->mat_nr]];
 
                mat->polys[mat->counter++] = i;
 
-               /* add triangle */
-               cdDM_drawobject_add_triangle(gdo, mloop, lt, tot_loops);
-               mat->totelements += 3;
-               tot_loops += 3;
+               /* assign unique indices to vertices of the mesh */
+               for (j = 0; j < mp->totloop; j++) {
+                       cdDM_drawobject_add_vert_point(gdo, mloop[mp->loopstart 
+ j].v, tot_loops + j);
+               }
+               tot_loops += mp->totloop;
        }
 
        /* map any unused vertices to loose points */
@@ -1748,10 +1732,9 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
        GPUDrawObject *gdo;
        const MPoly *mpoly;
        const MLoop *mloop;
-       const MLoopTri *looptri;
        int totmat = dm->totmat;
        GPUMaterialInfo *mat_info;
-       int i, curmat, totelements, looptri_num, totloops;
+       int i, curmat, totelements, totloops, totpolys;
 
        /* object contains at least one material (default included) so zero 
means uninitialized dm */
        BLI_assert(totmat != 0);
@@ -1759,19 +1742,18 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh 
*dm)
        mpoly = dm->getPolyArray(dm);
        mloop = dm->getLoopArray(dm);
 
-       looptri = dm->looptris.array;
-       looptri_num = dm->looptris.num;
+       totpolys = dm->getNumPolys(dm);
 
        /* get the number of points used by each material, treating
         * each quad as two triangles */
        mat_info = MEM_callocN(sizeof(*mat_info) * totmat, 
"GPU_drawobject_new.mat_orig_to_new");
 
        /* NOTE: could loop polys instead (faster) */
-       for (i = 0; i < looptri_num; i++) {
-               const int mat_nr = mpoly[looptri[i].poly].mat_nr;
+       for (i = 0; i < totpolys; i++) {
+               const int mat_nr = mpoly[i].mat_nr;
                mat_info[mat_nr].polys++;
-               mat_info[mat_nr].elements += 3;
-               mat_info[mat_nr].loops += 3;
+               mat_info[mat_nr].elements += 3 * (mpoly[i].totloop - 2);
+               mat_info[mat_nr].loops += mpoly[i].totloop;
        }
        /* create the GPUDrawObject */
        gdo = MEM_callocN(sizeof(GPUDrawObject), "GPUDrawObject");
@@ -1793,7 +1775,7 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
                if (mat_info[i].elements > 0) {
                        gdo->materials[curmat].start = totelements;
                        /* can set it to points now but used in 
cdDM_drawobject_init_vert_points as counter */
-                       gdo->materials[curmat].totelements = 0;
+                       gdo->materials[curmat].totelements = 
mat_info[i].elements;
                        gdo->materials[curmat].totloops = mat_info[i].loops;
                        gdo->materials[curmat].mat_nr = i;
                        gdo->materials[curmat].totpolys = mat_info[i].polys;
@@ -1810,7 +1792,7 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
        /* store total number of points used for triangles */
        gdo->tot_triangle_point = totelements;
 
-       cdDM_drawobject_init_vert_points(gdo, mpoly, mloop, looptri, 
looptri_num, totmat);
+       cdDM_drawobject_init_vert_points(gdo, mpoly, mloop, totpolys, totmat);
        MEM_freeN(mat_info);
 
        return gdo;

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

Reply via email to