Revision: 18728 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18728 Author: nicholasbishop Date: 2009-01-29 04:50:46 +0100 (Thu, 29 Jan 2009)
Log Message: ----------- * Brought back special normal recalc for sculpt (only recalculates modified faces/verts) * Means that full object recalc isn't done, so multires works more as expected now * Moved mesh element cache back to sculpt session (from sculpt cache), really makes more sense there Modified Paths: -------------- branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h branches/blender2.5/blender/source/blender/blenkernel/intern/brush.c branches/blender2.5/blender/source/blender/blenkernel/intern/scene.c branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h =================================================================== --- branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h 2009-01-29 03:43:04 UTC (rev 18727) +++ branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h 2009-01-29 03:50:46 UTC (rev 18728) @@ -30,16 +30,22 @@ #ifndef BKE_SCULPT_H #define BKE_SCULPT_H -struct NumInput; -struct RadialControl; -struct Scene; +struct MFace; +struct MultireModifierData; +struct MVert; struct Sculpt; -struct SculptSession; struct StrokeCache; typedef struct SculptSession { struct ProjVert *projverts; + /* Mesh data (not copied) can come either directly from a Mesh, or from a MultiresDM */ + struct MultiresModifierData *multires; /* Special handling for multires meshes */ + struct MVert *mvert; + struct MFace *mface; + int totvert, totface; + float *face_normals; + /* Mesh connectivity */ struct ListBase *fmap; struct IndexNode *fmap_mem; @@ -55,8 +61,6 @@ void *cursor; /* wm handle */ - struct RadialControl *radialcontrol; - struct SculptStroke *stroke; struct StrokeCache *cache; Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/brush.c =================================================================== --- branches/blender2.5/blender/source/blender/blenkernel/intern/brush.c 2009-01-29 03:43:04 UTC (rev 18727) +++ branches/blender2.5/blender/source/blender/blenkernel/intern/brush.c 2009-01-29 03:50:46 UTC (rev 18728) @@ -1018,15 +1018,16 @@ /* Modulate curve with texture */ if(texcache) { - for(i=0; i<side; ++i) + for(i=0; i<side; ++i) { for(j=0; j<side; ++j) { const int col= texcache[i*side+j]; im->rect_float[i*side+j]*= (((char*)&col)[0]+((char*)&col)[1]+((char*)&col)[2])/3.0f/255.0f; } + } + + MEM_freeN(texcache); } - MEM_freeN(texcache); - return im; } Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/scene.c =================================================================== --- branches/blender2.5/blender/source/blender/blenkernel/intern/scene.c 2009-01-29 03:43:04 UTC (rev 18727) +++ branches/blender2.5/blender/source/blender/blenkernel/intern/scene.c 2009-01-29 03:50:46 UTC (rev 18728) @@ -658,9 +658,6 @@ if(ss->projverts) MEM_freeN(ss->projverts); - if(ss->radialcontrol) - MEM_freeN(ss->radialcontrol); - if(ss->fmap) MEM_freeN(ss->fmap); Modified: branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c 2009-01-29 03:43:04 UTC (rev 18727) +++ branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c 2009-01-29 03:50:46 UTC (rev 18728) @@ -145,13 +145,6 @@ ViewContext vc; bglMats *mats; - /* Mesh data (not copied) can come either directly from a Mesh, or from a MultiresDM */ - int multires; /* Special handling for multires meshes */ - MVert *mvert; - MFace *mface; - int totvert, totface; - float *face_normals; - float *layer_disps; /* Displacements for each vertex */ float (*mesh_store)[3]; /* Copy of the mesh vertices' locations */ short (*orig_norms)[3]; /* Copy of the mesh vertices' normals */ @@ -331,7 +324,7 @@ } else { for(; node; node = node->next) - add_norm_if(out_dir, out, out_flip, cache->mvert[node->Index].no); + add_norm_if(out_dir, out, out_flip, sd->session->mvert[node->Index].no); } if (out[0]==0.0 && out[1]==0.0 && out[2]==0.0) { @@ -359,7 +352,7 @@ sculpt_axislock(sd, area_normal); while(node){ - float *co= ss->cache->mvert[node->Index].co; + float *co= ss->mvert[node->Index].co; const float val[3]= {co[0]+area_normal[0]*node->Fade*ss->cache->scale[0], co[1]+area_normal[1]*node->Fade*ss->cache->scale[1], @@ -385,12 +378,12 @@ /* Don't modify corner vertices */ if(ncount==1) { - VecCopyf(avg, ss->cache->mvert[vert].co); + VecCopyf(avg, ss->mvert[vert].co); return; } while(node){ - f= &ss->cache->mface[node->index]; + f= &ss->mface[node->index]; if(f->v4) { skip= (f->v1==vert?2: @@ -401,7 +394,7 @@ for(i=0; i<(f->v4?4:3); ++i) { if(i != skip && (ncount!=2 || BLI_countlist(&ss->fmap[(&f->v1)[i]]) <= 2)) { - VecAddf(avg, avg, ss->cache->mvert[(&f->v1)[i]].co); + VecAddf(avg, avg, ss->mvert[(&f->v1)[i]].co); ++total; } } @@ -412,7 +405,7 @@ if(total>0) VecMulf(avg, 1.0f / total); else - VecCopyf(avg, ss->cache->mvert[vert].co); + VecCopyf(avg, ss->mvert[vert].co); } static void do_smooth_brush(SculptSession *ss, const ListBase* active_verts) @@ -420,7 +413,7 @@ ActiveData *node= active_verts->first; while(node){ - float *co= ss->cache->mvert[node->Index].co; + float *co= ss->mvert[node->Index].co; float avg[3], val[3]; neighbor_average(ss, avg, node->Index); @@ -438,7 +431,7 @@ ActiveData *node= active_verts->first; while(node) { - float *co= ss->cache->mvert[node->Index].co; + float *co= ss->mvert[node->Index].co; const float val[3]= {co[0]+(ss->cache->location[0]-co[0])*node->Fade, co[1]+(ss->cache->location[1]-co[1])*node->Fade, co[2]+(ss->cache->location[2]-co[2])*node->Fade}; @@ -457,7 +450,7 @@ sculpt_axislock(sd, grab_delta); while(node) { - float *co= ss->cache->mvert[node->Index].co; + float *co= ss->mvert[node->Index].co; VecCopyf(add, grab_delta); VecMulf(add, node->Fade); @@ -482,7 +475,7 @@ if((bstr > 0 && *disp < bstr) || (bstr < 0 && *disp > bstr)) { - float *co= ss->cache->mvert[node->Index].co; + float *co= ss->mvert[node->Index].co; *disp+= node->Fade; @@ -512,8 +505,8 @@ float add[3]; while(node) { - float *co= ss->cache->mvert[node->Index].co; - short *no= ss->cache->mvert[node->Index].no; + float *co= ss->mvert[node->Index].co; + short *no= ss->mvert[node->Index].no; add[0]= no[0]/ 32767.0f; add[1]= no[1]/ 32767.0f; @@ -549,7 +542,7 @@ co[0] = co[1] = co[2] = 0.0f; for(i = 0; i < FLATTEN_SAMPLE_SIZE; ++i) - VecAddf(co, co, ss->cache->mvert[outer[i]->Index].co); + VecAddf(co, co, ss->mvert[outer[i]->Index].co); VecMulf(co, 1.0f / FLATTEN_SAMPLE_SIZE); } @@ -564,7 +557,7 @@ calc_flatten_center(ss, node, cntr); while(node){ - float *co= ss->cache->mvert[node->Index].co; + float *co= ss->mvert[node->Index].co; float p1[3], sub1[3], sub2[3], intr[3], val[3]; /* Find the intersection between squash-plane and vertex (along the area normal) */ @@ -743,7 +736,7 @@ BLI_addtail(&ss->damaged_rects, rn); /* Update insides */ - for(i=0; i<ss->cache->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) { @@ -757,6 +750,7 @@ } /* Clears the depth buffer in each modified area. */ +#if 0 static void sculpt_clear_damaged_areas(SculptSession *ss) { RectNode *rn= NULL; @@ -785,7 +779,7 @@ glClear(GL_DEPTH_BUFFER_BIT); } } - +#endif static void do_brush_action(Sculpt *sd, StrokeCache *cache) { SculptSession *ss = sd->session; @@ -805,11 +799,11 @@ /* Build a list of all vertices that are potentially within the brush's area of influence. Only do this once for the grab brush. */ if((b->sculpt_tool != SCULPT_TOOL_GRAB) || cache->first_time) { - for(i=0; i<cache->totvert; ++i) { + for(i=0; i<ss->totvert; ++i) { /* Projverts.inside provides a rough bounding box */ - if(cache->multires || ss->projverts[i].inside) { + if(ss->multires || ss->projverts[i].inside) { //vert= ss->vertexcosnos ? &ss->vertexcosnos[i*6] : a->verts[i].co; - vert= cache->mvert[i].co; + vert= ss->mvert[i].co; av_dist= VecLenf(ss->cache->location, vert); if(av_dist < cache->radius) { adata= (ActiveData*)MEM_mallocN(sizeof(ActiveData), "ActiveData"); @@ -857,7 +851,7 @@ } /* Copy the modified vertices from mesh to the active key */ - if(keyblock && !cache->multires) { + if(keyblock && !ss->multires) { float *co= keyblock->data; if(co) { if(b->sculpt_tool == SCULPT_TOOL_GRAB) @@ -871,7 +865,7 @@ } } - if(ss->vertexcosnos && !cache->multires) + if(ss->vertexcosnos && !ss->multires) BLI_freelistN(&active_verts); else { if(b->sculpt_tool != SCULPT_TOOL_GRAB) @@ -952,16 +946,16 @@ while(face){ float *fn = NULL; - if(ss->cache->face_normals) - fn = &ss->cache->face_normals[face->index*3]; - add_face_normal(&norm, ss->cache->mvert, &ss->cache->mface[face->index], fn); + if(ss->face_normals) + fn = &ss->face_normals[face->index*3]; + add_face_normal(&norm, ss->mvert, &ss->mface[face->index], fn); face= face->next; } Normalize(&norm.x); - ss->cache->mvert[vert->Index].no[0]=norm.x*32767; - ss->cache->mvert[vert->Index].no[1]=norm.y*32767; - ss->cache->mvert[vert->Index].no[2]=norm.z*32767; + 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; } } @@ -971,18 +965,19 @@ for(i=0; i<8; ++i) update_damaged_vert(ss, &ss->cache->grab_active_verts[i]); - update_damaged_vert(ss, &ss->damaged_verts); BLI_freelistN(&ss->damaged_verts); ss->damaged_verts.first = ss->damaged_verts.last = NULL; } +#if 0 static void projverts_clear_inside(SculptSession *ss) { int i; - for(i = 0; i < ss->cache->totvert; ++i) + for(i = 0; i < ss->totvert; ++i) ss->projverts[i].inside = 0; } +#endif static void sculpt_update_tex(Sculpt *sd) { @@ -1027,10 +1022,10 @@ unsigned i; if(!ss->projverts) - ss->projverts = MEM_mallocN(sizeof(ProjVert)*ss->cache->totvert,"ProjVerts"); + ss->projverts = MEM_mallocN(sizeof(ProjVert)*ss->totvert,"ProjVerts"); - for(i=0; i<ss->cache->totvert; ++i) { - project(ss->cache->mats, ss->vertexcosnos ? &ss->vertexcosnos[i * 6] : ss->cache->mvert[i].co, + for(i=0; i<ss->totvert; ++i) { + project(ss->cache->mats, ss->vertexcosnos ? &ss->vertexcosnos[i * 6] : ss->mvert[i].co, ss->projverts[i].co); ss->projverts[i].inside= 0; } @@ -1066,32 +1061,31 @@ return NULL; } -static void sculpt_update_mesh_elements(SculptSession *ss, Object *ob) +static void sculpt_update_mesh_elements(bContext *C) { - StrokeCache *cache = ss->cache; @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs