[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30911] branches/soc-2010-nicolasbishop: = = VPaint ==

Nicholas Bishop nicholasbishop at gmail.com
Sat Jul 31 00:10:35 CEST 2010


Revision: 30911
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30911
Author:   nicholasbishop
Date:     2010-07-31 00:10:34 +0200 (Sat, 31 Jul 2010)

Log Message:
-----------
== VPaint ==

* Added an operator to convert vcols to texture; works for multires vcols too
* Still has some seam issues, need to do more intelligent bleeding
* Current UI is a menu item in the Image menu (Vertex Colors to Texture)

Modified Paths:
--------------
    branches/soc-2010-nicolasbishop/release/scripts/ui/space_image.py
    branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_math_geom.h
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c

Modified: branches/soc-2010-nicolasbishop/release/scripts/ui/space_image.py
===================================================================
--- branches/soc-2010-nicolasbishop/release/scripts/ui/space_image.py	2010-07-30 19:24:41 UTC (rev 30910)
+++ branches/soc-2010-nicolasbishop/release/scripts/ui/space_image.py	2010-07-30 22:10:34 UTC (rev 30911)
@@ -137,7 +137,10 @@
 
             layout.prop(sima, "image_painting")
 
+            layout.separator()
+            layout.operator("paint.vertex_colors_to_texture")
 
+
 class IMAGE_MT_uvs_showhide(bpy.types.Menu):
     bl_label = "Show/Hide Faces"
 

Modified: branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_math_geom.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_math_geom.h	2010-07-30 19:24:41 UTC (rev 30910)
+++ branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_math_geom.h	2010-07-30 22:10:34 UTC (rev 30911)
@@ -96,7 +96,6 @@
 	float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float epsilon);
 
 /* point in polygon */
-int isect_point_tri_v2(float p[2], float a[2], float b[2], float c[2]);
 int isect_point_quad_v2(float p[2], float a[2], float b[2], float c[2], float d[2]);
 
 int isect_point_tri_v2(float v1[2], float v2[2], float v3[2], float pt[2]);

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h	2010-07-30 19:24:41 UTC (rev 30910)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h	2010-07-30 22:10:34 UTC (rev 30911)
@@ -143,6 +143,7 @@
 void PAINT_OT_vertex_paint_radial_control(struct wmOperatorType *ot);
 void PAINT_OT_vertex_paint_toggle(struct wmOperatorType *ot);
 void PAINT_OT_vertex_paint(struct wmOperatorType *ot);
+void PAINT_OT_vertex_colors_to_texture(struct wmOperatorType *ot);
 
 unsigned int vpaint_get_current_col(struct VPaint *vp);
 

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c	2010-07-30 19:24:41 UTC (rev 30910)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c	2010-07-30 22:10:34 UTC (rev 30911)
@@ -1,8 +1,3 @@
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
 #include "MEM_guardedalloc.h"
 
 #include "DNA_material_types.h"
@@ -439,11 +434,6 @@
 	return 0;
 }
 
-typedef enum {
-	LAYER_ADDED,
-	LAYER_REMOVED
-} PaintMaskLayerOp;
-
 static int mask_layer_poll(bContext *C)
 {
 	return mask_poll(C) && ED_mesh_layers_poll(C);

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c	2010-07-30 19:24:41 UTC (rev 30910)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c	2010-07-30 22:10:34 UTC (rev 30911)
@@ -216,6 +216,7 @@
 	WM_operatortype_append(PAINT_OT_vertex_paint_toggle);
 	WM_operatortype_append(PAINT_OT_vertex_paint);
 	WM_operatortype_append(PAINT_OT_vertex_color_set);
+	WM_operatortype_append(PAINT_OT_vertex_colors_to_texture);
 
 	/* face-select */
 	WM_operatortype_append(PAINT_OT_face_select_linked);

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c	2010-07-30 19:24:41 UTC (rev 30910)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c	2010-07-30 22:10:34 UTC (rev 30911)
@@ -64,6 +64,7 @@
 #include "BKE_displist.h"
 #include "BKE_dmgrid.h"
 #include "BKE_global.h"
+#include "BKE_image.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_multires.h"
@@ -2137,6 +2138,209 @@
 	RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
 }
 
