Curves: cage overlay for sculpt mode #104467
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
@ -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];
|
||||
|
|
Loading…
Reference in New Issue
Better to combine this with
editmesh_eval_cage
which can be made anID *
.