[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15959] branches/soc-2008-nicholasbishop/ source/blender/src/sculptmode.c: Fixed partial redraw sculpting for multires.

Nicholas Bishop nicholasbishop at gmail.com
Tue Aug 5 00:49:05 CEST 2008


Revision: 15959
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15959
Author:   nicholasbishop
Date:     2008-08-05 00:49:05 +0200 (Tue, 05 Aug 2008)

Log Message:
-----------
Fixed partial redraw sculpting for multires.

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c

Modified: branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-08-04 22:16:44 UTC (rev 15958)
+++ branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-08-04 22:49:05 UTC (rev 15959)
@@ -888,7 +888,6 @@
 {
 	short p[2];
 	RectNode *rn= MEM_mallocN(sizeof(RectNode),"RectNode");
-	Mesh *me= get_mesh(OBACT);
 	SculptSession *ss = sculpt_session();
 	const float radius = a->radius > a->prev_radius ? a->radius : a->prev_radius;
 	unsigned i;
@@ -903,7 +902,7 @@
 	BLI_addtail(&sculpt_session()->damaged_rects, rn);
 
 	/* Update insides */
-	for(i=0; i<me->totvert; ++i) {
+	for(i=0; i<ss->totvert; ++i) {
 		if(!ss->projverts[i].inside) {
 			if(ss->projverts[i].co[0] > rn->r.xmin && ss->projverts[i].co[1] > rn->r.ymin &&
 			   ss->projverts[i].co[0] < rn->r.xmax && ss->projverts[i].co[1] < rn->r.ymax) {
@@ -1134,12 +1133,9 @@
 
 void projverts_clear_inside(SculptSession *ss)
 {
-	Mesh *me = get_mesh(OBACT);
-	if(me) {
-		int i;
-		for(i = 0; i < me->totvert; ++i)
-			ss->projverts[i].inside = 0;
-	}
+	int i;
+	for(i = 0; i < ss->totvert; ++i)
+		ss->projverts[i].inside = 0;
 }
 
 BrushData *sculptmode_brush(void)
@@ -1473,8 +1469,59 @@
 	}
 }
 
-void sculptmode_draw_wires(SculptSession *ss, int only_damaged, Mesh *me)
+/* Checks whether full update mode (slower) needs to be used to work with modifiers */
+char sculpt_modifiers_active(Object *ob)
 {
+	ModifierData *md;
+	
+	for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) {
+		if(md->mode & eModifierMode_Realtime && md->type != eModifierType_Multires)
+			return 1;
+	}
+	
+	return 0;
+}
+
+struct MultiresModifierData *sculpt_multires_active(Object *ob)
+{
+	ModifierData *md;
+	
+	for(md= modifiers_getVirtualModifierList(OBACT); md; md= md->next) {
+		if(md->type == eModifierType_Multires) {
+			MultiresModifierData *mmd = (MultiresModifierData*)md;
+			if(mmd->lvl != 1)
+				return mmd;
+		}
+	}
+
+	return NULL;
+}
+
+static void sculpt_update_mesh_elements(SculptSession *ss, Object *ob)
+{
+	if(sculpt_multires_active(ob)) {
+		DerivedMesh *dm = mesh_get_derived_final(OBACT, CD_MASK_BAREMESH);
+		ss->multires = 1;
+		ss->totvert = dm->getNumVerts(dm);
+		ss->totface = dm->getNumFaces(dm);
+		ss->mvert = dm->getVertDataArray(dm, CD_MVERT);
+		ss->mface = dm->getFaceDataArray(dm, CD_MFACE);
+		ss->face_normals = dm->getFaceDataArray(dm, CD_NORMAL);
+	}
+	else {
+		Mesh *me = get_mesh(ob);
+		ss->multires = 0;
+		ss->totvert = me->totvert;
+		ss->totface = me->totface;
+		ss->mvert = me->mvert;
+		ss->mface = me->mface;
+		ss->face_normals = NULL;
+	}
+}
+
+void sculptmode_draw_wires(SculptSession *ss, int only_damaged)
+{
+	Mesh *me = get_mesh(OBACT);
 	int i;
 
 	bglPolygonOffset(1.0);
@@ -1496,10 +1543,11 @@
 
 void sculptmode_draw_mesh(int only_damaged) 
 {
-	Mesh *me= get_mesh(OBACT);
 	int i, j, dt, drawCurrentMat = 1, matnr= -1;
 	SculptSession *ss = sculpt_session();
 
+	sculpt_update_mesh_elements(ss, OBACT);
+
 	persp(PERSP_VIEW);
 	mymultmatrix(OBACT->obmat);
 	glEnable(GL_DEPTH_TEST);
@@ -1509,15 +1557,15 @@
 
 	glShadeModel(GL_SMOOTH);
 
-	glVertexPointer(3, GL_FLOAT, sizeof(MVert), &me->mvert[0].co);
-	glNormalPointer(GL_SHORT, sizeof(MVert), &me->mvert[0].no);
+	glVertexPointer(3, GL_FLOAT, sizeof(MVert), &ss->mvert[0].co);
+	glNormalPointer(GL_SHORT, sizeof(MVert), &ss->mvert[0].no);
 
 	dt= MIN2(G.vd->drawtype, OBACT->dt);
 	if(dt==OB_WIRE)
 		glColorMask(0,0,0,0);
 
-	for(i=0; i<me->totface; ++i) {
-		MFace *f= &me->mface[i];
+	for(i=0; i<ss->totface; ++i) {
+		MFace *f= &ss->mface[i];
 		char inside= 0;
 		int new_matnr= f->mat_nr + 1;
 		
@@ -1546,7 +1594,7 @@
 	glColorMask(1,1,1,1);
 
 	if(dt==OB_WIRE || (OBACT->dtx & OB_DRAWWIRE))
-		sculptmode_draw_wires(ss, only_damaged, me);
+		sculptmode_draw_wires(ss, only_damaged);
 
 	glDisable(GL_DEPTH_TEST);
 }
@@ -1562,36 +1610,12 @@
 	if(!sculpt_session()->vertex_users) calc_vertex_users();
 }
 
-/* Checks whether full update mode (slower) needs to be used to work with modifiers */
-char sculpt_modifiers_active(Object *ob)
-{
-	ModifierData *md;
-	
-	for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) {
-		if(md->mode & eModifierMode_Realtime && md->type != eModifierType_Multires)
-			return 1;
-	}
-	
-	return 0;
-}
-
-struct MultiresModifierData *sculpt_multires_active(Object *ob)
-{
-	ModifierData *md;
-	
-	for(md= modifiers_getVirtualModifierList(OBACT); md; md= md->next) {
-		if(md->type == eModifierType_Multires)
-			return (MultiresModifierData*)md;
-	}
-
-	return NULL;
-}
-
 void sculpt(void)
 {
 	SculptData *sd= sculpt_data();
 	SculptSession *ss= sculpt_session();
 	Object *ob= OBACT;
+	Mesh *me;
 	MultiresModifierData *mmd = NULL;
 	/* lastSigMouse is for the rake, to store the last place the mouse movement was significant */
 	short mouse[2], mvalo[2], lastSigMouse[2],firsttime=1, mousebut;
@@ -1630,24 +1654,7 @@
 	ss->vertexcosnos = NULL;
 
 	mmd = sculpt_multires_active(ob);
-	if(sculpt_multires_active(ob)) {
-		DerivedMesh *dm = mesh_get_derived_final(OBACT, CD_MASK_BAREMESH);
-		ss->multires = 1;
-		ss->totvert = dm->getNumVerts(dm);
-		ss->totface = dm->getNumFaces(dm);
-		ss->mvert = dm->getVertDataArray(dm, CD_MVERT);
-		ss->mface = dm->getFaceDataArray(dm, CD_MFACE);
-		ss->face_normals = dm->getFaceDataArray(dm, CD_NORMAL);
-	}
-	else {
-		Mesh *me = get_mesh(ob);
-		ss->multires = 0;
-		ss->totvert = me->totvert;
-		ss->totface = me->totface;
-		ss->mvert = me->mvert;
-		ss->mface = me->mface;
-		ss->face_normals = NULL;
-	}
+	sculpt_update_mesh_elements(ss, ob);
 
 	/* Check that vertex users are up-to-date */
 	if(ob != active_ob || !ss->vertex_users || ss->vertex_users_size != ss->totvert) {
@@ -1703,7 +1710,9 @@
 	
 	/* For raking, get the original angle*/
 	offsetRot=sculpt_tex_angle();
-	
+
+	me = get_mesh(OBACT);
+
 	while (get_mbut() & mousebut) {
 		getmouseco_areawin(mouse);
 		/* If rake, and the mouse has moved over 10 pixels (euclidean) (prevents jitter) then get the new angle */
@@ -1729,8 +1738,6 @@
 
 			if(G.scene->sculptdata.brush_type != GRAB_BRUSH) {
 				if(anchored) {
-					Mesh *me = get_mesh(ob);
-					
  					/* Restore the mesh before continuing with anchored stroke */
  					if(a->mesh_store) {
  						for(i = 0; i < me->totvert; ++i) {
@@ -1824,11 +1831,20 @@
 	MEM_freeN(a);
 	sculpt_stroke_free();
 
-	get_mesh(OBACT)->mr_undo = ss->mvert;
-	get_mesh(OBACT)->mr_undo_tot = ss->totvert;
+	if(mmd) {
+		me->mr_undo = ss->mvert;
+		me->mr_undo_tot = ss->totvert;
+	}
+	else {
+		me->mr_undo = NULL;
+		me->mr_undo_tot = 0;
+	}
 
 	sculpt_undo_push(G.scene->sculptdata.brush_type);
 
+	me->mr_undo = NULL;
+	me->mr_undo_tot = 0;
+
 	if(G.vd->depths) G.vd->depths->damaged= 1;
 	
 	allqueue(REDRAWVIEW3D, 0);





More information about the Bf-blender-cvs mailing list