Blender  V3.3
Classes
object_dupli.cc File Reference
#include <climits>
#include <cstddef>
#include <cstdlib>
#include "MEM_guardedalloc.h"
#include "BLI_listbase.h"
#include "BLI_string_utf8.h"
#include "BLI_array.hh"
#include "BLI_float4x4.hh"
#include "BLI_math.h"
#include "BLI_math_vec_types.hh"
#include "BLI_rand.h"
#include "BLI_span.hh"
#include "BLI_vector.hh"
#include "DNA_anim_types.h"
#include "DNA_collection_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_pointcloud_types.h"
#include "DNA_scene_types.h"
#include "DNA_vfont_types.h"
#include "BKE_collection.h"
#include "BKE_duplilist.h"
#include "BKE_editmesh.h"
#include "BKE_editmesh_cache.h"
#include "BKE_geometry_set.h"
#include "BKE_geometry_set.hh"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_mesh_iterators.h"
#include "BKE_mesh_runtime.h"
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
#include "BKE_vfont.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "BLI_hash.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Classes

struct  DupliContext
 
struct  DupliGenerator
 
struct  VertexDupliData_Params
 
struct  VertexDupliData_Mesh
 
struct  VertexDupliData_EditMesh
 
struct  FaceDupliData_Params
 
struct  FaceDupliData_Mesh
 
struct  FaceDupliData_EditMesh
 

Functions

Internal Duplicate Context
static const DupliGeneratorget_dupli_generator (const DupliContext *ctx)
 
static void init_context (DupliContext *r_ctx, Depsgraph *depsgraph, Scene *scene, Object *ob, const float space_mat[4][4], Vector< Object * > &instance_stack)
 
static bool copy_dupli_context (DupliContext *r_ctx, const DupliContext *ctx, Object *ob, const float mat[4][4], int index)
 
static DupliObjectmake_dupli (const DupliContext *ctx, Object *ob, const float mat[4][4], int index)
 
static void make_recursive_duplis (const DupliContext *ctx, Object *ob, const float space_mat[4][4], int index)
 
Internal Data Access Utilities
static const Meshmesh_data_from_duplicator_object (Object *ob, BMEditMesh **r_em, const float(**r_vert_coords)[3], const float(**r_vert_normals)[3])
 
Dupli-Container Implementation
ListBaseobject_duplilist (Depsgraph *depsgraph, Scene *sce, Object *ob)
 
void free_object_duplilist (ListBase *lb)
 

Internal Child Duplicates (Used by Other Functions)

using MakeChildDuplisFunc = void(*)(const DupliContext *ctx, void *userdata, Object *child)
 
static bool is_child (const Object *ob, const Object *parent)
 
static void make_child_duplis (const DupliContext *ctx, void *userdata, MakeChildDuplisFunc make_child_duplis_cb)
 

Dupli-Collection Implementation (#OB_DUPLICOLLECTION)

static const DupliGenerator gen_dupli_collection
 
static void make_duplis_collection (const DupliContext *ctx)
 

Dupli-Vertices Implementation (#OB_DUPLIVERTS for Geometry)

static const DupliGenerator gen_dupli_verts
 
static void get_duplivert_transform (const float co[3], const float no[3], const bool use_rotation, const short axis, const short upflag, float r_mat[4][4])
 
static DupliObjectvertex_dupli (const DupliContext *ctx, Object *inst_ob, const float child_imat[4][4], int index, const float co[3], const float no[3], const bool use_rotation)
 
static void make_child_duplis_verts_from_mesh (const DupliContext *ctx, void *userdata, Object *inst_ob)
 
static void make_child_duplis_verts_from_editmesh (const DupliContext *ctx, void *userdata, Object *inst_ob)
 
static void make_duplis_verts (const DupliContext *ctx)
 

Dupli-Vertices Implementation (#OB_DUPLIVERTS for 3D Text)

static const DupliGenerator gen_dupli_verts_font
 
static Objectfind_family_object (Main *bmain, const char *family, size_t family_len, unsigned int ch, GHash *family_gh)
 
static void make_duplis_font (const DupliContext *ctx)
 

Instances Geometry Component Implementation

static const DupliGenerator gen_dupli_geometry_set
 
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)
 
static void make_duplis_geometry_set (const DupliContext *ctx)
 

Dupli-Faces Implementation (#OB_DUPLIFACES)

static const DupliGenerator gen_dupli_faces
 
static void get_dupliface_transform_from_coords (Span< float3 > coords, const bool use_scale, const float scale_fac, float r_mat[4][4])
 
static DupliObjectface_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 DupliObjectface_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 MPoly *mpoly, const MLoop *mloopstart, const MVert *mvert)
 
static DupliObjectface_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 float(*vert_coords)[3])
 
static void make_child_duplis_faces_from_mesh (const DupliContext *ctx, void *userdata, Object *inst_ob)
 
static void make_child_duplis_faces_from_editmesh (const DupliContext *ctx, void *userdata, Object *inst_ob)
 
static void make_duplis_faces (const DupliContext *ctx)
 

Dupli-Particles Implementation (#OB_DUPLIPARTS)

static const DupliGenerator gen_dupli_particles
 
static void make_duplis_particle_system (const DupliContext *ctx, ParticleSystem *psys)
 
static void make_duplis_particles (const DupliContext *ctx)
 

Typedef Documentation

◆ MakeChildDuplisFunc

using MakeChildDuplisFunc = void (*)(const DupliContext *ctx, void *userdata, Object *child)

Definition at line 269 of file object_dupli.cc.

Function Documentation

◆ copy_dupli_context()

static bool copy_dupli_context ( DupliContext r_ctx,
const DupliContext ctx,
Object ob,
const float  mat[4][4],
int  index 
)
static

◆ face_dupli()

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

◆ face_dupli_from_editmesh()

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 float(*)  vert_coords[3] 
)
static

◆ face_dupli_from_mesh()

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 MPoly mpoly,
const MLoop mloopstart,
const MVert mvert 
)
static

