Commit: e48c4d73d378b5ac7e8679b1eea04b265ef31612
Author: Campbell Barton
Date:   Mon Jul 27 15:52:54 2015 +1000
Branches: master
https://developer.blender.org/rBe48c4d73d378b5ac7e8679b1eea04b265ef31612

Replace MFace with looptri for dynamicpaint

D1429 by @lichtwerk, with edits

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

M       source/blender/blenkernel/BKE_dynamicpaint.h
M       source/blender/blenkernel/intern/dynamicpaint.c
M       source/blender/render/extern/include/RE_render_ext.h
M       source/blender/render/extern/include/RE_shader_ext.h
M       source/blender/render/intern/source/render_texture.c
M       source/blenderplayer/bad_level_call_stubs/stubs.c

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

diff --git a/source/blender/blenkernel/BKE_dynamicpaint.h 
b/source/blender/blenkernel/BKE_dynamicpaint.h
index e7384fb..0025617 100644
--- a/source/blender/blenkernel/BKE_dynamicpaint.h
+++ b/source/blender/blenkernel/BKE_dynamicpaint.h
@@ -45,12 +45,10 @@ typedef struct PaintPoint {
 
        /* Wet paint is handled at effect layer only
         * and mixed to surface when drying */
-       float e_color[3];
-       float e_alpha;
+       float e_color[4];
        float wetness;
        short state;
-       float color[3];
-       float alpha;
+       float color[4];
 } PaintPoint;
 
 /* heigh field waves   */
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c 
b/source/blender/blenkernel/intern/dynamicpaint.c
index 4372f96..6f510d8 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -200,12 +200,11 @@ typedef struct PaintBakeData {
 /* UV Image sequence format point      */
 typedef struct PaintUVPoint {
        /* Pixel / mesh data */
-       unsigned int face_index, pixel_index;   /* face index on domain derived 
mesh */
+       unsigned int tri_index, pixel_index;    /* tri index on domain derived 
mesh */
        unsigned int v1, v2, v3;                /* vertex indexes */
 
        unsigned int neighbour_pixel;   /* If this pixel isn't uv mapped to any 
face,
                                         * but it's neighboring pixel is */
-       short quad;
 } PaintUVPoint;
 
 typedef struct ImgSeqFormatData {
@@ -457,7 +456,7 @@ static void blendColors(const float t_color[3], float 
t_alpha, const float s_col
 }
 
 /* Mix two alpha weighed colors by a defined ratio. output is saved at a_color 
*/
-static float mixColors(float a_color[3], float a_weight, float b_color[3], 
float b_weight, float ratio)
+static float mixColors(float a_color[3], float a_weight, const float 
b_color[3], float b_weight, float ratio)
 {
        float weight_ratio, factor;
        if (b_weight) {
@@ -1465,24 +1464,26 @@ static void dynamicPaint_setInitialColor(const Scene 
*scene, DynamicPaintSurface
                /* apply color to every surface point */
 #pragma omp parallel for schedule(static)
                for (i = 0; i < sData->total_points; i++) {
-                       copy_v3_v3(pPoint[i].color, surface->init_color);
-                       pPoint[i].alpha = surface->init_color[3];
+                       copy_v4_v4(pPoint[i].color, surface->init_color);
                }
        }
        /* UV mapped texture */
        else if (surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) {
                Tex *tex = surface->init_texture;
-               MTFace *tface;
-               MFace *mface = dm->getTessFaceArray(dm);
-               int numOfFaces = dm->getNumTessFaces(dm);
+
+               const MLoop *mloop = dm->getLoopArray(dm);
+               const MLoopTri *mlooptri = dm->getLoopTriArray(dm);
+               const int tottri = dm->getNumLoopTri(dm);
+               const MLoopUV *mloopuv = NULL;
+
                char uvname[MAX_CUSTOMDATA_LAYER_NAME];
 
                if (!tex) return;
 
                /* get uv map */
-               CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, 
surface->init_layername, uvname);
-               tface = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, 
uvname);
-               if (!tface) return;
+               CustomData_validate_layer_name(&dm->loopData, CD_MLOOPUV, 
surface->init_layername, uvname);
+               mloopuv = CustomData_get_layer_named(&dm->loopData, CD_MLOOPUV, 
uvname);
+               if (!mloopuv) return;
 
                /* for vertex surface loop through tfaces and find uv color
                 *  that provides highest alpha */
@@ -1490,23 +1491,22 @@ static void dynamicPaint_setInitialColor(const Scene 
*scene, DynamicPaintSurface
                        struct ImagePool *pool = BKE_image_pool_new();
 
 #pragma omp parallel for schedule(static) shared(pool)
-                       for (i = 0; i < numOfFaces; i++) {
-                               int numOfVert = (mface[i].v4) ? 4 : 3;
+                       for (i = 0; i < tottri; i++) {
                                float uv[3] = {0.0f};
                                int j;
-                               for (j = 0; j < numOfVert; j++) {
+                               for (j = 0; j < 3; j++) {
                                        TexResult texres = {0};
-                                       unsigned int *vert = (&mface[i].v1) + j;
+                                       unsigned int vert = 
mloop[mlooptri[i].tri[j]].v;
 
                                        /* remap to -1.0 to 1.0 */
-                                       uv[0] = tface[i].uv[j][0] * 2.0f - 1.0f;
-                                       uv[1] = tface[i].uv[j][1] * 2.0f - 1.0f;
+                                       uv[0] = 
mloopuv[mlooptri[i].tri[j]].uv[0] * 2.0f - 1.0f;
+                                       uv[1] = 
mloopuv[mlooptri[i].tri[j]].uv[1] * 2.0f - 1.0f;
 
                                        multitex_ext_safe(tex, uv, &texres, 
pool, scene_color_manage, false);
 
-                                       if (texres.tin > pPoint[*vert].alpha) {
-                                               copy_v3_v3(pPoint[*vert].color, 
&texres.tr);
-                                               pPoint[*vert].alpha = 
texres.tin;
+                                       if (texres.tin > pPoint[vert].color[3]) 
{
+                                               copy_v3_v3(pPoint[vert].color, 
&texres.tr);
+                                               pPoint[vert].color[3] = 
texres.tin;
                                        }
                                }
                        }
@@ -1525,8 +1525,7 @@ static void dynamicPaint_setInitialColor(const Scene 
*scene, DynamicPaintSurface
 
                                /* collect all uvs */
                                for (j = 0; j < 3; j++) {
-                                       int v = (f_data->uv_p[i].quad && j > 0) 
? j + 1 : j;
-                                       copy_v2_v2(&uv[j * 3], 
tface[f_data->uv_p[i].face_index].uv[v]);
+                                       copy_v2_v2(&uv[j * 3], 
mloopuv[mlooptri[f_data->uv_p[i].tri_index].tri[j]].uv);
                                }
 
                                /* interpolate final uv pos */
@@ -1540,7 +1539,7 @@ static void dynamicPaint_setInitialColor(const Scene 
*scene, DynamicPaintSurface
 
                                /* apply color */
                                copy_v3_v3(pPoint[i].color, &texres.tr);
-                               pPoint[i].alpha = texres.tin;
+                               pPoint[i].color[3] = texres.tin;
                        }
                }
        }
@@ -1549,46 +1548,40 @@ static void dynamicPaint_setInitialColor(const Scene 
*scene, DynamicPaintSurface
 
                /* for vertex surface, just copy colors from mcol */
                if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
-                       MLoop *mloop = dm->getLoopArray(dm);
-                       int numOfLoops = dm->getNumLoops(dm);
-                       MCol *col = CustomData_get_layer_named(&dm->loopData, 
CD_MLOOPCOL, surface->init_layername);
+                       const MLoop *mloop = dm->getLoopArray(dm);
+                       const int totloop = dm->getNumLoops(dm);
+                       const MLoopCol *col = 
CustomData_get_layer_named(&dm->loopData, CD_MLOOPCOL, surface->init_layername);
                        if (!col) return;
 
 #pragma omp parallel for schedule(static)
-                       for (i = 0; i < numOfLoops; i++) {
-                               pPoint[mloop[i].v].color[0] = 1.0f / 255.f * 
(float)col[i].b;
-                               pPoint[mloop[i].v].color[1] = 1.0f / 255.f * 
(float)col[i].g;
-                               pPoint[mloop[i].v].color[2] = 1.0f / 255.f * 
(float)col[i].r;
-                               pPoint[mloop[i].v].alpha = 1.0f / 255.f * 
(float)col[i].a;
+                       for (i = 0; i < totloop; i++) {
+                               rgba_uchar_to_float(pPoint[mloop[i].v].color, 
(const unsigned char *)&col[mloop[i].v].r);
                        }
                }
                else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
+                       const MLoopTri *mlooptri = dm->getLoopTriArray(dm);
                        ImgSeqFormatData *f_data = (ImgSeqFormatData 
*)sData->format_data;
                        int samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 
5 : 1;
-                       MCol *col = CustomData_get_layer_named(&dm->faceData, 
CD_MCOL, surface->init_layername);
+                       // should this be replaced by CD_MLOOPCOL?
+                       MLoopCol *col = 
CustomData_get_layer_named(&dm->loopData, CD_MLOOPCOL, surface->init_layername);
                        if (!col) return;
 
 #pragma omp parallel for schedule(static)
                        for (i = 0; i < sData->total_points; i++) {
-                               int face_ind = f_data->uv_p[i].face_index;
-                               float colors[3][4] = {{0.0f, 0.0f, 0.0f, 0.0f}};
+                               int tri_ind = f_data->uv_p[i].tri_index;
+                               float colors[3][4];
                                float final_color[4];
                                int j;
+
                                /* collect color values */
                                for (j = 0; j < 3; j++) {
-                                       int v = (f_data->uv_p[i].quad && j > 0) 
? j + 1 : j;
-                                       colors[j][0] = 1.0f / 255.f * 
(float)col[face_ind * 4 + v].b;
-                                       colors[j][1] = 1.0f / 255.f * 
(float)col[face_ind * 4 + v].g;
-                                       colors[j][2] = 1.0f / 255.f * 
(float)col[face_ind * 4 + v].r;
-                                       colors[j][3] = 1.0f / 255.f * 
(float)col[face_ind * 4 + v].a;
+                                       rgba_uchar_to_float(colors[j], (const 
unsigned char *)&col[mlooptri[tri_ind].tri[j]].r);
                                }
-                               
+
                                /* interpolate final color */
-                               interp_v4_v4v4v4(final_color, colors[0], 
colors[1], colors[2],
-                                                f_data->barycentricWeights[i * 
samples].v);
+                               interp_v4_v4v4v4(final_color, UNPACK3(colors), 
f_data->barycentricWeights[i * samples].v);
 
-                               copy_v3_v3(pPoint[i].color, final_color);
-                               pPoint[i].alpha = final_color[3];
+                               copy_v4_v4(pPoint[i].color, final_color);
                        }
                }
        }
@@ -1724,7 +1717,7 @@ static DerivedMesh 
*dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd,
 #pragma omp parallel for schedule(static)
                                                for (i = 0; i < 
sData->total_points; i++) {
                                                        /* blend dry and wet 
layer */
-                                                       
blendColors(pPoint[i].color, pPoint[i].alpha, pPoint[i].e_color, 
pPoint[i].e_alpha, &fcolor[i * 4]);
+                                                       
blendColors(pPoint[i].color, pPoint[i].color[3], pPoint[i].e_color, 
pPoint[i].e_color[3], &fcolor[i * 4]);
                                                }
 
                                                /* viewport preview */
@@ -2051,7 +2044,7 @@ static int dynamicPaint_findNeighbourPixel(PaintUVPoint 
*tempPoints, DerivedMesh
         *      Check if shifted point is on same face -> it's a correct 
neighbor
         *   (and if it isn't marked as an "edge pixel")
         */
-       if ((tPoint->face_index == cPoint->face_index) && 
(tPoint->neighbour_pixel == -1))
+       if ((tPoint->tri_index == cPoint->tri_index) && 
(tPoint->neighbour_pixel == -1))
                return (x + w * y);
 
        /*
@@ -2062,7 +2055,7 @@ static int dynamicPaint_findNeighbourPixel(PaintUVPoint 
*tempPoints, DerivedMesh
         *      This should work fine as long as uv island
         *      margin is > 1 pixel.
         */
-       if ((tPoint->face_index != -1) && (tPoint->neighbour_pixel == -1)) {
+       if ((tPoint->tri_index != -1) && (tPoint->neighbour_pixel == -1)) {
                return (x + w * y);
        }
 
@@ -2080,9 +2073,10 @@ static int dynamicPaint_findNeighbourPixel(PaintUVPoint 
*tempPoints, DerivedMesh
         *      TODO: Implement something more accurate / optimized?
         */
        {
-               int numOfFaces = dm->getNumTessFaces(dm);
-               MFace *mface = dm->getTessFaceArray(dm);
-               MTFace *tface =  CustomData_get_layer_named(&dm->faceData, 
CD_MTFACE, uvname);
+               const MLoop *mloop = dm->getLoopArray(dm);
+               const MLoopTri *mlooptri = dm->getLoopTriArray(dm);
+               const int tottri = dm->getNumLoopTri(dm);
+               const MLoopUV *mloopuv = 
CustomData_get_layer_named(&dm->loopData, CD_MLOOPUV, uvname);
 
                /* Get closest edge to that subpixel on UV map  */
                {
@@ -2090,8 +2084,8 @@ static int dynamicPaint_findNeighbourPixel(PaintUVPoint 
*tempPoints, DerivedMesh
                        /* distances only used for comparison */
                        float dist_squared, t_dist_squared;
 
-                       int i, uindex[3], edge1_index, edge2_index,
-                           e1_index, e2_index, target_face;
+                       int i, edge1_index, edge

@@ 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