Commit: 27b23c326e7dce6750cd45f79966ce5a200da3a5
Author: Nicholas Bishop
Date:   Tue Feb 10 18:29:28 2015 +0100
Branches: cycles-ptex-49
https://developer.blender.org/rB27b23c326e7dce6750cd45f79966ce5a200da3a5

Avoid creating new images on Ptex resolution change

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

M       source/blender/blenkernel/intern/bke_ptex.c
M       source/blender/editors/mesh/mesh_data.c

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

diff --git a/source/blender/blenkernel/intern/bke_ptex.c 
b/source/blender/blenkernel/intern/bke_ptex.c
index 88b8489..a6647c4 100644
--- a/source/blender/blenkernel/intern/bke_ptex.c
+++ b/source/blender/blenkernel/intern/bke_ptex.c
@@ -580,10 +580,13 @@ static BPXImageBuf 
*bpx_image_buf_wrap_loop_ptex(MLoopPtex *loop_ptex)
 }
 
 /* TODO(nicholasbishop): sync up with code in imb_ptex.c */
-static bool ptex_pack_loops(Image **image, Mesh *me, MLoopPtex *loop_ptex,
+/* TODO(nicholasbishop): should function apart, Image stuff really is
+ * separate from the packing stuff */
+static bool ptex_pack_loops(Image **image_r, Mesh *me, MLoopPtex *loop_ptex,
                                                        const char *layer_name)
 {
        BPXImageBuf *bpx_dst;
+       Image *image;
        const int num_loops = me->totloop;
        struct BPXPackedLayout *layout = NULL;
        struct ImBuf *ibuf;
@@ -591,7 +594,7 @@ static bool ptex_pack_loops(Image **image, Mesh *me, 
MLoopPtex *loop_ptex,
        BPXTypeDesc type_desc;
        int i;
 
-       if (!image) {
+       if (!image_r) {
                return false;
        }
 
@@ -654,52 +657,56 @@ static bool ptex_pack_loops(Image **image, Mesh *me, 
MLoopPtex *loop_ptex,
        // TODO
        IMB_float_from_rect(ibuf);
 
-       (*image) = BKE_image_add_from_imbuf(ibuf);
-       
-       /* Image now owns the ImBuf */
-       IMB_freeImBuf(ibuf);
-
-       if (*image) {
-               ID *id = &(*image)->id;
-               rename_id(id, layer_name);
-               id_us_min(id);
-               return true;
+       image = *image_r;
+       if (image) {
+               BKE_image_free_buffers(image);
+               BKE_image_assign_ibuf(image, ibuf);
        }
        else {
-               return false;
+               image = BKE_image_add_from_imbuf(ibuf);
+
+               rename_id(&image->id, layer_name);
+               id_us_min(&image->id);
+
+               (*image_r) = image;
        }
+
+       /* Image now owns the ImBuf */
+       IMB_freeImBuf(ibuf);
+
+       return image != NULL;
 }
 
 Image *BKE_ptex_mesh_image_get(struct Object *ob,
                                                           const char 
layer_name[MAX_CUSTOMDATA_LAYER_NAME])
 {
        Mesh *me = BKE_mesh_from_object(ob);
-       if (me) {
-               MLoopPtex *loop_ptex = CustomData_get_layer_named(&me->ldata,
-                                                                               
                                  CD_LOOP_PTEX,
-                                                                               
                                  layer_name);
-               if (loop_ptex) {
-                       // TODO
-                       if (!loop_ptex->image) {
-                               // TODO
-                               const bool r = 
ptex_pack_loops(&loop_ptex->image, me,
-                                                                               
           loop_ptex, layer_name);
-                               BLI_assert(r);
-                       }
-                       else if (loop_ptex->image->tpageflag & 
IMA_TPAGE_REFRESH) {
-                               //mesh_ptex_pack_textures_free(loop_ptex->pack);
-                               loop_ptex->image->tpageflag &= 
~IMA_TPAGE_REFRESH;
-                       }
-                       // TODO
+       MLoopPtex *loop_ptex;
+       if (!me) {
+               return NULL;
+       }
 
-                       /* if (!loop_ptex->pack->mapping_texture) { */
-                       /*      
mesh_ptex_pack_update_textures(loop_ptex->pack); */
-                       /* } */
+       loop_ptex = CustomData_get_layer_named(&me->ldata, CD_LOOP_PTEX,
+                                                                               
   layer_name);
+       if (!loop_ptex) {
+               return NULL;
+       }
 
-                       return loop_ptex->image;
-               }
+       if (!loop_ptex->image ||
+               !BKE_image_has_ibuf(loop_ptex->image, NULL))
+       {
+               // TODO
+               const bool r = ptex_pack_loops(&loop_ptex->image, me,
+                                                                          
loop_ptex, layer_name);
+               BLI_assert(r);
        }
-       return NULL;
+       // TODO
+       else if (loop_ptex->image->tpageflag & IMA_TPAGE_REFRESH) {
+               //mesh_ptex_pack_textures_free(loop_ptex->pack);
+               loop_ptex->image->tpageflag &= ~IMA_TPAGE_REFRESH;
+       }
+
+       return loop_ptex->image;
 }
 
 MPtexDataType BKE_ptex_texel_data_type(const MPtexTexelInfo texel_info)
diff --git a/source/blender/editors/mesh/mesh_data.c 
b/source/blender/editors/mesh/mesh_data.c
index 90dcff7..424b30c 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -876,10 +876,12 @@ static int mesh_ptex_res_change_exec(bContext *C, 
wmOperator *op)
 {
        Object *ob = ED_object_context(C);
        Mesh *me = ob->data;
-       int i;
-
-       MLoopPtex *loop_ptex = CustomData_get_layer(&me->ldata, CD_LOOP_PTEX);
+       const int layer_offset = CustomData_get_active_layer(&me->ldata,
+                                                                               
                                 CD_LOOP_PTEX);
+       MLoopPtex *loop_ptex = CustomData_get_layer_n(&me->ldata, CD_LOOP_PTEX,
+                                                                               
                  layer_offset);
        const PtexResChangeMode mode = RNA_enum_get(op->ptr, "mode");
+       int i;
 
        for (i = 0; i < me->totpoly; i++) {
                const MPoly *poly = &me->mpoly[i];
@@ -901,8 +903,7 @@ static int mesh_ptex_res_change_exec(bContext *C, 
wmOperator *op)
                }
        }
 
-       /* TODO, not sure how this will look yet */
-       loop_ptex[0].image = NULL;
+       BKE_ptex_image_mark_for_update(me, layer_offset);
 
        DAG_id_tag_update(&me->id, 0);
        WM_main_add_notifier(NC_GEOM | ND_DATA, me);

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

Reply via email to