Definition at line 1018 of file object_dupli.cc.

References MVert::co, face_dupli(), MPoly::totloop, and MLoop::v.

Referenced by make_child_duplis_faces_from_mesh().

◆ find_family_object()

static Object* find_family_object ( Main bmain,
const char *  family,
size_t  family_len,
unsigned int  ch,
GHash family_gh 
)
static

◆ free_object_duplilist()

void free_object_duplilist ( ListBase lb)

◆ get_dupli_generator()

static const DupliGenerator * get_dupli_generator ( const DupliContext ctx)
static

◆ get_dupliface_transform_from_coords()

static void get_dupliface_transform_from_coords ( Span< float3 coords,
const bool  use_scale,
const float  scale_fac,
float  r_mat[4][4] 
)
static

◆ get_duplivert_transform()

static void get_duplivert_transform ( const float  co[3],
const float  no[3],
const bool  use_rotation,
const short  axis,
const short  upflag,
float  r_mat[4][4] 
)
static
Parameters
noThe direction, currently this is copied from a short[3] normal without division. Can be null when use_rotation is false.

Definition at line 482 of file object_dupli.cc.

References loc_quat_size_to_mat4(), negate_v3_v3(), size(), unit_qt(), and vec_to_quat().

Referenced by vertex_dupli().

◆ init_context()

static void init_context ( DupliContext r_ctx,
Depsgraph depsgraph,
Scene scene,
Object ob,
const float  space_mat[4][4],
Vector< Object * > &  instance_stack 
)
static

◆ is_child()

static bool is_child ( const Object ob,
const Object parent 
)
static

◆ make_child_duplis()

static void make_child_duplis ( const DupliContext ctx,
void userdata,
MakeChildDuplisFunc  make_child_duplis_cb 
)
static

◆ make_child_duplis_faces_from_editmesh()

static void make_child_duplis_faces_from_editmesh ( const DupliContext ctx,
void userdata,
Object inst_ob 
)
static

◆ make_child_duplis_faces_from_mesh()

static void make_child_duplis_faces_from_mesh ( const DupliContext ctx,
void userdata,
Object inst_ob 
)
static

◆ make_child_duplis_verts_from_editmesh()

static void make_child_duplis_verts_from_editmesh ( const DupliContext ctx,
void userdata,
Object inst_ob 
)
static

◆ make_child_duplis_verts_from_mesh()

static void make_child_duplis_verts_from_mesh ( const DupliContext ctx,
void userdata,
Object inst_ob 
)
static

◆ make_dupli()

static DupliObject* make_dupli ( const DupliContext ctx,
Object ob,
const float  mat[4][4],
int  index 
)
static

◆ make_duplis_collection()

static void make_duplis_collection ( const DupliContext ctx)
static

◆ make_duplis_faces()

static void make_duplis_faces ( const DupliContext ctx)
static

◆ make_duplis_font()

static void make_duplis_font ( const DupliContext ctx)
static

◆ make_duplis_geometry_set()

static void make_duplis_geometry_set ( const DupliContext ctx)
static

◆ make_duplis_geometry_set_impl()

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 
)
static

◆ make_duplis_particle_system()

static void make_duplis_particle_system ( const DupliContext ctx,
ParticleSystem psys 
)
static

Definition at line 1206 of file object_dupli.cc.

