[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21795] branches/soc-2009-imbusy/source/ blender: sculpt mode should be working ok.

Lukas Steiblys imbusy at imbusy.org
Wed Jul 22 13:39:49 CEST 2009


Revision: 21795
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21795
Author:   imbusy
Date:     2009-07-22 13:39:47 +0200 (Wed, 22 Jul 2009)

Log Message:
-----------
sculpt mode should be working ok. Needs more testing.

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
    branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c

Modified: branches/soc-2009-imbusy/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/sculpt_paint/sculpt.c	2009-07-22 10:12:00 UTC (rev 21794)
+++ branches/soc-2009-imbusy/source/blender/editors/sculpt_paint/sculpt.c	2009-07-22 11:39:47 UTC (rev 21795)
@@ -346,19 +346,10 @@
 		                     co[2]+area_normal[2]*ss->cache->radius*node->Fade*ss->cache->scale[2]};
 
 		if( buffer != 0 ) {
-			for( i = 0; i < ss->drawobject->nelements/3; i++ ) {
-				int realface = ss->drawobject->faceRemap[i];
-				if( ss->mface[realface].v1 == node->Index ||
-					ss->mface[realface].v2 == node->Index ||
-					ss->mface[realface].v3 == node->Index ||
-					ss->mface[realface].v4 == node->Index ) {
-						for( j = 0; j < 3; j++ ) {
-							float dx = co[0]-buffer[i*9+j*3], dy = co[1]-buffer[i*9+j*3+1], dz = co[2]-buffer[i*9+j*3+2];
-							if( dx*dx + dy*dy + dz*dz < 0.0001 ) {
-								sculpt_clip(sd, &buffer[i*9+j*3], val);
-							}
-						}
-				}
+			IndexLink *cur = &ss->drawobject->indices[node->Index];
+			while( cur != 0 && cur->element != -1 ) {
+				sculpt_clip(sd, &buffer[cur->element*3], val);
+				cur = cur->next;
 			}
 		}
 
@@ -417,6 +408,7 @@
 static void do_smooth_brush(Sculpt *s, const ListBase* active_verts)
 {
 	ActiveData *node= active_verts->first;
+	float *buffer = (float *)GPU_buffer_lock( s->session->drawobject->vertices );
 	int i;
 	
 	for(i = 0; i < 2; ++i) {
@@ -429,24 +421,46 @@
 			val[1] = co[1]+(avg[1]-co[1])*node->Fade;
 			val[2] = co[2]+(avg[2]-co[2])*node->Fade;
 			
+			if( buffer != 0 ) {
+				IndexLink *cur = &s->session->drawobject->indices[node->Index];
+				while( cur != 0 && cur->element != -1 ) {
+					sculpt_clip(s, &buffer[cur->element*3], val);
+					cur = cur->next;
+				}
+			}
+
 			sculpt_clip(s, co, val);
 			node= node->next;
 		}
 	}
+	if( buffer != 0 )
+		GPU_buffer_unlock( s->session->drawobject->vertices );
 }
 
 static void do_pinch_brush(Sculpt *s, const ListBase* active_verts)
 {
  	ActiveData *node= active_verts->first;
+	float *buffer = (float *)GPU_buffer_lock( s->session->drawobject->vertices );
 
 	while(node) {
 		float *co= s->session->mvert[node->Index].co;
 		const float val[3]= {co[0]+(s->session->cache->location[0]-co[0])*node->Fade,
 		                     co[1]+(s->session->cache->location[1]-co[1])*node->Fade,
 		                     co[2]+(s->session->cache->location[2]-co[2])*node->Fade};
+
+		if( buffer != 0 ) {
+			IndexLink *cur = &s->session->drawobject->indices[node->Index];
+			while( cur != 0 && cur->element != -1 ) {
+				sculpt_clip(s, &buffer[cur->element*3], val);
+				cur = cur->next;
+			}
+		}
+
 		sculpt_clip(s, co, val);
 		node= node->next;
 	}
+	if( buffer != 0 )
+		GPU_buffer_unlock( s->session->drawobject->vertices );
 }
 
 static void do_grab_brush(Sculpt *sd, SculptSession *ss)
@@ -454,6 +468,7 @@
 	ActiveData *node= ss->cache->grab_active_verts[ss->cache->symmetry].first;
 	float add[3];
 	float grab_delta[3];
+	float *buffer = (float *)GPU_buffer_lock( ss->drawobject->vertices );
 	
 	VecCopyf(grab_delta, ss->cache->grab_delta_symmetry);
 	
@@ -463,10 +478,21 @@
 		VecCopyf(add, grab_delta);
 		VecMulf(add, node->Fade);
 		VecAddf(add, add, co);
