14#include <fmt/format.h>
67#include "RNA_prototypes.hh"
159 const float space_mat[4][4],
166 r_ctx->
scene = scene;
200 const float mat[4][4],
228 std::cerr << fmt::format(
229 "Warning: Maximum instance recursion level reached in \"{}\" object.\n", object_name);
232 std::cerr << fmt::format(
233 "Warning: Maximum instance recursion level reached at \"{}\" geometry.\n",
237 std::cerr << fmt::format(
238 "Warning: Maximum instance recursion level reached at \"{}\" geometry in \"{}\" "
262 const ID *object_data,
263 const float mat[4][4],
281 dob->
ob_data =
const_cast<ID *
>(object_data);
293 for (
i = 1;
i < ctx->
level + 1;
i++) {
304 int next_instance = 0;
305 if (geometry !=
nullptr) {
310 for (
i = ctx->
level - 1;
i >= 0 && next_instance < max_instance;
i--) {
321 if (object_data &&
GS(object_data->
name) ==
ID_MB) {
331 for (
i = 0;
i < ctx->
level + 1;
i++) {
348 const float mat[4][4],
353 return make_dupli(ctx, ob,
static_cast<ID *
>(ob->
data), mat, index, geometry, instance_index);
363 const float space_mat[4][4],
370 printf(
"Warning: '%s' object is trying to instance itself.\n", ob->
id.
name + 2);
376 if (!
copy_dupli_context(&rctx, ctx, ob, space_mat, index, geometry, instance_index)) {
404 if (ob_parent == parent) {
407 ob_parent = ob_parent->
parent;
431 make_child_duplis_cb(&pctx, userdata, ob);
445 int persistent_dupli_id = 0;
461 make_child_duplis_cb(&pctx, userdata, ob);
469 persistent_dupli_id++;
488 const Mesh *mesh_eval;
492 if (r_vert_normals !=
nullptr) {
493 *r_vert_normals = {};
513 if (r_vert_normals !=
nullptr) {
535 float collection_mat[4][4];
545 mul_m4_m4m4(collection_mat, ob->object_to_world().ptr(), collection_mat);
565 mul_m4_m4m4(mat, collection_mat, cob->object_to_world().ptr());
632 const bool use_rotation,
638 const float size[3] = {1.0f, 1.0f, 1.0f};
655 const float child_imat[4][4],
659 const bool use_rotation)
665 float space_mat[4][4];
670 mul_m4_m4m4(obmat, inst_ob->object_to_world().ptr(), obmat);
674 mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object().ptr());
691 const int totvert = vdd->
totvert;
695 float child_imat[4][4];
696 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
698 for (
int i = 0;
i < totvert;
i++) {
722 float child_imat[4][4];
723 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
733 if (!vert_positions_deform.
is_empty()) {
734 co = vert_positions_deform[
i];
735 no = !vert_normals_deform.
is_empty() ? vert_normals_deform[
i] :
float3(0);
759 parent, &em, &vert_positions_deform, use_rotation ? &vert_normals_deform :
nullptr);
760 if (em ==
nullptr && mesh_eval ==
nullptr) {
799 Main *bmain,
const char *family,
size_t family_len,
uint ch,
GHash *family_gh)
812 ch_utf8[ch_utf8_len] =
'\0';
816 if (
STREQLEN(ob->id.name + 2 + family_len, ch_utf8, ch_utf8_len)) {
817 if (
STREQLEN(ob->id.name + 2, family, family_len)) {
840 float vec[3], obmat[4][4], pmat[4][4];
843 const char32_t *text =
nullptr;
846 copy_m4_m4(pmat, par->object_to_world().ptr());
851 par, *cu,
FO_DUPLI,
nullptr, &text, &text_len, &
text_free, &chartransdata,
nullptr);
853 if (text ==
nullptr || chartransdata ==
nullptr) {
857 const float fsize = cu->
fsize;
863 family_len = strlen(cu->
family);
870 for (a = 0; a < text_len; a++, ct++) {
883 vec[0] = fsize * (ct->
offset.x - cu_offset.x);
884 vec[1] = fsize * (ct->
offset.y - cu_offset.y);
889 copy_m4_m4(obmat, par->object_to_world().ptr());
926 const float parent_transform[4][4],
927 bool geometry_set_is_instance,
928 bool use_new_curves_type)
930 int component_index = 0;
945 if (use_new_curves_type) {
946 if (
const Curves *curves = component->get()) {
951 if (
const Curve *curve = component->get_curve_for_render()) {
964 make_dupli(ctx, ctx->
object, &grease_pencil->
id, parent_transform, component_index++);
967 const bool creates_duplis_for_components = component_index >= 1;
970 if (instances ==
nullptr) {
978 if (creates_duplis_for_components) {
982 instances_ctx = &new_instances_ctx;
992 const int id = unique_ids[
i];
998 tmp_ctx_for_instance = *instances_ctx;
1000 ctx_for_instance = &tmp_ctx_for_instance;
1003 switch (reference.
type()) {
1004 case InstanceReference::Type::Object: {
1007 mul_m4_m4m4(matrix, parent_transform, instance_offset_matrices[
i].
ptr());
1008 make_dupli(ctx_for_instance, &
object, matrix,
id, &geometry_set,
i);
1010 float space_matrix[4][4];
1012 space_matrix, instance_offset_matrices[
i].
ptr(),
object.world_to_object().
ptr());
1017 case InstanceReference::Type::Collection: {
1019 float collection_matrix[4][4];
1028 ctx_for_instance->
object,
1040 if (
object == ctx_for_instance->
object) {
1044 float instance_matrix[4][4];
1045 mul_m4_m4m4(instance_matrix, collection_matrix, object->object_to_world().ptr());
1047 make_dupli(&sub_ctx,
object, instance_matrix, object_id++);
1053 case InstanceReference::Type::GeometrySet: {
1054 float new_transform[4][4];
1055 mul_m4_m4m4(new_transform, parent_transform, instance_offset_matrices[
i].
ptr());
1060 ctx_for_instance->
object,
1067 &sub_ctx, reference.
geometry_set(), new_transform,
true,
false);
1071 case InstanceReference::Type::None: {
1082 ctx, *geometry_set, ctx->
object->object_to_world().ptr(),
false,
false);
1130 const bool use_scale,
1131 const float scale_fac,
1138 for (
const float3 &coord : coords) {
1141 location *= 1.0f /
float(coords.
size());
1164 const float child_imat[4][4],
1166 const bool use_scale,
1167 const float scale_fac,
1171 float space_mat[4][4];
1188 mul_m4_m4m4(obmat, inst_ob->object_to_world().ptr(), obmat);
1192 mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object().ptr());
1204 const float child_imat[4][4],
1206 const bool use_scale,
1207 const float scale_fac,
1215 for (
int i = 0;
i < face_verts.
size();
i++) {
1216 coords[
i] = vert_positions[face_verts[
i]];
1219 return face_dupli(ctx, inst_ob, child_imat, index, use_scale, scale_fac, coords);
1224 const float child_imat[4][4],
1226 const bool use_scale,
1227 const float scale_fac,
1233 const int coords_len = f->
len;
1236 BMLoop *l_first, *l_iter;
1239 if (!vert_positions_deform.
is_empty()) {
1242 }
while ((l_iter = l_iter->
next) != l_first);
1247 }
while ((l_iter = l_iter->
next) != l_first);
1250 return face_dupli(ctx, inst_ob, child_imat, index, use_scale, scale_fac, coords);
1260 const int totface = fdd->
totface;
1263 float child_imat[4][4];
1267 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
1284 for (
int j = 0; j < face.
size(); j++) {
1289 for (
int j = 0; j < face.
size(); j++) {
1302 float child_imat[4][4];
1314 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
1319 fdd->
params.
ctx, inst_ob, child_imat, a, use_scale, scale_fac, f, vert_positions_deform);
1323 BMLoop *l_first, *l_iter;
1327 }
while ((l_iter = l_iter->
next) != l_first);
1343 parent, &em, &vert_positions_deform,
nullptr);
1344 if (em ==
nullptr && mesh_eval ==
nullptr) {
1350 if (em !=
nullptr) {
1368 fdd.
faces = mesh_eval->faces();
1398 Object *ob =
nullptr, **oblist =
nullptr;
1405 float ctime,
scale = 1.0f;
1406 float tmat[4][4], mat[4][4], pamat[4][4],
size = 0.0;
1408 int totpart, totchild;
1412 if (psys ==
nullptr) {
1418 if (part ==
nullptr) {
1490 int totcollection = 0;
1495 if (use_collection_count) {
1501 if (dw->ob ==
object) {
1502 totcollection += dw->count;
1520 if (use_collection_count) {
1526 if (dw->ob ==
object) {
1527 for (
b = 0;
b < dw->count;
b++, a++) {
1557 for (pa = psys->
particles; a < totpart + totchild; a++, pa++) {
1560 if (pa->
flag & no_draw_flag) {
1571 cpa = &psys->
child[a - totpart];
1581 ((a < totpart && psys->pathcache[a]->segments < 0) ||
1589 if (totcollection == 0) {
1598 b = a % totcollection;
1659 copy_m4_m4(obmat, ob->object_to_world().ptr());
1668 float xvec[3], q[4], size_mat[4][4], original_size[3];
1674 xvec[1] = xvec[2] = 0;
1686 float size_mat[4][4], original_size[3];
1816 instance_stack.
append(ob);
1824 dupli_gen_type_stack,
1840 instance_stack.
append(ob_eval);
1848 dupli_gen_type_stack,
1858 if (!nmd_orig->
runtime->eval_log) {
1868 ob_eval->object_to_world().ptr(),
1894 dupli_gen_type_stack,
1906 const int level_to_use = is_particle_duplis ? 1 : 0;
1913 if (dob.level == level_to_use) {
1914 top_level_duplis.
append(&dob);
1919 const float4x4 &world_to_object = ob.world_to_object();
1922 const int instances_num = top_level_duplis.
size();
1923 top_level_instances.
resize(instances_num);
1931 Object &instanced_object = *dob.
ob;
1932 if (referenced_objects.
add(&instanced_object)) {
1935 const int handle = referenced_objects.
index_of(&instanced_object);
1936 instances_transforms[
i] = world_to_object *
float4x4(dob.
mat);
1937 instances_reference_handles[
i] = handle;
1940 if (is_particle_duplis) {
1947 id = (particle_system_i << 26) + particle_i;
1949 instances_ids.
span[
i] = id;
1953 return top_level_instances;
1980 if (component ==
nullptr) {
1985 std::optional<bke::AttributeAccessor> attributes = component->
attributes();
2001 if (id_ptr->
data ==
nullptr) {
2016 if (prop !=
nullptr) {
2023 if (prop ==
nullptr) {
2031 if (array_len == 0) {
2057 if (type ==
PROP_INT && array_len <= 4) {
2058 int tmp[4] = {0, 0, 0, 1};
2060 for (
int i = 0;
i < 4;
i++) {
2077 const Object *dupli_parent,
2123 &
const_cast<ID &
>(scene->
id), &RNA_ViewLayer,
const_cast<ViewLayer *
>(layer));
#define FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN(_collection, _object, _mode)
ListBase BKE_collection_object_cache_get(Collection *collection)
#define FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_END
const void * CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
int CustomData_get_n_offset(const CustomData *data, eCustomDataType type, int n)
int CustomData_get_render_layer(const CustomData *data, eCustomDataType type)
blender::VectorList< DupliObject > DupliList
constexpr int MAX_DUPLI_RECUR
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
blender::Span< blender::float3 > BKE_editmesh_cache_ensure_vert_normals(BMEditMesh &em, blender::bke::EditMeshData &emd)
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, blender::StringRef name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
General operations, lookup, etc. for blender objects.
const Mesh * BKE_object_get_editmesh_eval_cage(const Object *object)
Mesh * BKE_object_get_evaluated_mesh(const Object *object_eval)
void psys_get_dupli_path_transform(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ChildParticle *cpa, struct ParticleCacheKey *cache, float mat[4][4], float *scale)
struct ParticleSystemModifierData * psys_get_modifier(struct Object *ob, struct ParticleSystem *psys)
void psys_get_dupli_texture(struct ParticleSystem *psys, struct ParticleSettings *part, struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct ChildParticle *cpa, float uv[2], float orco[3])
bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys, bool use_render_params)
void psys_sim_data_free(struct ParticleSimulationData *sim)
void psys_find_group_weights(struct ParticleSettings *part)
float psys_get_child_size(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra, float *pa_time)
void psys_sim_data_init(struct ParticleSimulationData *sim)
bool psys_get_particle_state(struct ParticleSimulationData *sim, int p, struct ParticleKey *state, bool always)
bool BKE_vfont_to_curve_ex(Object *ob, const Curve &cu, eEditFontMode mode, ListBase *r_nubase, const char32_t **r_text, int *r_text_len, bool *r_text_free, CharTrans **r_chartransdata, float *r_font_size_eval)
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_int_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
BLI_INLINE unsigned int BLI_hash_int(unsigned int k)
BLI_INLINE unsigned int BLI_hash_string(const char *str)
BLI_INLINE unsigned int BLI_hash_int_2d(unsigned int kx, unsigned int ky)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
float area_poly_v3(const float verts[][3], unsigned int nr)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_mat3_m4_fl(float R[4][4], float f)
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void mul_m4_m4_pre(float R[4][4], const float A[4][4])
void size_to_mat4(float R[4][4], const float size[3])
void mul_m4_v3(const float M[4][4], float r[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void loc_quat_size_to_mat4(float R[4][4], const float loc[3], const float quat[4], const float size[3])
bool invert_m4(float mat[4][4])
void mat4_to_size(float size[3], const float M[4][4])
void mul_m4_m3m4(float R[4][4], const float A[3][3], const float B[4][4])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
void unit_m4(float m[4][4])
void vec_to_quat(float q[4], const float vec[3], short axis, short upflag)
void quat_to_mat4(float m[4][4], const float q[4])
float normalize_qt_qt(float r[4], const float q[4])
void tri_to_quat_ex(float quat[4], const float v1[3], const float v2[3], const float v3[3], const float no_orig[3])
void axis_angle_to_mat4_single(float R[4][4], char axis, float angle)
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
MINLINE void copy_v4_fl(float r[4], float f)
void int BLI_rng_get_int(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
struct RNG * BLI_rng_new_srandom(unsigned int seed)
size_t BLI_str_utf8_from_unicode(unsigned int c, char *dst, size_t dst_maxncpy) ATTR_NONNULL(2)
#define STREQLEN(a, b, n)
#define POINTER_FROM_UINT(i)
float DEG_get_ctime(const Depsgraph *graph)
#define DEG_OBJECT_ITER_BEGIN(settings_, instance_)
#define DEG_OBJECT_ITER_END
bool DEG_is_evaluated(const T *id)
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
T * DEG_get_original(T *id)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY
@ DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET
Object groups, one object can be in many groups at once.
#define OBEDIT_FROM_OBACT(ob)
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
#define BM_elem_index_get(ele)
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v
void BM_face_uv_calc_center_median(const BMFace *f, const int cd_loop_uv_offset, float r_cent[2])
BPy_StructRNA * depsgraph
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
int64_t index_of(const Key &key) const
constexpr int64_t size() const
constexpr const T * data() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
constexpr bool is_empty() const
void append(const T &value)
void append(const T &value)
GeometrySet & geometry_set()
Collection & collection() const
std::optional< AttributeAccessor > attributes() const final
Span< int > reference_handles() const
MutableSpan< int > reference_handles_for_write()
int add_new_reference(const InstanceReference &reference)
Span< float4x4 > transforms() const
Span< InstanceReference > references() const
void resize(int capacity)
bke::MutableAttributeAccessor attributes_for_write()
MutableSpan< float4x4 > transforms_for_write()
Span< int > unique_ids() const
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, AttrType data_type)
static const ViewerNodeLog * find_viewer_node_log_for_path(const ViewerPath &viewer_path)
VecBase< float, D > normalize(VecOp< float, D >) RET
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
bool object_has_geometry_set_instances(const Object &object)
MatBase< T, NumCol, NumRow > scale(const MatBase< T, NumCol, NumRow > &mat, const VectorT &scale)
VecBase< T, 3 > cross_poly(Span< VecBase< T, 3 > > poly)
MatBase< float, 4, 4 > float4x4
VecBase< float, 2 > float2
VecBase< float, 3 > float3
static void make_duplis_verts(const DupliContext *ctx)
static constexpr short GEOMETRY_SET_DUPLI_GENERATOR_TYPE
static Object * find_family_object(Main *bmain, const char *family, size_t family_len, uint ch, GHash *family_gh)
static void make_child_duplis(const DupliContext *ctx, void *userdata, MakeChildDuplisFunc make_child_duplis_cb)
static bool copy_dupli_context(DupliContext *r_ctx, const DupliContext *ctx, Object *ob, const float mat[4][4], int index, const GeometrySet *geometry=nullptr, int64_t instance_index=0)
static void make_duplis_collection(const DupliContext *ctx)
static void make_child_duplis_verts_from_mesh(const DupliContext *ctx, void *userdata, Object *inst_ob)
static DupliObject * face_dupli(const DupliContext *ctx, Object *inst_ob, const float child_imat[4][4], const int index, const bool use_scale, const float scale_fac, Span< float3 > coords)
static void make_duplis_font(const DupliContext *ctx)
bool BKE_object_dupli_find_rgba_attribute(const Object *ob, const DupliObject *dupli, const Object *dupli_parent, const char *name, float r_value[4])
static void make_child_duplis_faces_from_editmesh(const DupliContext *ctx, void *userdata, Object *inst_ob)
static const DupliGenerator gen_dupli_verts
static void make_duplis_particles(const DupliContext *ctx)
static const DupliGenerator gen_dupli_collection
static void make_duplis_particle_system(const DupliContext *ctx, ParticleSystem *psys)
static DupliObject * face_dupli_from_mesh(const DupliContext *ctx, Object *inst_ob, const float child_imat[4][4], const int index, const bool use_scale, const float scale_fac, const Span< int > face_verts, const Span< float3 > vert_positions)
void object_duplilist(Depsgraph *depsgraph, Scene *sce, Object *ob, Set< const Object * > *include_objects, DupliList &r_duplilist)
static void make_child_duplis_faces_from_mesh(const DupliContext *ctx, void *userdata, Object *inst_ob)
void(*)(const DupliContext *ctx, void *userdata, Object *child) MakeChildDuplisFunc
static void get_duplivert_transform(const float3 &co, const float3 &no, const bool use_rotation, const short axis, const short upflag, float r_mat[4][4])
void object_duplilist_preview(Depsgraph *depsgraph, Scene *sce, Object *ob_eval, const ViewerPath *viewer_path, DupliList &r_duplilist)
static const DupliGenerator * get_dupli_generator(const DupliContext *ctx)
static bool find_geonode_attribute_rgba(const DupliObject *dupli, const char *name, float r_value[4])
static DupliObject * vertex_dupli(const DupliContext *ctx, Object *inst_ob, const float child_imat[4][4], int index, const float3 &co, const float3 &no, const bool use_rotation)
static void make_duplis_geometry_set_impl(const DupliContext *ctx, const GeometrySet &geometry_set, const float parent_transform[4][4], bool geometry_set_is_instance, bool use_new_curves_type)
static bool find_property_rgba(PointerRNA *id_ptr, const char *name, float r_data[4])
bool BKE_view_layer_find_rgba_attribute(const Scene *scene, const ViewLayer *layer, const char *name, float r_value[4])
static bool is_child(const Object *ob, const Object *parent)
static const Mesh * mesh_data_from_duplicator_object(Object *ob, BMEditMesh **r_em, Span< float3 > *r_vert_coords, Span< float3 > *r_vert_normals)
static DupliObject * face_dupli_from_editmesh(const DupliContext *ctx, Object *inst_ob, const float child_imat[4][4], const int index, const bool use_scale, const float scale_fac, BMFace *f, const Span< float3 > vert_positions_deform)
static const DupliGenerator gen_dupli_particles
static void init_context(DupliContext *r_ctx, Depsgraph *depsgraph, Scene *scene, Object *ob, const float space_mat[4][4], blender::Set< const Object * > *include_objects, Vector< Object * > &instance_stack, Vector< short > &dupli_gen_type_stack, DupliList &duplilist)
static const DupliGenerator gen_dupli_faces
static void make_recursive_duplis(const DupliContext *ctx, Object *ob, const float space_mat[4][4], int index, const GeometrySet *geometry=nullptr, int64_t instance_index=0)
static void make_child_duplis_verts_from_editmesh(const DupliContext *ctx, void *userdata, Object *inst_ob)
static const DupliGenerator gen_dupli_geometry_set
static DupliObject * make_dupli(const DupliContext *ctx, Object *ob, const ID *object_data, const float mat[4][4], int index, const GeometrySet *geometry=nullptr, int64_t instance_index=0)
static const DupliGenerator gen_dupli_verts_font
static void get_dupliface_transform_from_coords(Span< float3 > coords, const bool use_scale, const float scale_fac, float r_mat[4][4])
static void make_duplis_faces(const DupliContext *ctx)
static void make_duplis_geometry_set(const DupliContext *ctx)
blender::bke::Instances object_duplilist_legacy_instances(Depsgraph &depsgraph, Scene &scene, Object &ob)
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
PropertyType RNA_property_type(PropertyRNA *prop)
IDProperty * RNA_struct_idprops(PointerRNA *ptr, bool create)
bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
PointerRNA RNA_id_pointer_create(ID *id)
bool RNA_path_resolve(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
static void text_free(SpaceLink *sl)
const GeometrySet * instance_data[MAX_DUPLI_RECUR]
int64_t instance_idx[MAX_DUPLI_RECUR]
const GeometrySet * preview_base_geometry
Vector< short > * dupli_gen_type_stack
int preview_instance_index
int persistent_id[MAX_DUPLI_RECUR]
Set< const Object * > * include_objects
const struct DupliGenerator * gen
Vector< Object * > * instance_stack
void(* make_duplis)(const DupliContext *ctx)
const blender::bke::GeometrySet * preview_base_geometry
int preview_instance_index
const blender::bke::GeometrySet * instance_data[4]
ParticleSystem * particle_system
int persistent_id[MAX_DUPLI_RECUR]
Span< float3 > vert_positions_deform
FaceDupliData_Params params
blender::OffsetIndices< int > faces
FaceDupliData_Params params
Span< float3 > vert_positions
MeshRuntimeHandle * runtime
NodesModifierRuntimeHandle * runtime
struct Collection * instance_collection
ObjectRuntimeHandle * runtime
float instance_faces_scale
struct Collection * instance_collection
struct ListBase instance_weights
struct Object * instance_object
struct Depsgraph * depsgraph
struct ParticleSystemModifierData * psmd
struct ParticleSystem * psys
struct ParticleCacheKey ** childcache
struct ParticleCacheKey ** pathcache
Span< float3 > vert_positions_deform
VertexDupliData_Params params
Span< float3 > vert_normals_deform
VertexDupliData_Params params
Span< float3 > vert_positions
Span< float3 > vert_normals
Array< float3 > vert_positions
const GreasePencil * get_grease_pencil() const
const Volume * get_volume() const
const GeometryComponent * get_component(GeometryComponent::Type component_type) const
const Instances * get_instances() const
const PointCloud * get_pointcloud() const
const Mesh * get_mesh() const
MutableVArraySpan< T > span