References Freestyle::a, add_v3_v3v3(), usdtokens::b(), BKE_collection_object_cache_get(), BLI_findptr(), BLI_listbase_is_empty(), BLI_rng_free(), BLI_rng_get_int(), BLI_rng_new_srandom(), ParticleSystem::child, ParticleSystem::childcache, ParticleCacheKey::co, copy_m4_m4(), copy_v3_v3(), DAG_EVAL_RENDER, DEG_get_ctime(), DEG_get_mode(), ParticleSimulationData::depsgraph, DupliContext::depsgraph, ParticleSettings::draw, ParticleSettings::draw_as, ELEM, ParticleData::flag, ParticleSystem::flag, FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN, FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_END, Object::imat, ParticleSettings::instance_collection, ParticleSettings::instance_object, Collection::instance_offset, ParticleSettings::instance_weights, invert_m4(), invert_m4_m4(), LISTBASE_FOREACH, make_dupli(), mat4_to_size(), MEM_callocN, MEM_freeN, mul_m4_m4m4(), mul_mat3_m4_fl(), mul_v3_fl(), normalize_qt_qt(), ParticleData::num, ParticleSimulationData::ob, DupliContext::object, Object::obmat, DupliObject::orco, PARS_NO_DISP, PARS_UNEXIST, ParticleSystem::part, PART_DRAW_COUNT_GR, PART_DRAW_GLOBAL_OB, PART_DRAW_GR, PART_DRAW_NO_SCALE_OB, PART_DRAW_OB, PART_DRAW_PARENT, PART_DRAW_RAND_GR, PART_DRAW_REND, PART_DRAW_ROTATE_OB, PART_DRAW_WHOLE_GR, PART_HAIR, DupliObject::particle_system, ParticleSystem::particles, ParticleSystem::pathcache, ParticleSimulationData::psmd, ParticleSimulationData::psys, psys_check_enabled(), psys_find_group_weights(), psys_get_child_size(), psys_get_dupli_path_transform(), psys_get_dupli_texture(), psys_get_modifier(), psys_get_particle_state(), PSYS_HAIR_DONE, psys_sim_data_free(), psys_sim_data_init(), quat_to_mat4(), ParticleSettings::ren_as, ParticleSimulationData::scene, DupliContext::scene, scene, ParticleSystem::seed, ParticleCacheKey::segments, size(), ParticleData::size, size_to_mat4(), state, sub_v3_v3(), ParticleSystem::totcached, ParticleSystem::totchild, ParticleSystem::totchildcache, ParticleSystem::totpart, Object::trackflag, ParticleSettings::type, Object::upflag, DupliObject::uv, vec_to_quat(), void, and zero_v3().

Referenced by make_duplis_particles().

◆ make_duplis_particles()

static void make_duplis_particles ( const DupliContext ctx)
static

◆ make_duplis_verts()

static void make_duplis_verts ( const DupliContext ctx)
static

◆ make_recursive_duplis()

static void make_recursive_duplis ( const DupliContext ctx,
Object ob,
const float  space_mat[4][4],
int  index 
)
static

◆ mesh_data_from_duplicator_object()

static const Mesh* mesh_data_from_duplicator_object ( Object ob,
BMEditMesh **  r_em,
const float(**)  r_vert_coords[3],
const float(**)  r_vert_normals[3] 
)
static

◆ object_duplilist()

ListBase* object_duplilist ( struct Depsgraph depsgraph,
struct Scene sce,
struct Object ob 
)

◆ vertex_dupli()

static DupliObject* vertex_dupli ( const DupliContext ctx,
Object inst_ob,
const float  child_imat[4][4],
int  index,
const float  co[3],
const float  no[3],
const bool  use_rotation 
)
static

Variable Documentation

◆ gen_dupli_collection

const DupliGenerator gen_dupli_collection
static
Initial value:
= {
}
@ OB_DUPLICOLLECTION
static void make_duplis_collection(const DupliContext *ctx)

Definition at line 426 of file object_dupli.cc.

Referenced by get_dupli_generator().

◆ gen_dupli_faces

const DupliGenerator gen_dupli_faces
static
Initial value:
= {
}
@ OB_DUPLIFACES
static void make_duplis_faces(const DupliContext *ctx)

Definition at line 1195 of file object_dupli.cc.

Referenced by get_dupli_generator().

◆ gen_dupli_geometry_set

const DupliGenerator gen_dupli_geometry_set
static
Initial value:
= {
0,
}
static void make_duplis_geometry_set(const DupliContext *ctx)

Definition at line 901 of file object_dupli.cc.

Referenced by get_dupli_generator().

◆ gen_dupli_particles

const DupliGenerator gen_dupli_particles
static
Initial value:
= {
}
@ OB_DUPLIPARTS
static void make_duplis_particles(const DupliContext *ctx)

Definition at line 1544 of file object_dupli.cc.

Referenced by get_dupli_generator().

◆ gen_dupli_verts

const DupliGenerator gen_dupli_verts
static
Initial value:
= {
}
@ OB_DUPLIVERTS
static void make_duplis_verts(const DupliContext *ctx)

Definition at line 637 of file object_dupli.cc.

Referenced by get_dupli_generator().

◆ gen_dupli_verts_font

const DupliGenerator gen_dupli_verts_font
static
Initial value:
= {
}
static void make_duplis_font(const DupliContext *ctx)

Definition at line 766 of file object_dupli.cc.

Referenced by get_dupli_generator().