forked from bartvdbraak/blender
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:
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)
|
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;
|
if(har) har->lay= ob->lay;
|
||||||
}
|
}
|
||||||
else { /* generate pixel sized hair strands */
|
else { /* generate pixel sized hair strand */
|
||||||
float cross[3], w, dx, dy;
|
static_particle_strand(ob, ma, orco, vec, vec1, (ctime-pa->time)/(mtime-pa->time));
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user