Switching images in the image space would modify UV coordinates.
authorCampbell Barton <ideasman42@gmail.com>
Mon, 6 Aug 2012 19:28:22 +0000 (19:28 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 6 Aug 2012 19:28:22 +0000 (19:28 +0000)
This is an intended feature but works too unreliably.

- This setting was stored in each face and only editable by re-running the unwrap, this is too hidden (only discovered this by reading code).
- This worked with blender internal but not with cycles, such basic options as changing an image shouldn't behave different depending on the render engine selected.

I've ifdef'd out the aspect correction for now, it could be added back as a per scene option and be made to run on both cycles or blender internal but for now I prefer to keep this disabled.

source/blender/editors/uvedit/uvedit_ops.c
source/blender/editors/uvedit/uvedit_parametrizer.c
source/blender/editors/uvedit/uvedit_parametrizer.h
source/blender/editors/uvedit/uvedit_unwrap_ops.c
source/blender/makesdna/DNA_meshdata_types.h

index 4154e363292445d5f95dbb0d6266120a9802f942..de1d51b22040ba3cb2c13d536c2bd2b9742b5c7e 100644 (file)
@@ -165,6 +165,8 @@ void ED_object_assign_active_image(Main *bmain, Object *ob, int mat_nr, Image *i
 
 /************************* assign image ************************/
 
+//#define USE_SWITCH_ASPECT
+
 void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *ima, Image *previma)
 {
        BMEditMesh *em;
@@ -196,6 +198,7 @@ void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *im
        }
        else {
                /* old shading system, assign image to selected faces */
+#ifdef USE_SWITCH_ASPECT
                float prev_aspect[2], fprev_aspect;
                float aspect[2], faspect;
 
@@ -204,6 +207,7 @@ void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *im
 
                fprev_aspect = prev_aspect[0]/prev_aspect[1];
                faspect = aspect[0]/aspect[1];
+#endif
 
                /* ensure we have a uv map */
                if (!CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY)) {
@@ -223,8 +227,12 @@ void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *im
                                        if (ima->id.us == 0) id_us_plus(&ima->id);
                                        else id_lib_extern(&ima->id);
 
+#ifdef USE_SWITCH_ASPECT
                                        /* we also need to correct the aspect of uvs */
-                                       if (tf->unwrap & TF_CORRECT_ASPECT) {
+                                       if (scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT) {
+                                               /* do nothing */
+                                       }
+                                       else {
                                                BMIter liter;
                                                BMLoop *l;
 
@@ -235,6 +243,7 @@ void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *im
                                                        luv->uv[0] /= faspect;
                                                }
                                        }
+#endif
                                }
                                else {
                                        tf->tpage = NULL;
index 39a78ea934b13c02a9c69c9412030bfcbc35fa51..2161d4989db23257051e75eb13cd696768c92833 100644 (file)
@@ -145,8 +145,6 @@ typedef struct PFace {
 
        struct PEdge *edge;
        unsigned char flag;
-       short *unwrap_flag;
-
 } PFace;
 
 enum PVertFlag {
@@ -236,9 +234,6 @@ typedef struct PHandle {
        char do_aspect;
 } PHandle;
 
-/* duplicate, to avoid including DNA_mesh_types.h */
-#define TF_CORRECT_ASPECT  256
-
 /* PHash
  * - special purpose hash that keeps all its elements in a single linked list.
  * - after construction, this hash is thrown away, and the list remains.
@@ -650,7 +645,6 @@ static void p_vert_load_pin_select_uvs(PHandle *handle, PVert *v)
 static void p_flush_uvs(PHandle *handle, PChart *chart)
 {
        PEdge *e;
-       PFace *f;
 
        for (e = chart->edges; e; e = e->nextlink) {
                if (e->orig_uv) {
@@ -658,17 +652,6 @@ static void p_flush_uvs(PHandle *handle, PChart *chart)
                        e->orig_uv[1] = e->vert->uv[1] / handle->aspy;
                }
        }
-
-       for (f = chart->faces; f; f = f->nextlink) {
-               if (f->unwrap_flag) {
-                       if (handle->do_aspect) {
-                               *f->unwrap_flag |= TF_CORRECT_ASPECT;
-                       }
-                       else {
-                               *f->unwrap_flag &= ~TF_CORRECT_ASPECT;
-                       }
-               }
-       }
 }
 
 static void p_flush_uvs_blend(PHandle *handle, PChart *chart, float blend)
@@ -1058,7 +1041,6 @@ static PFace *p_face_add(PHandle *handle)
        /* allocate */
        f = (PFace *)BLI_memarena_alloc(handle->arena, sizeof *f);
        f->flag = 0; // init !
-       f->unwrap_flag = NULL;
 
        e1 = (PEdge *)BLI_memarena_alloc(handle->arena, sizeof *e1);
        e2 = (PEdge *)BLI_memarena_alloc(handle->arena, sizeof *e2);
@@ -1085,7 +1067,7 @@ static PFace *p_face_add(PHandle *handle)
 
 static PFace *p_face_add_construct(PHandle *handle, ParamKey key, ParamKey *vkeys,
                                    float *co[3], float *uv[3], int i1, int i2, int i3,
-                                   ParamBool *pin, ParamBool *select, short *unwrap_flag)
+                                   ParamBool *pin, ParamBool *select)
 {
        PFace *f = p_face_add(handle);
        PEdge *e1 = f->edge, *e2 = e1->next, *e3 = e2->next;
@@ -1112,7 +1094,6 @@ static PFace *p_face_add_construct(PHandle *handle, ParamKey key, ParamKey *vkey
 
        /* insert into hash */
        f->u.key = key;
-       f->unwrap_flag = unwrap_flag;
        phash_insert(handle->hash_faces, (PHashLink *)f);
 
        e1->u.key = PHASH_edge(vkeys[i1], vkeys[i2]);
@@ -4151,7 +4132,7 @@ void param_delete(ParamHandle *handle)
 
 void param_face_add(ParamHandle *handle, ParamKey key, int nverts,
                     ParamKey *vkeys, float **co, float **uv,
-                    ParamBool *pin, ParamBool *select, short *unwrap_flag)
+                    ParamBool *pin, ParamBool *select)
 {
        PHandle *phandle = (PHandle *)handle;
 
@@ -4161,16 +4142,16 @@ void param_face_add(ParamHandle *handle, ParamKey key, int nverts,
 
        if (nverts == 4) {
                if (p_quad_split_direction(phandle, co, vkeys)) {
-                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 2, pin, select, unwrap_flag);
-                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 2, 3, pin, select, unwrap_flag);
+                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 2, pin, select);
+                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 2, 3, pin, select);
                }
                else {
-                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 3, pin, select, unwrap_flag);
-                       p_face_add_construct(phandle, key, vkeys, co, uv, 1, 2, 3, pin, select, unwrap_flag);
+                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 3, pin, select);
+                       p_face_add_construct(phandle, key, vkeys, co, uv, 1, 2, 3, pin, select);
                }
        }
        else if (!p_face_exists(phandle, vkeys, 0, 1, 2)) {
-               p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 2, pin, select, unwrap_flag);
+               p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 2, pin, select);
        }
 }
 