+/**** convert vertex colors to texture ****/
+static void vcol_to_tex_tri(ImBuf *ibuf,
+			    float uv1[2], float uv2[2], float uv3[3],
+			    float col1[3], float col2[3], float col3[3])
+{
+	/* ibuf coords */
+	float t[3][2] = {{uv1[0] * ibuf->x, uv1[1] * ibuf->y},
+			 {uv2[0] * ibuf->x, uv2[1] * ibuf->y},
+			 {uv3[0] * ibuf->x, uv3[1] * ibuf->y}};
+	float co[2];
+	rctf r;
+	int i;
+	
+	r.xmin = MIN3(t[0][0], t[1][0], t[2][0]);
+	r.xmax = MAX3(t[0][0], t[1][0], t[2][0]);
+	r.ymin = MIN3(t[0][1], t[1][1], t[2][1]);
+	r.ymax = MAX3(t[0][1], t[1][1], t[2][1]);
+
+	/* expand by a pixel */
+	for(i = 0; i < 3; ++i) {
+		if(r.xmin == t[i][0])
+			--t[i][0];
+		if(r.xmax == t[i][0])
+			++t[i][0];
+		if(r.ymin == t[i][1])
+			--t[i][1];
+		if(r.ymax == t[i][1])
+			++t[i][1];
+	}
+	r.xmin = (int)(r.xmin+0.5f) - 2;
+	r.xmax = (int)(r.xmax+0.5f) + 2;
+	r.ymin = (int)(r.ymin+0.5f) - 2;
+	r.ymax = (int)(r.ymax+0.5f) + 2;
+
+	for(co[1] = r.ymin; co[1] <= r.ymax; ++co[1]) {
+		for(co[0] = r.xmin; co[0] <= r.xmax; ++co[0]) {
+			if(isect_point_tri_v2(co, t[0], t[1], t[2])) {
+				float w[3], col[3];
+				int offset = ibuf->x * co[1] + co[0];
+
+				barycentric_weights_v2(t[0], t[1], t[2], co, w);
+				interp_v3_v3v3v3(col, col1, col2, col3, w);
+
+				if(ibuf->rect_float) {
+					copy_v3_v3(ibuf->rect_float + offset*4,
+						   col);
+				}
+				else {
+					char *ccol = ((char*)ibuf->rect) +
+						offset*4;
+
+					ccol[0] = col[0] * 255.0;
+					ccol[1] = col[1] * 255.0;
+					ccol[2] = col[2] * 255.0;
+					
+				}
+			}
+		}
+	}
+}
+
+static void multires_vcol_to_tex(ImBuf *ibuf, DerivedMesh *dm, Mesh *me,
+				 MTFace *mtface)
+{
+	DMGridData **grids;
+	GridKey *gridkey;
+	int i, x, y, totgrid, gridsize, boundary, offset;
+
+	totgrid = dm->getNumGrids(dm);
+	gridsize = dm->getGridSize(dm);
+	grids = dm->getGridData(dm);
+	gridkey = dm->getGridKey(dm);
+
+	boundary = gridsize - 1;
+	offset = gridelem_active_offset(&me->fdata, gridkey, CD_MCOL);
+
+	for(i = 0; i < totgrid; ++i) {
+		DMGridData *grid = grids[i];
+
+		for(y = 0; y < boundary; ++y) {
+			for(x = 0; x < boundary; ++x, ++mtface) {
+				float *col[4];
+
+				col[0] = GRIDELEM_COLOR_AT(grid,
+							   y*gridsize+x,
+							   gridkey)[offset];
+				col[1] = GRIDELEM_COLOR_AT(grid,
+							   (y+1)*gridsize+x,
+							   gridkey)[offset];
+				col[2] = GRIDELEM_COLOR_AT(grid,
+							   (y+1)*gridsize+(x+1),
+							   gridkey)[offset];
+				col[3] = GRIDELEM_COLOR_AT(grid,
+							   y*gridsize+(x+1),
+							   gridkey)[offset];
+
+				
+				vcol_to_tex_tri(ibuf, mtface->uv[0],
+						mtface->uv[1], mtface->uv[2],
+						col[0], col[1], col[2]);
+				vcol_to_tex_tri(ibuf, mtface->uv[0],
+						mtface->uv[2], mtface->uv[3],
+						col[0], col[2], col[3]);
+			}
+		}
+	}
+}
+
+static int vertex_colors_to_texture_exec(bContext *C, wmOperator *op)
+{
+	Scene *scene = CTX_data_scene(C);
+	Object *ob = CTX_data_active_object(C);
+	Image *ima = CTX_data_edit_image(C);
+	Mesh *me = ob->data;
+	DerivedMesh *dm;
+	CustomDataMultires *cdm;
+	ImBuf *ibuf;
+	MTFace *mtface;
+	int active_mcol, active_mtface;
+
+	active_mcol = CustomData_get_active_layer_index(&me->fdata, CD_MCOL);
+	active_mtface = CustomData_get_active_layer_index(&me->fdata, CD_MTFACE);
+	ibuf = BKE_image_get_ibuf(ima, NULL);
+
+	dm = mesh_get_derived_final(scene, ob, CD_MASK_MTFACE);
+	mtface = dm->getFaceDataArray(dm, CD_MTFACE);
+
+	cdm = CustomData_get_layer(&me->fdata, CD_GRIDS);
+	if(dm->type == DM_TYPE_CCGDM && cdm &&
+	   CustomData_multires_get_data(cdm, CD_MCOL,
+					me->fdata.layers[active_mcol].name)) {
+		/* multires vcols, special handling */
+		multires_vcol_to_tex(ibuf, dm, me, mtface);
+
+	}
+	else {
+		MFace *mface;
+		MCol *mcol;
+		int i, j, totface;
+
+		dm = mesh_get_derived_final(scene, ob, CD_MASK_MTFACE|CD_MASK_MCOL);
+
+		mface = dm->getFaceArray(dm);
+		mcol = dm->getFaceDataArray(dm, CD_MCOL);
+		totface = dm->getNumFaces(dm);
+
+		for(i = 0; i < totface; ++i) {
+			MFace *f = &mface[i];
+			MTFace *mtf = &mtface[i];
+			float fcol[4][4];
+			int S = f->v4?4:3;
+
+			for(j = 0; j < S; ++j) {
+				MCol *ccol = mcol + i*4 + j;
+				fcol[j][0] = ccol->b / 255.0;
+				fcol[j][1] = ccol->g / 255.0;
+				fcol[j][2] = ccol->r / 255.0;
+				fcol[j][3] = ccol->a / 255.0;
+			}
+			
+			vcol_to_tex_tri(ibuf, mtf->uv[0], mtf->uv[1], mtf->uv[2],
+					fcol[0], fcol[1], fcol[2]);
+			if(f->v4) {
+				vcol_to_tex_tri(ibuf,
+						mtf->uv[0], mtf->uv[2], mtf->uv[3],
+						fcol[0], fcol[2], fcol[3]);
+			}
+		}
+	}
+
+	return OPERATOR_FINISHED;
+}
+
+static int vertex_colors_to_texture_poll(bContext *C)
+{
+	Object *ob= CTX_data_active_object(C);
+	Image *ima = CTX_data_edit_image(C);
+
+	if(ob && ima) {
+		Mesh *me = ob->data;
+
+		return (CustomData_get_active_layer_index(&me->fdata, CD_MCOL) >= 0 &&
+			CustomData_get_active_layer_index(&me->fdata, CD_MTFACE) >= 0 &&
+			ima && BKE_image_get_ibuf(ima, NULL));
+	}
+
+	return 0;
+}
+
+void PAINT_OT_vertex_colors_to_texture(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Vertex Colors to Texture";
+	ot->idname= "PAINT_OT_vertex_colors_to_texture";
+	
+	/* api callbacks */
+	ot->exec= vertex_colors_to_texture_exec;
+	ot->poll= vertex_colors_to_texture_poll;
+	
+	/* flags */
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
 /* ********************** weight from bones operator ******************* */
 
 static int weight_from_bones_poll(bContext *C)
@@ -2184,4 +2388,3 @@
 	/* properties */
 	ot->prop= RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "Method to use for assigning weights.");
 }
-





More information about the Bf-blender-cvs mailing list