[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37680] branches/soc-2011-onion/source/ blender/editors: smart welding - big refactor to better allow for adding/ removing vertices on the go.
Antony Riakiotakis
kalast at gmail.com
Tue Jun 21 02:33:46 CEST 2011
Revision: 37680
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37680
Author: psy-fi
Date: 2011-06-21 00:33:45 +0000 (Tue, 21 Jun 2011)
Log Message:
-----------
smart welding - big refactor to better allow for adding/removing vertices on the go. This is a solid base commit to solidify the fun that is going to start in the next commits :)
Modified Paths:
--------------
branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c
branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h
branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
Modified: branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c 2011-06-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c 2011-06-21 00:33:45 UTC (rev 37680)
@@ -2311,49 +2311,52 @@
}
}
- /* sort individual uvs for each vert */
- for(a=0, ev=em->verts.first; ev; a++, ev= ev->next) {
- UvMapVert *newvlist= NULL, *vlist=vmap->vert[a];
- UvMapVert *iterv, *v, *lastv, *next;
- float *uv, *uv2, uvdiff[2];
+ if(limit)
+ {
+ /* sort individual uvs for each vert */
+ for(a=0, ev=em->verts.first; ev; a++, ev= ev->next) {
+ UvMapVert *newvlist= NULL, *vlist=vmap->vert[a];
+ UvMapVert *iterv, *v, *lastv, *next;
+ float *uv, *uv2, uvdiff[2];
- while(vlist) {
- v= vlist;
- vlist= vlist->next;
- v->next= newvlist;
- newvlist= v;
+ while(vlist) {
+ v= vlist;
+ vlist= vlist->next;
+ v->next= newvlist;
+ newvlist= v;
- efa = EM_get_face_for_index(v->f);
- tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- uv = tf->uv[v->tfindex];
+ efa = EM_get_face_for_index(v->f);
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ uv = tf->uv[v->tfindex];
- lastv= NULL;
- iterv= vlist;
+ lastv= NULL;
+ iterv= vlist;
- while(iterv) {
- next= iterv->next;
- efa = EM_get_face_for_index(iterv->f);
- tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- uv2 = tf->uv[iterv->tfindex];
+ while(iterv) {
+ next= iterv->next;
+ efa = EM_get_face_for_index(iterv->f);
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ uv2 = tf->uv[iterv->tfindex];
- sub_v2_v2v2(uvdiff, uv2, uv);
+ sub_v2_v2v2(uvdiff, uv2, uv);
- if(fabsf(uv[0]-uv2[0]) < limit[0] && fabsf(uv[1]-uv2[1]) < limit[1]) {
- if(lastv) lastv->next= next;
- else vlist= next;
- iterv->next= newvlist;
- newvlist= iterv;
+ if(fabsf(uv[0]-uv2[0]) < limit[0] && fabsf(uv[1]-uv2[1]) < limit[1]) {
+ if(lastv) lastv->next= next;
+ else vlist= next;
+ iterv->next= newvlist;
+ newvlist= iterv;
+ }
+ else
+ lastv=iterv;
+
+ iterv= next;
}
- else
- lastv=iterv;
- iterv= next;
+ newvlist->separate = 1;
}
- newvlist->separate = 1;
+ vmap->vert[a]= newvlist;
}
-
- vmap->vert[a]= newvlist;
}
if (do_face_idx_array)
Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h 2011-06-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h 2011-06-21 00:33:45 UTC (rev 37680)
@@ -49,9 +49,15 @@
float *previewQuads;
/* ...and here we'll store the triangles*/
float *previewTris;
+ /* Preview points.These will be the selected vertices */
+ float *previewPoints;
+ /* Colors for selected vertices */
+ int *previewPointColors;
+
/* here we'll store the number of triangles and quads to be drawn */
unsigned int numOfTris;
unsigned int numOfQuads;
+ unsigned int numOfPoints;
/* stores whether user desires preview display */
char enabled;
} StitchPreviewer;
Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c 2011-06-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c 2011-06-21 00:33:45 UTC (rev 37680)
@@ -1126,9 +1126,22 @@
/* stitch state object */
typedef struct StitchState {
- int use_limit;
+ /* edge or vertex stitch mode */
+ short mode;
+ /* use limit flag */
+ short use_limit;
+ /* limit to operator, same as original operator */
float limitDist;
- short selectMode;
+ /* operate on vertex uvs or whole edge uvs */
+ short operationMode;
+ /* vertices used in the operation */
+ GHash *vertices;
+ /* faces affected by operation */
+ GHash *faces;
+ /* editmesh, cached for use in modal handler */
+ EditMesh *em;
+ /* vertmap, contains vertices sharing uv's in linked lists. */
+ UvVertMap *vmap;
} StitchState;
#define VERT_STITCH 1
@@ -1143,6 +1156,14 @@
_stitch_preview = MEM_mallocN(sizeof(StitchPreviewer), "stitch_previewer");
_stitch_preview->previewQuads = NULL;
_stitch_preview->previewTris = NULL;
+ _stitch_preview->previewPoints = NULL;
+ _stitch_preview->previewPointColors = NULL;
+
+ _stitch_preview->numOfQuads = 0;
+ _stitch_preview->numOfTris = 0;
+ _stitch_preview->numOfPoints = 0;
+
+ _stitch_preview->enabled = 1;
return _stitch_preview;
}
@@ -1161,6 +1182,16 @@
MEM_freeN(_stitch_preview->previewTris);
_stitch_preview->previewTris = NULL;
}
+ if(_stitch_preview->previewPoints)
+ {
+ MEM_freeN(_stitch_preview->previewPoints);
+ _stitch_preview->previewPoints = NULL;
+ }
+ if(_stitch_preview->previewPointColors)
+ {
+ MEM_freeN(_stitch_preview->previewPointColors);
+ _stitch_preview->previewPointColors = NULL;
+ }
MEM_freeN(_stitch_preview);
_stitch_preview = NULL;
}
@@ -1185,10 +1216,145 @@
}
}
+static void stitch_prepare_preview_data(StitchState *state)
+{
+ StitchPreviewer *preview = uv_get_stitch_previewer();
+ UVVertAverage *uv_average;
+ GHash *vertices = state->vertices;
+ GHash *faces = state->faces;
+ UvVertMap *vmap = state->vmap;
+ int numOfPoints = 0;
+ GHashIterator *ghiter;
+ int bufferIterator = 0;
+ int averageBufferIterator = 0;
+ EditFace *efa;
+ MTFace *mt;
+
+ /* cleanup previous preview(if any) */
+ if(preview->previewQuads){
+ MEM_freeN(preview->previewQuads);
+ preview->previewQuads = NULL;
+ }
+ if(preview->previewTris){
+ MEM_freeN(preview->previewTris);
+ preview->previewTris = NULL;
+ }
+ if(preview->previewPoints){
+ MEM_freeN(preview->previewPoints);
+ preview->previewPoints = NULL;
+ }
+ if(preview->previewPointColors){
+ MEM_freeN(preview->previewPointColors);
+ preview->previewPointColors = NULL;
+ }
+ ghiter = BLI_ghashIterator_new(faces);
+
+ uv_average = MEM_callocN(sizeof(UVVertAverage)*BLI_ghash_size(vertices), "stitch_averages");
+
+ BLI_ghashIterator_init(ghiter, vertices);
+
+ /* Count number of points/faces so that we allocate appropriate buffer */
+ for( ; !BLI_ghashIterator_isDone(ghiter); BLI_ghashIterator_step(ghiter), averageBufferIterator++){
+ EditVert *editVert = BLI_ghashIterator_getKey(ghiter);
+ UvMapVert *mapVert = vmap->vert[editVert->tmp.l];
+
+ while(mapVert){
+ efa = EM_get_face_for_index(mapVert->f);
+ mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+ efa = EM_get_face_for_index(mapVert->f);
+ mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+ uv_average[averageBufferIterator].count++;
+ uv_average[averageBufferIterator].uv[0] += mt->uv[mapVert->tfindex][0];
+ uv_average[averageBufferIterator].uv[1] += mt->uv[mapVert->tfindex][1];
+
+ mapVert = mapVert->next;
+ numOfPoints++;
+ if(!BLI_ghash_haskey(faces, efa))
+ {
+ BLI_ghash_insert(faces, efa, NULL);
+ /* store position in the preview buffer */
+ if(efa->v4)
+ {
+ efa->tmp.l = preview->numOfQuads;
+ preview->numOfQuads++;
+ }
+ else {
+ efa->tmp.l = preview->numOfTris;
+ preview->numOfTris++;
+ }
+ }
+ }
+ }
+
+ /* Initialize the preview buffers */
+ preview->previewQuads = (float *)MEM_mallocN(preview->numOfQuads*sizeof(float)*8, "quad_uv_stitch_prev");
+ preview->previewTris = (float *)MEM_mallocN(preview->numOfTris*sizeof(float)*6, "tri_uv_stitch_prev");
+ preview->previewPoints = MEM_mallocN(numOfPoints*sizeof(float)*2, "stitch_preview_points");
+ preview->previewPointColors = MEM_mallocN(numOfPoints*sizeof(unsigned int)*2, "stitch_preview_point_colors");
+
+ BLI_ghashIterator_init(ghiter, faces);
+
+ /* Copy data from MTFaces to the preview display buffers */
+ for( ; !BLI_ghashIterator_isDone(ghiter); BLI_ghashIterator_step(ghiter)){
+ efa = BLI_ghashIterator_getKey(ghiter);
+ mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+ if(efa->v4)
+ {
+ memcpy(preview->previewQuads+efa->tmp.l*8, &mt->uv[0][0], 8*sizeof(float));
+ }
+ else {
+ memcpy(preview->previewTris+efa->tmp.l*6, &mt->uv[0][0], 6*sizeof(float));
+ }
+ }
+
+ BLI_ghashIterator_init(ghiter, vertices);
+ for(averageBufferIterator = 0; !BLI_ghashIterator_isDone(ghiter); BLI_ghashIterator_step(ghiter), averageBufferIterator++){
+ short stitchable;
+ EditVert *editVert = BLI_ghashIterator_getKey(ghiter);
+ UvMapVert *mapVert = vmap->vert[editVert->tmp.l];
+ stitchable = (mapVert->next != NULL);
+
+ while(mapVert){
+ float uv[2];
+ efa = EM_get_face_for_index(mapVert->f);
+ mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+ uv[0] = uv_average[averageBufferIterator].uv[0]/uv_average[averageBufferIterator].count;
+ uv[1] = uv_average[averageBufferIterator].uv[1]/uv_average[averageBufferIterator].count;
+ preview->previewPoints[bufferIterator*2] = uv[0];
+ preview->previewPoints[bufferIterator*2 + 1] = uv[1];
+ preview->previewPointColors[bufferIterator] = stitchable? (0x00FF0000):(0x0000FF00);
+
+ if(efa->v4){
+ preview->previewQuads[efa->tmp.l*8 + 2*mapVert->tfindex] = uv[0];
+ preview->previewQuads[efa->tmp.l*8 + 2*mapVert->tfindex + 1] = uv[1];
+ }
+ else {
+ preview->previewTris[efa->tmp.l*6 + 2*mapVert->tfindex] = uv[0];
+ preview->previewTris[efa->tmp.l*6 + 2*mapVert->tfindex + 1] = uv[1];
+ }
+ mapVert = mapVert->next;
+ bufferIterator++;
+ }
+ }
+
+ MEM_freeN(uv_average);
+
+ BLI_ghashIterator_free(ghiter);
+}
+
static int stitch_init(bContext *C, wmOperator *op)
{
+ EditFace *efa;
StitchState *stitch_state = MEM_mallocN(sizeof(StitchState), "stitch_state");
StitchPreviewer *preview = stitch_preview_init();
+ EditMesh *em;
+ Object *obedit = CTX_data_edit_object(C);
+ Scene *scene = CTX_data_scene(C);
+ GHash *tempHash;
+ GHashIterator *ghiter;
preview->enabled = 1;
op->customdata = stitch_state;
@@ -1198,7 +1364,48 @@
stitch_state->use_limit = RNA_boolean_get(op->ptr, "use_limit");
stitch_state->limitDist = RNA_float_get(op->ptr, "limit");
+ stitch_state->vertices = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "stitch_operator_vertices");
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list