Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2022-09-29 02:22:34 +0300
committerJoseph Eagar <joeedh@gmail.com>2022-09-29 02:22:34 +0300
commit0156a677c7d13106a1d049d74fca43b5311eb53e (patch)
tree9e2c73fc0349cde80555dbe0cbf67e2dfb531011 /source/blender/blenkernel
parent53ac3192ba07c4271c86479186ed0d0b8cd7846f (diff)
Sculpt: New Cavity Automasking Mode
Add new cavity automasking mode based on local mesh curvature. Cavity masking is a great way to quickly add detail in crevices and the like. It's meant to be used with the Paint brush in color attribute mode. It does work with other brushes but the results can be unpredictable. {F13131497} The old "dirty mask" operator has been replace with a new "mask from cavity" operator that shares the same code with cavity automasking. Differences from the sculpt-dev implementation: * It uses the word "cavity." When I first implemented this I wasn't aware this feature existed in other software (and other paint modes in Blender), and for reasons that escape me today I initially decided to call it a concave or concavity mask. * The cavity factor works a bit differently. It's no longer non-linear and functions as a simple scale around 0.5f. * Supports custom curves. * Supports blurring. Reviewed By: Julian Kaspar, Jeroen Bakker and Campbell Barton Differential Revision: https://developer.blender.org/D15122 Ref D15122
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_blender_version.h4
-rw-r--r--source/blender/blenkernel/BKE_paint.h14
-rw-r--r--source/blender/blenkernel/intern/brush.cc15
-rw-r--r--source/blender/blenkernel/intern/paint.cc3
-rw-r--r--source/blender/blenkernel/intern/scene.cc70
5 files changed, 104 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index 244c5d4609f..b6dd25d9f29 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -19,13 +19,13 @@ extern "C" {
/* Blender major and minor version. */
#define BLENDER_VERSION 304
/* Blender patch version for bugfix releases. */
-#define BLENDER_VERSION_PATCH 0
+#define BLENDER_VERSION_PATCH 1
/** Blender release cycle stage: alpha/beta/rc/release. */
#define BLENDER_VERSION_CYCLE alpha
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
-#define BLENDER_FILE_SUBVERSION 1
+#define BLENDER_FILE_SUBVERSION 2
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and show a warning if the file
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index ed0969a6306..386fecfd278 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -52,6 +52,7 @@ struct Palette;
struct PaletteColor;
struct Scene;
struct StrokeCache;
+struct Sculpt;
struct SubdivCCG;
struct Tex;
struct ToolSettings;
@@ -473,6 +474,11 @@ typedef struct SculptBoundary {
} twist;
} SculptBoundary;
+typedef struct CavityMaskData {
+ float factor;
+ int stroke_id;
+} CavityMaskData;
+
typedef struct SculptFakeNeighbors {
bool use_fake_neighbors;
@@ -552,6 +558,9 @@ typedef struct SculptAttributePointers {
/* BMesh */
SculptAttribute *dyntopo_node_id_vertex;
SculptAttribute *dyntopo_node_id_face;
+
+ SculptAttribute *stroke_id;
+ SculptAttribute *cavity;
} SculptAttributePointers;
typedef struct SculptSession {
@@ -743,6 +752,9 @@ typedef struct SculptSession {
*/
char *last_paint_canvas_key;
+ uchar stroke_id;
+ int last_automasking_settings_hash;
+ uchar last_cavity_stroke_id;
} SculptSession;
void BKE_sculptsession_free(struct Object *ob);
@@ -900,6 +912,8 @@ bool BKE_paint_canvas_image_get(struct PaintModeSettings *settings,
struct ImageUser **r_image_user);
int BKE_paint_canvas_uvmap_layer_index_get(const struct PaintModeSettings *settings,
struct Object *ob);
+void BKE_sculpt_check_cavity_curves(struct Sculpt *sd);
+struct CurveMapping *BKE_sculpt_default_cavity_curve(void);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/intern/brush.cc b/source/blender/blenkernel/intern/brush.cc
index 3708090f8ed..fb8a6785f64 100644
--- a/source/blender/blenkernel/intern/brush.cc
+++ b/source/blender/blenkernel/intern/brush.cc
@@ -72,6 +72,8 @@ static void brush_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c
}
brush_dst->curve = BKE_curvemapping_copy(brush_src->curve);
+ brush_dst->automasking_cavity_curve = BKE_curvemapping_copy(brush_src->automasking_cavity_curve);
+
if (brush_src->gpencil_settings != nullptr) {
brush_dst->gpencil_settings = MEM_cnew(__func__, *(brush_src->gpencil_settings));
brush_dst->gpencil_settings->curve_sensitivity = BKE_curvemapping_copy(
@@ -109,6 +111,7 @@ static void brush_free_data(ID *id)
IMB_freeImBuf(brush->icon_imbuf);
}
BKE_curvemapping_free(brush->curve);
+ BKE_curvemapping_free(brush->automasking_cavity_curve);
if (brush->gpencil_settings != nullptr) {
BKE_curvemapping_free(brush->gpencil_settings->curve_sensitivity);
@@ -212,6 +215,10 @@ static void brush_blend_write(BlendWriter *writer, ID *id, const void *id_addres
BKE_curvemapping_blend_write(writer, brush->curve);
}
+ if (brush->automasking_cavity_curve) {
+ BKE_curvemapping_blend_write(writer, brush->automasking_cavity_curve);
+ }
+
if (brush->gpencil_settings) {
BLO_write_struct(writer, BrushGpencilSettings, brush->gpencil_settings);
@@ -267,6 +274,14 @@ static void brush_blend_read_data(BlendDataReader *reader, ID *id)
BKE_brush_curve_preset(brush, CURVE_PRESET_SHARP);
}
+ BLO_read_data_address(reader, &brush->automasking_cavity_curve);
+ if (brush->automasking_cavity_curve) {
+ BKE_curvemapping_blend_read(reader, brush->automasking_cavity_curve);
+ }
+ else {
+ brush->automasking_cavity_curve = BKE_sculpt_default_cavity_curve();
+ }
+
/* grease pencil */
BLO_read_data_address(reader, &brush->gpencil_settings);
if (brush->gpencil_settings != nullptr) {
diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc
index a735250fd2a..08e49550426 100644
--- a/source/blender/blenkernel/intern/paint.cc
+++ b/source/blender/blenkernel/intern/paint.cc
@@ -2089,6 +2089,9 @@ void BKE_sculpt_toolsettings_data_ensure(Scene *scene)
if (!sd->paint.tile_offset[2]) {
sd->paint.tile_offset[2] = 1.0f;
}
+ if (!sd->automasking_cavity_curve || !sd->automasking_cavity_curve_op) {
+ BKE_sculpt_check_cavity_curves(sd);
+ }
}
static bool check_sculpt_object_deformed(Object *object, const bool for_construction)
diff --git a/source/blender/blenkernel/intern/scene.cc b/source/blender/blenkernel/intern/scene.cc
index 6d10d31e976..4af6409347d 100644
--- a/source/blender/blenkernel/intern/scene.cc
+++ b/source/blender/blenkernel/intern/scene.cc
@@ -114,6 +114,32 @@
#include "bmesh.h"
+CurveMapping *BKE_sculpt_default_cavity_curve()
+
+{
+ CurveMapping *cumap = BKE_curvemapping_add(1, 0, 0, 1, 1);
+
+ cumap->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
+ cumap->preset = CURVE_PRESET_LINE;
+
+ BKE_curvemap_reset(cumap->cm, &cumap->clipr, cumap->preset, CURVEMAP_SLOPE_POSITIVE);
+ BKE_curvemapping_changed(cumap, false);
+ BKE_curvemapping_init(cumap);
+
+ return cumap;
+}
+
+void BKE_sculpt_check_cavity_curves(Sculpt *sd)
+{
+ if (!sd->automasking_cavity_curve) {
+ sd->automasking_cavity_curve = BKE_sculpt_default_cavity_curve();
+ }
+
+ if (!sd->automasking_cavity_curve_op) {
+ sd->automasking_cavity_curve_op = BKE_sculpt_default_cavity_curve();
+ }
+}
+
static void scene_init_data(ID *id)
{
Scene *scene = (Scene *)id;
@@ -940,6 +966,13 @@ static void scene_blend_write(BlendWriter *writer, ID *id, const void *id_addres
}
if (tos->sculpt) {
BLO_write_struct(writer, Sculpt, tos->sculpt);
+ if (tos->sculpt->automasking_cavity_curve) {
+ BKE_curvemapping_blend_write(writer, tos->sculpt->automasking_cavity_curve);
+ }
+ if (tos->sculpt->automasking_cavity_curve_op) {
+ BKE_curvemapping_blend_write(writer, tos->sculpt->automasking_cavity_curve_op);
+ }
+
BKE_paint_blend_write(writer, &tos->sculpt->paint);
}
if (tos->uvsculpt) {
@@ -1153,6 +1186,24 @@ static void scene_blend_read_data(BlendDataReader *reader, ID *id)
sce->toolsettings->particle.object = nullptr;
sce->toolsettings->gp_sculpt.paintcursor = nullptr;
+ if (sce->toolsettings->sculpt) {
+ BLO_read_data_address(reader, &sce->toolsettings->sculpt->automasking_cavity_curve);
+ BLO_read_data_address(reader, &sce->toolsettings->sculpt->automasking_cavity_curve_op);
+
+ if (sce->toolsettings->sculpt->automasking_cavity_curve) {
+ BKE_curvemapping_blend_read(reader, sce->toolsettings->sculpt->automasking_cavity_curve);
+ BKE_curvemapping_init(sce->toolsettings->sculpt->automasking_cavity_curve);
+ }
+
+ if (sce->toolsettings->sculpt->automasking_cavity_curve_op) {
+ BKE_curvemapping_blend_read(reader,
+ sce->toolsettings->sculpt->automasking_cavity_curve_op);
+ BKE_curvemapping_init(sce->toolsettings->sculpt->automasking_cavity_curve_op);
+ }
+
+ BKE_sculpt_check_cavity_curves(sce->toolsettings->sculpt);
+ }
+
/* Relink grease pencil interpolation curves. */
BLO_read_data_address(reader, &sce->toolsettings->gp_interpolate.custom_ipo);
if (sce->toolsettings->gp_interpolate.custom_ipo) {
@@ -1740,6 +1791,18 @@ ToolSettings *BKE_toolsettings_copy(ToolSettings *toolsettings, const int flag)
if (ts->sculpt) {
ts->sculpt = static_cast<Sculpt *>(MEM_dupallocN(ts->sculpt));
BKE_paint_copy(&ts->sculpt->paint, &ts->sculpt->paint, flag);
+
+ if (ts->sculpt->automasking_cavity_curve) {
+ ts->sculpt->automasking_cavity_curve = BKE_curvemapping_copy(
+ ts->sculpt->automasking_cavity_curve);
+ BKE_curvemapping_init(ts->sculpt->automasking_cavity_curve);
+ }
+
+ if (ts->sculpt->automasking_cavity_curve_op) {
+ ts->sculpt->automasking_cavity_curve_op = BKE_curvemapping_copy(
+ ts->sculpt->automasking_cavity_curve_op);
+ BKE_curvemapping_init(ts->sculpt->automasking_cavity_curve_op);
+ }
}
if (ts->uvsculpt) {
ts->uvsculpt = static_cast<UvSculpt *>(MEM_dupallocN(ts->uvsculpt));
@@ -1797,6 +1860,13 @@ void BKE_toolsettings_free(ToolSettings *toolsettings)
MEM_freeN(toolsettings->wpaint);
}
if (toolsettings->sculpt) {
+ if (toolsettings->sculpt->automasking_cavity_curve) {
+ BKE_curvemapping_free(toolsettings->sculpt->automasking_cavity_curve);
+ }
+ if (toolsettings->sculpt->automasking_cavity_curve_op) {
+ BKE_curvemapping_free(toolsettings->sculpt->automasking_cavity_curve_op);
+ }
+
BKE_paint_free(&toolsettings->sculpt->paint);
MEM_freeN(toolsettings->sculpt);
}