107 if (psmd->
psys == psys) {
110 if (useRenderParams) {
151 int totpart, randp, minp, maxp;
186 randp = (int)(
psys_frand(psys, 3578 + p) * totpart) % totpart;
192 return randp < minp || randp >= maxp;
195 return randp < minp && randp >= maxp;
206 vcol->
r = vcol->
g = vcol->
b = value;
218 MPoly *mpoly, *orig_mpoly;
219 MLoop *mloop, *orig_mloop;
220 MVert *mvert, *orig_mvert;
221 int totvert, totpoly, totloop, totedge;
222 int maxvert, maxpoly, maxloop, maxedge, part_end = 0, part_start;
225 float max_co = 0.0, min_co = 0.0, temp_co[3];
227 float spacemat[4][4];
249 part_start = use_parents ? 0 : psys->
totpart;
275 for (p = 0, pa = psys->
particles; p < psys->totpart; p++, pa++, si++) {
283 for (p = 0; p < psys->
totchild; p++, cpa++, si++) {
289 switch (pimd->
space) {
315 for (p = part_start; p < part_end; p++) {
349 int *vert_part_index =
NULL;
350 float *vert_part_value =
NULL;
351 if (mloopcols_index !=
NULL) {
352 vert_part_index =
MEM_calloc_arrayN(maxvert,
sizeof(
int),
"vertex part index array");
354 if (mloopcols_value) {
355 vert_part_value =
MEM_calloc_arrayN(maxvert,
sizeof(
float),
"vertex part value array");
358 for (p = part_start, p_skip = 0; p < part_end; p++) {
361 float p_random =
psys_frand(psys, 77091 + 283 * p);
369 for (k = 0; k < totvert; k++) {
372 int vindex = p_skip * totvert + k;
375 inMV = orig_mvert + k;
379 if (vert_part_index !=
NULL) {
380 vert_part_index[vindex] = p;
382 if (vert_part_value !=
NULL) {
383 vert_part_value[vindex] = p_random;
388 mv->co[axis] = temp_co[track];
389 mv->co[(axis + 1) % 3] = temp_co[(track + 1) % 3];
390 mv->co[(axis + 2) % 3] = temp_co[(track + 2) % 3];
404 state.time = (
mv->co[axis] - min_co) / (max_co - min_co) * pimd->
position * (1.0f - ran);
422 if (p < psys->totpart) {
438 const float eul[3] = {0.0f, 0.0f,
angle};
464 if (
state.vel[axis] < -0.9999f ||
state.vel[axis] > 0.9999f) {
469 float temp[3] = {0.0f, 0.0f, 0.0f};
496 for (k = 0; k < totedge; k++, me++) {
497 me->
v1 += p_skip * totvert;
498 me->
v2 += p_skip * totvert;
502 for (k = 0; k < totpoly; k++) {
504 MPoly *inMP = orig_mpoly + k;
505 MPoly *mp = mpoly + p_skip * totpoly + k;
517 for (; j; j--, ml++, inML++) {
518 ml->
v = inML->
v + (p_skip * totvert);
519 ml->
e = inML->
e + (p_skip * totedge);
520 const int ml_index = (ml - mloop);
521 if (mloopcols_index !=
NULL) {
522 const int part_index = vert_part_index[ml->
v];
524 (
float)part_index / (
float)(psys->
totpart - 1));
526 if (mloopcols_value !=
NULL) {
527 const float part_value = vert_part_value[ml->
v];
577 uiItemR(layout,
ptr,
"particle_system_index", 0,
IFACE_(
"Particle System"), ICON_NONE);
610 uiItemR(layout,
ptr,
"use_path", 0,
IFACE_(
"Create Along Paths"), ICON_NONE);
649 col,
ptr,
"index_layer_name", &obj_data_ptr,
"vertex_colors",
IFACE_(
"Index"), ICON_NONE);
651 col,
ptr,
"value_layer_name", &obj_data_ptr,
"vertex_colors",
IFACE_(
"Value"), ICON_NONE);
665 "ParticleInstanceModifierData",
671 ICON_MOD_PARTICLE_INSTANCE,
void * CustomData_get_layer_named(const struct CustomData *data, int type, const char *name)
void CustomData_copy_data(const struct CustomData *source, struct CustomData *dest, int source_index, int dest_index, int count)
void BKE_lattice_deform_data_destroy(struct LatticeDeformData *lattice_deform_data)
struct Mesh * BKE_mesh_new_nomain_from_template(const struct Mesh *me_src, int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
bool BKE_mesh_minmax(const struct Mesh *me, float r_min[3], float r_max[3])
bool BKE_modifier_is_enabled(const struct Scene *scene, struct ModifierData *md, int required_mode)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Constructive
struct LatticeDeformData * psys_create_lattice_deform_data(struct ParticleSimulationData *sim)
void psys_get_particle_on_path(struct ParticleSimulationData *sim, int pa_num, struct ParticleKey *state, const bool vel)
void psys_mat_hair_to_global(struct Object *ob, struct Mesh *mesh, short from, struct ParticleData *pa, float hairmat[4][4])
int psys_get_particle_state(struct ParticleSimulationData *sim, int p, struct ParticleKey *state, int always)
struct ParticleSystemModifierData * psys_get_modifier(struct Object *ob, struct ParticleSystem *psys)
float psys_get_child_size(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra, float *pa_time)
BLI_INLINE float psys_frand(ParticleSystem *psys, unsigned int seed)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE float saacos(float fac)
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void unit_m4(float m[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void rotation_between_vecs_to_quat(float q[4], const float v1[3], const float v2[3])
void mat3_to_quat(float q[4], const float mat[3][3])
void axis_angle_to_quat(float r[4], const float axis[3], const float angle)
void mul_qt_v3(const float q[4], float r[3])
void eul_to_quat(float quat[4], const float eul[3])
void mul_qt_qtqt(float q[4], const float a[4], const float b[4])
void copy_qt_qt(float q[4], const float a[4])
MINLINE float normalize_v3(float r[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 cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
float BLI_hash_frand(unsigned int seed) ATTR_WARN_UNUSED_RESULT
#define INIT_MINMAX(min, max)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define DNA_struct_default_get(struct_name)
@ eParticleInstanceFlag_Parents
@ eParticleInstanceFlag_Alive
@ eParticleInstanceFlag_Dead
@ eParticleInstanceFlag_Children
@ eParticleInstanceFlag_Unborn
@ eParticleInstanceFlag_Path
@ eParticleInstanceFlag_UseSize
@ eParticleInstanceFlag_KeepShape
struct ParticleInstanceModifierData ParticleInstanceModifierData
@ eModifierType_ParticleSystem
@ eModifierType_ParticleInstance
@ eParticleInstanceSpace_World
@ eParticleInstanceSpace_Local
Read Guarded memory(de)allocation.
ModifierTypeInfo modifierType_ParticleInstance
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static bool isDisabled(const struct Scene *scene, ModifierData *md, bool useRenderParams)
static bool particle_skip(ParticleInstanceModifierData *pimd, ParticleSystem *psys, int p)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static void store_float_in_vcol(MLoopCol *vcol, float float_value)
static void path_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void path_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void panelRegister(ARegionType *region_type)
static void layers_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
StructRNA RNA_ParticleInstanceModifier
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_ITEM_R_FORCE_BLANK_DECORATE
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
MINLINE unsigned char unit_float_to_uchar_clamp(float val)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
struct CustomData pdata ldata
struct ModifierData * next
struct Depsgraph * depsgraph
struct DepsNodeHandle * node
char value_layer_name[64]
char index_layer_name[64]
struct Depsgraph * depsgraph
struct ParticleSystemModifierData * psmd
struct ParticleSystem * psys
struct ParticleSystem * psys
struct PointCache * pointcache
struct LatticeDeformData * lattice_deform_data
__forceinline avxf cross(const avxf &a, const avxf &b)