index 9a2fea0d7f9827505205dd293b6bcb908cf51b47..4c23d49428b356f87da1e8ba692a7748d6d91ff6 100644 (file)
@@ -56,16 +56,16 @@ ParamHandle *param_construct_begin(void);
 void param_aspect_ratio(ParamHandle *handle, float aspx, float aspy);
 
 void param_face_add(ParamHandle *handle,
-                                       ParamKey key,
-                                       int nverts,     
-                                       ParamKey *vkeys,
-                                       float **co,
-                                       float **uv,
-                                       ParamBool *pin,
-                                       ParamBool *select, short *unwrap_flag);
+                    ParamKey key,
+                    int nverts,
+                    ParamKey *vkeys,
+                    float **co,
+                    float **uv,
+                    ParamBool *pin,
+                    ParamBool *select);
 
 void param_edge_set_seam(ParamHandle *handle,
-                                                ParamKey *vkeys);
+                         ParamKey *vkeys);
 
 void param_construct_end(ParamHandle *handle, ParamBool fill, ParamBool impl);
 void param_delete(ParamHandle *chart);
index 4b6c0ef0e7bcaaf97cabe98d616a88e33b01ab1c..682b35072f6b25bb8843e8821ac2e2eea8ed2633 100644 (file)
@@ -213,7 +213,6 @@ static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
        BLI_srand(0);
        
        BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-               MTexPoly *tf;
                ScanFillVert *sf_vert, *sf_vert_last, *sf_vert_first;
                ScanFillFace *sf_tri;
                ParamKey key, vkeys[4];
