Revision: 48310
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48310
Author:   lfrisken
Date:     2012-06-26 12:50:16 +0000 (Tue, 26 Jun 2012)
Log Message:
-----------
Made some changes to the way the snapping system handles different types
of mesh data.
Re-implemented vertex snapping using the new snapping system! There are
a couple of bugs with this recorded in comments for
SnapMesh_snap_vertex.

Modified Paths:
--------------
    branches/soc-2012-sushi/source/blender/blenkernel/BKE_snap.h
    branches/soc-2012-sushi/source/blender/blenkernel/intern/snap.c
    branches/soc-2012-sushi/source/blender/editors/transform/transform_snap.c

Modified: branches/soc-2012-sushi/source/blender/blenkernel/BKE_snap.h
===================================================================
--- branches/soc-2012-sushi/source/blender/blenkernel/BKE_snap.h        
2012-06-26 10:18:53 UTC (rev 48309)
+++ branches/soc-2012-sushi/source/blender/blenkernel/BKE_snap.h        
2012-06-26 12:50:16 UTC (rev 48310)
@@ -1,6 +1,13 @@
 #ifndef __BKE_SNAP_H__
 #define __BKE_SNAP_H__
 
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_mesh_types.h"
+
 typedef struct{
        //perhaps more info later I might guess
        float location[3];
@@ -29,4 +36,17 @@
        SNAPMESH_DAT_face
 }SnapMesh_data_array_type;
 
+void Snap_run(Snap* s);
+void Snap_free(Snap* s);
+
+int Snap_getretval(Snap* s);
+SnapPoint* Snap_getSnapPoint(Snap* s);
+
+Snap* SnapMesh_create( void* mesh_data,
+                                               SnapMesh_data_type data_type,
+                                               SnapMesh_type sm_type,
+                                               Scene *scene, Object *ob, 
View3D *v3d, ARegion *ar, int mval[2]);
+
+
+
 #endif // __BKE_SNAP_H__

Modified: branches/soc-2012-sushi/source/blender/blenkernel/intern/snap.c
===================================================================
--- branches/soc-2012-sushi/source/blender/blenkernel/intern/snap.c     
2012-06-26 10:18:53 UTC (rev 48309)
+++ branches/soc-2012-sushi/source/blender/blenkernel/intern/snap.c     
2012-06-26 12:50:16 UTC (rev 48310)
@@ -19,16 +19,19 @@
 
 #include "BLI_math_vector.h"
 
+#include <stdio.h>
+
 #include <stdlib.h>
 #include <math.h>
 #include <float.h>
 
 /* -- PROTOTYPES -- */
+typedef struct MeshData MeshData;
 void Snap_draw_default(Snap *s);
-void SnapMesh_run(Snap *s);
+void SnapMesh_run(Snap *sm);
+void SnapMesh_free(Snap* sm);
 
 
-
 struct Snap{
        int snap_found; //boolean whether snap point has been found
        SnapPoint snap_point;
@@ -62,14 +65,16 @@
 
        //transform
 
+       /*subclass data struct*/
        void* snap_data;
 
-       void (*run)(Snap*); //function pointer
-       void (*draw)(Snap*); //function pointer
+       /*function pointers*/
+       void (*run)(Snap*);
+       void (*draw)(Snap*);
+       void (*free)(Snap*);
        //void callback for doing transform -- function pointer
 };
 
-
 Snap* Snap_create(Scene *scene, Object* ob, View3D *v3d, ARegion *ar, int 
mval[2]){
        Snap* s = (Snap*)MEM_mallocN(sizeof(Snap), "snap");
 
@@ -81,6 +86,7 @@
 
        s->min_distance = 30; //TODO: change to a user defined value;
 
+       //TODO: pass the function pointers in as arguments
        s->snap_found = 0;
        s->run = NULL;
        s->draw = NULL;
@@ -92,6 +98,14 @@
        copy_v2_v2_int(s->mval, mval);
 }
 
