New hair "strand" channel has wrong texture coord input... it rendered

from 0 - 1, instead of -1 to 1. Thats fixed.
The error made tests i did with alpha make nice though, apparently hairs
are nicer when rendered with alpha range 0.0 to 0.5.
This commit is contained in:
Ton Roosendaal 2005-09-29 18:13:36 +00:00
parent b15f46ed7c
commit fa57f3115d

@ -922,6 +922,75 @@ static Object *vlr_set_ob(Object *ob)
/* ------------------------------------------------------------------------- */
static void static_particle_strand(Object *ob, Material *ma, float *orco, float *vec, float *vec1, float ctime)
{
static VertRen *v1= NULL, *v2= NULL;
VlakRen *vlr;
float nor[3], cross[3], w, dx, dy;
VecSubf(nor, vec, vec1);
Normalise(nor); // nor needed as tangent
Crossf(cross, vec, nor);
/* turn cross in pixelsize */
w= vec[2]*R.winmat[2][3] + R.winmat[3][3];
dx= R.rectx*cross[0]*R.winmat[0][0]/w;
dy= R.recty*cross[1]*R.winmat[1][1]/w;
w= sqrt(dx*dx + dy*dy);
if(w!=0.0f)
VecMulf(cross, 1.0/w);
if(ctime == 0.0f) {
v1= RE_findOrAddVert(R.totvert++);
v2= RE_findOrAddVert(R.totvert++);
VECCOPY(v1->co, vec);
VecAddf(v1->co, v1->co, cross);
VECCOPY(v1->n, nor);
v2->orco= orco;
v1->accum= -1.0f; // accum abuse for strand texco
VECCOPY(v2->co, vec);
VecSubf(v2->co, v2->co, cross);
VECCOPY(v2->n, nor);
v2->orco= orco;
v2->accum= v1->accum;
}
else {
vlr= RE_findOrAddVlak(R.totvlak++);
vlr->flag= ME_SMOOTH|R_NOPUNOFLIP|R_TANGENT;
vlr->ob= vlr_set_ob(ob);
vlr->v1= v1;
vlr->v2= v2;
vlr->v3= RE_findOrAddVert(R.totvert++);
vlr->v4= RE_findOrAddVert(R.totvert++);
v1= vlr->v4; // cycle
v2= vlr->v3; // cycle
VECCOPY(vlr->v4->co, vec);
VecAddf(vlr->v4->co, vlr->v4->co, cross);
VECCOPY(vlr->v4->n, nor);
vlr->v4->orco= orco;
vlr->v4->accum= -1.0f + 2.0f*ctime; // accum abuse for strand texco
VECCOPY(vlr->v3->co, vec);
VecSubf(vlr->v3->co, vlr->v3->co, cross);
VECCOPY(vlr->v3->n, nor);
vlr->v3->orco= orco;
vlr->v3->accum= vlr->v4->accum;
CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
vlr->mat= ma;
vlr->ec= ME_V1V2|ME_V2V3;
vlr->lay= ob->lay;
}
}
static void render_static_particle_system(Object *ob, PartEff *paf)
{
@ -1059,69 +1128,8 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
}
if(har) har->lay= ob->lay;
}
else { /* generate pixel sized hair strands */
float cross[3], w, dx, dy;
VecSubf(nor, vec, vec1);
Normalise(nor); // nor needed as tangent
Crossf(cross, vec, nor);
/* turn cross in pixelsize */
w= vec[2]*R.winmat[2][3] + R.winmat[3][3];
dx= R.rectx*cross[0]*R.winmat[0][0]/w;
dy= R.recty*cross[1]*R.winmat[1][1]/w;
w= sqrt(dx*dx + dy*dy);
if(w!=0.0f)
VecMulf(cross, 1.0/w);
if(ctime == pa->time) {
v1= RE_findOrAddVert(R.totvert++);
v2= RE_findOrAddVert(R.totvert++);
VECCOPY(v1->co, vec);
VecAddf(v1->co, v1->co, cross);
VECCOPY(v1->n, nor);
v2->orco= orco;
v1->accum= (ctime-pa->time)/(mtime-pa->time); // accum abuse for strand texco
VECCOPY(v2->co, vec);
VecSubf(v2->co, v2->co, cross);
VECCOPY(v2->n, nor);
v2->orco= orco;
v2->accum= v1->accum;
}
else {
vlr= RE_findOrAddVlak(R.totvlak++);
vlr->flag= ME_SMOOTH|R_NOPUNOFLIP|R_TANGENT;
vlr->ob= vlr_set_ob(ob);
vlr->v1= v1;
vlr->v2= v2;
vlr->v3= RE_findOrAddVert(R.totvert++);
vlr->v4= RE_findOrAddVert(R.totvert++);
v1= vlr->v4; // cycle
v2= vlr->v3; // cycle
VECCOPY(vlr->v4->co, vec);
VecAddf(vlr->v4->co, vlr->v4->co, cross);
VECCOPY(vlr->v4->n, nor);
vlr->v4->orco= orco;
vlr->v4->accum= (ctime-pa->time)/(mtime-pa->time); // accum abuse for strand texco
VECCOPY(vlr->v3->co, vec);
VecSubf(vlr->v3->co, vlr->v3->co, cross);
VECCOPY(vlr->v3->n, nor);
vlr->v3->orco= orco;
vlr->v3->accum= vlr->v4->accum;
CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
vlr->mat= ma;
vlr->ec= ME_V1V2|ME_V2V3;
vlr->lay= ob->lay;
}
else { /* generate pixel sized hair strand */
static_particle_strand(ob, ma, orco, vec, vec1, (ctime-pa->time)/(mtime-pa->time));
}
}