@@ -257,7 +256,7 @@ static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
                                i++;
                        }
 
-                       param_face_add(handle, key, i, vkeys, co, uv, pin, select, &tf->unwrap);
+                       param_face_add(handle, key, i, vkeys, co, uv, pin, select);
                }
                else {
                        /* ngon - scanfill time! */
@@ -302,7 +301,7 @@ static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
                                        select[i] = uvedit_uv_select_test(em, scene, ls[i]) != 0;
                                }
 
-                               param_face_add(handle, key, 3, vkeys, co, uv, pin, select, &tf->unwrap);
+                               param_face_add(handle, key, 3, vkeys, co, uv, pin, select);
                        }
 
                        BLI_scanfill_end(&sf_ctx);
@@ -446,7 +445,6 @@ static ParamHandle *construct_param_handle_subsurfed(Scene *scene, BMEditMesh *e
                float *co[4];
                float *uv[4];
                BMFace *origFace = faceMap[i];
-               MTexPoly *tf;
 
                face = subsurfedFaces + i;
 
@@ -459,8 +457,6 @@ static ParamHandle *construct_param_handle_subsurfed(Scene *scene, BMEditMesh *e
                                continue;
                }
 
-               tf = CustomData_bmesh_get(&em->bm->pdata, origFace->head.data, CD_MTEXPOLY);
-
                /* We will not check for v4 here. Subsurfed mfaces always have 4 vertices. */
                key = (ParamKey)face;
                vkeys[0] = (ParamKey)face->v1;
@@ -480,7 +476,7 @@ static ParamHandle *construct_param_handle_subsurfed(Scene *scene, BMEditMesh *e
                texface_from_original_index(origFace, origVertIndices[face->v3], &uv[2], &pin[2], &select[2], scene, em);
                texface_from_original_index(origFace, origVertIndices[face->v4], &uv[3], &pin[3], &select[3], scene, em);
 
-               param_face_add(handle, key, 4, vkeys, co, uv, pin, select, &tf->unwrap);
+               param_face_add(handle, key, 4, vkeys, co, uv, pin, select);
        }
 
        /* these are calculated from original mesh too */
index 9ae2bec583dfb22ccad51d21b3dae33609d32923..2f5ef9c2aaa1993e736d88d1108719e14b16fd48 100644 (file)
@@ -95,7 +95,7 @@ typedef struct MLoop {
 typedef struct MTexPoly {
        struct Image *tpage;
        char flag, transp;
-       short mode, tile, unwrap;
+       short mode, tile, pad;
 } MTexPoly;
 
 /* can copy from/to MTexPoly/MTFace */
@@ -106,8 +106,7 @@ typedef struct MTexPoly {
        (dst)->transp = (src)->transp;  \
        (dst)->mode   = (src)->mode;    \
        (dst)->tile   = (src)->tile;    \
-       (dst)->unwrap = (src)->unwrap;  \
-}
+} (void)0
 
 typedef struct MLoopUV {
        float uv[2];
@@ -368,6 +367,5 @@ typedef struct MVertSkin {
 #define TF_PIN2                   32
 #define TF_PIN3                       64
 #define TF_PIN4                   128
-#define TF_CORRECT_ASPECT  256
 
 #endif