[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15278] branches/soc-2008-nicholasbishop/ source/blender: Enabled updates of normals when sculpting on a multires mesh ( only works for smooth meshes now)
Nicholas Bishop
nicholasbishop at gmail.com
Thu Jun 19 09:36:48 CEST 2008
Revision: 15278
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15278
Author: nicholasbishop
Date: 2008-06-19 09:35:44 +0200 (Thu, 19 Jun 2008)
Log Message:
-----------
Enabled updates of normals when sculpting on a multires mesh (only works for smooth meshes now)
Modified Paths:
--------------
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_sculpt.h
branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_sculpt.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_sculpt.h 2008-06-19 03:13:00 UTC (rev 15277)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_sculpt.h 2008-06-19 07:35:44 UTC (rev 15278)
@@ -30,6 +30,8 @@
#ifndef BKE_SCULPT_H
#define BKE_SCULPT_H
+struct MFace;
+struct MVert;
struct NumInput;
struct RadialControl;
struct Scene;
@@ -40,6 +42,12 @@
struct ProjVert *projverts;
struct bglMats *mats;
+
+ int multires;
+ int totvert;
+ int totface;
+ struct MVert *mvert;
+ struct MFace *mface;
/* An array of lists; array is sized as
large as the number of verts in the mesh,
Modified: branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c 2008-06-19 03:13:00 UTC (rev 15277)
+++ branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c 2008-06-19 07:35:44 UTC (rev 15278)
@@ -143,10 +143,6 @@
char firsttime;
- int multires;
- MVert *verts;
- int totvert;
-
/* Some brushes need access to original mesh vertices */
vec3f *mesh_store;
short (*orig_norms)[3];
@@ -225,22 +221,21 @@
SculptSession *ss= sculpt_session();
int i,j;
IndexNode *node= NULL;
- Mesh *me= get_mesh(OBACT);
sculpt_vertexusers_free(ss);
/* For efficiency, use vertex_users_mem as a memory pool (may be larger
than necessary if mesh has triangles, but only one alloc is needed.) */
- ss->vertex_users= MEM_callocN(sizeof(ListBase) * me->totvert, "vertex_users");
- ss->vertex_users_size= me->totvert;
- ss->vertex_users_mem= MEM_callocN(sizeof(IndexNode)*me->totface*4, "vertex_users_mem");
+ ss->vertex_users= MEM_callocN(sizeof(ListBase) * ss->totvert, "vertex_users");
+ ss->vertex_users_size= ss->totvert;
+ ss->vertex_users_mem= MEM_callocN(sizeof(IndexNode)*ss->totface*4, "vertex_users_mem");
node= ss->vertex_users_mem;
/* Find the users */
- for(i=0; i<me->totface; ++i){
- for(j=0; j<(me->mface[i].v4?4:3); ++j, ++node) {
+ for(i=0; i<ss->totface; ++i){
+ for(j=0; j<(ss->mface[i].v4?4:3); ++j, ++node) {
node->Index=i;
- BLI_addtail(&ss->vertex_users[((unsigned int*)(&me->mface[i]))[j]], node);
+ BLI_addtail(&ss->vertex_users[((unsigned int*)(&ss->mface[i]))[j]], node);
}
}
}
@@ -472,7 +467,7 @@
}
else {
for(; node; node = node->next)
- add_norm_if(((BrushAction*)a)->symm.out, out, out_flip, a->verts[node->Index].no);
+ add_norm_if(((BrushAction*)a)->symm.out, out, out_flip, sd->session->mvert[node->Index].no);
}
if (out[0]==0.0 && out[1]==0.0 && out[2]==0.0) {
@@ -490,7 +485,7 @@
Normalize(out);
}
-void do_draw_brush(const BrushAction *a, const ListBase* active_verts)
+void do_draw_brush(SculptSession *ss, const BrushAction *a, const ListBase* active_verts)
{
float area_normal[3];
ActiveData *node= active_verts->first;
@@ -500,7 +495,7 @@
sculpt_axislock(area_normal);
while(node){
- float *co= a->verts[node->Index].co;
+ float *co= ss->mvert[node->Index].co;
const float val[3]= {co[0]+area_normal[0]*node->Fade*a->scale[0],
co[1]+area_normal[1]*node->Fade*a->scale[1],
@@ -980,11 +975,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((sd->brush_type != GRAB_BRUSH) || a->firsttime) {
- for(i=0; i<a->totvert; ++i) {
+ for(i=0; i<ss->totvert; ++i) {
/* Projverts.inside provides a rough bounding box */
- if(a->multires || ss->projverts[i].inside) {
+ if(ss->multires || ss->projverts[i].inside) {
//vert= ss->vertexcosnos ? &ss->vertexcosnos[i*6] : a->verts[i].co;
- vert= a->verts[i].co;
+ vert= ss->mvert[i].co;
av_dist= VecLenf(a->symm.center_3d, vert);
if(av_dist < a->size_3d) {
adata= (ActiveData*)MEM_mallocN(sizeof(ActiveData), "ActiveData");
@@ -1009,7 +1004,7 @@
/* Apply one type of brush action */
switch(G.scene->sculptdata.brush_type){
case DRAW_BRUSH:
- do_draw_brush(a, &active_verts);
+ do_draw_brush(ss, a, &active_verts);
break;
case SMOOTH_BRUSH:
do_smooth_brush(a, &active_verts);
@@ -1032,7 +1027,7 @@
}
/* Copy the modified vertices from mesh to the active key */
- if(keyblock && !a->multires) {
+ if(keyblock && !ss->multires) {
float *co= keyblock->data;
if(co) {
if(sd->brush_type == GRAB_BRUSH)
@@ -1046,7 +1041,7 @@
}
}
- if(ss->vertexcosnos)
+ if(ss->vertexcosnos && !ss->multires)
BLI_freelistN(&active_verts);
else {
if(sd->brush_type != GRAB_BRUSH)
@@ -1092,13 +1087,11 @@
a->symm = orig;
}
-void add_face_normal(vec3f *norm, const MFace* face)
+void add_face_normal(vec3f *norm, MVert *mvert, const MFace* face)
{
- Mesh *me= get_mesh(OBACT);
-
- vec3f c= {me->mvert[face->v1].co[0],me->mvert[face->v1].co[1],me->mvert[face->v1].co[2]};
- vec3f b= {me->mvert[face->v2].co[0],me->mvert[face->v2].co[1],me->mvert[face->v2].co[2]};
- vec3f a= {me->mvert[face->v3].co[0],me->mvert[face->v3].co[1],me->mvert[face->v3].co[2]};
+ vec3f c= {mvert[face->v1].co[0],mvert[face->v1].co[1],mvert[face->v1].co[2]};
+ vec3f b= {mvert[face->v2].co[0],mvert[face->v2].co[1],mvert[face->v2].co[2]};
+ vec3f a= {mvert[face->v3].co[0],mvert[face->v3].co[1],mvert[face->v3].co[2]};
vec3f s1, s2;
VecSubf(&s1.x,&a.x,&b.x);
@@ -1109,35 +1102,35 @@
norm->z+= s1.x * s2.y - s1.y * s2.x;
}
-void update_damaged_vert(Mesh *me, ListBase *lb)
+void update_damaged_vert(ListBase *lb, BrushAction *a)
{
ActiveData *vert;
+ SculptSession *ss = sculpt_session();
for(vert= lb->first; vert; vert= vert->next) {
vec3f norm= {0,0,0};
IndexNode *face= sculpt_session()->vertex_users[vert->Index].first;
while(face){
- add_face_normal(&norm,&me->mface[face->Index]);
+ add_face_normal(&norm, ss->mvert, &ss->mface[face->Index]);
face= face->next;
}
Normalize(&norm.x);
- me->mvert[vert->Index].no[0]=norm.x*32767;
- me->mvert[vert->Index].no[1]=norm.y*32767;
- me->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;
}
}
void calc_damaged_verts(ListBase *damaged_verts, BrushAction *a)
{
- Mesh *me= get_mesh(OBACT);
int i;
for(i=0; i<8; ++i)
- update_damaged_vert(me, &a->grab_active_verts[i]);
+ update_damaged_vert(&a->grab_active_verts[i], a);
- update_damaged_vert(me, damaged_verts);
+ update_damaged_vert(damaged_verts, a);
BLI_freelistN(damaged_verts);
damaged_verts->first = damaged_verts->last = NULL;
}
@@ -1342,30 +1335,6 @@
}
}
}
-
- /* Multires */
- {
- ModifierData *md;
- MultiresModifierData *mmd = NULL;
-
- for(md= modifiers_getVirtualModifierList(OBACT); md; md= md->next) {
- if(md->type == eModifierType_Multires)
- mmd = (MultiresModifierData*)md;
- }
-
- if(mmd) {
- DerivedMesh *dm = mesh_get_derived_final(OBACT, CD_MASK_BAREMESH);
- a->multires = 1;
- a->verts = dm->getVertDataArray(dm, CD_MVERT);
- a->totvert = dm->getNumVerts(dm);
- }
- else {
- Mesh *me = get_mesh(OBACT);
- a->multires = 0;
- a->verts = me->mvert;
- a->totvert = me->totvert;
- }
- }
}
void sculptmode_set_strength(const int delta)
{
@@ -1612,11 +1581,24 @@
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;
+ 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;
short modifier_calculations= 0;
@@ -1653,8 +1635,26 @@
ss->damaged_verts.first = ss->damaged_verts.last = NULL;
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);
+ }
+ 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;
+ }
+
/* Check that vertex users are up-to-date */
- if(ob != active_ob || !ss->vertex_users || ss->vertex_users_size != get_mesh(ob)->totvert) {
+ if(ob != active_ob || !ss->vertex_users || ss->vertex_users_size != ss->totvert) {
sculpt_vertexusers_free(ss);
calc_vertex_users();
if(ss->projverts)
@@ -1762,7 +1762,7 @@
unproject(sd->pivot, mouse[0], mouse[1], a->depth);
}
- if((!a->multires && modifier_calculations) || ob_get_keyblock(ob))
+ if((!ss->multires && modifier_calculations) || ob_get_keyblock(ob))
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
if(modifier_calculations || sd->brush_type == GRAB_BRUSH || !(sd->flags & SCULPT_DRAW_FAST)) {
More information about the Bf-blender-cvs
mailing list