Commit: 4cac468e09d3dc3e575abedac441509283c421dd
Author: Antony Riakiotakis
Date:   Wed Jul 15 19:29:57 2015 +0200
Branches: temp-derivedmesh-looptri
https://developer.blender.org/rB4cac468e09d3dc3e575abedac441509283c421dd

Textured and GLSL drawing for cddm except from tangent layer
now ported correctly to new display paradigm

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

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

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

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c 
b/source/blender/blenkernel/intern/cdderivedmesh.c
index bfb5e1e..d5c5984 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -488,9 +488,8 @@ static void cdDM_drawFacesTex_common(
 {
        CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
        const MPoly *mpoly = cddm->mpoly;
-       const MLoopTri *looptri = dm->looptris.array;
-       const  MLoopCol *mloopcol;
        MTexPoly *mtexpoly = DM_get_poly_data_layer(dm, CD_MTEXPOLY);
+       const  MLoopCol *mloopcol;
        int i;
        int colType, start_element, tot_drawn;
        bool use_tface = (uvflag & DM_DRAW_USE_ACTIVE_UV) != 0;
@@ -546,7 +545,7 @@ static void cdDM_drawFacesTex_common(
        /* lastFlag = 0; */ /* UNUSED */
        for (mat_index = 0; mat_index < dm->drawObject->totmaterial; 
mat_index++) {
                GPUBufferMaterial *bufmat = dm->drawObject->materials + 
mat_index;
-               next_actualFace = looptri[bufmat->polys[0]].poly;
+               next_actualFace = bufmat->polys[0];
                totpoly = bufmat->totpolys;
 
                tot_element = 0;
@@ -554,12 +553,12 @@ static void cdDM_drawFacesTex_common(
                start_element = 0;
 
                for (i = 0; i < totpoly; i++) {
-                       int actualFace =  looptri[bufmat->polys[i]].poly;
+                       int actualFace = bufmat->polys[i];
                        DMDrawOption draw_option = DM_DRAW_OPTION_NORMAL;
                        int flush = 0;
 
                        if (i != totpoly - 1)
-                               next_actualFace = looptri[bufmat->polys[i + 
1]].poly;
+                               next_actualFace = bufmat->polys[i + 1];
 
                        if (drawParams) {
                                draw_option = drawParams(use_tface && mtexpoly 
? &mtexpoly[actualFace] : NULL, (mloopcol != NULL), mpoly[actualFace].mat_nr);
@@ -591,11 +590,11 @@ static void cdDM_drawFacesTex_common(
                                flush |= compareDrawOptions(userData, 
actualFace, next_actualFace) == 0;
                        }
 
-                       tot_element += 3;
+                       tot_element += (mpoly[actualFace].totloop - 2) * 3;
 
                        if (flush) {
                                if (draw_option != DM_DRAW_OPTION_SKIP)
-                                       tot_drawn += 3;
+                                       tot_drawn += (mpoly[actualFace].totloop 
- 2) * 3;
 
                                if (tot_drawn) {
                                        if (mloopcol && draw_option != 
DM_DRAW_OPTION_NO_MCOL)
@@ -609,7 +608,7 @@ static void cdDM_drawFacesTex_common(
                                start_element = tot_element;
                        }
                        else {
-                               tot_drawn += 3;
+                               tot_drawn += (mpoly[actualFace].totloop - 2) * 
3;
                        }
                }
        }
@@ -846,6 +845,7 @@ static void cdDM_drawMappedFacesGLSL(
        /* MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE); */ /* UNUSED */
        const float (*nors)[3] = dm->getPolyDataArray(dm, CD_NORMAL);
        const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL);
+       const int totpoly = dm->getNumPolys(dm);
        int a, b, matnr, new_matnr;
        bool do_draw;
        int orig;
@@ -1010,7 +1010,6 @@ static void cdDM_drawMappedFacesGLSL(
 
                /* part two, generate and fill the arrays with the data */
                if (max_element_size > 0) {
-                       const MLoopTri *lt = dm->looptris.array;
                        buffer = GPU_buffer_alloc(max_element_size * 
dm->drawObject->tot_loop_verts, false);
 
                        if (buffer == NULL) {
@@ -1026,39 +1025,35 @@ static void cdDM_drawMappedFacesGLSL(
                                return;
                        }
 
-                       for (a = 0; a < dm->looptris.num; a++, lt++) {
-                               const MPoly *mp = &mpoly[lt->poly];
-                               int i = mat_orig_to_new[mp->mat_nr];
+                       for (a = 0; a < totpoly; a++, mpoly++) {
+                               int j;
+                               int i = mat_orig_to_new[mpoly->mat_nr];
                                offset = tot_loops * max_element_size;
 
                                if (matconv[i].numdata != 0) {
-                                       const unsigned int *ltri = lt->tri;
-                                       const unsigned int  vtri[3] = 
{mloop[ltri[0]].v, mloop[ltri[1]].v, mloop[ltri[2]].v};
-
                                        if (matconv[i].attribs.totorco && 
matconv[i].attribs.orco.array) {
-                                               copy_v3_v3((float 
*)&varray[offset], (float *)matconv[i].attribs.orco.array[vtri[0]]);
-                                               copy_v3_v3((float 
*)&varray[offset + max_element_size], (float 
*)matconv[i].attribs.orco.array[vtri[1]]);
-                                               copy_v3_v3((float 
*)&varray[offset + max_element_size * 2], (float 
*)matconv[i].attribs.orco.array[vtri[2]]);
+                                               for (j = 0; j < mpoly->totloop; 
j++)
+                                                       copy_v3_v3((float 
*)&varray[offset + j * max_element_size],
+                                                                  (float 
*)matconv[i].attribs.orco.array[mloop[mpoly->loopstart + j].v]);
                                                offset += sizeof(float) * 3;
                                        }
                                        for (b = 0; b < 
matconv[i].attribs.tottface; b++) {
                                                if 
(matconv[i].attribs.tface[b].array) {
                                                        const MLoopUV *mloopuv 
= matconv[i].attribs.tface[b].array;
-                                                       copy_v2_v2((float 
*)&varray[offset], mloopuv[ltri[0]].uv);
-                                                       copy_v2_v2((float 
*)&varray[offset + max_element_size], mloopuv[ltri[1]].uv);
-                                                       copy_v2_v2((float 
*)&varray[offset + max_element_size * 2], mloopuv[ltri[2]].uv);
+                                                       for (j = 0; j < 
mpoly->totloop; j++)
+                                                               
copy_v2_v2((float *)&varray[offset + j * max_element_size], 
mloopuv[mpoly->loopstart + j].uv);
                                                        offset += sizeof(float) 
* 2;
                                                }
                                        }
                                        for (b = 0; b < 
matconv[i].attribs.totmcol; b++) {
                                                if 
(matconv[i].attribs.mcol[b].array) {
                                                        const MLoopCol 
*mloopcol = matconv[i].attribs.mcol[b].array;
-                                                       copy_v4_v4_char((char 
*)&varray[offset], &mloopcol[ltri[0]].r);
-                                                       copy_v4_v4_char((char 
*)&varray[offset + max_element_size], &mloopcol[ltri[1]].r);
-                                                       copy_v4_v4_char((char 
*)&varray[offset + max_element_size * 2], &mloopcol[ltri[2]].r);
+                                                       for (j = 0; j < 
mpoly->totloop; j++)
+                                                               
copy_v4_v4_char((char *)&varray[offset + j * max_element_size], 
&mloopcol[mpoly->loopstart + j].r);
                                                        offset += 
sizeof(unsigned char) * 4;
                                                }
                                        }
+                                       /* TODO, handle tangents */
                                        if (matconv[i].attribs.tottang && 
matconv[i].attribs.tang.array) {
                                                const float *tang = 
matconv[i].attribs.tang.array[i * 4 + 0];
                                                copy_v4_v4((float 
*)&varray[offset], tang);
@@ -1070,7 +1065,7 @@ static void cdDM_drawMappedFacesGLSL(
                                        }
                                }
 
-                               tot_loops += 3;
+                               tot_loops += mpoly->totloop;
                        }
                        GPU_buffer_unlock(buffer);
                }

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

Reply via email to