[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48310] branches/soc-2012-sushi/source/ blender: Made some changes to the way the snapping system handles different types
luke frisken
l.frisken at gmail.com
Tue Jun 26 14:50:23 CEST 2012
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. @@
More information about the Bf-blender-cvs
mailing list