[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38170] branches/soc-2011-onion: Vertex Weights Export Tool

Antony Riakiotakis kalast at gmail.com
Thu Jul 7 02:58:05 CEST 2011


Revision: 38170
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38170
Author:   psy-fi
Date:     2011-07-07 00:58:04 +0000 (Thu, 07 Jul 2011)
Log Message:
-----------
Vertex Weights Export Tool
=====================

*Completed the tool, To check out, see Weight paint mode->tools->save weight images
*Missing is ability to select export directory(maybe will make a python wrapper for that?), for now exporting to binary directory.

Final decision is to export as multiple png's. The filename format is <object name>_<group name>.png. I did this for various reasons, first, if I used layered tiff I had to implement layered tiff export, which required me to go over the specification. Too time consuming. Multilayered OpenEXR is not supported in GIMP out of the box so I went for the simpler and easier solution.

Modified Paths:
--------------
    branches/soc-2011-onion/release/scripts/startup/bl_ui/space_view3d_toolbar.py
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_image.c
    branches/soc-2011-onion/source/blender/editors/space_view3d/view3d_draw.c

Modified: branches/soc-2011-onion/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- branches/soc-2011-onion/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2011-07-06 21:37:31 UTC (rev 38169)
+++ branches/soc-2011-onion/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2011-07-07 00:58:04 UTC (rev 38170)
@@ -1129,7 +1129,8 @@
         col.operator("object.vertex_group_invert", text="Invert")
         col.operator("object.vertex_group_clean", text="Clean")
         col.operator("object.vertex_group_levels", text="Levels")
-        col.operator("paint.weight_layers_image_from_view", text="Save As Layered Image")
+        col.operator("paint.weight_layers_image_from_view", text="Save Weight Images")
+	#lazy stuff, but maybe not so, export size should be unified. Maybe add better description to rna?
         row = col.row(align=True)
         row.prop(ipaint, "screen_grab_size", text="")
 

Modified: branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_image.c	2011-07-06 21:37:31 UTC (rev 38169)
+++ branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_image.c	2011-07-07 00:58:04 UTC (rev 38170)
@@ -5625,7 +5625,7 @@
 	/* identifiers */
 	ot->name= "Weight layers image from View";
 	ot->idname= "PAINT_OT_weight_layers_image_from_view";
-	ot->description= "Make an openEXR image containing luminance layers for each vertex group of the active object from the current 3D view";
+	ot->description= "Make multiple png images from vertex group of the active object as seen from the current view";
 
 	/* api callbacks */
 	ot->exec= weight_layers_image_from_view_exec;

Modified: branches/soc-2011-onion/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/space_view3d/view3d_draw.c	2011-07-06 21:37:31 UTC (rev 38169)
+++ branches/soc-2011-onion/source/blender/editors/space_view3d/view3d_draw.c	2011-07-07 00:58:04 UTC (rev 38170)
@@ -44,6 +44,7 @@
 #include "DNA_lamp_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_world_types.h"
+#include "DNA_meshdata_types.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -63,6 +64,8 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_unit.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_deform.h"
 
 #include "RE_pipeline.h"	// make_stars
 
@@ -2698,8 +2701,23 @@
 	int bwinx, bwiny;
 	rcti brect;
 	int zbufbackup = v3d->zbuf;
+	DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
+	int numOfQuads = 0;
+	MDeformVert *dw;
+	ImBuf *ibuf;
+	bDeformGroup *defgrp;
+	int defnum = 0;
+	int numOfFaces;
+	int numOfVerts;
+	MVert *verts;
+	MFace *faces;
+	unsigned char *weightColors;
+	int i;
 
