Curves: Move curves primitive to object add code
Currently, any time a Curves data-block is created, the `curves_random` function runs, filling it with 500 random curves, also adding a radius attribute. This is just left over from the prototype in the initial commit that added the type. This commit moves the code that creates the random data to the curve editors module, like the other primitives are organized. Differential Revision: https://developer.blender.org/D14211
This commit is contained in:
parent
143bc9f8d4
commit
f98d74c80d
|
@ -50,7 +50,6 @@ using blender::Span;
|
|||
|
||||
static const char *ATTR_POSITION = "position";
|
||||
|
||||
static void curves_random(Curves *curves);
|
||||
static void update_custom_data_pointers(Curves &curves);
|
||||
|
||||
static void curves_init_data(ID *id)
|
||||
|
@ -61,8 +60,6 @@ static void curves_init_data(ID *id)
|
|||
MEMCPY_STRUCT_AFTER(curves, DNA_struct_default_get(Curves), id);
|
||||
|
||||
new (&curves->geometry) blender::bke::CurvesGeometry();
|
||||
|
||||
curves_random(curves);
|
||||
}
|
||||
|
||||
static void curves_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag)
|
||||
|
@ -234,49 +231,6 @@ static void update_custom_data_pointers(Curves &curves)
|
|||
blender::bke::CurvesGeometry::wrap(curves.geometry).update_customdata_pointers();
|
||||
}
|
||||
|
||||
static void curves_random(Curves *curves)
|
||||
{
|
||||
const int numpoints = 8;
|
||||
|
||||
blender::bke::CurvesGeometry &geometry = blender::bke::CurvesGeometry::wrap(curves->geometry);
|
||||
geometry = blender::bke::CurvesGeometry(500 * numpoints, 500);
|
||||
|
||||
MutableSpan<int> offsets = geometry.offsets();
|
||||
MutableSpan<float3> positions = geometry.positions();
|
||||
|
||||
float *radius_data = (float *)CustomData_add_layer_named(
|
||||
&geometry.point_data, CD_PROP_FLOAT, CD_DEFAULT, nullptr, geometry.point_size, "radius");
|
||||
MutableSpan<float> radii{radius_data, geometry.points_size()};
|
||||
|
||||
for (const int i : offsets.index_range()) {
|
||||
offsets[i] = numpoints * i;
|
||||
}
|
||||
|
||||
RandomNumberGenerator rng;
|
||||
|
||||
for (int i = 0; i < geometry.curve_size; i++) {
|
||||
const IndexRange curve_range = geometry.range_for_curve(i);
|
||||
MutableSpan<float3> curve_positions = positions.slice(curve_range);
|
||||
MutableSpan<float> curve_radii = radii.slice(curve_range);
|
||||
|
||||
const float theta = 2.0f * M_PI * rng.get_float();
|
||||
const float phi = saacosf(2.0f * rng.get_float() - 1.0f);
|
||||
|
||||
float3 no = {std::sin(theta) * std::sin(phi), std::cos(theta) * std::sin(phi), std::cos(phi)};
|
||||
no = blender::math::normalize(no);
|
||||
|
||||
float3 co = no;
|
||||
for (int key = 0; key < numpoints; key++) {
|
||||
float t = key / (float)(numpoints - 1);
|
||||
curve_positions[key] = co;
|
||||
curve_radii[key] = 0.02f * (1.0f - t);
|
||||
|
||||
float3 offset = float3(rng.get_float(), rng.get_float(), rng.get_float()) * 2.0f - 1.0f;
|
||||
co += (offset + no) / numpoints;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void *BKE_curves_add(Main *bmain, const char *name)
|
||||
{
|
||||
Curves *curves = static_cast<Curves *>(BKE_id_new(bmain, ID_CV, name));
|
||||
|
|
|
@ -14,6 +14,7 @@ set(INC
|
|||
)
|
||||
|
||||
set(SRC
|
||||
intern/curves_add.cc
|
||||
intern/curves_ops.cc
|
||||
)
|
||||
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
/** \file
|
||||
* \ingroup edcurves
|
||||
*/
|
||||
|
||||
#include "BLI_rand.hh"
|
||||
|
||||
#include "BKE_curves.hh"
|
||||
|
||||
#include "ED_curves.h"
|
||||
|
||||
namespace blender::ed::curves {
|
||||
|
||||
bke::CurvesGeometry primitive_random_sphere(const int curves_size, const int points_per_curve)
|
||||
{
|
||||
bke::CurvesGeometry curves(points_per_curve * curves_size, curves_size);
|
||||
|
||||
MutableSpan<int> offsets = curves.offsets();
|
||||
MutableSpan<float3> positions = curves.positions();
|
||||
|
||||
float *radius_data = (float *)CustomData_add_layer_named(
|
||||
&curves.point_data, CD_PROP_FLOAT, CD_DEFAULT, nullptr, curves.point_size, "radius");
|
||||
MutableSpan<float> radii{radius_data, curves.points_size()};
|
||||
|
||||
for (const int i : offsets.index_range()) {
|
||||
offsets[i] = points_per_curve * i;
|
||||
}
|
||||
|
||||
RandomNumberGenerator rng;
|
||||
|
||||
for (const int i : curves.curves_range()) {
|
||||
const IndexRange curve_range = curves.range_for_curve(i);
|
||||
MutableSpan<float3> curve_positions = positions.slice(curve_range);
|
||||
MutableSpan<float> curve_radii = radii.slice(curve_range);
|
||||
|
||||
const float theta = 2.0f * M_PI * rng.get_float();
|
||||
const float phi = saacosf(2.0f * rng.get_float() - 1.0f);
|
||||
|
||||
float3 no = {std::sin(theta) * std::sin(phi), std::cos(theta) * std::sin(phi), std::cos(phi)};
|
||||
no = math::normalize(no);
|
||||
|
||||
float3 co = no;
|
||||
for (int key = 0; key < points_per_curve; key++) {
|
||||
float t = key / (float)(points_per_curve - 1);
|
||||
curve_positions[key] = co;
|
||||
curve_radii[key] = 0.02f * (1.0f - t);
|
||||
|
||||
float3 offset = float3(rng.get_float(), rng.get_float(), rng.get_float()) * 2.0f - 1.0f;
|
||||
co += (offset + no) / points_per_curve;
|
||||
}
|
||||
}
|
||||
|
||||
return curves;
|
||||
}
|
||||
|
||||
} // namespace blender::ed::curves
|
|
@ -15,3 +15,14 @@ void ED_operatortypes_curves(void);
|
|||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
# include "BKE_curves.hh"
|
||||
|
||||
namespace blender::ed::curves {
|
||||
|
||||
bke::CurvesGeometry primitive_random_sphere(int curves_size, int points_per_curve);
|
||||
|
||||
}
|
||||
#endif
|
|
@ -8,6 +8,7 @@ set(INC
|
|||
../../blentranslation
|
||||
../../bmesh
|
||||
../../depsgraph
|
||||
../../functions
|
||||
../../gpencil_modifiers
|
||||
../../gpu
|
||||
../../ikplugin
|
||||
|
|
|
@ -93,6 +93,7 @@
|
|||
|
||||
#include "ED_armature.h"
|
||||
#include "ED_curve.h"
|
||||
#include "ED_curves.h"
|
||||
#include "ED_gpencil.h"
|
||||
#include "ED_mball.h"
|
||||
#include "ED_mesh.h"
|
||||
|
@ -1899,6 +1900,8 @@ static bool object_hair_curves_add_poll(bContext *C)
|
|||
|
||||
static int object_hair_curves_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
using namespace blender;
|
||||
|
||||
ushort local_view_bits;
|
||||
float loc[3], rot[3];
|
||||
if (!ED_object_add_generic_get_opts(
|
||||
|
@ -1909,6 +1912,9 @@ static int object_hair_curves_add_exec(bContext *C, wmOperator *op)
|
|||
Object *object = ED_object_add_type(C, OB_CURVES, nullptr, loc, rot, false, local_view_bits);
|
||||
object->dtx |= OB_DRAWBOUNDOX; /* TODO: remove once there is actual drawing. */
|
||||
|
||||
Curves *curves_id = static_cast<Curves *>(object->data);
|
||||
bke::CurvesGeometry::wrap(curves_id->geometry) = ed::curves::primitive_random_sphere(500, 8);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue