Curves: cage overlay for sculpt mode #104467

Merged
Jacques Lucke merged 44 commits from JacquesLucke/blender:sculpt-edit-overlay into main 2023-02-14 18:10:24 +01:00
4 changed files with 8 additions and 55 deletions
Showing only changes of commit 24f63cc40a - Show all commits

View File

@ -322,23 +322,6 @@ static void curves_evaluate_modifiers(struct Depsgraph *depsgraph,
}
}
/** Get the positions that are edited in sculpt mode. */
static Span<float3> get_cage_positions(const blender::bke::CurvesGeometry &curves_orig,
const Curves *curves_id_eval,
const blender::bke::CurvesEditHints *curve_edit_hints)
{
if (curve_edit_hints) {
if (curve_edit_hints->positions.has_value()) {
return *curve_edit_hints->positions;
}
else if (curves_id_eval && curves_id_eval->geometry.point_num == curves_orig.point_num) {
const blender::bke::CurvesGeometry &curves_eval = curves_id_eval->geometry.wrap();
return curves_eval.positions();
}
}
return curves_orig.positions();
}
void BKE_curves_data_update(struct Depsgraph *depsgraph, struct Scene *scene, Object *object)
{
/* Free any evaluated data and restore original data. */
@ -348,43 +331,24 @@ void BKE_curves_data_update(struct Depsgraph *depsgraph, struct Scene *scene, Ob
Curves *curves = static_cast<Curves *>(object->data);
GeometrySet geometry_set = GeometrySet::create_with_curves(curves,
GeometryOwnershipType::ReadOnly);
const bool generate_cage = object->mode == OB_MODE_SCULPT_CURVES;
const Curves &curves_id_orig = *static_cast<const Curves *>(
DEG_get_original_object(object)->data);
if (generate_cage) {
if (object->mode == OB_MODE_SCULPT_CURVES) {
/* Try to propagate deformation data through modifier evaluation, so that sculpt mode can work
* on evaluated curves. */
GeometryComponentEditData &edit_component =
geometry_set.get_component_for_write<GeometryComponentEditData>();
edit_component.curves_edit_hints_ = std::make_unique<blender::bke::CurvesEditHints>(
curves_id_orig);
*static_cast<const Curves *>(DEG_get_original_object(object)->data));
}
curves_evaluate_modifiers(depsgraph, scene, object, geometry_set);
Curves *curves_id_eval = const_cast<Curves *>(geometry_set.get_curves_for_read());
/* Create cage curves geometry for drawing. */
if (generate_cage) {
const blender::bke::CurvesGeometry &curves_orig = curves_id_orig.geometry.wrap();
Curves *curves_id_cage = blender::bke::curves_new_nomain(curves_id_orig.geometry.point_num,
curves_id_orig.geometry.curve_num);
object->runtime.editcurves_eval_cage = curves_id_cage;
blender::bke::CurvesGeometry &curves_cage = curves_id_cage->geometry.wrap();
curves_cage.offsets_for_write().copy_from(curves_orig.offsets());
curves_cage.fill_curve_types(CURVE_TYPE_POLY);
Span<float3> positions = get_cage_positions(
curves_orig, curves_id_eval, geometry_set.get_curve_edit_hints_for_read());
curves_cage.positions_for_write().copy_from(positions);
}
/* Assign evaluated object. */
if (curves_id_eval == nullptr) {
curves_id_eval = blender::bke::curves_new_nomain(0, 0);
BKE_object_eval_assign_data(object, &curves_id_eval->id, true);
Curves *curves_eval = const_cast<Curves *>(geometry_set.get_curves_for_read());
if (curves_eval == nullptr) {
curves_eval = blender::bke::curves_new_nomain(0, 0);
BKE_object_eval_assign_data(object, &curves_eval->id, true);
}
else {
BKE_object_eval_assign_data(object, &curves_id_eval->id, false);
BKE_object_eval_assign_data(object, &curves_eval->id, false);
}
object->runtime.geometry_set_eval = new GeometrySet(std::move(geometry_set));
}

View File

@ -1790,11 +1790,6 @@ void BKE_object_free_derived_caches(Object *ob)
}
ob->runtime.editmesh_eval_cage = nullptr;
if (ob->runtime.editcurves_eval_cage) {
BKE_id_free(nullptr, ob->runtime.editcurves_eval_cage);
}
ob->runtime.editcurves_eval_cage = nullptr;
if (ob->runtime.data_eval != nullptr) {
if (ob->runtime.is_data_eval_owned) {
ID *data_eval = ob->runtime.data_eval;

View File

@ -91,10 +91,6 @@ static void populate_edit_overlay(OVERLAY_Data *vedata, Object *object)
OVERLAY_PrivateData *pd = vedata->stl->pd;
Curves *curves = static_cast<Curves *>(object->data);
if (object->runtime.editcurves_eval_cage == nullptr) {
return;
}
GPUBatch *geom_lines = DRW_curves_batch_cache_get_edit_lines(curves);
DRW_shgroup_call_no_cull(pd->sculpt_curves_cage_lines_grp, geom_lines, object);
}

View File

@ -171,9 +171,6 @@ typedef struct Object_Runtime {
/* Evaluated mesh cage in edit mode. */
struct Mesh *editmesh_eval_cage;
/** Evaluated curve cage in edit and sculpt mode. */
struct Curves *editcurves_eval_cage;
/** Cached cage bounding box of `editmesh_eval_cage` for selection. */
struct BoundBox *editmesh_bb_cage;
JacquesLucke marked this conversation as resolved
Review

Better to combine this with editmesh_eval_cage which can be made an ID *.

Better to combine this with `editmesh_eval_cage` which can be made an `ID *`.
@ -211,6 +208,7 @@ typedef struct Object_Runtime {
/** Runtime evaluated curve-specific data, not stored in the file. */
struct CurveCache *curve_cache;
void *_pad4;
unsigned short local_collections_bits;
short _pad2[3];