diff options
author | Hans Goudey <h.goudey@me.com> | 2022-03-01 19:40:25 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-03-01 19:40:25 +0300 |
commit | f98d74c80de7b1cae1e5a963f33c51c49f478ba1 (patch) | |
tree | 5144a2249410c0128d7e2780cb39e56aa5181ab2 /source/blender/editors/curves/intern | |
parent | 143bc9f8d4baf2a7312f3e836a464f74148c4a3b (diff) |
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
Diffstat (limited to 'source/blender/editors/curves/intern')
-rw-r--r-- | source/blender/editors/curves/intern/curves_add.cc | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/source/blender/editors/curves/intern/curves_add.cc b/source/blender/editors/curves/intern/curves_add.cc new file mode 100644 index 00000000000..9cde23451dc --- /dev/null +++ b/source/blender/editors/curves/intern/curves_add.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 |