Particle: Remove Billboard Particle code

The billboard particles were only used by Blender Internal. So until it is
supported by Cycles of Eevee there is no reason to keep it in the code and
UI.

Fix T61695 Billboard particles not displaying in Eevee viewport, render
This commit is contained in:
Clément Foucault 2019-03-15 20:56:29 +01:00
parent aaa35d1092
commit efdde88dfc
Notes: blender-bot 2023-02-14 11:07:28 +01:00
Referenced by issue #61695, Billboard particles not displaying in Eevee viewport, render
6 changed files with 15 additions and 330 deletions

View File

@ -1480,98 +1480,6 @@ class PARTICLE_PT_render_collection_use_count(ParticleButtonsPanel, Panel):
row.prop(weight, "count")
class PARTICLE_PT_render_billboards_alignment(ParticleButtonsPanel, Panel):
bl_label = "Billboard Alignment"
bl_parent_id = "PARTICLE_PT_render"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
part = particle_get_settings(context)
return part.render_type == 'BILLBOARD'
def draw(self, context):
layout = self.layout
layout.use_property_split = True
part = particle_get_settings(context)
col = layout.column()
col.prop(part, "billboard_align", text="Align To")
col.prop(part, "lock_billboard", text="Lock Axis")
col.prop(part, "billboard_object")
class PARTICLE_PT_render_billboards_tilt(ParticleButtonsPanel, Panel):
bl_label = "Billboard Tilt"
bl_parent_id = "PARTICLE_PT_render"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
part = particle_get_settings(context)
return part.render_type == 'BILLBOARD'
def draw(self, context):
layout = self.layout
layout.use_property_split = True
part = particle_get_settings(context)
col = layout.column()
sub = col.column(align=True)
sub.prop(part, "billboard_tilt", text="Angle", slider=True)
sub.prop(part, "billboard_tilt_random", text="Random", slider=True)
sub = col.column(align=True)
sub.prop(part, "billboard_offset")
col.prop(part, "billboard_size", text="Scale")
if part.billboard_align == 'VEL':
col = col.column(align=True)
col.prop(part, "billboard_velocity_head", text="Velocity ScaleHead")
col.prop(part, "billboard_velocity_tail", text="Tail")
class PARTICLE_PT_render_billboards_uv(ParticleButtonsPanel, Panel):
bl_label = "Billboard UVs"
bl_parent_id = "PARTICLE_PT_render"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
part = particle_get_settings(context)
return part.render_type == 'BILLBOARD'
def draw(self, context):
layout = self.layout
layout.use_property_split = True
psys = context.particle_system
ob = context.object
part = particle_get_settings(context)
col = layout.column()
if psys:
col.prop_search(psys, "billboard_normal_uv", ob.data, "uv_layers")
col.prop_search(psys, "billboard_time_index_uv", ob.data, "uv_layers")
col.prop(part, "billboard_uv_split", text="Split UVs")
if psys:
sub = col.column()
sub.active = part.billboard_uv_split > 1
sub.prop_search(psys, "billboard_split_uv", ob.data, "uv_layers")
sub.prop(part, "billboard_animation")
sub.prop(part, "billboard_offset_split")
class PARTICLE_PT_render_trails(ParticleButtonsPanel, Panel):
bl_label = "Trails"
bl_parent_id = "PARTICLE_PT_render"
@ -2186,8 +2094,6 @@ classes = (
PARTICLE_PT_render_object,
PARTICLE_PT_render_collection,
PARTICLE_PT_render_collection_use_count,
PARTICLE_PT_render_billboards_tilt,
PARTICLE_PT_render_billboards_uv,
PARTICLE_PT_render_trails,
PARTICLE_PT_render_extra,
PARTICLE_PT_draw,

View File

@ -172,19 +172,6 @@ typedef struct ParticleTask {
int begin, end;
} ParticleTask;
typedef struct ParticleBillboardData {
struct Object *ob;
float vec[3], vel[3];
float offset[2];
float size[2];
float tilt, random, time;
int uv[3];
int lock, num;
int totnum;
int lifetime;
short align, uv_split, anim, split_offset;
} ParticleBillboardData;
typedef struct ParticleCollisionElement {
/* pointers to original data */
float *x[3], *v[3];
@ -391,7 +378,6 @@ void psys_thread_context_free(struct ParticleThreadContext *ctx);
void psys_tasks_create(struct ParticleThreadContext *ctx, int startpart, int endpart, struct ParticleTask **r_tasks, int *r_numtasks);
void psys_tasks_free(struct ParticleTask *tasks, int numtasks);
void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3], float zvec[3], float center[3]);
void psys_apply_hair_lattice(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
/* particle_system.c */

View File

@ -3150,8 +3150,6 @@ static void default_particle_settings(ParticleSettings *part)
part->draw_as = PART_DRAW_REND;
part->ren_as = PART_DRAW_HALO;
part->bb_uv_split = 1;
part->bb_align = PART_BB_VIEW;
part->bb_split_offset = PART_BB_OFF_LINEAR;
part->flag = PART_EDISTR | PART_TRAND | PART_HIDE_ADVANCED_HAIR;
part->sta = 1.0;
@ -4207,88 +4205,6 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa
*scale = len;
}
void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3], float zvec[3], float center[3])
{
float onevec[3] = {0.0f, 0.0f, 0.0f}, tvec[3], tvec2[3];
xvec[0] = 1.0f; xvec[1] = 0.0f; xvec[2] = 0.0f;
yvec[0] = 0.0f; yvec[1] = 1.0f; yvec[2] = 0.0f;
/* can happen with bad pointcache or physics calculation
* since this becomes geometry, nan's and inf's crash raytrace code.
* better not allow this. */
if (!is_finite_v3(bb->vec) || !is_finite_v3(bb->vec)) {
zero_v3(bb->vec);
zero_v3(bb->vel);
zero_v3(xvec);
zero_v3(yvec);
zero_v3(zvec);
zero_v3(center);
return;
}
if (bb->align < PART_BB_VIEW)
onevec[bb->align] = 1.0f;
if (bb->lock && (bb->align == PART_BB_VIEW)) {
normalize_v3_v3(xvec, bb->ob->obmat[0]);
normalize_v3_v3(yvec, bb->ob->obmat[1]);
normalize_v3_v3(zvec, bb->ob->obmat[2]);
}
else if (bb->align == PART_BB_VEL) {
float temp[3];
normalize_v3_v3(temp, bb->vel);
sub_v3_v3v3(zvec, bb->ob->obmat[3], bb->vec);
if (bb->lock) {
float fac = -dot_v3v3(zvec, temp);
madd_v3_v3fl(zvec, temp, fac);
}
normalize_v3(zvec);
cross_v3_v3v3(xvec, temp, zvec);
normalize_v3(xvec);
cross_v3_v3v3(yvec, zvec, xvec);
}
else {
sub_v3_v3v3(zvec, bb->ob->obmat[3], bb->vec);
if (bb->lock)
zvec[bb->align] = 0.0f;
normalize_v3(zvec);
if (bb->align < PART_BB_VIEW)
cross_v3_v3v3(xvec, onevec, zvec);
else
cross_v3_v3v3(xvec, bb->ob->obmat[1], zvec);
normalize_v3(xvec);
cross_v3_v3v3(yvec, zvec, xvec);
}
copy_v3_v3(tvec, xvec);
copy_v3_v3(tvec2, yvec);
mul_v3_fl(xvec, cosf(bb->tilt * (float)M_PI));
mul_v3_fl(tvec2, sinf(bb->tilt * (float)M_PI));
add_v3_v3(xvec, tvec2);
mul_v3_fl(yvec, cosf(bb->tilt * (float)M_PI));
mul_v3_fl(tvec, -sinf(bb->tilt * (float)M_PI));
add_v3_v3(yvec, tvec);
mul_v3_fl(xvec, bb->size[0]);
mul_v3_fl(yvec, bb->size[1]);
madd_v3_v3v3fl(center, bb->vec, xvec, bb->offset[0]);
madd_v3_v3fl(center, yvec, bb->offset[1]);
}
void psys_apply_hair_lattice(Depsgraph *depsgraph, Scene *scene, Object *ob, ParticleSystem *psys)
{
ParticleSimulationData sim = {0};

View File

@ -2910,5 +2910,15 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
{
/* Versioning code until next subversion bump goes here. */
LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
/* Replace deprecated PART_DRAW_BB by PART_DRAW_NOT */
if (part->ren_as == PART_DRAW_BB) {
part->ren_as = PART_DRAW_NOT;
}
if (part->draw_as == PART_DRAW_BB) {
part->draw_as = PART_DRAW_NOT;
}
}
}
}