-	/* render 3d view */
+	int *quadIndices, *triIndices;
+	unsigned int tri_buf_index = 0, quad_buf_index = 0;
+
+	/* change camera matrix if object camera */
 	if(rv3d->persp==RV3D_CAMOB && v3d->camera) {
 		float _clipsta, _clipend, _lens, _yco, _dx, _dy;
 		rctf _viewplane;
@@ -2719,6 +2737,13 @@
 	if(ofs == NULL)
 		return 0;
 
+	ibuf= IMB_allocImBuf(w, h, 32, IB_rect);
+	if(!ibuf){
+		GPU_offscreen_free(ofs);
+		return 0;
+	}
+	ibuf->ftype = PNG;
+
 	GPU_offscreen_bind(ofs);
 
 	glPushMatrix();
@@ -2739,49 +2764,115 @@
 	/* set flags */
 	G.f |= G_RENDER_OGL;
 
+	/* set zbuffer */
+	v3d->zbuf= TRUE;
+	glEnable(GL_DEPTH_TEST);
+
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 
 	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 
 	/* setup view matrices */
 	view3d_main_area_setup_view(scene, v3d, ar, NULL, winmatarg);
+	ED_view3d_init_mats_rv3d_gl(ob, rv3d);
 
-	/* set zbuffer */
-	v3d->zbuf= TRUE;
-	glEnable(GL_DEPTH_TEST);
+	/* get our vert groups */
+	dw = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+	verts = dm->getVertArray(dm);
+	faces = dm->getFaceArray(dm);
+	numOfVerts = dm->getNumVerts(dm);
+	numOfFaces = dm->getNumFaces(dm);
 
-	ED_view3d_init_mats_rv3d_gl(ob, rv3d);
+	/* Count the quads */
+	for(i = 0; i < numOfFaces; i++){
+		if((faces + i)->v4){
+			numOfQuads++;
+		}
+	}
 
-	/*
-	if(scene->set) {
-		Scene *sce_iter;
-		for(SETLOOPER(scene->set, sce_iter, base)) {
-			if(v3d->lay & base->lay) {
-				UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f);
-				draw_object(scene, ar, v3d, base, DRAW_CONSTCOLOR|DRAW_SCENESET);
+	quadIndices = MEM_mallocN(numOfQuads*sizeof(unsigned int)*4, "Quad Indices for weight export");
+	triIndices = MEM_mallocN((numOfFaces - numOfQuads)*sizeof(unsigned int)*3, "Triangle Indices for weight export");
+	weightColors = MEM_mallocN(numOfVerts*4*sizeof(unsigned char), "Weight Colors for weight export");
+	if(!(quadIndices && triIndices && weightColors)){
+		if(quadIndices)
+			MEM_freeN(quadIndices);
+		if(triIndices)
+			MEM_freeN(triIndices);
+		if(weightColors)
+			MEM_freeN(weightColors);
+		GPU_offscreen_free(ofs);
+		IMB_freeImBuf(ibuf);
+		return 0;
+	}
 
-				if(base->object->transflag & OB_DUPLI)
-					draw_dupli_objects_color(scene, ar, v3d, base, TH_WIRE);
-			}
+
+	/* fill the index arrays */
+	for(i = 0; i < numOfFaces; i++){
+		MFace *mfa = faces + i;
+		if(mfa->v4){
+			quadIndices[quad_buf_index++] = mfa->v1;
+			quadIndices[quad_buf_index++] = mfa->v2;
+			quadIndices[quad_buf_index++] = mfa->v3;
+			quadIndices[quad_buf_index++] = mfa->v4;
 		}
+		else{
+			triIndices[tri_buf_index++] = mfa->v1;
+			triIndices[tri_buf_index++] = mfa->v2;
+			triIndices[tri_buf_index++] = mfa->v3;
+		}
 	}
 
-	for(base= scene->base.first; base; base= base->next) {
-		if(v3d->lay & base->lay) {
-			if(base->object->transflag & OB_DUPLI)
-				draw_dupli_objects(scene, ar, v3d, base);
+	glColor3f(1.0 ,1.0, 1.0);
+	glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_COLOR_ARRAY);
 
-			draw_object(scene, ar, v3d, base, 0);
+	glVertexPointer(3, GL_FLOAT, sizeof(MVert), verts);
+	glColorPointer(4, GL_UNSIGNED_BYTE, 0, weightColors);
+
+	glShadeModel(GL_SMOOTH);
+
+	/* Do this for each vertex group */
+	for(defgrp = ob->defbase.first; defgrp; defgrp = defgrp->next, defnum++){
+		char filename[1024];
+
+		/* Fill the Weight buffer */
+		for(i = 0; i < numOfVerts; i++){
+			weightColors[4*i] = weightColors[4*i+1] = weightColors[4*i +2] =
+					weightColors[4*i + 3] = FTOCHAR(defvert_find_weight(dw+i, defnum));
 		}
+
+		glDrawElements(GL_TRIANGLES, 3*(numOfFaces - numOfQuads), GL_UNSIGNED_INT, triIndices);
+		glDrawElements(GL_QUADS, 4*numOfQuads, GL_UNSIGNED_INT, quadIndices);
+
+		/* ready to draw here */
+		glBegin(GL_POINTS);
+		glVertex3f(0.0, 0.0, 0.0);
+		glEnd();
+
+		glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+
+		sprintf(filename, "%s_%s.png", ob->id.name, defgrp->name);
+
+		IMB_saveiff(ibuf, filename, 0);
 	}
-	 */
+	glPopClientAttrib();
 
+	MEM_freeN(quadIndices);
+	MEM_freeN(triIndices);
+	MEM_freeN(weightColors);
+
 	/* cleanup */
 	if(!zbufbackup) {
 		v3d->zbuf= FALSE;
 		glDisable(GL_DEPTH_TEST);
 	}
 
+	dm->release(dm);
+
+
+	IMB_freeImBuf(ibuf);
+
 	/* restore size */
 	ar->winx= bwinx;
 	ar->winy= bwiny;




More information about the Bf-blender-cvs mailing list