[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