+
+		if( buffer != 0 ) {
+			IndexLink *cur = &ss->drawobject->indices[node->Index];
+			while( cur != 0 && cur->element != -1 ) {
+				sculpt_clip(sd, &buffer[cur->element*3], add);
+				cur = cur->next;
+			}
+		}
+
 		sculpt_clip(sd, co, add);
 
 		node= node->next;
 	}
+	if( buffer != 0 )
+		GPU_buffer_unlock( ss->drawobject->vertices );
 	
 }
 
@@ -474,6 +500,7 @@
 {
 	float area_normal[3];
 	ActiveData *node= active_verts->first;
+	float *buffer;
 	float lim= ss->cache->radius / 4;
 
 	if(ss->cache->flip)
@@ -481,6 +508,7 @@
 
 	calc_area_normal(sd, area_normal, active_verts);
 
+	buffer = (float *)GPU_buffer_lock( ss->drawobject->vertices );
 	while(node){
 		float *disp= &ss->cache->layer_disps[node->Index];
 		float *co= ss->mvert[node->Index].co;
@@ -496,10 +524,20 @@
 		val[1] = ss->cache->mesh_store[node->Index][1]+area_normal[1] * *disp*ss->cache->scale[1];
 		val[2] = ss->cache->mesh_store[node->Index][2]+area_normal[2] * *disp*ss->cache->scale[2];
 
+		if( buffer != 0 ) {
+			IndexLink *cur = &ss->drawobject->indices[node->Index];
+			while( cur != 0 && cur->element != -1 ) {
+				sculpt_clip(sd, &buffer[cur->element*3], val);
+				cur = cur->next;
+			}
+		}
+
 		sculpt_clip(sd, co, val);
 
 		node= node->next;
 	}
+	if( buffer != 0 )
+		GPU_buffer_unlock( ss->drawobject->vertices );
 }
 
 static void do_inflate_brush(Sculpt *s, const ListBase *active_verts)
@@ -507,7 +545,8 @@
 	ActiveData *node= active_verts->first;
 	SculptSession *ss = s->session;
 	float add[3];
-	
+	float *buffer = (float *)GPU_buffer_lock( ss->drawobject->vertices );
+
 	while(node) {
 		float *co= ss->mvert[node->Index].co;
 		short *no= ss->mvert[node->Index].no;
@@ -521,10 +560,20 @@
 		add[2]*= ss->cache->scale[2];
 		VecAddf(add, add, co);
 		
+		if( buffer != 0 ) {
+			IndexLink *cur = &ss->drawobject->indices[node->Index];
+			while( cur != 0 && cur->element != -1 ) {
+				sculpt_clip(s, &buffer[cur->element*3], add);
+				cur = cur->next;
+			}
+		}
+
 		sculpt_clip(s, co, add);
 
 		node= node->next;
 	}
+	if( buffer != 0 )
+		GPU_buffer_unlock( ss->drawobject->vertices );
 }
 
 static void calc_flatten_center(SculptSession *ss, ActiveData *node, float co[3])
@@ -556,10 +605,11 @@
 	/* area_normal and cntr define the plane towards which vertices are squashed */
 	float area_normal[3];
 	float cntr[3];
-
+	float *buffer;
 	calc_area_normal(sd, area_normal, active_verts);
 	calc_flatten_center(ss, node, cntr);
 
+	buffer = (float *)GPU_buffer_lock( ss->drawobject->vertices );
 	while(node){
 		float *co= ss->mvert[node->Index].co;
 		float p1[3], sub1[3], sub2[3], intr[3], val[3];
@@ -584,10 +634,20 @@
 			VecAddf(val, val, tmp);
 		}
 
+		if( buffer != 0 ) {
+			IndexLink *cur = &ss->drawobject->indices[node->Index];
+			while( cur != 0 && cur->element != -1 ) {
+				sculpt_clip(sd, &buffer[cur->element*3], val);
+				cur = cur->next;
+			}
+		}
+
 		sculpt_clip(sd, co, val);
 		
 		node= node->next;
 	}
+	if( buffer != 0 )
+		GPU_buffer_unlock( ss->drawobject->vertices );
 }
  
 /* Uses symm to selectively flip any axis of a coordinate. */
