Commit: 8f81f275a45c2639f1f6b24820254192fb0ad5ee
Author: Nicholas Bishop
Date:   Thu Jan 22 20:02:51 2015 +0100
Branches: cycles-ptex-12
https://developer.blender.org/rB8f81f275a45c2639f1f6b24820254192fb0ad5ee

Texpaint beginning

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

M       source/blender/editors/sculpt_paint/paint_image_proj.c

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

diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c 
b/source/blender/editors/sculpt_paint/paint_image_proj.c
index 3e67501..c09f557 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -2839,7 +2839,11 @@ static void project_bucket_init(const ProjPaintState 
*ps, const int thread_index
                ima = ps->projImages[0].ima;
 
                for (node = ps->bucketFaces[bucket_index]; node; node = 
node->next) {
-                       project_paint_face_init(ps, thread_index, bucket_index, 
GET_INT_FROM_POINTER(node->link), 0, bucket_bounds, ibuf, &tmpibuf, 
ima->tpageflag & IMA_CLAMP_U, ima->tpageflag & IMA_CLAMP_V);
+                       project_paint_face_init(ps, thread_index, bucket_index,
+                                                                       
GET_INT_FROM_POINTER(node->link), 0,
+                                                                       
bucket_bounds, ibuf, &tmpibuf,
+                                                                       ima ? 
ima->tpageflag & IMA_CLAMP_U : 0,
+                                                                       ima ? 
ima->tpageflag & IMA_CLAMP_V : 0);
                }
        }
        else {
@@ -3003,6 +3007,8 @@ static void 
project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf,
 /* run once per stroke before projection painting */
 static void project_paint_begin(ProjPaintState *ps)
 {
+       int ptex;
+
        /* Viewport vars */
        float mat[3][3];
 
@@ -3042,7 +3048,11 @@ static void project_paint_begin(ProjPaintState *ps)
 
        const int diameter = 2 * BKE_brush_size_get(ps->scene, ps->brush);
 
-       bool reset_threads = false;
+       bool reset_threads = true;
+
+       Mesh *me = ps->ob->data;
+       MLoopPtex *loop_ptex = CustomData_get_layer(&me->ldata, CD_LOOP_PTEX);
+       MTessFacePtex *tess_ptex = NULL;
 
        /* ---- end defines ---- */
 
@@ -3073,7 +3083,9 @@ static void project_paint_begin(ProjPaintState *ps)
                ps->dm_release = true;
        }
 
-       if (!CustomData_has_layer(&ps->dm->faceData, CD_MTFACE)) {
+       if (!CustomData_has_layer(&ps->dm->faceData, CD_MTFACE) &&
+               !CustomData_has_layer(&(((Mesh *)ps->ob->data)->ldata),
+                                                         CD_LOOP_PTEX)) {
 
                if (ps->dm_release)
                        ps->dm->release(ps->dm);
@@ -3087,6 +3099,7 @@ static void project_paint_begin(ProjPaintState *ps)
        ps->dm_totvert = ps->dm->getNumVerts(ps->dm);
        ps->dm_totface = ps->dm->getNumTessFaces(ps->dm);
 
+       tess_ptex = ps->dm->getTessFaceDataArray(ps->dm, CD_TESSFACE_PTEX);
        ps->dm_mvert = ps->dm->getVertArray(ps->dm);
        ps->dm_mface = ps->dm->getTessFaceArray(ps->dm);
        ps->dm_mtface = MEM_mallocN(ps->dm_totface * sizeof(MTFace *), 
"proj_paint_mtfaces");
@@ -3432,6 +3445,9 @@ static void project_paint_begin(ProjPaintState *ps)
                                        slot_last = slot;
                                }
 
+                               // TODO
+                               slot->ima = loop_ptex->image;
+
                                /* don't allow using the same inage for 
painting and stencilling */
                                if (slot->ima == ps->stencil_ima)
                                        continue;
@@ -3443,7 +3459,27 @@ static void project_paint_begin(ProjPaintState *ps)
                        tpage = ps->stencil_ima;
                }
 
-               *tf = tf_base + face_index;
+               //*tf = tf_base + face_index;
+               *tf = MEM_callocN(sizeof(MTFace), "bad");
+               {
+                       ImBuf *ibuf = BKE_image_acquire_ibuf(slot->ima, NULL, 
NULL);
+                       if (ibuf && ibuf->ptex_coords) {
+                               // I'm sleepy                           
+                               int abc;
+                               for (abc = 0; abc < 4; abc++) {
+                                       float *dst = (*tf)->uv[abc];
+                                       const MLoopPtexUV *src = 
&tess_ptex[face_index].corners[abc];
+                                       const float *pc = 
ibuf->ptex_coords[src->id];
+
+                                       copy_v2_v2(dst, src->uv);
+                                       mul_v2_v2(dst, pc + 2);
+                                       add_v2_v2(dst, pc);
+                                       dst[0] /= ibuf->x;
+                                       dst[1] /= ibuf->y;
+                               }
+                       }
+                       BKE_image_release_ibuf(slot->ima, ibuf, NULL);
+               }
 
                if (ps->do_layer_clone) {
                        if (ps->do_material_slots) {
@@ -3469,9 +3505,9 @@ static void project_paint_begin(ProjPaintState *ps)
                }
 
                /* tfbase here should be non-null! */
-               BLI_assert (tf_base != NULL);
+               //BLI_assert (tf_base != NULL);
 
-               if (is_face_sel && tpage) {
+               if (is_face_sel/* && tpage*/) {
                        const float *v1coSS, *v2coSS, *v3coSS, *v4coSS = NULL;
 
                        v1coSS = ps->screenCoords[mf->v1];
@@ -3557,7 +3593,7 @@ static void project_paint_begin(ProjPaintState *ps)
                                tpage_last = tpage;
                        }
 
-                       if (image_index != -1) {
+                       /*if (image_index != -1)*/ {
                                /* Initialize the faces screen pixels */
                                /* Add this to a list to initialize later */
                                project_paint_delayed_face_init(ps, mf, 
face_index);
@@ -3565,14 +3601,29 @@ static void project_paint_begin(ProjPaintState *ps)
                }
        }
 
+       // TODO, ptex testing
+       //ps->image_tot++;
+
        /* build an array of images we use*/
        projIma = ps->projImages = (ProjPaintImage *)BLI_memarena_alloc(arena, 
sizeof(ProjPaintImage) * ps->image_tot);
 
-       for (node = image_LinkList, i = 0; node; node = node->next, i++, 
projIma++) {
+       ptex = 1;
+       for (node = image_LinkList, i = 0; node || ptex; node = node->next, 
i++, projIma++) {
                int size;
-               projIma->ima = node->link;
-               projIma->touch = 0;
+               if (ptex) {
+                       Mesh *me = ps->ob->data;
+                       MLoopPtex *loop_ptex;
+                       memset(projIma, 0, sizeof(*projIma));
+                       loop_ptex = CustomData_get_layer(&me->ldata, 
CD_LOOP_PTEX);
+                       if (loop_ptex) {
+                               projIma->ima = loop_ptex->image;
+                       }
+               }
+               else {
+                       projIma->ima = node->link;
+               }
                projIma->ibuf = BKE_image_acquire_ibuf(projIma->ima, NULL, 
NULL);
+               projIma->touch = 0;
                size = sizeof(void **) * IMAPAINT_TILE_NUMBER(projIma->ibuf->x) 
* IMAPAINT_TILE_NUMBER(projIma->ibuf->y);
                projIma->partRedrawRect =  BLI_memarena_alloc(arena, 
sizeof(ImagePaintPartialRedraw) * PROJ_BOUNDBOX_SQUARED);
                memset(projIma->partRedrawRect, 0, 
sizeof(ImagePaintPartialRedraw) * PROJ_BOUNDBOX_SQUARED);
@@ -3582,6 +3633,8 @@ static void project_paint_begin(ProjPaintState *ps)
                memset(projIma->maskRect, 0, size);
                projIma->valid = (bool **) BLI_memarena_alloc(arena, size);
                memset(projIma->valid, 0, size);
+
+               break;
        }
 
        /* we have built the array, discard the linked list */
@@ -5068,6 +5121,12 @@ bool BKE_paint_proj_mesh_data_check(Scene *scene, Object 
*ob, bool *uvs, bool *m
 
        if (layernum == 0) {
                hasuvs = false;
+
+               layernum = CustomData_number_of_layers(&me->ldata, 
CD_LOOP_PTEX);
+
+               if (layernum) {
+                       hasuvs = true;
+               }
        }
 
        /* Make sure we have a stencil to paint on! */

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

Reply via email to