[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30096] branches/soc-2010-nicolasbishop/ source/blender: Some more changes for improving non-sculpt paint modes:

Nicholas Bishop nicholasbishop at gmail.com
Thu Jul 8 00:55:57 CEST 2010


Revision: 30096
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30096
Author:   nicholasbishop
Date:     2010-07-08 00:55:57 +0200 (Thu, 08 Jul 2010)

Log Message:
-----------
Some more changes for improving non-sculpt paint modes:

?\226?\128?\162 Add face customdata to the pbvh
?\226?\128?\162 Return more data from BLI_pbvh_node_get_faces
?\226?\128?\162 Add some drawing flags for the pbvh/VBO drawing code
?\226?\128?\162 Some initial support for drawing mesh colors (not used yet)
?\226?\128?\162 Abstracted sculpt's get_location a bit so it can be used for other types of paint strokes
?\226?\128?\162 Moved and renamed unproject_brush_radius so other paint modes can use it
?\226?\128?\162 There should be no visible changes from this commit

Modified Paths:
--------------
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_pbvh.h
    branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c
    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_stroke.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_utils.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2010-nicolasbishop/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2010-nicolasbishop/source/blender/gpu/gpu_buffers.h
    branches/soc-2010-nicolasbishop/source/blender/gpu/intern/gpu_buffers.c

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/DerivedMesh.c	2010-07-07 21:57:57 UTC (rev 30095)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/DerivedMesh.c	2010-07-07 22:55:57 UTC (rev 30096)
@@ -2186,7 +2186,7 @@
 	   changing PVBH node organization, we hope topology does not change in
 	   the meantime .. weak */
 	if(ob->paint && ob->paint->pbvh) {
-		if(!ob->paint->sculpt->cache) {
+		if(!ob->paint->sculpt || !ob->paint->sculpt->cache) {
 			BLI_pbvh_free(ob->paint->pbvh);
 			ob->paint->pbvh= NULL;
 		}

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2010-07-07 21:57:57 UTC (rev 30095)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2010-07-07 22:55:57 UTC (rev 30096)
@@ -223,7 +223,8 @@
 		cddm->pbvh = BLI_pbvh_new();
 		cddm->pbvh_draw = can_pbvh_draw(ob, dm);
 		BLI_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
-				    &me->vdata, me->totface, me->totvert,
+				    &me->vdata, &me->fdata, me->totface,
+				    me->totvert,
 				    ss ? &ss->hidden_areas : NULL);
 	}
 
@@ -439,15 +440,16 @@
 
 	if(cddm->pbvh && cddm->pbvh_draw) {
 		if(dm->numFaceData) {
+			GPUDrawFlags drawflags = 0;
 			float (*face_nors)[3] = CustomData_get_layer(&dm->faceData, CD_NORMAL);
 
 			/* should be per face */
 			if(!setMaterial(mface->mat_nr+1, NULL))
 				return;
+			if(mface->flag & ME_SMOOTH)
+				drawflags |= GPU_DRAW_SMOOTH;
 
-			glShadeModel((mface->flag & ME_SMOOTH)? GL_SMOOTH: GL_FLAT);
-			BLI_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors, (mface->flag & ME_SMOOTH));
-			glShadeModel(GL_FLAT);
+			BLI_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors, drawflags);
 		}
 
 		return;

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c	2010-07-07 21:57:57 UTC (rev 30095)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c	2010-07-07 22:55:57 UTC (rev 30096)
@@ -60,6 +60,7 @@
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
 
+#include "gpu_buffers.h"
 #include "GPU_draw.h"
 #include "GPU_extensions.h"
 #include "GPU_material.h"
@@ -1303,13 +1304,15 @@
 
 	if(ccgdm->pbvh && ccgdm->multires.mmd && !fast) {
 		if(dm->numFaceData) {
+			GPUDrawFlags drawflags = 0;
+
 			/* should be per face */
 			if(!setMaterial(faceFlags[1]+1, NULL))
 				return;
+			if(faceFlags[0] & ME_SMOOTH)
+				drawflags |= GPU_DRAW_SMOOTH;
 
-			glShadeModel((faceFlags[0] & ME_SMOOTH)? GL_SMOOTH: GL_FLAT);
-			BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, (faceFlags[0] & ME_SMOOTH));
-			glShadeModel(GL_FLAT);
+			BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, drawflags);
 		}
 
 		return;