View File

@ -206,8 +206,8 @@ typedef struct ParticleSettings {
short kink, kink_axis;
/* billboards */
short bb_align, bb_uv_split, bb_anim, bb_split_offset;
float bb_tilt, bb_rand_tilt, bb_offset[2], bb_size[2], bb_vel_head, bb_vel_tail;
short bb_align, bb_uv_split, bb_anim, bb_split_offset DNA_DEPRECATED;
float bb_tilt, bb_rand_tilt, bb_offset[2], bb_size[2], bb_vel_head, bb_vel_tail DNA_DEPRECATED;
/* draw color */
float color_vec_max;
@ -362,7 +362,7 @@ typedef struct ParticleSystem {
char _pad1[6];
/** Billboard uv name, MAX_CUSTOMDATA_LAYER_NAME. */
char bb_uvname[3][64];
char bb_uvname[3][64] DNA_DEPRECATED;
/* if you change these remember to update array lengths to PSYS_TOT_VG! */
/** Vertex groups, 0==disable, 1==starting index. */
@ -412,7 +412,7 @@ typedef enum eParticleDrawFlag {
PART_DRAW_HEALTH = (1 << 4),
PART_ABS_PATH_TIME = (1 << 5),
PART_DRAW_COUNT_GR = (1 << 6),
PART_DRAW_BB_LOCK = (1 << 7), /* used with billboards */
PART_DRAW_BB_LOCK = (1 << 7), /* used with billboards */ /* DEPRECATED */
PART_DRAW_ROTATE_OB = (1 << 7), /* used with instance object/collection */
PART_DRAW_PARENT = (1 << 8),
PART_DRAW_NUM = (1 << 9),
@ -530,24 +530,6 @@ typedef enum eParticleShapeFlag {
/* part->time_flag */
#define PART_TIME_AUTOSF 1 /* Automatic subframes */
/* part->bb_align */
#define PART_BB_X 0
#define PART_BB_Y 1
#define PART_BB_Z 2
#define PART_BB_VIEW 3
#define PART_BB_VEL 4
/* part->bb_anim */
#define PART_BB_ANIM_NONE 0
#define PART_BB_ANIM_AGE 1
#define PART_BB_ANIM_ANGLE 2
#define PART_BB_ANIM_FRAME 3
/* part->bb_split_offset */
#define PART_BB_OFF_NONE 0
#define PART_BB_OFF_LINEAR 1
#define PART_BB_OFF_RANDOM 2
/* part->draw_as */
/* part->ren_as*/
#define PART_DRAW_NOT 0
@ -560,7 +542,7 @@ typedef enum eParticleShapeFlag {
#define PART_DRAW_PATH 6
#define PART_DRAW_OB 7
#define PART_DRAW_GR 8
#define PART_DRAW_BB 9
#define PART_DRAW_BB 9 /* deprecated */
#define PART_DRAW_REND 10
/* part->integrator */

View File

@ -108,7 +108,6 @@ static const EnumPropertyItem part_ren_as_items[] = {
{PART_DRAW_PATH, "PATH", 0, "Path", ""},
{PART_DRAW_OB, "OBJECT", 0, "Object", ""},
{PART_DRAW_GR, "COLLECTION", 0, "Collection", ""},
{PART_DRAW_BB, "BILLBOARD", 0, "Billboard", ""},
{0, NULL, 0, NULL, NULL},
};
@ -2062,30 +2061,6 @@ static void rna_def_particle_settings(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL},
};
static const EnumPropertyItem bb_align_items[] = {
{PART_BB_X, "X", 0, "X", ""},
{PART_BB_Y, "Y", 0, "Y", ""},
{PART_BB_Z, "Z", 0, "Z", ""},
{PART_BB_VIEW, "VIEW", 0, "View", ""},
{PART_BB_VEL, "VEL", 0, "Velocity", ""},
{0, NULL, 0, NULL, NULL},
};
static const EnumPropertyItem bb_anim_items[] = {
{PART_BB_ANIM_NONE, "NONE", 0, "None", ""},
{PART_BB_ANIM_AGE, "AGE", 0, "Age", ""},
{PART_BB_ANIM_FRAME, "FRAME", 0, "Frame", ""},
{PART_BB_ANIM_ANGLE, "ANGLE", 0, "Angle", ""},
{0, NULL, 0, NULL, NULL},
};
static const EnumPropertyItem bb_split_offset_items[] = {
{PART_BB_OFF_NONE, "NONE", 0, "None", ""},
{PART_BB_OFF_LINEAR, "LINEAR", 0, "Linear", ""},
{PART_BB_OFF_RANDOM, "RANDOM", 0, "Random", ""},
{0, NULL, 0, NULL, NULL},
};
static const EnumPropertyItem draw_col_items[] = {
{PART_DRAW_COL_NONE, "NONE", 0, "None", ""},
{PART_DRAW_COL_MAT, "MATERIAL", 0, "Material", ""},
@ -2481,79 +2456,12 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Axis", "Which axis to use for offset");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
/* billboards */
prop = RNA_def_property(srna, "lock_billboard", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_BB_LOCK);
RNA_def_property_ui_text(prop, "Lock Billboard", "Lock the billboards align axis");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop = RNA_def_property(srna, "billboard_align", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "bb_align");
RNA_def_property_enum_items(prop, bb_align_items);
RNA_def_property_ui_text(prop, "Align to", "In respect to what the billboards are aligned");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop = RNA_def_property(srna, "billboard_uv_split", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "bb_uv_split");
RNA_def_property_range(prop, 1, 100);
RNA_def_property_ui_range(prop, 1, 10, 1, -1);
RNA_def_property_ui_text(prop, "UV Split", "Number of rows/columns to split UV coordinates for billboards");
prop = RNA_def_property(srna, "billboard_animation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "bb_anim");
RNA_def_property_enum_items(prop, bb_anim_items);
RNA_def_property_ui_text(prop, "Animate", "How to animate billboard textures");
prop = RNA_def_property(srna, "billboard_offset_split", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "bb_split_offset");
RNA_def_property_enum_items(prop, bb_split_offset_items);
RNA_def_property_ui_text(prop, "Offset", "How to offset billboard textures");
prop = RNA_def_property(srna, "billboard_tilt", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bb_tilt");
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Tilt", "Tilt of the billboards");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop = RNA_def_property(srna, "color_maximum", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "color_vec_max");
RNA_def_property_range(prop, 0.01f, 100.0f);
RNA_def_property_ui_text(prop, "Color Maximum", "Maximum length of the particle color vector");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop = RNA_def_property(srna, "billboard_tilt_random", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "bb_rand_tilt");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Tilt", "Random tilt of the billboards");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop = RNA_def_property(srna, "billboard_offset", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "bb_offset");
RNA_def_property_array(prop, 2);
RNA_def_property_range(prop, -100.0f, 100.0f);
RNA_def_property_ui_range(prop, -1.0, 1.0, 0.1, 3);
RNA_def_property_ui_text(prop, "Billboard Offset", "");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop = RNA_def_property(srna, "billboard_size", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "bb_size");
RNA_def_property_array(prop, 2);
RNA_def_property_range(prop, 0.001f, 10.0f);
RNA_def_property_ui_text(prop, "Billboard Scale", "Scale billboards relative to particle size");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop = RNA_def_property(srna, "billboard_velocity_head", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "bb_vel_head");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Billboard Velocity Head", "Scale billboards by velocity");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop = RNA_def_property(srna, "billboard_velocity_tail", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "bb_vel_tail");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Billboard Velocity Tail", "Scale billboards by velocity");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
/* general values */
prop = RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "sta"); /*optional if prop names are the same */
@ -3123,13 +3031,6 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Instance Object", "Show this Object in place of particles");
RNA_def_property_update(prop, 0, "rna_Particle_redo_dependency");
prop = RNA_def_property(srna, "billboard_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "bb_ob");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Billboard Object", "Billboards face this object (default is active camera)");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
/* boids */
prop = RNA_def_property(srna, "boids", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "BoidSettings");
@ -3381,22 +3282,6 @@ static void rna_def_particle_system(BlenderRNA *brna)
"rna_ParticleSystem_active_particle_target_index_range");
RNA_def_property_ui_text(prop, "Active Particle Target Index", "");
/* billboard */
prop = RNA_def_property(srna, "billboard_normal_uv", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "bb_uvname[0]");
RNA_def_property_string_maxlength(prop, 32);
RNA_def_property_ui_text(prop, "Billboard Normal UV", "UV map to control billboard normals");
prop = RNA_def_property(srna, "billboard_time_index_uv", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "bb_uvname[1]");
RNA_def_property_string_maxlength(prop, 32);
RNA_def_property_ui_text(prop, "Billboard Time Index UV", "UV map to control billboard time index (X-Y)");
prop = RNA_def_property(srna, "billboard_split_uv", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "bb_uvname[2]");
RNA_def_property_string_maxlength(prop, 32);
RNA_def_property_ui_text(prop, "Billboard Split UV", "UV map to control billboard splitting");
/* vertex groups */
/* note, internally store as ints, access as strings */