Revision: 37351
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37351
Author:   psy-fi
Date:     2011-06-10 00:19:12 +0000 (Fri, 10 Jun 2011)
Log Message:
-----------
subsurf-aware UV solver commit #3:
Feature implemented :) Made unwrap work with post-subsurf vertex positions in 
the solver. There are some issues with crashes. Need to investigate. Also 
pending is addition of setting to select subdivision level to calculate.

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_unwrap_ops.c

Modified: 
branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_unwrap_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_unwrap_ops.c   
2011-06-09 23:15:41 UTC (rev 37350)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_unwrap_ops.c   
2011-06-10 00:19:12 UTC (rev 37351)
@@ -42,6 +42,7 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_modifier_types.h"
 
 #include "BLI_math.h"
 #include "BLI_edgehash.h"
@@ -49,6 +50,8 @@
 #include "BLI_uvproject.h"
 #include "BLI_utildefines.h"
 
+#include "BKE_cdderivedmesh.h"
+#include "BKE_subsurf.h"
 #include "BKE_context.h"
 #include "BKE_customdata.h"
 #include "BKE_depsgraph.h"
@@ -134,7 +137,7 @@
 
 /****************** Parametrizer Conversion ***************/
 
-static ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short 
implicit, short fill, short sel, short correct_aspect)
+static ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short 
implicit, short fill, short sel, short correct_aspect, short use_subsurf)
 {
        ParamHandle *handle;
        EditFace *efa;
@@ -142,6 +145,17 @@
        EditVert *ev;
        MTFace *tf;
        int a;
+
+       /* modifier initialization data, will  control what type of subdivision 
will happen*/
+       SubsurfModifierData smd;
+       /* Used to hold subsurfed Mesh */
+       DerivedMesh *derivedMesh, *initialDerived;
+       /* holds original indices for subsurfed mesh */
+       int *origIndices;
+       /* Holds vertices of subdivided mesh */
+       MVert *subsurfedVerts;
+       /* holds a map from mesh indices to subsurfedMesh indices */
+       int *indexMap = NULL;
        
        handle = param_construct_begin();
 
@@ -159,6 +173,45 @@
                }
        }
        
+       if(use_subsurf)
+       {
+               int numOfVerts;
+               
+               /* ad hoc, will change later */
+               smd.levels = 2;
+               /* no cache here */
+               smd.emCache = NULL;
+               smd.mCache = NULL;
+               /* will not be used here I think */
+               smd.renderLevels = 0;
+               /* catmull clark subdiv(simple makes no difference, apart from 
roasting the CPU) */
+               smd.subdivType = ME_CC_SUBSURF;
+               //smd.flags = ;
+               
+               initialDerived = CDDM_from_editmesh(em, NULL);
+               /* This is not very useful actually, we need to be able to 
account for mirror modifiers etc.
+                  However it -is- useful as a proof-of-concept implementation 
:) */
+               derivedMesh = subsurf_make_derived_from_derived(initialDerived, 
&smd, NULL,
+                       0, NULL, 1, 1, 0);
+
+               initialDerived->release(initialDerived);
+
+               subsurfedVerts = derivedMesh->getVertArray(derivedMesh);
+               origIndices = derivedMesh->getVertDataArray(derivedMesh, 
CD_ORIGINDEX);
+               
+               numOfVerts = derivedMesh->getNumVerts(derivedMesh);
+               
+               indexMap = MEM_mallocN(em->totvert*sizeof(int), 
"mesh_to_subsurfed_index_map");
+               
+               /* remap indices. DerivedMesh vertices that do not correspond to
+                  original mesh have -1 index on ORIGINDEX layer */
+               for(a = 0; a < numOfVerts; a++)
+               {
+                       if(origIndices[a] != -1)
+                               indexMap[origIndices[a]] = a;
+               }
+       }
+
        /* we need the vert indices */
        for(ev= em->verts.first, a=0; ev; ev= ev->next, a++)
                ev->tmp.l = a;
@@ -197,10 +250,16 @@
                vkeys[1] = (ParamKey)efa->v2->tmp.l;
                vkeys[2] = (ParamKey)efa->v3->tmp.l;
 
