[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37738] branches/soc-2011-onion/source/ blender/editors/uvedit: smart welding - implemented preview with uv selection mask but much to my annoyment crashes remain .
Antony Riakiotakis
kalast at gmail.com
Wed Jun 22 19:35:06 CEST 2011
Revision: 37738
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37738
Author: psy-fi
Date: 2011-06-22 17:35:05 +0000 (Wed, 22 Jun 2011)
Log Message:
-----------
smart welding - implemented preview with uv selection mask but much to my annoyment crashes remain.
Modified Paths:
--------------
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/uvedit/uvedit_intern.h
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h 2011-06-22 17:17:48 UTC (rev 37737)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h 2011-06-22 17:35:05 UTC (rev 37738)
@@ -52,7 +52,7 @@
/* Preview points.These will be the selected vertices */
float *previewPoints;
/* Colors for selected vertices */
- int *previewPointColors;
+ unsigned int *previewPointColors;
/* here we'll store the number of triangles and quads to be drawn */
unsigned int numOfTris;
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-22 17:17:48 UTC (rev 37737)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c 2011-06-22 17:35:05 UTC (rev 37738)
@@ -1134,10 +1134,6 @@
float limitDist;
/* 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. */
@@ -1220,56 +1216,77 @@
{
StitchPreviewer *preview = uv_get_stitch_previewer();
UVVertAverage *uv_average;
- GHash *vertices = state->vertices;
- GHash *faces = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "stitch_operator_faces");
UvVertMap *vmap = state->vmap;
- int numOfPoints = 0;
- GHashIterator *ghiter;
+ int i;
int bufferIterator = 0;
- int averageBufferIterator = 0;
- EditFace *efa;
+ EditFace *editFace, *efa, **faceArray;
+ EditVert *editVert;
MTFace *mt;
short preview_enabled = preview->enabled;
+ const char FACE_UVS_SELECTED = TF_SEL1 | TF_SEL2 | TF_SEL3 | TF_SEL4;
- /* cleanup previous preview(if any) */
+ /* cleanup previous preview */
stitch_preview_delete();
preview = stitch_preview_init();
+ /*todo better store this in state */
preview->enabled = preview_enabled;
- EM_init_index_arrays(state->em, 0, 0, 1);
+ uv_average = (UVVertAverage *)MEM_callocN(state->em->totvert*sizeof(UVVertAverage), "stitch_averages");
- ghiter = BLI_ghashIterator_new(vertices);
+ faceArray = (EditFace **)MEM_mallocN(state->em->totface*sizeof(EditFace *), "stitch preview faceArray");
+ /* Store Indices to editVerts */
+ for(editVert = state->em->verts.first, i = 0; editVert; editVert = editVert->next, i++){
+ editVert->tmp.t = i;
+ }
- uv_average = MEM_callocN(sizeof(UVVertAverage)*BLI_ghash_size(vertices), "stitch_averages");
+ /* Make face array and initialize position in preview buffer */
+ for(editFace = state->em->faces.first, i = 0; editFace; editFace = editFace->next, i++){
+ faceArray[i] = editFace;
+ editFace->tmp.l = -1;
+ }
/* 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];
+ for(editFace = state->em->faces.first ; editFace; editFace=editFace->next){
+ mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
+ /* if face has UV selected... */
+ if(mt->flag & FACE_UVS_SELECTED){
+ int vertsPerFace = editFace->v4 ? 4 : 3;
- while(mapVert){
- efa = EM_get_face_for_index(mapVert->f);
- mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+ for(i = 0; i < vertsPerFace; i++){
+ if(mt->flag & TF_SEL_MASK(i))
+ {
+ /* ...we'll iterate through all shared UV's of the corresponding vertex */
+ UvMapVert *mapVert = vmap->vert[(*(&(editFace->v1)+i))->tmp.t];
+ /* flag is not set anywhere so assuming it's safe to set to indicate use for preview */
+ mapVert->flag = 1;
- uv_average[averageBufferIterator].count++;
- uv_average[averageBufferIterator].uv[0] += mt->uv[mapVert->tfindex][0];
- uv_average[averageBufferIterator].uv[1] += mt->uv[mapVert->tfindex][1];
+ while(mapVert){
+ efa = faceArray[mapVert->f];
+ mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
- mapVert = mapVert->next;
- numOfPoints++;
- if(!BLI_ghash_haskey(faces, efa)){
- BLI_ghash_insert(faces, efa, NULL);
+ preview->numOfPoints++;
- /* store position in the preview buffer */
- if(efa->v4)
- {
- efa->tmp.l = preview->numOfQuads;
- preview->numOfQuads++;
+ uv_average[(*(&(editFace->v1)+i))->tmp.t].count++;
+ uv_average[(*(&(editFace->v1)+i))->tmp.t].uv[0] += mt->uv[mapVert->tfindex][0];
+ uv_average[(*(&(editFace->v1)+i))->tmp.t].uv[1] += mt->uv[mapVert->tfindex][1];
+
+ mapVert = mapVert->next;
+
+ /* store position in the preview buffer */
+ if(efa->tmp.l == -1)
+ {
+ if(efa->v4)
+ {
+ efa->tmp.l = preview->numOfQuads*8;
+ preview->numOfQuads++;
+ }
+ else {
+ efa->tmp.l = preview->numOfTris*6;
+ preview->numOfTris++;
+ }
+ }
+ }
}
- else {
- efa->tmp.l = preview->numOfTris;
- preview->numOfTris++;
- }
}
}
}
@@ -1277,74 +1294,71 @@
/* 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 = (float *)MEM_mallocN(numOfPoints*sizeof(float)*2, "stitch_preview_points");
- preview->previewPointColors = (float *)MEM_mallocN(numOfPoints*sizeof(unsigned int), "stitch_preview_point_colors");
+ preview->previewPoints = (float *)MEM_mallocN(preview->numOfPoints*sizeof(float)*2, "stitch_preview_points");
+ preview->previewPointColors = (unsigned int *)MEM_mallocN(preview->numOfPoints*sizeof(unsigned int), "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)
+ for(editFace = state->em->faces.first; editFace; editFace = editFace->next){
+ if(editFace->tmp.l != -1)
{
- memcpy(preview->previewQuads+efa->tmp.l*8, &mt->uv[0][0], 8*sizeof(float));
+ mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
+
+ if(editFace->v4)
+ {
+ memcpy(preview->previewQuads+editFace->tmp.l, &mt->uv[0][0], 8*sizeof(float));
+ }
+ else {
+ memcpy(preview->previewTris+editFace->tmp.l, &mt->uv[0][0], 6*sizeof(float));
+ }
}
- else {
- memcpy(preview->previewTris+efa->tmp.l*6, &mt->uv[0][0], 6*sizeof(float));
- }
}
- BLI_ghash_free(faces, NULL, NULL);
-
- BLI_ghashIterator_init(ghiter, vertices);
- for(averageBufferIterator = 0; !BLI_ghashIterator_isDone(ghiter); BLI_ghashIterator_step(ghiter), averageBufferIterator++){
+ for(editVert = state->em->verts.first; editVert; editVert = editVert->next){
short stitchable;
- EditVert *editVert = BLI_ghashIterator_getKey(ghiter);
- UvMapVert *mapVert = vmap->vert[editVert->tmp.l];
- stitchable = (mapVert->next != NULL);
+ UvMapVert *mapVert = vmap->vert[editVert->tmp.t];
- 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(mapVert->flag){
+ /* UV's that have a corresponding stitchable UV have a mapVert->next */
+ stitchable = (mapVert->next != NULL);
- 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];
+ while(mapVert){
+ float uv[2];
+ int averageBufIndex;
+ efa = faceArray[mapVert->f];
+
+ averageBufIndex = (*(&(efa->v1) + mapVert->tfindex))->tmp.t;
+ uv[0] = uv_average[averageBufIndex].uv[0]/uv_average[averageBufIndex].count;
+ uv[1] = uv_average[averageBufIndex].uv[1]/uv_average[averageBufIndex].count;
+ preview->previewPoints[bufferIterator*2] = uv[0];
+ preview->previewPoints[bufferIterator*2 + 1] = uv[1];
+ /* stitchable uv's will be green, non-stitchable red */
+ preview->previewPointColors[bufferIterator] = stitchable? (0x00FF0000):(0x0000FF00);
+
+ if(efa->v4){
+ preview->previewQuads[efa->tmp.l + 2*mapVert->tfindex] = uv[0];
+ preview->previewQuads[efa->tmp.l + 2*mapVert->tfindex + 1] = uv[1];
+ }
+ else {
+ preview->previewTris[efa->tmp.l + 2*mapVert->tfindex] = uv[0];
+ preview->previewTris[efa->tmp.l + 2*mapVert->tfindex + 1] = uv[1];
+ }
+ mapVert = mapVert->next;
+ bufferIterator++;
}
- 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);
-
- EM_free_index_arrays();
-
- BLI_ghashIterator_free(ghiter);
+ MEM_freeN(faceArray);
}
+
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;
@@ -1354,43 +1368,10 @@
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");
stitch_state->em = em = BKE_mesh_get_editmesh((Mesh*)obedit->data);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list