@@ -2349,7 +2352,7 @@
 
 		ob->paint->pbvh= ccgdm->pbvh = BLI_pbvh_new();
 		BLI_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert,
-				    &me->vdata, me->totface, me->totvert,
+				    &me->vdata, &me->fdata, me->totface, me->totvert,
 				    ss ? &ss->hidden_areas : NULL);
 		ccgdm->pbvh_draw = 0;
 	}

Modified: branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_pbvh.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_pbvh.h	2010-07-07 21:57:57 UTC (rev 30095)
+++ branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_pbvh.h	2010-07-07 22:55:57 UTC (rev 30096)
@@ -54,12 +54,20 @@
 
 typedef void (*BLI_pbvh_HitCallback)(PBVHNode *node, void *data);
 
+/* test AABB against sphere */
+typedef struct {
+	float *center;
+	float radius_squared;
+	int original;
+} PBVHSearchSphereData;
+int BLI_pbvh_search_sphere_cb(PBVHNode *node, void *data);
+
 /* Building */
 
 PBVH *BLI_pbvh_new(void);
 void BLI_pbvh_build_mesh(PBVH *bvh, struct MFace *faces, struct MVert *verts,
-			 struct CustomData *vdata, int totface, int totvert,
-			 ListBase *hidden_areas);
+			 struct CustomData *vdata, struct CustomData *fdata,
+			 int totface, int totvert, ListBase *hidden_areas);
 void BLI_pbvh_build_grids(PBVH *bvh, struct DMGridData **grids,
 			  struct DMGridAdjacency *gridadj, int totgrid,
 			  int gridsize, struct GridKey *gridkey, void **gridfaces,
@@ -92,7 +100,7 @@
 
 void BLI_pbvh_node_draw(PBVHNode *node, void *data);
 int BLI_pbvh_node_planes_contain_AABB(PBVHNode *node, void *data);
-void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int smooth);
+void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int flags);
 
 /* Node Access */
 
@@ -123,7 +131,9 @@
 void BLI_pbvh_node_set_flags(PBVHNode *node, void *data);
 
 void BLI_pbvh_node_get_faces(PBVH *bvh, PBVHNode *node,
-			     int **face_indices, int *totnode);
+			     struct MFace **faces, struct CustomData **fdata,
+			     int **face_indices, int **face_vert_indices,
+			     int *totface);
 void BLI_pbvh_node_get_grids(PBVH *bvh, PBVHNode *node,
 	int **grid_indices, int *totgrid, int *maxgrid, int *gridsize,
 	struct DMGridData ***griddata, struct DMGridAdjacency **gridadj, struct GridKey **gridkey);

Modified: branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c	2010-07-07 21:57:57 UTC (rev 30095)
+++ branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c	2010-07-07 22:55:57 UTC (rev 30096)
@@ -33,6 +33,7 @@
 #include "BKE_global.h" /* for mesh_calc_normals */
 
 #include "gpu_buffers.h"
+#include "GL/glew.h"
 
 static void pbvh_free_nodes(PBVH *bvh);
 
@@ -121,6 +122,9 @@
 	/* Used by both mesh and grid type */
 	CustomData *vdata;
 
+	/* For vertex paint */
+	CustomData *fdata;
+
 	/* Only used during BVH build and update,
 	   don't need to remain valid after */
 	BLI_bitmap vert_bitmap;
@@ -152,8 +156,33 @@
 	int stackspace;
 } PBVHIter;
 
