[Bf-blender-cvs] [8933363] vertex_paint_pbvh: Vertex painting PBVH refactor:
Antony Riakiotakis
noreply at git.blender.org
Wed Dec 24 14:42:59 CET 2014
Commit: 89333638a8cc4aeb2eae2a1bd48f71396672aeb4
Author: Antony Riakiotakis
Date: Sat Oct 18 14:39:28 2014 +0200
Branches: vertex_paint_pbvh
https://developer.blender.org/rB89333638a8cc4aeb2eae2a1bd48f71396672aeb4
Vertex painting PBVH refactor:
Refactor PBVH off SculptSession and in a separate PaintSession struct
Entering Vertex painting will generate a PBVH and vertex painting now
draws using PBVH.
Add stub vertex painting operator that will use PBVH.
===================================================================
M source/blender/blenkernel/BKE_paint.h
M source/blender/blenkernel/intern/DerivedMesh.c
M source/blender/blenkernel/intern/cdderivedmesh.c
M source/blender/blenkernel/intern/multires.c
M source/blender/blenkernel/intern/object.c
M source/blender/blenkernel/intern/paint.c
M source/blender/blenkernel/intern/subsurf_ccg.c
M source/blender/blenloader/intern/readfile.c
M source/blender/editors/object/object_edit.c
M source/blender/editors/sculpt_paint/CMakeLists.txt
M source/blender/editors/sculpt_paint/paint_cursor.c
M source/blender/editors/sculpt_paint/paint_hide.c
M source/blender/editors/sculpt_paint/paint_intern.h
M source/blender/editors/sculpt_paint/paint_mask.c
M source/blender/editors/sculpt_paint/paint_ops.c
M source/blender/editors/sculpt_paint/paint_utils.c
A source/blender/editors/sculpt_paint/paint_vertex_pbvh.c
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
M source/blender/editors/sculpt_paint/sculpt_undo.c
M source/blender/editors/space_info/info_stats.c
M source/blender/editors/space_view3d/drawobject.c
M source/blender/makesdna/DNA_object_types.h
M source/blender/makesrna/intern/rna_object.c
M source/blender/makesrna/intern/rna_sculpt_paint.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index b080ca3..24a485a 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -145,6 +145,7 @@ float paint_grid_paint_mask(const struct GridPaintMask *gpm, unsigned level,
/* stroke related */
void paint_calculate_rake_rotation(struct UnifiedPaintSettings *ups, const float mouse_pos[2]);
+
/* Session data (mode-specific) */
typedef struct SculptSession {
@@ -169,8 +170,6 @@ typedef struct SculptSession {
/* Undo/redo log for dynamic topology sculpting */
struct BMLog *bm_log;
- /* PBVH acceleration structure */
- struct PBVH *pbvh;
bool show_diffuse_color;
/* Painting on deformed mesh */
@@ -178,14 +177,7 @@ typedef struct SculptSession {
float (*orig_cos)[3]; /* coords of undeformed mesh */
float (*deform_cos)[3]; /* coords of deformed mesh but without stroke displacement */
float (*deform_imats)[3][3]; /* crazyspace deformation matrices */
-
- /* Partial redraw */
- bool partial_redraw;
- /* Used to cache the render of the active texture */
- unsigned int texcache_side, *texcache, texcache_actual;
- struct ImagePool *tex_pool;
-
/* Layer brush persistence between strokes */
float (*layer_co)[3]; /* Copy of the mesh vertices' locations */
@@ -200,6 +192,24 @@ typedef struct SculptSession {
int average_stroke_counter;
} SculptSession;
+/* Session data (common) */
+typedef struct PaintSession {
+ /* PBVH acceleration structure */
+ struct PBVH *pbvh;
+
+ /* Used to cache the render of the active texture */
+ unsigned int texcache_side, *texcache, texcache_actual;
+ struct ImagePool *tex_pool;
+
+ /* Partial redraw */
+ bool partial_redraw;
+
+ /* mode specific stuff */
+ SculptSession *sculpt;
+} PaintSession;
+
+void BKE_free_paintsession(struct Object *ob);
+
void BKE_free_sculptsession(struct Object *ob);
void BKE_free_sculptsession_deformMats(struct SculptSession *ss);
void BKE_sculptsession_bm_to_me(struct Object *ob, bool reorder);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index e8000a0..6c9985b 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1484,8 +1484,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
const bool has_multires = (mmd && mmd->sculptlvl != 0);
bool multires_applied = false;
- const bool sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt && !useRenderParams;
- const bool sculpt_dyntopo = (sculpt_mode && ob->sculpt->bm) && !useRenderParams;
+ const bool sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->paint && ob->paint->sculpt && !useRenderParams;
+ const bool sculpt_dyntopo = (sculpt_mode && ob->paint->sculpt->bm) && !useRenderParams;
const int draw_flag = dm_drawflag_calc(scene->toolsettings);
/* Generic preview only in object mode! */
@@ -2282,12 +2282,17 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask,
ob->derivedDeform->needsFree = 0;
ob->lastDataMask = dataMask;
- if ((ob->mode & OB_MODE_SCULPT) && ob->sculpt) {
+ if ((ob->mode & OB_MODE_SCULPT) && ob->paint && ob->paint->sculpt) {
/* create PBVH immediately (would be created on the fly too,
* but this avoids waiting on first stroke) */
BKE_sculpt_update_mesh_elements(scene, scene->toolsettings->sculpt, ob, false, false);
}
+ else if ((ob->mode & OB_MODE_VERTEX_PAINT) && ob->paint) {
+ /* needs to be called after we ensure tessface */
+ DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
+ ob->paint->pbvh = dm->getPBVH(ob, dm);
+ }
BLI_assert(!(ob->derivedFinal->dirty & DM_DIRTY_NORMALS));
}
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 6ac8569..f6df071 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -222,23 +222,26 @@ static const MeshElemMap *cdDM_getPolyMap(Object *ob, DerivedMesh *dm)
static bool check_sculpt_object_deformed(Object *object, bool for_construction)
{
+ SculptSession *ss = object->paint->sculpt;
bool deformed = false;
+ if (!ss)
+ return deformed;
/* Active modifiers means extra deformation, which can't be handled correct
* on birth of PBVH and sculpt "layer" levels, so use PBVH only for internal brush
* stuff and show final DerivedMesh so user would see actual object shape.
*/
- deformed |= object->sculpt->modifiers_active;
+ deformed |= ss->modifiers_active;
if (for_construction) {
- deformed |= object->sculpt->kb != NULL;
+ deformed |= ss->kb != NULL;
}
else {
/* As in case with modifiers, we can't synchronize deformation made against
* PBVH and non-locked keyblock, so also use PBVH only for brushes and
* final DM to give final result to user.
*/
- deformed |= object->sculpt->kb && (object->shapeflag & OB_SHAPE_LOCK) == 0;
+ deformed |= ss->kb && (object->shapeflag & OB_SHAPE_LOCK) == 0;
}
return deformed;
@@ -254,37 +257,40 @@ static bool can_pbvh_draw(Object *ob, DerivedMesh *dm)
return false;
}
- return cddm->mvert == me->mvert || ob->sculpt->kb;
+ return cddm->mvert == me->mvert || (ob->paint->sculpt && ob->paint->sculpt->kb);
}
static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
+ SculptSession *ss;
if (!ob) {
cddm->pbvh = NULL;
return NULL;
}
- if (!ob->sculpt)
+ if (!ob->paint)
return NULL;
- if (ob->sculpt->pbvh) {
- cddm->pbvh = ob->sculpt->pbvh;
+ if (ob->paint->pbvh) {
+ cddm->pbvh = ob->paint->pbvh;
cddm->pbvh_draw = can_pbvh_draw(ob, dm);
}
+ ss = ob->paint->sculpt;
+
/* Sculpting on a BMesh (dynamic-topology) gets a special PBVH */
- if (!cddm->pbvh && ob->sculpt->bm) {
+ if (!cddm->pbvh && ss && ss->bm) {
cddm->pbvh = BKE_pbvh_new();
cddm->pbvh_draw = true;
- BKE_pbvh_build_bmesh(cddm->pbvh, ob->sculpt->bm,
- ob->sculpt->bm_smooth_shading,
- ob->sculpt->bm_log, ob->sculpt->cd_vert_node_offset,
- ob->sculpt->cd_face_node_offset);
+ BKE_pbvh_build_bmesh(cddm->pbvh, ss->bm,
+ ss->bm_smooth_shading,
+ ss->bm_log, ss->cd_vert_node_offset,
+ ss->cd_face_node_offset);
- pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
+ pbvh_show_diffuse_color_set(cddm->pbvh, ss->show_diffuse_color);
}
@@ -303,9 +309,13 @@ static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
BKE_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
me->totface, me->totvert, &me->vdata);
- pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
+ if (ss) {
+ pbvh_show_diffuse_color_set(cddm->pbvh, ss->show_diffuse_color);
- deformed = check_sculpt_object_deformed(ob, true);
+ deformed = check_sculpt_object_deformed(ob, true);
+ }
+ else
+ deformed = false;
if (deformed && ob->derivedDeform) {
DerivedMesh *deformdm = ob->derivedDeform;
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 0adc65b..3e7696d 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -377,9 +377,9 @@ void multires_force_update(Object *ob)
if (ob) {
BKE_object_free_derived_caches(ob);
- if (ob->sculpt && ob->sculpt->pbvh) {
- BKE_pbvh_free(ob->sculpt->pbvh);
- ob->sculpt->pbvh = NULL;
+ if (ob->paint && ob->paint->pbvh) {
+ BKE_pbvh_free(ob->paint->pbvh);
+ ob->paint->pbvh = NULL;
}
}
}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index a0d1b25..fc7544e 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -395,7 +395,7 @@ void BKE_object_free_ex(Object *ob, bool do_id_user)
if (ob->bsoft) bsbFree(ob->bsoft);
if (ob->gpulamp.first) GPU_lamp_free(ob);
- BKE_free_sculptsession(ob);
+ BKE_free_paintsession(ob);
if (ob->pc_ids.first) BLI_freelistN(&ob->pc_ids);
@@ -1481,7 +1481,7 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches)
BKE_constraints_copy(&obn->constraints, &ob->constraints, true);
obn->mode = OB_MODE_OBJECT;
- obn->sculpt = NULL;
+ obn->paint = NULL;
/* increase user numbers */
id_us_plus((ID *)obn->data);
@@ -3179,25 +3179,26 @@ void BKE_object_handle_update(EvaluationContext *eval_ctx, Scene *scene, Object
void BKE_object_sculpt_modifiers_changed(Object *ob)
{
- SculptSession *ss = ob->sculpt;
+ PaintSession *psession = ob->paint;
+ SculptSession *ss = psession ? psession->sculpt : NULL;
if (ss) {
if (!ss->cache) {
/* we free pbvh on changes, except during sculpt since it can't deal with
* changing PVBH node organization, we hope topology does not change in
* the meantime .. weak */
- if (ss->pbvh) {
- BKE_pbvh_free(ss->pbvh);
- ss->pbvh = NULL;
+ if (psession->pbvh) {
+ BKE_pbvh_free(psession->pbvh);
+ psession->pbvh = NULL;
}
- BKE_free_sculptsession_deformMats(ob->sculpt);
+ BKE_free_sculptsession_deformMats(psession->sculpt);
}
else {
PBVHNode **nodes;
int n, totnode;
- BKE_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
+ BKE_pbvh_search_gather(psession->pbvh, NULL, NULL, &nodes, &totnode);
for (n = 0; n < totnode; n++)
BKE_pbvh_node_mark_update(nodes[n]);
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 96fff33..de6ca48 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -507,7 +507,7 @@ void BKE_free_sculptsession_deformMats(SculptSession *ss)
/* Write out the sculpt dynamic-topology BMesh to the Mesh */
static void sculptsession_bm_to_me_update_data_only(Object *ob, bool reorder)
{
- SculptSession *ss = ob->sculpt;
+ SculptSession *ss = ob->paint->sculpt;
if (ss->bm) {
if
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list