[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29597] trunk/blender/source/blender: [ #22262] Sculpting shape keys using the Smooth brush switches the shape to the Basis
Tom M
letterrip at gmail.com
Mon Jun 21 22:40:35 CEST 2010
Sergey and brecht,
this seems like it would result in a large increase in the ram
requirements for high poly sculpting?
I chatted with Sergey briefly and asked what ram increase this would
have on ram.
He said it would increase ram requirements by the size of MVert (24
bytes) * the number of verts
so for 20 million quads which is what I'm sculpting on for a 2GB ram
imac, that would be a
20 000 000 * 24 bytes = 457.763672 megabytes
that is a huge percentage increase in ram usage, will cut the maximum
size mesh you can sculpt on by 30%-50% when you don't have any
shapekeys.
LetterRip
On Mon, Jun 21, 2010 at 12:11 PM, Sergey Sharybin <g.ulairi at gmail.com> wrote:
> Revision: 29597
> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29597
> Author: nazgul
> Date: 2010-06-21 22:10:59 +0200 (Mon, 21 Jun 2010)
>
> Log Message:
> -----------
> [#22262] Sculpting shape keys using the Smooth brush switches the shape to the Basis
>
> PBVH used the same verts array as mesh data and shape key/reference key coords
> were applying on the mesh data, so on some refreshing undeformed mesh was
> displayed.
> Added utility functions to get vert coords from key block, apply new vert coords
> on keyblock and function to apply coords on bpvh, so now pbvh uses it's ovn
> vertex array and no changes are making to the mesh data.
>
> Additional change:
> Store key block name in SculptUndoNode, so now shape wouldn't be copied to
> wrong keyblock on undo
>
> Modified Paths:
> --------------
> trunk/blender/source/blender/blenkernel/BKE_key.h
> trunk/blender/source/blender/blenkernel/BKE_paint.h
> trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
> trunk/blender/source/blender/blenkernel/intern/depsgraph.c
> trunk/blender/source/blender/blenkernel/intern/key.c
> trunk/blender/source/blender/blenlib/BLI_pbvh.h
> trunk/blender/source/blender/blenlib/intern/pbvh.c
> trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
> trunk/blender/source/blender/editors/sculpt_paint/sculpt_intern.h
>
> Modified: trunk/blender/source/blender/blenkernel/BKE_key.h
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/BKE_key.h 2010-06-21 19:46:23 UTC (rev 29596)
> +++ trunk/blender/source/blender/blenkernel/BKE_key.h 2010-06-21 20:10:59 UTC (rev 29597)
> @@ -75,6 +75,8 @@
> void latt_to_key(struct Lattice *lt, struct KeyBlock *kb);
> void key_to_curve(struct KeyBlock *kb, struct Curve *cu, struct ListBase *nurb);
> void curve_to_key(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb);
> +float (*key_to_vertcos(struct Object *ob, struct KeyBlock *kb))[3];
> +void vertcos_to_key(struct Object *ob, struct KeyBlock *kb, float (*vertCos)[3]);
>
> #ifdef __cplusplus
> };
>
> Modified: trunk/blender/source/blender/blenkernel/BKE_paint.h
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/BKE_paint.h 2010-06-21 19:46:23 UTC (rev 29596)
> +++ trunk/blender/source/blender/blenkernel/BKE_paint.h 2010-06-21 20:10:59 UTC (rev 29597)
> @@ -70,7 +70,7 @@
> int totvert, totface;
> float *face_normals;
> struct Object *ob;
> - struct KeyBlock *kb, *refkb;
> + struct KeyBlock *kb;
>
> /* Mesh connectivity */
> struct ListBase *fmap;
> @@ -94,6 +94,8 @@
> struct StrokeCache *cache;
>
> struct GPUDrawObject *drawobject;
> +
> + int modifiers_active;
> } SculptSession;
>
> void free_sculptsession(struct Object *ob);
>
> Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2010-06-21 19:46:23 UTC (rev 29596)
> +++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2010-06-21 20:10:59 UTC (rev 29597)
> @@ -186,6 +186,16 @@
> return cddm->fmap;
> }
>
> +static int can_pbvh_draw(Object *ob, DerivedMesh *dm)
> +{
> + CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
> + Mesh *me= (ob)? ob->data: NULL;
> +
> + if(ob->sculpt->modifiers_active) return 0;
> +
> + return (cddm->mvert == me->mvert) || ob->sculpt->kb;
> +}
> +
> static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
> {
> CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
> @@ -200,7 +210,7 @@
> return NULL;
> if(ob->sculpt->pbvh) {
> cddm->pbvh= ob->sculpt->pbvh;
> - cddm->pbvh_draw = (cddm->mvert == me->mvert) || ob->sculpt->kb;
> + cddm->pbvh_draw = can_pbvh_draw(ob, dm);
> }
>
> /* always build pbvh from original mesh, and only use it for drawing if
> @@ -208,7 +218,7 @@
> that this is actually for, to support a pbvh on a modified mesh */
> if(!cddm->pbvh && ob->type == OB_MESH) {
> cddm->pbvh = BLI_pbvh_new();
> - cddm->pbvh_draw = (cddm->mvert == me->mvert) || ob->sculpt->kb;
> + cddm->pbvh_draw = can_pbvh_draw(ob, dm);
> BLI_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
> me->totface, me->totvert);
> }
>
> Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/intern/depsgraph.c 2010-06-21 19:46:23 UTC (rev 29596)
> +++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c 2010-06-21 20:10:59 UTC (rev 29597)
> @@ -2286,9 +2286,6 @@
> /* no point in trying in this cases */
> if(!id || id->us <= 1)
> id= NULL;
> - /* for locked shape keys we make an exception */
> - else if(ob_get_key(ob) && (ob->shapeflag & OB_SHAPE_LOCK))
> - id= NULL;
> }
> }
>
>
> Modified: trunk/blender/source/blender/blenkernel/intern/key.c
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/intern/key.c 2010-06-21 19:46:23 UTC (rev 29596)
> +++ trunk/blender/source/blender/blenkernel/intern/key.c 2010-06-21 20:10:59 UTC (rev 29597)
> @@ -38,6 +38,7 @@
>
> #include "BLI_blenlib.h"
> #include "BLI_editVert.h"
> +#include "BLI_math_vector.h"
>
> #include "DNA_anim_types.h"
> #include "DNA_key_types.h"
> @@ -1719,3 +1720,151 @@
> VECCOPY(mvert->co, fp);
> }
> }
> +
> +/************************* vert coords ************************/
> +float (*key_to_vertcos(Object *ob, KeyBlock *kb))[3]
> +{
> + float (*vertCos)[3], *co;
> + float *fp= kb->data;
> + int tot= 0, a;
> +
> + /* Count of vertex coords in array */
> + if(ob->type == OB_MESH) {
> + Mesh *me= (Mesh*)ob->data;
> + tot= me->totvert;
> + } else if(ob->type == OB_LATTICE) {
> + Lattice *lt= (Lattice*)ob->data;
> + tot= lt->pntsu*lt->pntsv*lt->pntsw;
> + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
> + Curve *cu= (Curve*)ob->data;
> + tot= count_curveverts(&cu->nurb);
> + }
> +
> + if (tot == 0) return NULL;
> +
> + vertCos= MEM_callocN(tot*sizeof(*vertCos), "key_to_vertcos vertCos");
> +
> + /* Copy coords to array */
> + co= (float*)vertCos;
> +
> + if(ELEM(ob->type, OB_MESH, OB_LATTICE)) {
> + for (a= 0; a<tot; a++, fp+=3, co+=3) {
> + copy_v3_v3(co, fp);
> + }
> + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
> + Curve *cu= (Curve*)ob->data;
> + Nurb *nu= cu->nurb.first;
> + BezTriple *bezt;
> + BPoint *bp;
> +
> + while (nu) {
> + if(nu->bezt) {
> + int i;
> + bezt= nu->bezt;
> + a= nu->pntsu;
> +
> + while (a--) {
> + for (i= 0; i<3; i++) {
> + copy_v3_v3(co, fp);
> + fp+= 3; co+= 3;
> + }
> +
> + fp+= 3; /* skip alphas */
> +
> + bezt++;
> + }
> + }
> + else {
> + bp= nu->bp;
> + a= nu->pntsu*nu->pntsv;
> +
> + while (a--) {
> + copy_v3_v3(co, fp);
> +
> + fp+= 4;
> + co+= 3;
> +
> + bp++;
> + }
> + }
> +
> + nu= nu->next;
> + }
> + }
> +
> + return vertCos;
> +}
> +
> +void vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3])
> +{
> + float *co= (float*)vertCos, *fp;
> + int tot= 0, a, elemsize;
> +
> + if (kb->data) MEM_freeN(kb->data);
> +
> + /* Count of vertex coords in array */
> + if(ob->type == OB_MESH) {
> + Mesh *me= (Mesh*)ob->data;
> + tot= me->totvert;
> + elemsize= me->key->elemsize;
> + } else if(ob->type == OB_LATTICE) {
> + Lattice *lt= (Lattice*)ob->data;
> + tot= lt->pntsu*lt->pntsv*lt->pntsw;
> + elemsize= lt->key->elemsize;
> + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
> + Curve *cu= (Curve*)ob->data;
> + elemsize= cu->key->elemsize;
> + tot= count_curveverts(&cu->nurb);
> + }
> +
> + fp= kb->data= MEM_callocN(tot*elemsize, "key_to_vertcos vertCos");
> +
> + if (tot == 0) return;
> +
> + /* Copy coords to keyblock */
> +
> + if(ELEM(ob->type, OB_MESH, OB_LATTICE)) {
> + for (a= 0; a<tot; a++, fp+=3, co+=3) {
> + copy_v3_v3(fp, co);
> + }
> + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
> + Curve *cu= (Curve*)ob->data;
> + Nurb *nu= cu->nurb.first;
> + BezTriple *bezt;
> + BPoint *bp;
> +
> + while (nu) {
> + if(nu->bezt) {
> + int i;
> + bezt= nu->bezt;
> + a= nu->pntsu;
> +
> + while (a--) {
> + for (i= 0; i<3; i++) {
> + copy_v3_v3(fp, co);
> + fp+= 3; co+= 3;
> + }
> +
> + fp+= 3; /* skip alphas */
> +
> + bezt++;
> + }
> + }
> + else {
> + bp= nu->bp;
> + a= nu->pntsu*nu->pntsv;
> +
> + while (a--) {
> + copy_v3_v3(fp, co);
> +
> + fp+= 4;
> + co+= 3;
> +
> + bp++;
> + }
> + }
> +
> + nu= nu->next;
> + }
> + }
> +}
>
> Modified: trunk/blender/source/blender/blenlib/BLI_pbvh.h
> ===================================================================
> --- trunk/blender/source/blender/blenlib/BLI_pbvh.h 2010-06-21 19:46:23 UTC (rev 29596)
> +++ trunk/blender/source/blender/blenlib/BLI_pbvh.h 2010-06-21 20:10:59 UTC (rev 29597)
> @@ -114,6 +114,12 @@
> void BLI_pbvh_grids_update(PBVH *bvh, struct DMGridData **grids,
> struct DMGridAdjacency *gridadj, void **gridfaces);
>
> +/* vertex deformer */
> +float (*BLI_pbvh_get_vertCos(struct PBVH *pbvh))[3];
> +void BLI_pbvh_apply_vertCos(struct PBVH *pbvh, float (*vertCos)[3]);
> +int BLI_pbvh_isDeformed(struct PBVH *pbvh);
> +
> +
> /* Vertex Iterator */
>
> /* this iterator has quite a lot of code, but it's designed to:
>
> Modified: trunk/blender/source/blender/blenlib/intern/pbvh.c
> ===================================================================
> --- trunk/blender/source/blender/blenlib/intern/pbvh.c 2010-06-21 19:46:23 UTC (rev 29596)
> +++ trunk/blender/source/blender/blenlib/intern/pbvh.c 2010-06-21 20:10:59 UTC (rev 29597)
> @@ -29,6 +29,7 @@
> #include "BLI_pbvh.h"
>
> #include "BKE_DerivedMesh.h"
> +#include "BKE_mesh.h" /* for mesh_calc_normals */
>
> #include "gpu_buffers.h"
>
> @@ -120,6 +121,9 @@
> #ifdef PERFCNTRS
> int perf_modified;
> #endif
> +
> + /* flag are verts/faces deformed */
> + int deformed;
> };
>
> #define STACK_FIXED_DEPTH 100
> @@ -576,6 +580,15 @@
> }
> }
>
> + if (bvh->deformed) {
> + if (bvh->verts) {
> + /* if pbvh was deformed, new memory was allocated for verts/faces -- free it */
> +
> + MEM_freeN(bvh->verts);
> + MEM_freeN(bvh->faces);
> + }
> + }
> +
> MEM_freeN(bvh->nodes);
> MEM_freeN(bvh->prim_indices);
> MEM_freeN(bvh);
> @@ -1330,3 +1343,55 @@
> bvh->gridfaces= gridfaces;
> }
>
> +float (*BLI_pbvh_get_vertCos(PBVH *pbvh))[3]
> +{
> + int a;
> + float (*vertCos)[3]= NULL;
> +
> + if (pbvh->verts) {
> + float *co;
> + MVert *mvert= pbvh->verts;
> +
> + vertCos= MEM_callocN(3*pbvh->totvert*sizeof(float), "BLI_pbvh_get_vertCoords");
> + co= (float*)vertCos;
> +
> + for (a= 0; a<pbvh->totvert; a++, mvert++, co+= 3) {
> + copy_v3_v3(co, mvert->co);
> + }
> + }
> +
> + return vertCos;
> +}
> +
> +void BLI_pbvh_apply_vertCos(PBVH *pbvh, float (*vertCos)[3])
> +{
> + int a;
> +
> + if (!pbvh->deformed) {
> + if (pbvh->verts) {
> + /* if pbvh is not already deformed, verts/faces points to the */
> + /* original data and applying new coords to this arrays would lead to */
> + /* unneeded deformation -- duplicate verts/faces to avoid this */
> +
> + pbvh->verts= MEM_dupallocN(pbvh->verts);
> + pbvh->faces= MEM_dupallocN(pbvh->faces);
> +
> + pbvh->deformed= 1;
> + }
> + }
> +
> + if (pbvh->verts) {
> + /* copy new verts coords */
> + for (a= 0; a < pbvh->totvert; ++a) {
> + copy_v3_v3(pbvh->verts[a].co, vertCos[a]);
> + }
> +
> + /* coordinates are new -- normals should also be updated */
> + mesh_calc_normals(pbvh->verts, pbvh->totvert, pbvh->faces, pbvh->totprim, NULL);
> + }
> +}
> +
> +int BLI_pbvh_isDeformed(PBVH *pbvh)
> +{
> + return pbvh->deformed;
> +}
>
> Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
> ===================================================================
> --- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c 2010-06-21 19:46:23 UTC (rev 29596)
> +++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c 2010-06-21 20:10:59 UTC (rev 29597)
> @@ -275,6 +275,9 @@
>
> /* layer brush */
> float *layer_disp;
> +
> + /* shape keys */
> + char *shapeName[32]; /* keep size in sync with keyblock dna */
> } SculptUndoNode;
>
> static void update_cb(PBVHNode *node, void *data)
> @@ -326,16 +329,53 @@
> continue;
>
> if(unode->maxvert) {
> + char *shapeName= (char*)unode->shapeName;
> +
> /* regular mesh restore */
> if(ss->totvert != unode->maxvert)
> continue;
>
> + if (ss->kb && strcmp(ss->kb->name, shapeName)) {
>
> @@ Diff output truncated at 10240 characters. @@
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list