+int Snap_getretval(Snap* s){
+       return s->retval;
+}
+
+SnapPoint* Snap_getSnapPoint(Snap* s){
+       return &(s->snap_point);
+}
+
 void Snap_calc_rays(Snap* s){
        ED_view3d_win_to_ray(s->ar, s->v3d, s->mval, s->ray_start, 
s->ray_normal);
 }
@@ -111,6 +125,10 @@
 }
 
 void Snap_free(Snap* s){
+       s->free(s);
+}
+
+void Snap_free_f(Snap* s){
        MEM_freeN(s);
 }
 
@@ -134,7 +152,7 @@
        SnapMesh_type sm_type;// -- type of snap to calculate -- can be 
combination of several
 
        SnapMesh_data_type data_type; //the type of data stored in mesh_data 
pointer.
-       void* mesh_data;
+       MeshData *mesh_data;
 
        int *dm_index_array; //for use when using derivedmesh data type;
 
@@ -142,37 +160,22 @@
 
 }SnapMesh_data;
 
-Snap* SnapMesh_create( void* mesh_data,
-                                               SnapMesh_data_type data_type,
-                                               SnapMesh_type sm_type,
-                                               Scene *scene, Object *ob, 
View3D *v3d, ARegion *ar, int mval[2]){
-       Snap* sm = Snap_create(scene, ob, v3d, ar, mval);
-       SnapMesh_data* sm_data;
-       sm->run = SnapMesh_run; //not sure whether to split into the seperate 
SnapMesh types here or not
-       //leaving generic SnapMesh_run for now.
+struct MeshData{
+       void* data;
+       int (*getNumVerts)(MeshData* md);
+       int (*getNumEdges)(MeshData* md);
+       int (*getNumFaces)(MeshData* md);
 
-       sm->draw = Snap_draw_default; //default drawing function. should put an 
optional over-ride here.
+       void (*index_init)(MeshData* md, SnapMesh_data_array_type array_type);
 
+       void (*getVert)(MeshData* md, int index, MVert* mv);
+       void (*getEdgeVerts)(MeshData* md, int index, MVert* mv1, MVert* mv2);
 
-       sm_data = (SnapMesh_data*)MEM_mallocN(sizeof(SnapMesh_data), 
"snapmesh_data");
+       int (*checkVert)(MeshData* md, int index);
+       int (*checkEdge)(MeshData* md, int index);
 
-       sm_data->sm_type = sm_type;
+};
 
-       //put an early exit flag somewhere here for the case when there is no 
geometry in mesh_data;
-       sm_data->data_type = data_type;
-       sm_data->mesh_data = mesh_data;
-       sm_data->dm_index_array = NULL;
-
-       sm->snap_data = (void*)sm_data;
-
-       return sm;
-}
-
-void SnapMesh_free(Snap* sm){
-       MEM_freeN(sm->snap_data);
-       Snap_free(sm);
-}
-
 /* Mesh Data Functions */
 
 void copy_mvert(MVert* out, MVert* in){
@@ -200,157 +203,248 @@
 
 }
 