-               co[0] = efa->v1->co;
-               co[1] = efa->v2->co;
-               co[2] = efa->v3->co;
-
+               if(use_subsurf){
+                       co[0] = subsurfedVerts[indexMap[vkeys[0]]].co;
+                       co[1] = subsurfedVerts[indexMap[vkeys[1]]].co;
+                       co[2] = subsurfedVerts[indexMap[vkeys[2]]].co;
+               } else {
+                       co[0] = efa->v1->co;
+                       co[1] = efa->v2->co;
+                       co[2] = efa->v3->co;
+               }
+               
                uv[0] = tf->uv[0];
                uv[1] = tf->uv[1];
                uv[2] = tf->uv[2];
@@ -215,7 +274,11 @@
 
                if(efa->v4) {
                        vkeys[3] = (ParamKey)efa->v4->tmp.l;
-                       co[3] = efa->v4->co;
+                       if(use_subsurf){
+                               co[3] = subsurfedVerts[indexMap[vkeys[3]]].co;
+                       } else {
+                               co[3] = efa->v4->co;
+                       }
                        uv[3] = tf->uv[3];
                        pin[3] = ((tf->unwrap & TF_PIN4) != 0);
                        select[3] = (uvedit_uv_selected(scene, efa, tf, 3) != 
0);
@@ -240,6 +303,12 @@
 
        param_construct_end(handle, fill, implicit);
 
+       /* cleanup */
+       if(use_subsurf)
+       {
+               derivedMesh->release(derivedMesh);
+               MEM_freeN(indexMap);
+       }
        return handle;
 }
 
@@ -270,7 +339,7 @@
        ms->em= em;
        ms->blend= RNA_float_get(op->ptr, "blend");
        ms->iterations= RNA_int_get(op->ptr, "iterations");
-       ms->handle= construct_param_handle(scene, em, 1, fill_holes, 1, 1);
+       ms->handle= construct_param_handle(scene, em, 1, fill_holes, 1, 1, 0);
        ms->lasttime= PIL_check_seconds_timer();
 
        param_stretch_begin(ms->handle);
@@ -453,7 +522,7 @@
                RNA_float_set(op->ptr, "margin", 
scene->toolsettings->uvcalc_margin);
        }
 
-       handle = construct_param_handle(scene, em, 1, 0, 1, 1);
+       handle = construct_param_handle(scene, em, 1, 0, 1, 1, 0);
        param_pack(handle, scene->toolsettings->uvcalc_margin);
        param_flush(handle);
        param_delete(handle);
@@ -489,7 +558,7 @@
        EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
        ParamHandle *handle;
 
-       handle= construct_param_handle(scene, em, 1, 0, 1, 1);
+       handle= construct_param_handle(scene, em, 1, 0, 1, 1, 0);
        param_average(handle);
        param_flush(handle);
        param_delete(handle);
@@ -529,7 +598,7 @@
                return;
        }
 
-       liveHandle = construct_param_handle(scene, em, 0, fillholes, 1, 1);
+       liveHandle = construct_param_handle(scene, em, 0, fillholes, 1, 1, 
use_subsurf);
 
        param_lscm_begin(liveHandle, PARAM_TRUE, abf);
        BKE_mesh_end_editmesh(obedit->data, em);
@@ -840,7 +909,7 @@
        const short correct_aspect= !(scene->toolsettings->uvcalc_flag & 
UVCALC_NO_ASPECT_CORRECT);
        const short use_subsurf = scene->toolsettings->uvcalc_flag & 
UVCALC_USESUBSURF;
 
-       ParamHandle *handle= construct_param_handle(scene, em, 0, fill_holes, 
sel, correct_aspect);
+       ParamHandle *handle= construct_param_handle(scene, em, 0, fill_holes, 
sel, correct_aspect, use_subsurf);
 
        param_lscm_begin(handle, PARAM_FALSE, scene->toolsettings->unwrapper == 
0);
        param_lscm_solve(handle);

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

Reply via email to