+/* Test AABB against sphere */
+int BLI_pbvh_search_sphere_cb(PBVHNode *node, void *data_v)
+{
+	PBVHSearchSphereData *data = data_v;
+	float nearest[3];
+	float t[3], bb_min[3], bb_max[3];
+	int i;
 
+	if(data->original)
+		BLI_pbvh_node_get_original_BB(node, bb_min, bb_max);
+	else
+		BLI_pbvh_node_get_BB(node, bb_min, bb_max);
+	
+	for(i = 0; i < 3; ++i) {
+		if(bb_min[i] > data->center[i])
+			nearest[i] = bb_min[i];
+		else if(bb_max[i] < data->center[i])
+			nearest[i] = bb_max[i];
+		else
+			nearest[i] = data->center[i]; 
+	}
+	
+	sub_v3_v3v3(t, data->center, nearest);
 
+	return t[0] * t[0] + t[1] * t[1] + t[2] * t[2] < data->radius_squared;
+}
+
 /* Adapted from:
    http://www.gamedev.net/community/forums/topic.asp?topic_id=512123
    Returns true if the AABB is at least partially within the frustum
@@ -392,6 +421,7 @@
 		node->draw_buffers =
 			GPU_build_mesh_buffers(map, bvh->verts, bvh->faces,
 				  bvh->vdata,
+				  bvh->fdata,
 				  node->prim_indices,
 				  node->totprim, node->vert_indices,
 				  node->uniq_verts,
@@ -614,12 +644,14 @@
 
 /* Do a full rebuild with on Mesh data structure */
 void BLI_pbvh_build_mesh(PBVH *bvh, MFace *faces, MVert *verts,
-			 CustomData *vdata, int totface, int totvert,
+			 CustomData *vdata, CustomData *fdata,
+			 int totface, int totvert,
 			 ListBase *hidden_areas)
 {
 	bvh->faces = faces;
 	bvh->verts = verts;
 	bvh->vdata = vdata;
+	bvh->fdata = fdata;
 	bvh->totvert = totvert;
 	bvh->leaf_limit = LEAF_LIMIT;
 
@@ -969,7 +1001,7 @@
 	}
 }
 
-static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode, int smooth)
+static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode, GPUDrawFlags flags)
 {
 	PBVHNode *node;
 	int n;
@@ -986,7 +1018,7 @@
 							     node->totprim,
 							     bvh->gridsize,
 							     bvh->gridkey,
-							     smooth);
+							     flags & GPU_DRAW_SMOOTH);
 			}
 			else {
 				GPU_update_mesh_vert_buffers(node->draw_buffers,
@@ -1011,10 +1043,7 @@
 			}
 			else {
 				GPU_update_mesh_color_buffers(node->draw_buffers,
-							      bvh->vdata,
-							      node->vert_indices,
-							      node->uniq_verts +
-							      node->face_verts);
+							      bvh, node, flags);
 			}
 
 			node->flag &= ~PBVH_UpdateColorBuffers;
@@ -1176,14 +1205,22 @@
 }
 
 void BLI_pbvh_node_get_faces(PBVH *bvh, PBVHNode *node,
-			     int **face_indices, int *totnode)
+			     struct MFace **mface, struct CustomData **fdata,
+			     int **face_indices, int **face_vert_indices,
+			     int *totnode)
 {
 	if(bvh->grids) {
+		if(mface) *mface= NULL;
+		if(fdata) *fdata= NULL;
 		if(face_indices) *face_indices= NULL;
+		if(face_vert_indices) *face_vert_indices= NULL;
 		if(totnode) *totnode= 0;
 	}
 	else {
+		if(mface) *mface= bvh->faces;
+		if(fdata) *fdata= bvh->fdata;
 		if(face_indices) *face_indices= node->prim_indices;
+		if(face_vert_indices) *face_vert_indices= node->face_vert_indices;
 		if(totnode) *totnode= node->totprim;
 	}
 }
@@ -1431,7 +1468,7 @@
 	return pbvh_planes_contain_AABB(bb_min, bb_max, data);
 }
 
-void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int smooth)
+void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int flags)
 {
 	PBVHNode **nodes;
 	int totnode;
@@ -1441,10 +1478,12 @@
 		&nodes, &totnode);
 
 	pbvh_update_normals(bvh, nodes, totnode, face_nors);
-	pbvh_update_draw_buffers(bvh, nodes, totnode, smooth);
+	pbvh_update_draw_buffers(bvh, nodes, totnode, flags);
 
 	if(nodes) MEM_freeN(nodes);
 
+	glShadeModel((flags & GPU_DRAW_SMOOTH) ? GL_SMOOTH: GL_FLAT);
+
 	if(planes) {
 		BLI_pbvh_search_callback(bvh, BLI_pbvh_node_planes_contain_AABB,
 				planes, BLI_pbvh_node_draw, NULL);
@@ -1452,6 +1491,8 @@
 	else {
 		BLI_pbvh_search_callback(bvh, NULL, NULL, BLI_pbvh_node_draw, NULL);
 	}
+
+	glShadeModel(GL_FLAT);
 }
 
 void BLI_pbvh_grids_update(PBVH *bvh, DMGridData **grids,

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list