Small update for billboards:

* Renamed the old split uv's animate option "time" to "age" and added a new option to change the used split frame by frame. These are good changes were suggested/implied by Hannu Hoffren over 3 years ago in his tutorial video! (oh my how time flies)
* Also cleaned up the billboard ui quite a bit. For example now the uv channels can be properly chosen from the existing channels.
This commit is contained in:
Janne Karhu 2011-02-12 23:25:03 +00:00
parent 54b2127fad
commit 373fea6662
5 changed files with 39 additions and 38 deletions

@ -821,6 +821,8 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel):
row.prop(weight, "count")
elif part.render_type == 'BILLBOARD':
ob = context.object
sub.label(text="Align:")
row = layout.row()
@ -833,21 +835,22 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel):
col = row.column(align=True)
col.label(text="Tilt:")
col.prop(part, "billboard_tilt", text="Angle", slider=True)
col.prop(part, "billboard_tilt_random", slider=True)
col.prop(part, "billboard_tilt_random", text="Random", slider=True)
col = row.column()
col.prop(part, "billboard_offset")
row = layout.row()
row.prop(psys, "billboard_normal_uv")
row = layout.row()
row.prop(psys, "billboard_time_index_uv")
col = layout.column()
col.prop_search(psys, "billboard_normal_uv", ob.data, "uv_textures")
col.prop_search(psys, "billboard_time_index_uv", ob.data, "uv_textures")
row = layout.row()
row.label(text="Split uv's:")
row.prop(part, "billboard_uv_split", text="Number of splits")
row = layout.row()
row.prop(psys, "billboard_split_uv")
row = layout.row()
split = layout.split(percentage=0.33)
split.label(text="Split uv's:")
split.prop(part, "billboard_uv_split", text="Number of splits")
col = layout.column()
col.active = part.billboard_uv_split > 1
col.prop_search(psys, "billboard_split_uv", ob.data, "uv_textures")
row = col.row()
row.label(text="Animate:")
row.prop(part, "billboard_animation", text="")
row.label(text="Offset:")

@ -149,6 +149,7 @@ typedef struct ParticleBillboardData
int uv[3];
int lock, num;
int totnum;
int lifetime;
short align, uv_split, anim, split_offset;
} ParticleBillboardData;

@ -390,10 +390,9 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
/* part->bb_anim */
#define PART_BB_ANIM_NONE 0
#define PART_BB_ANIM_TIME 1
#define PART_BB_ANIM_AGE 1
#define PART_BB_ANIM_ANGLE 2
#define PART_BB_ANIM_OFF_TIME 3
#define PART_BB_ANIM_OFF_ANGLE 4
#define PART_BB_ANIM_FRAME 3
/* part->bb_split_offset */
#define PART_BB_OFF_NONE 0

@ -1450,10 +1450,9 @@ static void rna_def_particle_settings(BlenderRNA *brna)
static EnumPropertyItem bb_anim_items[] = {
{PART_BB_ANIM_NONE, "NONE", 0, "None", ""},
{PART_BB_ANIM_TIME, "TIME", 0, "Time", ""},
{PART_BB_ANIM_AGE, "AGE", 0, "Age", ""},
{PART_BB_ANIM_FRAME, "FRAME", 0, "Frame", ""},
{PART_BB_ANIM_ANGLE, "ANGLE", 0, "Angle", ""},
//{PART_BB_ANIM_OFF_TIME, "OFF_TIME", 0, "off_time", ""},
//{PART_BB_ANIM_OFF_ANGLE, "OFF_ANGLE", 0, "off_angle", ""},
{0, NULL, 0, NULL, NULL}
};

@ -1269,6 +1269,7 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
VlakRen *vlr;
MTFace *mtf;
float xvec[3], yvec[3], zvec[3], bb_center[3];
int totsplit = bb->uv_split * bb->uv_split;
float uvx = 0.0f, uvy = 0.0f, uvdx = 1.0f, uvdy = 1.0f, time = 0.0f;
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
@ -1306,49 +1307,46 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
if(bb->uv_split > 1){
uvdx = uvdy = 1.0f / (float)bb->uv_split;
if(bb->anim == PART_BB_ANIM_TIME) {
if(bb->split_offset == PART_BB_OFF_NONE)
time = bb->time;
else if(bb->split_offset == PART_BB_OFF_LINEAR)
time = (float)fmod(bb->time + (float)bb->num / (float)(bb->uv_split * bb->uv_split), 1.0f);
else /* split_offset==PART_BB_OFF_RANDOM */
time = (float)fmod(bb->time + bb->random, 1.0f);
if(ELEM(bb->anim, PART_BB_ANIM_AGE, PART_BB_ANIM_FRAME)) {
if(bb->anim == PART_BB_ANIM_FRAME)
time = ((int)(bb->time * bb->lifetime) % totsplit)/(float)totsplit;
else
time = bb->time;
}
else if(bb->anim == PART_BB_ANIM_ANGLE) {
if(bb->align == PART_BB_VIEW) {
time = (float)fmod((bb->tilt + 1.0f) / 2.0f, 1.0);
}
else{
else {
float axis1[3] = {0.0f,0.0f,0.0f};
float axis2[3] = {0.0f,0.0f,0.0f};
axis1[(bb->align + 1) % 3] = 1.0f;
axis2[(bb->align + 2) % 3] = 1.0f;
if(bb->lock == 0) {
zvec[bb->align] = 0.0f;
normalize_v3(zvec);
}
time = saacos(dot_v3v3(zvec, axis1)) / (float)M_PI;
if(dot_v3v3(zvec, axis2) < 0.0f)
time = 1.0f - time / 2.0f;
else
time = time / 2.0f;
time /= 2.0f;
}
if(bb->split_offset == PART_BB_OFF_LINEAR)
time = (float)fmod(bb->time + (float)bb->num / (float)(bb->uv_split * bb->uv_split), 1.0f);
else if(bb->split_offset == PART_BB_OFF_RANDOM)
time = (float)fmod(bb->time + bb->random, 1.0f);
}
else{
if(bb->split_offset == PART_BB_OFF_NONE)
time = 0.0f;
else if(bb->split_offset == PART_BB_OFF_LINEAR)
time = (float)fmod((float)bb->num /(float)(bb->uv_split * bb->uv_split) , 1.0f);
else /* split_offset==PART_BB_OFF_RANDOM */
time = bb->random;
}
if(bb->split_offset == PART_BB_OFF_LINEAR)
time = (float)fmod(time + (float)bb->num / (float)totsplit, 1.0f);
else if(bb->split_offset==PART_BB_OFF_RANDOM)
time = (float)fmod(time + bb->random, 1.0f);
uvx = uvdx * floor((float)(bb->uv_split * bb->uv_split) * (float)fmod((double)time, (double)uvdx));
uvy = uvdy * floor((1.0f - time) * (float)bb->uv_split);
if(fmod(time, 1.0f / bb->uv_split) == 0.0f)
uvy -= uvdy;
}
@ -1989,6 +1987,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt);
bb.time = pa_time;
bb.num = a;
bb.lifetime = pa_dietime-pa_birthtime;
}
particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize, pa_co);