@@ -912,7 +972,8 @@
 static void update_damaged_vert(SculptSession *ss, ListBase *lb)
 {
 	ActiveData *vert;
-       
+    
+	float *buffer = (float *)GPU_buffer_lock( ss->drawobject->normals );
 	for(vert= lb->first; vert; vert= vert->next) {
 		vec3f norm= {0,0,0};		
 		IndexNode *face= ss->fmap[vert->Index].first;
@@ -929,7 +990,32 @@
 		ss->mvert[vert->Index].no[0]=norm.x*32767;
 		ss->mvert[vert->Index].no[1]=norm.y*32767;
 		ss->mvert[vert->Index].no[2]=norm.z*32767;
+
+		if( buffer != 0 ) {
+			IndexLink *cur = &ss->drawobject->indices[vert->Index];
+			while( cur != 0 && cur->element != -1 ) {
+				int i = ss->drawobject->faceRemap[cur->element/3];
+				if( ss->mface[i].flag & ME_SMOOTH ) {
+					VECCOPY(&buffer[cur->element*3],ss->mvert[vert->Index].no);
+				}
+				else {
+					float norm[3];
+					if( ss->mface[i].v4 )
+						CalcNormFloat4(ss->mvert[ss->mface[i].v1].co, ss->mvert[ss->mface[i].v2].co, ss->mvert[ss->mface[i].v3].co, ss->mvert[ss->mface[i].v4].co, norm);
+					else
+						CalcNormFloat(ss->mvert[ss->mface[i].v1].co, ss->mvert[ss->mface[i].v2].co, ss->mvert[ss->mface[i].v3].co, norm);
+					VECCOPY(&buffer[cur->element*3],norm);
+					VECCOPY(&buffer[cur->element*3],norm);
+					VECCOPY(&buffer[cur->element*3],norm);
+				}
+
+				//VECCOPY(&buffer[cur->element*3],ss->mvert[vert->Index].no);
+				cur = cur->next;
+			}
+		}
 	}
+	if( buffer != 0 )
+		GPU_buffer_unlock( ss->drawobject->normals );
 }
 
 static void calc_damaged_verts(SculptSession *ss)
@@ -1387,16 +1473,27 @@
 {
 	SculptSession *ss = sd->session;
 	StrokeCache *cache = ss->cache;
+	float *buffer;
 	int i;
-	
+
 	/* Restore the mesh before continuing with anchored stroke */
 	if((sd->brush->flag & BRUSH_ANCHORED) && cache->mesh_store) {
+		buffer = (float *)GPU_buffer_lock( ss->drawobject->normals );
 		for(i = 0; i < ss->totvert; ++i) {
 			VecCopyf(ss->mvert[i].co, cache->mesh_store[i]);
 			ss->mvert[i].no[0] = cache->orig_norms[i][0];
 			ss->mvert[i].no[1] = cache->orig_norms[i][1];
 			ss->mvert[i].no[2] = cache->orig_norms[i][2];
+			if( buffer != 0 ) {
+				IndexLink *cur = &ss->drawobject->indices[i];
+				while( cur != 0 && cur->element != -1 ) {
+					VECCOPY(&buffer[cur->element*3],cache->orig_norms[i]);
+					cur = cur->next;
+				}
+			}
 		}
+		if( buffer != 0 )
+			GPU_buffer_unlock( ss->drawobject->normals );
 
 		if(ss->face_normals) {
 			float *fn = ss->face_normals;

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-07-22 10:12:00 UTC (rev 21794)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-07-22 11:39:47 UTC (rev 21795)
@@ -67,20 +67,30 @@
 	char mat_nr;
 } GPUBufferMaterial;
 
+typedef struct IndexLink {
+	int element;
+	struct IndexLink *next;
+} IndexLink;
+
 typedef struct GPUDrawObject
 {
 	GPUBuffer *vertices;
 	GPUBuffer *normals;
 	GPUBuffer *uv;
 	GPUBuffer *colors;
-	int	*faceRemap;		/* at what index was the face originally in DerivedMesh */
+	int	*faceRemap;			/* at what index was the face originally in DerivedMesh */
+	IndexLink *indices;		/* given an index, find all elements using it */
+	IndexLink *indexMem;	/* for faster memory allocation/freeing */
+	int indexMemUsage;		/* how many are already allocated */
 	int colType;
 
 	GPUBufferMaterial *materials;
 
 	int nmaterials;
 	int nelements;
+	int nindices;
 	int legacy;	/* if there was a failure allocating some buffer, use old rendering code */
+
 } GPUDrawObject;
 
 GPUBufferPool *GPU_buffer_pool_new();

Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-07-22 10:12:00 UTC (rev 21794)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-07-22 11:39:47 UTC (rev 21795)
@@ -240,7 +240,13 @@
 
 	DEBUG_VBO("GPU_drawobject_new\n");
 
-	object = MEM_callocN(sizeof(GPUDrawObject),"GPU_drawobject_new");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list