[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37610] branches/soc-2011-onion/source/ blender/editors/uvedit: smart welding - preview drawing for uv' s without limt.

Ryakiotakis Antonis kalast at gmail.com
Sat Jun 18 02:30:42 CEST 2011


Revision: 37610
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37610
Author:   psy-fi
Date:     2011-06-18 00:30:42 +0000 (Sat, 18 Jun 2011)
Log Message:
-----------
smart welding - preview drawing for uv's without limt. also erased some unnecessary code in the operator.

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.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/uvedit/uvedit_draw.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c	2011-06-17 22:45:33 UTC (rev 37609)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c	2011-06-18 00:30:42 UTC (rev 37610)
@@ -525,17 +525,6 @@
 		}
 		
 	}
-	
-	/* 2.5 draw test :) */
-	if((stitch_preview) && stitch_preview->enabled){
-		glColor4f(1.0, 1.0, 1.0, 1.0);
-		glBegin(GL_QUADS);
-		glVertex2f(-0.5, -0.5);
-		glVertex2f(0.5, -0.5);
-		glVertex2f(0.5, 0.5);
-		glVertex2f(-0.5, 0.5);
-		glEnd();
-	}
 
 	/* 3. draw active face stippled */
 
@@ -845,6 +834,26 @@
 		bglEnd();	
 	}
 
+	/* finally draw stitch preview */
+	if((stitch_preview) && stitch_preview->enabled){
+		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+		glColor4f(0.0, 1.0, 0.0, 0.5);
+		glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
+		glEnable(GL_VERTEX_ARRAY);
+		glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewTris);
+		glDrawArrays(GL_TRIANGLES, 0, stitch_preview->numOfTris*3);
+		glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewQuads);
+		glDrawArrays(GL_QUADS, 0, stitch_preview->numOfQuads*4);
+		glColor4f(0.0, 0.0, 1.0, 0.5);
+		glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+		glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewTris);
+		glDrawArrays(GL_TRIANGLES, 0, stitch_preview->numOfTris*3);
+		glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewQuads);
+		glDrawArrays(GL_QUADS, 0, stitch_preview->numOfQuads*4);
+		glPopClientAttrib();
+		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+	}
+
 	glPointSize(1.0);
 	BKE_mesh_end_editmesh(obedit->data, em);
 }

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-17 22:45:33 UTC (rev 37609)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h	2011-06-18 00:30:42 UTC (rev 37610)
@@ -42,11 +42,17 @@
 struct Object;
 struct wmOperatorType;
 