-void SnapMesh_data_index_init(Snap *sm, SnapMesh_data_array_type array_type){
-       SnapMesh_data* sm_data = (SnapMesh_data*)sm->snap_data;
-       DerivedMesh* dm;
+/* - MeshData BMEditMesh accessor implementation - */
+
+void MeshData_BMEditMesh_index_init(MeshData* md, SnapMesh_data_array_type 
array_type){
        BMEditMesh* em;
-       switch(sm_data->data_type){
-       //hmm probably not the best for performance
-       case SNAPMESH_DATA_TYPE_BMEditMesh:
-               switch(array_type){
-               case SNAPMESH_DAT_vert:
-                       em = (BMEditMesh*)sm_data->mesh_data;
-                       EDBM_index_arrays_init(em, 1, 0, 0);
-               case SNAPMESH_DAT_edge:
-                       em = (BMEditMesh*)sm_data->mesh_data;
-                       EDBM_index_arrays_init(em, 0, 1, 0);
-               case SNAPMESH_DAT_face:
-                       em = (BMEditMesh*)sm_data->mesh_data;
-                       EDBM_index_arrays_init(em, 0, 0, 1);
-               }
-
-       case SNAPMESH_DATA_TYPE_DerivedMesh:
-               dm = (DerivedMesh*)sm_data->mesh_data;
-               sm_data->dm_index_array = dm->getTessFaceDataArray(dm, 
CD_ORIGINDEX);
+       switch(array_type){
+       case SNAPMESH_DAT_vert:
+               em = (BMEditMesh*)md->data;
+               EDBM_index_arrays_init(em, 1, 0, 0);
+               break;
+       case SNAPMESH_DAT_edge:
+               em = (BMEditMesh*)md->data;
+               EDBM_index_arrays_init(em, 0, 1, 0);
+               break;
+       case SNAPMESH_DAT_face:
+               em = (BMEditMesh*)md->data;
+               EDBM_index_arrays_init(em, 0, 0, 1);
+               break;
        }
 }
 
-int SnapMesh_data_getNumVerts(Snap *sm){
-       SnapMesh_data* sm_data = (SnapMesh_data*)sm->snap_data;
-       DerivedMesh* dm;
-       BMEditMesh* em;
-
-       switch(sm_data->data_type){
-       //hmm probably not the best for performance
-       case SNAPMESH_DATA_TYPE_BMEditMesh:
-               em = (BMEditMesh*)sm_data->mesh_data;
-               return em->bm->totvert;
-       case SNAPMESH_DATA_TYPE_DerivedMesh:
-               dm = (DerivedMesh*)sm_data->mesh_data;
-               return dm->getNumVerts(dm);
-               //verts[i];
-       }
-       return 0;
+int MeshData_BMEditMesh_getNumVerts(MeshData* md){
+       BMEditMesh* em = (BMEditMesh*)md->data;
+       return em->bm->totvert;
 }
 
-int SnapMesh_data_getNumEdges(Snap *sm){
-       SnapMesh_data* sm_data = (SnapMesh_data*)sm->snap_data;
-       DerivedMesh* dm;
-       BMEditMesh* em;
-
-       switch(sm_data->data_type){
-       //hmm probably not the best for performance
-       case SNAPMESH_DATA_TYPE_BMEditMesh:
-               em = (BMEditMesh*)sm_data->mesh_data;
-               return em->bm->totedge;
-       case SNAPMESH_DATA_TYPE_DerivedMesh:
-               dm = (DerivedMesh*)sm_data->mesh_data;
-               return dm->getNumEdges(dm);
-               //verts[i];
-       }
-       return 0;
+int MeshData_BMEditMesh_getNumEdges(MeshData* md){
+       BMEditMesh* em = (BMEditMesh*)md->data;
+       return em->bm->totedge;
 }
 
-int SnapMesh_data_getNumFaces(Snap *sm){
-       SnapMesh_data* sm_data = (SnapMesh_data*)sm->snap_data;
-       DerivedMesh* dm;
-       BMEditMesh* em;
-
-       switch(sm_data->data_type){
-       //hmm probably not the best for performance
-       case SNAPMESH_DATA_TYPE_BMEditMesh:
-               em = (BMEditMesh*)sm_data->mesh_data;
-               return em->bm->totface;
-       case SNAPMESH_DATA_TYPE_DerivedMesh:
-               dm = (DerivedMesh*)sm_data->mesh_data;
-               return dm->getNumPolys(dm);
-       }
-       return 0;
+int MeshData_BMEditMesh_getNumFaces(MeshData *md){
+       BMEditMesh* em = (BMEditMesh*)md->data;
+       return em->bm->totface;
 }
 
 /* I've chosen to have MVert and MEdge as the format in use in snapping 
because it's
   much easier to convert from BMVert to MVert than the reverse*/
 //should be inline?
-void SnapMesh_data_getVert(Snap *sm, int index, MVert* mv){
-       SnapMesh_data* sm_data = (SnapMesh_data*)sm->snap_data;
-       MVert *verts;
+void MeshData_BMEditMesh_getVert(MeshData *md, int index, MVert* mv){
        BMVert* bmv;
-       DerivedMesh* dm;
-       BMEditMesh* em;
+       BMEditMesh* em = (BMEditMesh*)md->data;
+       bmv = EDBM_vert_at_index(em, index);
+       bmvert_to_mvert(em->bm, bmv, mv);
+}
 
-       switch(sm_data->data_type){
-       //hmm probably not the best for performance
-       case SNAPMESH_DATA_TYPE_BMEditMesh:
-               em = (BMEditMesh*)sm_data->mesh_data;
-               bmv = EDBM_vert_at_index(em, index);
-               bmvert_to_mvert(em->bm, bmv, mv);
-       case SNAPMESH_DATA_TYPE_DerivedMesh:
-               dm = (DerivedMesh*)sm_data->mesh_data;
-               verts = dm->getVertArray(dm);
-               copy_mvert(mv, &(verts[index]));
+//if vert is not hidden and not selected return 1 else 0
+int MeshData_BMEditMesh_checkVert(MeshData *md, int index){
+       BMVert* bmv;
+       BMEditMesh* em = (BMEditMesh*)md->data;
+       bmv = EDBM_vert_at_index(em, index);
+       if(BM_elem_flag_test(bmv, BM_ELEM_HIDDEN) || BM_elem_flag_test(bmv, 
BM_ELEM_SELECT)){
+               return 0;
        }
+       return 1;
 }
 
+void MeshData_BMEditMesh_getEdgeVerts(MeshData *md, int index, MVert* mv1, 
MVert* mv2){
+       BMEdge* bme;
+       BMEditMesh* em = (BMEditMesh*)md->data;
+       bme = EDBM_edge_at_index(em, index);
+       bmvert_to_mvert(em->bm, bme->v1, mv1);
+       bmvert_to_mvert(em->bm, bme->v2, mv2);
+}
+
+
 //if vert is not hidden and not selected return 1 else 0
-int SnapMesh_data_VertCheck(Snap *sm, int index){
-       SnapMesh_data* sm_data = (SnapMesh_data*)sm->snap_data;
+int MeshData_BMEditMesh_checkEdge(MeshData *md, int index){
+       BMEdge* bme;
+       BMEditMesh* em = (BMEditMesh*)md->data;
+       bme = EDBM_edge_at_index(em, index);
+       /* check whether edge is hidden and if either of its vertices are 
selected*/
+       if( BM_elem_flag_test(bme, BM_ELEM_HIDDEN) ||
+               BM_elem_flag_test(bme->v1, BM_ELEM_SELECT ||
+               BM_elem_flag_test(bme->v2, BM_ELEM_SELECT))){
+               return 0;
+       }
+       return 1;
+}
+
+void MeshData_BMEditMesh_getFace(MeshData *md, int index, MVert* mv){
+
+}
+
+
+
+/* - MeshData DerivedMesh accessor implementation - */
+
+void MeshData_DerivedMesh_index_init(MeshData* md, SnapMesh_data_array_type 
array_type){
+//     DerivedMesh* dm;
+//     dm = (DerivedMesh*)md->data;
+//     sm_data->dm_index_array = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
+       //TODO: check why this code would be needed, and why it is currently 
commented out.
+}
+
+int MeshData_DerivedMesh_getNumVerts(MeshData* md){
+       DerivedMesh* dm = (DerivedMesh*)md->data;
+       return dm->getNumVerts(dm);
+}
+
+int MeshData_DerivedMesh_getNumEdges(MeshData* md){

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