62#include "RNA_prototypes.hh"
147 const float space_mat[4][4],
184 const float mat[4][4],
208 std::cerr <<
"Warning: Maximum instance recursion level reached.\n";
227 const ID *object_data,
228 const float mat[4][4],
238 dob = MEM_cnew<DupliObject>(
"dupli object");
246 dob->
ob_data =
const_cast<ID *
>(object_data);
257 for (i = 1; i < ctx->
level + 1; i++) {
268 int next_instance = 0;
269 if (geometry !=
nullptr) {
274 for (i = ctx->
level - 1; i >= 0 && next_instance < max_instance; i--) {
285 if (object_data &&
GS(object_data->
name) ==
ID_MB) {
312 const float mat[4][4],
317 return make_dupli(ctx, ob,
static_cast<ID *
>(ob->
data), mat, index, geometry, instance_index);
327 const float space_mat[4][4],
334 printf(
"Warning: '%s' object is trying to instance itself.\n", ob->
id.
name + 2);
340 if (!
copy_dupli_context(&rctx, ctx, ob, space_mat, index, geometry, instance_index)) {
368 if (ob_parent == parent) {
371 ob_parent = ob_parent->
parent;
395 make_child_duplis_cb(&pctx, userdata, ob);
409 int persistent_dupli_id = 0;
425 make_child_duplis_cb(&pctx, userdata, ob);
433 persistent_dupli_id++;
452 const Mesh *mesh_eval;
456 if (r_vert_normals !=
nullptr) {
457 *r_vert_normals = {};
477 if (r_vert_normals !=
nullptr) {
499 float collection_mat[4][4];
508 sub_v3_v3(collection_mat[3], collection->instance_offset);
509 mul_m4_m4m4(collection_mat, ob->object_to_world().ptr(), collection_mat);
518 mul_m4_m4m4(mat, collection_mat, cob->object_to_world().ptr());
586 const bool use_rotation,
592 const float size[3] = {1.0f, 1.0f, 1.0f};
609 const float child_imat[4][4],
613 const bool use_rotation)
619 float space_mat[4][4];
624 mul_m4_m4m4(obmat, inst_ob->object_to_world().ptr(), obmat);
628 mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object().ptr());
645 const int totvert = vdd->
totvert;
649 float child_imat[4][4];
650 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
652 for (
int i = 0; i < totvert; i++) {
676 float child_imat[4][4];
677 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
687 if (!vert_positions_deform.
is_empty()) {
688 co = vert_positions_deform[i];
689 no = !vert_normals_deform.
is_empty() ? vert_normals_deform[i] :
float3(0);
713 parent, &em, &vert_positions_deform, use_rotation ? &vert_normals_deform :
nullptr);
714 if (em ==
nullptr && mesh_eval ==
nullptr) {
724 vdd.vert_positions_deform = vert_positions_deform;
725 vdd.vert_normals_deform = vert_normals_deform;
726 vdd.has_orco = !vert_positions_deform.
is_empty();
734 vdd.vert_positions = mesh_eval->vert_positions();
735 vdd.vert_normals = mesh_eval->vert_normals();
753 Main *bmain,
const char *family,
size_t family_len,
uint ch,
GHash *family_gh)
766 ch_utf8[ch_utf8_len] =
'\0';
770 if (
STREQLEN(ob->id.name + 2 + family_len, ch_utf8, ch_utf8_len)) {
771 if (
STREQLEN(ob->id.name + 2, family, family_len)) {
789 float vec[3], obmat[4][4], pmat[4][4], fsize, xof, yof;
792 const char32_t *text =
nullptr;
800 copy_m4_m4(pmat, par->object_to_world().ptr());
807 if (text ==
nullptr || chartransdata ==
nullptr) {
819 family_len = strlen(cu->
family);
826 for (a = 0; a < text_len; a++, ct++) {
839 vec[0] = fsize * (ct->
xof - xof);
840 vec[1] = fsize * (ct->
yof - yof);
845 copy_m4_m4(obmat, par->object_to_world().ptr());
882 const float parent_transform[4][4],
883 bool geometry_set_is_instance,
884 bool use_new_curves_type)
886 int component_index = 0;
901 if (use_new_curves_type) {
902 if (
const Curves *curves = component->get()) {
907 if (
const Curve *curve = component->get_curve_for_render()) {
920 make_dupli(ctx, ctx->
object, &grease_pencil->
id, parent_transform, component_index++);
923 const bool creates_duplis_for_components = component_index >= 1;
926 if (instances ==
nullptr) {
934 if (creates_duplis_for_components) {
938 instances_ctx = &new_instances_ctx;
941 Span<float4x4> instance_offset_matrices = instances->transforms();
942 Span<int> reference_handles = instances->reference_handles();
943 Span<int> almost_unique_ids = instances->almost_unique_ids();
948 const int id = almost_unique_ids[i];
954 tmp_ctx_for_instance = *instances_ctx;
956 ctx_for_instance = &tmp_ctx_for_instance;
959 switch (reference.type()) {
961 Object &
object = reference.object();
963 mul_m4_m4m4(matrix, parent_transform, instance_offset_matrices[i].
ptr());
964 make_dupli(ctx_for_instance, &
object, matrix,
id, &geometry_set, i);
966 float space_matrix[4][4];
968 space_matrix, instance_offset_matrices[i].
ptr(),
object.world_to_object().
ptr());
974 Collection &collection = reference.collection();
975 float collection_matrix[4][4];
977 sub_v3_v3(collection_matrix[3], collection.instance_offset);
996 if (
object == ctx_for_instance->
object) {
1000 float instance_matrix[4][4];
1001 mul_m4_m4m4(instance_matrix, collection_matrix, object->object_to_world().ptr());
1003 make_dupli(&sub_ctx,
object, instance_matrix, object_id++);
1010 float new_transform[4][4];
1011 mul_m4_m4m4(new_transform, parent_transform, instance_offset_matrices[i].
ptr());
1016 ctx_for_instance->
object,
1023 &sub_ctx, reference.geometry_set(), new_transform,
true,
false);
1038 ctx, *geometry_set, ctx->
object->object_to_world().ptr(),
false,
false);
1086 const bool use_scale,
1087 const float scale_fac,
1094 for (
const float3 &coord : coords) {
1097 location *= 1.0f /
float(coords.
size());
1109 scale =
sqrtf(area) * scale_fac;
1120 const float child_imat[4][4],
1122 const bool use_scale,
1123 const float scale_fac,
1127 float space_mat[4][4];
1144 mul_m4_m4m4(obmat, inst_ob->object_to_world().ptr(), obmat);
1148 mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object().ptr());
1160 const float child_imat[4][4],
1162 const bool use_scale,
1163 const float scale_fac,
1171 for (
int i = 0; i < face_verts.
size(); i++) {
1172 coords[i] = vert_positions[face_verts[i]];
1175 return face_dupli(ctx, inst_ob, child_imat, index, use_scale, scale_fac, coords);
1180 const float child_imat[4][4],
1182 const bool use_scale,
1183 const float scale_fac,
1189 const int coords_len = f->
len;
1192 BMLoop *l_first, *l_iter;
1195 if (!vert_positions_deform.
is_empty()) {
1198 }
while ((l_iter = l_iter->
next) != l_first);
1203 }
while ((l_iter = l_iter->
next) != l_first);
1206 return face_dupli(ctx, inst_ob, child_imat, index, use_scale, scale_fac, coords);
1216 const int totface = fdd->
totface;
1219 float child_imat[4][4];
1223 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
1238 const float w = 1.0f /
float(face.size());
1240 for (
int j = 0; j < face.size(); j++) {
1245 for (
int j = 0; j < face.size(); j++) {
1258 float child_imat[4][4];
1270 mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->
object->object_to_world().ptr());
1275 fdd->
params.
ctx, inst_ob, child_imat, a, use_scale, scale_fac, f, vert_positions_deform);
1279 BMLoop *l_first, *l_iter;
1283 }
while ((l_iter = l_iter->
next) != l_first);
1299 parent, &em, &vert_positions_deform,
nullptr);
1300 if (em ==
nullptr && mesh_eval ==
nullptr) {
1306 if (em !=
nullptr) {
1311 fdd.vert_positions_deform = vert_positions_deform;
1312 fdd.has_orco = !vert_positions_deform.
is_empty();
1313 fdd.has_uvs = (uv_idx != -1);
1314 fdd.cd_loop_uv_offset = (uv_idx != -1) ?
1324 fdd.faces = mesh_eval->faces();
1325 fdd.corner_verts = mesh_eval->corner_verts();
1326 fdd.vert_positions = mesh_eval->vert_positions();
1354 Object *ob =
nullptr, **oblist =
nullptr;
1361 float ctime, scale = 1.0f;
1362 float tmat[4][4], mat[4][4], pamat[4][4], size = 0.0;
1364 int totpart, totchild;
1368 if (psys ==
nullptr) {
1374 if (part ==
nullptr) {
1407 if (
ELEM(part->instance_object,
nullptr, par)) {
1412 if (part->instance_collection ==
nullptr) {
1417 part->instance_collection);
1446 int totcollection = 0;
1449 const bool use_collection_count = part->draw &
PART_DRAW_COUNT_GR && !use_whole_collection;
1451 if (use_collection_count) {
1455 part->instance_collection,
object, mode)
1457 if (dw->ob ==
object) {
1458 totcollection += dw->count;
1475 "dupcollection object list");
1477 if (use_collection_count) {
1481 part->instance_collection,
object, mode)
1483 if (dw->ob ==
object) {
1484 for (
b = 0;
b < dw->count;
b++, a++) {
1504 ob = part->instance_object;
1514 for (pa = psys->
particles; a < totpart + totchild; a++, pa++) {
1517 if (pa->
flag & no_draw_flag) {
1528 cpa = &psys->
child[a - totpart];
1538 ((a < totpart && psys->pathcache[a]->segments < 0) ||
1546 if (totcollection == 0) {
1555 b = a % totcollection;
1596 sub_v3_v3(tmat[3], part->instance_collection->instance_offset);
1616 copy_m4_m4(obmat, ob->object_to_world().ptr());
1625 float xvec[3], q[4], size_mat[4][4], original_size[3];
1631 xvec[1] = xvec[2] = 0;
1643 float size_mat[4][4], original_size[3];
1766 ListBase *duplilist = MEM_cnew<ListBase>(
"duplilist");
1770 instance_stack.
append(ob);
1785 ListBase *duplilist = MEM_cnew<ListBase>(
"duplilist");
1789 instance_stack.
append(ob_eval);
1800 if (!nmd_orig->
runtime->eval_log) {
1804 geo_log::GeoModifierLog::find_viewer_node_log_for_path(*viewer_path))
1808 viewer_log->geometry,
1809 ob_eval->object_to_world().ptr(),
1847 if (component ==
nullptr) {
1852 std::optional<bke::AttributeAccessor> attributes = component->
attributes();
1868 if (id_ptr->
data ==
nullptr) {
1876 if (group && group->type ==
IDP_GROUP) {
1883 if (prop !=
nullptr) {
1890 if (prop ==
nullptr) {
1898 if (array_len == 0) {
1924 if (type ==
PROP_INT && array_len <= 4) {
1925 int tmp[4] = {0, 0, 0, 1};
1927 for (
int i = 0; i < 4; i++) {
1928 r_data[i] =
float(tmp[i]);
1944 const Object *dupli_parent,
1990 &
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)
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, const char *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)
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)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
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 unit_m4(float m[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 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_)
bool DEG_is_evaluated_id(const ID *id)
#define DEG_OBJECT_ITER_END
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
Object * DEG_get_original_object(Object *object)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
@ 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)
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])
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
constexpr const T * data() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
void append(const T &value)
std::optional< AttributeAccessor > attributes() const final
local_group_size(16, 16) .push_constant(Type b
const Depsgraph * depsgraph
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
bool object_has_geometry_set_instances(const Object &object)
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)
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
ListBase * object_duplilist(Depsgraph *depsgraph, Scene *sce, Object *ob)
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 void init_context(DupliContext *r_ctx, Depsgraph *depsgraph, Scene *scene, Object *ob, const float space_mat[4][4], Vector< Object * > &instance_stack, Vector< short > &dupli_gen_type_stack)
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)
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(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]
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
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 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