diff options
-rw-r--r-- | source/blender/blenkernel/intern/curves.cc | 46 | ||||
-rw-r--r-- | source/blender/editors/curves/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/curves/intern/curves_add.cc | 57 | ||||
-rw-r--r-- | source/blender/editors/include/ED_curves.h | 11 | ||||
-rw-r--r-- | source/blender/editors/object/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_add.cc | 6 |
6 files changed, 76 insertions, 46 deletions
diff --git a/source/blender/blenkernel/intern/curves.cc b/source/blender/blenkernel/intern/curves.cc index d7783c76f65..c7aaf4718fe 100644 --- a/source/blender/blenkernel/intern/curves.cc +++ b/source/blender/blenkernel/intern/curves.cc @@ -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)); diff --git a/source/blender/editors/curves/CMakeLists.txt b/source/blender/editors/curves/CMakeLists.txt index 93b21a46916..1731d224b3e 100644 --- a/source/blender/editors/curves/CMakeLists.txt +++ b/source/blender/editors/curves/CMakeLists.txt @@ -14,6 +14,7 @@ set(INC ) set(SRC + intern/curves_add.cc intern/curves_ops.cc ) 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 diff --git a/source/blender/editors/include/ED_curves.h b/source/blender/editors/include/ED_curves.h index 7316b045646..706563061d4 100644 --- a/source/blender/editors/include/ED_curves.h +++ b/source/blender/editors/include/ED_curves.h @@ -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
\ No newline at end of file diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt index a94387961ee..39ccadd1445 100644 --- a/source/blender/editors/object/CMakeLists.txt +++ b/source/blender/editors/object/CMakeLists.txt @@ -8,6 +8,7 @@ set(INC ../../blentranslation ../../bmesh ../../depsgraph + ../../functions ../../gpencil_modifiers ../../gpu ../../ikplugin diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index 19db09961e8..7befad3b8d7 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -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; } |