+/* Object that stores display data for previewing before accepting stitching */
 typedef struct StitchPreviewer {
-	float *previewQuads[4][2];
-	float *previewTris[2][2];
+	/* OpenGL requires different calls for Triangles and Quads.
+	 * here we'll store the quads of the mesh */
+	float *previewQuads;
+	/* ...and here we'll store the triangles*/
+	float *previewTris;
+	/* here we'll store the number of triangles and quads to be drawn */
 	unsigned int numOfTris;
 	unsigned int numOfQuads;
+	/* 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-17 22:45:33 UTC (rev 37609)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-18 00:30:42 UTC (rev 37610)
@@ -46,6 +46,7 @@
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
 #include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 
 #include "BKE_context.h"
 #include "BKE_customdata.h"
@@ -1120,12 +1121,11 @@
 /* just for averaging UVs */
 typedef struct UVVertAverage {
 	float uv[2];
-	int count;
+	unsigned short count;
 } UVVertAverage;
 
 /* stitch state object */
 typedef struct StitchState {
-	short preview;
 	int use_limit;
 	float limitDist;
 	short selectMode;
@@ -1134,19 +1134,31 @@
 #define VERT_STITCH 1
 #define EDGE_STITCH 2
 
-/* Previewer stuff */
+/* Previewer stuff (see uvedit_intern.h for more info) */
 static StitchPreviewer *_stitch_preview;
 
-static StitchPreviewer * stitch_preview_init()
+static StitchPreviewer * stitch_preview_init(void)
 {
 	_stitch_preview = MEM_mallocN(sizeof(StitchPreviewer), "stitch_previewer");
+	_stitch_preview->previewQuads = NULL;
+	_stitch_preview->previewTris = NULL;
 	return _stitch_preview;
 }
 
-static void stitch_preview_delete()
+static void stitch_preview_delete(void)
 {
 	if(_stitch_preview)
 	{
+		if(_stitch_preview->previewQuads)
+		{
+			MEM_freeN(_stitch_preview->previewQuads);
+			_stitch_preview->previewQuads = NULL;
+		}
+		if(_stitch_preview->previewTris)
+		{
+			MEM_freeN(_stitch_preview->previewTris);
+			_stitch_preview->previewTris = NULL;
+		}
 		MEM_freeN(_stitch_preview);
 		_stitch_preview = NULL;
 	}
@@ -1186,16 +1198,8 @@
 	return 1;
 }
 
-static int stitch_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
-{
-	if(!stitch_init(C, op))
-		return OPERATOR_CANCELLED;
 
-	WM_event_add_modal_handler(C, op);
-	return OPERATOR_RUNNING_MODAL;
-}
-
-static int stitch_uvs(bContext *C, wmOperator *op)
+static int stitch_uvs(bContext *C, wmOperator *op, int final)
 {
 	Scene *scene;
 	Object *obedit;
@@ -1205,12 +1209,28 @@
 	Image *ima;
 	MTFace *tf;
 	StitchState *stitch_state;
+	StitchPreviewer *preview;
 
+	preview = uv_get_stitch_previewer();
+	preview->numOfQuads = 0;
+	preview->numOfTris = 0;
+
 	stitch_state = (StitchState *)op->customdata;
 	scene= CTX_data_scene(C);
 	obedit= CTX_data_edit_object(C);
 	em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
 	ima= CTX_data_edit_image(C);
+
+	if(preview->previewQuads)
+	{
+		MEM_freeN(preview->previewQuads);
+		preview->previewQuads = NULL;
+	}
+	if(preview->previewTris)
+	{
+		MEM_freeN(preview->previewTris);
+		preview->previewTris = NULL;
+	}
 	
 	if(stitch_state->use_limit) {
 		UvVertMap *vmap;
@@ -1261,8 +1281,13 @@
 						tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
 
 						if(uvedit_uv_selected(scene, efa, tf, iterv->tfindex)) {
-							tf->uv[iterv->tfindex][0]= newuv[0];
-							tf->uv[iterv->tfindex][1]= newuv[1];
+							if(final){
+								tf->uv[iterv->tfindex][0]= newuv[0];
+								tf->uv[iterv->tfindex][1]= newuv[1];
+							}
+							if(preview->enabled){
+
+							}
 						}
 					}
 				}
@@ -1276,24 +1301,25 @@
 	}
 	else {
 		UVVertAverage *uv_average, *uvav;
-		int count;
-
-		// index and count verts
-		for(count=0, eve=em->verts.first; eve; count++, eve= eve->next)
-			eve->tmp.l = count;
+		int tri_index = 0, quad_index = 0;
 		
-		uv_average= MEM_callocN(sizeof(UVVertAverage)*count, "Stitch");
+		uv_average= MEM_callocN(sizeof(UVVertAverage)*em->totvert, "Stitch");
 		
 		// gather uv averages per vert
 		for(efa= em->faces.first; efa; efa= efa->next) {
 			tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
 
 			if(uvedit_face_visible(scene, ima, efa, tf)) {
+				/* is face updated? */
+				unsigned short tag = 0;
+
 				if(uvedit_uv_selected(scene, efa, tf, 0)) {
 					uvav = uv_average + efa->v1->tmp.l;
 					uvav->count++;
 					uvav->uv[0] += tf->uv[0][0];
 					uvav->uv[1] += tf->uv[0][1];
+					/* if count > 1, then this face will be drawn for preview */
+					tag = 1;
 				}
 
 				if(uvedit_uv_selected(scene, efa, tf, 1)) {
@@ -1301,6 +1327,7 @@
 					uvav->count++;
 					uvav->uv[0] += tf->uv[1][0];
 					uvav->uv[1] += tf->uv[1][1];
+					tag = 1;
 				}
 
 				if(uvedit_uv_selected(scene, efa, tf, 2)) {
@@ -1308,6 +1335,7 @@
 					uvav->count++;
 					uvav->uv[0] += tf->uv[2][0];
 					uvav->uv[1] += tf->uv[2][1];
+					tag = 1;
 				}
 
 				if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
@@ -1315,49 +1343,121 @@
 					uvav->count++;
 					uvav->uv[0] += tf->uv[3][0];
 					uvav->uv[1] += tf->uv[3][1];
+					tag = 1;
 				}
+
+				if(tag){
+					if(efa->v4){
+						preview->numOfQuads++;
+					}
+					else {
+						preview->numOfTris++;
+					}
+				}
 			}
 		}
 		
+		if(preview->enabled && !final){
+			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");
+		}
 		// apply uv welding
 		for(efa= em->faces.first; efa; efa= efa->next) {
 			tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
 
 			if(uvedit_face_visible(scene, ima, efa, tf)) {
-				if(uvedit_uv_selected(scene, efa, tf, 0)) {
-					uvav = uv_average + efa->v1->tmp.l;
-					tf->uv[0][0] = uvav->uv[0]/uvav->count;
-					tf->uv[0][1] = uvav->uv[1]/uvav->count;
-				}
+				if(final)
+				{
+					if(uvedit_uv_selected(scene, efa, tf, 0)) {
+						uvav = uv_average + efa->v1->tmp.l;
+						tf->uv[0][0] = uvav->uv[0]/uvav->count;
+						tf->uv[0][1] = uvav->uv[1]/uvav->count;
+					}
 
-				if(uvedit_uv_selected(scene, efa, tf, 1)) {
-					uvav = uv_average + efa->v2->tmp.l;
-					tf->uv[1][0] = uvav->uv[0]/uvav->count;
-					tf->uv[1][1] = uvav->uv[1]/uvav->count;
-				}
+					if(uvedit_uv_selected(scene, efa, tf, 1)) {
+						uvav = uv_average + efa->v2->tmp.l;
+						tf->uv[1][0] = uvav->uv[0]/uvav->count;
+						tf->uv[1][1] = uvav->uv[1]/uvav->count;
+					}
 
-				if(uvedit_uv_selected(scene, efa, tf, 2)) {
-					uvav = uv_average + efa->v3->tmp.l;
-					tf->uv[2][0] = uvav->uv[0]/uvav->count;
-					tf->uv[2][1] = uvav->uv[1]/uvav->count;
+					if(uvedit_uv_selected(scene, efa, tf, 2)) {
+						uvav = uv_average + efa->v3->tmp.l;
+						tf->uv[2][0] = uvav->uv[0]/uvav->count;
+						tf->uv[2][1] = uvav->uv[1]/uvav->count;
+					}
+
+					if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
+						uvav = uv_average + efa->v4->tmp.l;
+						tf->uv[3][0] = uvav->uv[0]/uvav->count;
+						tf->uv[3][1] = uvav->uv[1]/uvav->count;
+					}
 				}
+				if(preview->enabled && !final)
+				{
+					float *uv_tmp;
+					char v1sel = uvedit_uv_selected(scene, efa, tf, 0);
+					char v2sel = uvedit_uv_selected(scene, efa, tf, 1);
+					char v3sel = uvedit_uv_selected(scene, efa, tf, 2);
+					char v4sel = efa->v4 && uvedit_uv_selected(scene, efa, tf, 3);
+					if(!(v1sel || v2sel || v3sel || v4sel))
+						continue;
+					if(efa->v4)
+					{
+						uv_tmp = preview->previewQuads+quad_index*8;
+						quad_index++;
+						memcpy(uv_tmp, &tf->uv[0][0], 8*sizeof(float));
+					} else {
+						uv_tmp = preview->previewTris+tri_index*6;
+						memcpy(uv_tmp, &tf->uv[0][0], 6*sizeof(float));
+						tri_index++;
+					}
+					if(v1sel) {
+						uvav = uv_average + efa->v1->tmp.l;
+						uv_tmp[0] = uvav->uv[0]/uvav->count;
+						uv_tmp[1] = uvav->uv[1]/uvav->count;
+					}
 
-				if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
-					uvav = uv_average + efa->v4->tmp.l;
-					tf->uv[3][0] = uvav->uv[0]/uvav->count;
-					tf->uv[3][1] = uvav->uv[1]/uvav->count;
+					if(v2sel) {
+						uvav = uv_average + efa->v2->tmp.l;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list