14#include <fmt/format.h>
67#include "RNA_prototypes.hh"
158 const float space_mat[4][4],
164 r_ctx->
scene = scene;
198 const float mat[4][4],
226 std::cerr << fmt::format(
227 "Warning: Maximum instance recursion level reached in \"{}\" object.\n", object_name);
230 std::cerr << fmt::format(
231 "Warning: Maximum instance recursion level reached at \"{}\" geometry.\n",
235 std::cerr << fmt::format(
236 "Warning: Maximum instance recursion level reached at \"{}\" geometry in \"{}\" "
260 const ID *object_data,
261 const float mat[4][4],
279 dob->
ob_data =
const_cast<ID *
>(object_data);
291 for (
i = 1;
i < ctx->
level + 1;
i++) {
302 int next_instance = 0;
303 if (geometry !=
nullptr) {
308 for (
i = ctx->
level - 1;
i >= 0 && next_instance < max_instance;
i--) {
319 if (object_data &&
GS(object_data->
name) ==
ID_MB) {
346 const float mat[4][4],
351 return make_dupli(ctx, ob,
static_cast<ID *
>(ob->
data), mat, index, geometry, instance_index);
361 const float space_mat[4][4],
368 printf(
"Warning: '%s' object is trying to instance itself.\n", ob->
id.
name + 2);
374 if (!
copy_dupli_context(&rctx, ctx, ob, space_mat, index, geometry, instance_index)) {
402 if (ob_parent == parent) {
405 ob_parent = ob_parent->
parent;
429 make_child_duplis_cb(&pctx, userdata, ob);
443 int persistent_dupli_id = 0;
459 make_child_duplis_cb(&pctx, userdata, ob);
467 persistent_dupli_id++;
486 const Mesh *mesh_eval;
490 if (r_vert_normals !=
nullptr) {
491 *r_vert_normals = {};
511 if (r_vert_normals !=
nullptr) {
533 float collection_mat[4][4];
543 mul_m4_m4m4(collection_mat, ob->object_to_world().ptr(), collection_mat);
563 mul_m4_m4m4(mat, collection_mat, cob->object_to_world().ptr());
630 const bool use_rotation,
636 const float size[3] = {1.0f, 1.0f, 1.0f};
653 const float child_imat[4][4],
657 const bool use_rotation)
663 float space_mat[4][4];
668 mul_m4_m4m4(obmat, inst_ob->object_to_world().ptr(), obmat);
672 mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object().ptr());
689 const int totvert = vdd->
totvert;
693 float child_imat[4][4];
694 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
696 for (
int i = 0;
i < totvert;
i++) {
720 float child_imat[4][4];
721 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
731 if (!vert_positions_deform.
is_empty()) {
732 co = vert_positions_deform[
i];
733 no = !vert_normals_deform.
is_empty() ? vert_normals_deform[
i] :
float3(0);
757 parent, &em, &vert_positions_deform, use_rotation ? &vert_normals_deform :
nullptr);
758 if (em ==
nullptr && mesh_eval ==
nullptr) {
797 Main *bmain,
const char *family,
size_t family_len,
uint ch,
GHash *family_gh)
810 ch_utf8[ch_utf8_len] =
'\0';
814 if (
STREQLEN(ob->id.name + 2 + family_len, ch_utf8, ch_utf8_len)) {
815 if (
STREQLEN(ob->id.name + 2, family, family_len)) {
833 float vec[3], obmat[4][4], pmat[4][4], fsize, xof, yof;
836 const char32_t *text =
nullptr;
844 copy_m4_m4(pmat, par->object_to_world().ptr());
858 if (text ==
nullptr || chartransdata ==
nullptr) {
870 family_len = strlen(cu->
family);
877 for (a = 0; a < text_len; a++, ct++) {
890 vec[0] = fsize * (ct->
xof - xof);
891 vec[1] = fsize * (ct->
yof - yof);
896 copy_m4_m4(obmat, par->object_to_world().ptr());
933 const float parent_transform[4][4],
934 bool geometry_set_is_instance,
935 bool use_new_curves_type)
937 int component_index = 0;
952 if (use_new_curves_type) {
953 if (
const Curves *curves = component->get()) {
958 if (
const Curve *curve = component->get_curve_for_render()) {
971 make_dupli(ctx, ctx->
object, &grease_pencil->
id, parent_transform, component_index++);
974 const bool creates_duplis_for_components = component_index >= 1;
977 if (instances ==
nullptr) {
985 if (creates_duplis_for_components) {
989 instances_ctx = &new_instances_ctx;
999 const int id = almost_unique_ids[
i];
1005 tmp_ctx_for_instance = *instances_ctx;
1007 ctx_for_instance = &tmp_ctx_for_instance;
1010 switch (reference.
type()) {
1011 case InstanceReference::Type::Object: {
1014 mul_m4_m4m4(matrix, parent_transform, instance_offset_matrices[
i].
ptr());
1015 make_dupli(ctx_for_instance, &
object, matrix,
id, &geometry_set,
i);
1017 float space_matrix[4][4];
1019 space_matrix, instance_offset_matrices[
i].
ptr(),
object.world_to_object().
ptr());
1024 case InstanceReference::Type::Collection: {
1026 float collection_matrix[4][4];
1035 ctx_for_instance->
object,
1047 if (
object == ctx_for_instance->
object) {
1051 float instance_matrix[4][4];
1052 mul_m4_m4m4(instance_matrix, collection_matrix, object->object_to_world().ptr());
1054 make_dupli(&sub_ctx,
object, instance_matrix, object_id++);
1060 case InstanceReference::Type::GeometrySet: {
1061 float new_transform[4][4];
1062 mul_m4_m4m4(new_transform, parent_transform, instance_offset_matrices[
i].
ptr());
1067 ctx_for_instance->
object,
1074 &sub_ctx, reference.
geometry_set(), new_transform,
true,
false);
1078 case InstanceReference::Type::None: {
1089 ctx, *geometry_set, ctx->
object->object_to_world().ptr(),
false,
false);
1137 const bool use_scale,
1138 const float scale_fac,
1145 for (
const float3 &coord : coords) {
1148 location *= 1.0f / float(coords.
size());
1171 const float child_imat[4][4],
1173 const bool use_scale,
1174 const float scale_fac,
1178 float space_mat[4][4];
1195 mul_m4_m4m4(obmat, inst_ob->object_to_world().ptr(), obmat);
1199 mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object().ptr());
1211 const float child_imat[4][4],
1213 const bool use_scale,
1214 const float scale_fac,
1222 for (
int i = 0;
i < face_verts.
size();
i++) {
1223 coords[
i] = vert_positions[face_verts[
i]];
1226 return face_dupli(ctx, inst_ob, child_imat, index, use_scale, scale_fac, coords);
1231 const float child_imat[4][4],
1233 const bool use_scale,
1234 const float scale_fac,
1240 const int coords_len = f->
len;
1243 BMLoop *l_first, *l_iter;
1246 if (!vert_positions_deform.
is_empty()) {
1249 }
while ((l_iter = l_iter->
next) != l_first);
1254 }
while ((l_iter = l_iter->
next) != l_first);
1257 return face_dupli(ctx, inst_ob, child_imat, index, use_scale, scale_fac, coords);
1265 const float(*orco)[3] = fdd->
orco;
1267 const int totface = fdd->
totface;
1270 float child_imat[4][4];
1274 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
1289 const float w = 1.0f / float(face.
size());
1291 for (
int j = 0; j < face.
size(); j++) {
1296 for (
int j = 0; j < face.
size(); j++) {
1309 float child_imat[4][4];
1321 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
1326 fdd->
params.
ctx, inst_ob, child_imat, a, use_scale, scale_fac, f, vert_positions_deform);
1329 const float w = 1.0f / float(f->
len);
1330 BMLoop *l_first, *l_iter;
1334 }
while ((l_iter = l_iter->
next) != l_first);
1350 parent, &em, &vert_positions_deform,
nullptr);
1351 if (em ==
nullptr && mesh_eval ==
nullptr) {
1357 if (em !=
nullptr) {
1375 fdd.
faces = mesh_eval->faces();
1405 Object *ob =
nullptr, **oblist =
nullptr;
1412 float ctime,
scale = 1.0f;
1413 float tmat[4][4], mat[4][4], pamat[4][4],
size = 0.0;
1415 int totpart, totchild;
1419 if (psys ==
nullptr) {
1425 if (part ==
nullptr) {
1497 int totcollection = 0;
1502 if (use_collection_count) {
1508 if (dw->ob ==
object) {
1509 totcollection += dw->count;
1527 if (use_collection_count) {
1533 if (dw->ob ==
object) {
1534 for (
b = 0;
b < dw->count;
b++, a++) {
1564 for (pa = psys->
particles; a < totpart + totchild; a++, pa++) {
1567 if (pa->
flag & no_draw_flag) {
1578 cpa = &psys->
child[a - totpart];
1588 ((a < totpart && psys->pathcache[a]->segments < 0) ||
1596 if (totcollection == 0) {
1605 b = a % totcollection;
1666 copy_m4_m4(obmat, ob->object_to_world().ptr());
1675 float xvec[3], q[4], size_mat[4][4], original_size[3];
1681 xvec[1] = xvec[2] = 0;
1693 float size_mat[4][4], original_size[3];
1823 instance_stack.
append(ob);
1825 &ctx,
depsgraph, sce, ob,
nullptr, include_objects, instance_stack, dupli_gen_type_stack);
1843 instance_stack.
append(ob_eval);
1845 &ctx,
depsgraph, sce, ob_eval,
nullptr,
nullptr, instance_stack, dupli_gen_type_stack);
1855 if (!nmd_orig->
runtime->eval_log) {
1863 viewer_log->geometry,
1864 ob_eval->object_to_world().ptr(),
1884 &ctx, &
depsgraph, &scene, &ob,
nullptr,
nullptr, instance_stack, dupli_gen_type_stack);
1896 const int level_to_use = is_particle_duplis ? 1 : 0;
1903 if (dob->level == level_to_use) {
1904 top_level_duplis.
append(dob);
1909 const float4x4 &world_to_object = ob.world_to_object();
1912 const int instances_num = top_level_duplis.
size();
1913 top_level_instances.
resize(instances_num);
1921 Object &instanced_object = *dob.
ob;
1922 if (referenced_objects.
add(&instanced_object)) {
1925 const int handle = referenced_objects.
index_of(&instanced_object);
1926 instances_transforms[
i] = world_to_object *
float4x4(dob.
mat);
1927 instances_reference_handles[
i] = handle;
1930 if (is_particle_duplis) {
1937 id = (particle_system_i << 26) + particle_i;
1939 instances_ids.
span[
i] = id;
1944 return top_level_instances;
1977 if (component ==
nullptr) {
1982 std::optional<bke::AttributeAccessor> attributes = component->
attributes();
1998 if (id_ptr->
data ==
nullptr) {
2013 if (prop !=
nullptr) {
2020 if (prop ==
nullptr) {
2028 if (array_len == 0) {
2054 if (type ==
PROP_INT && array_len <= 4) {
2055 int tmp[4] = {0, 0, 0, 1};
2057 for (
int i = 0;
i < 4;
i++) {
2058 r_data[
i] = float(tmp[
i]);
2074 const Object *dupli_parent,
2120 &
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)
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, 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)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#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)
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()
Span< int > almost_unique_ids() const
MutableSpan< float4x4 > transforms_for_write()
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, eCustomDataType 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_callocN(size_t len, 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)
ListBase * object_duplilist(Depsgraph *depsgraph, Scene *sce, Object *ob, Set< const Object * > *include_objects)
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)
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)
ListBase * object_duplilist_preview(Depsgraph *depsgraph, Scene *sce, Object *ob_eval, const ViewerPath *viewer_path)
static bool find_rna_property_rgba(PointerRNA *id_ptr, const char *name, float r_data[4])
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 free_object_duplilist(ListBase *lb)
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)
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 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