|
|
On 10/13/20 4:55 PM, Bald Eagle wrote:
> Added a spherical/Cartesian length function version.
> (Midway, right/left)
>
> Looks pretty similar to the stock quilted.
>
> Still throwing darts in the dim light....
>
I'd guess there isn't much use in translating the non-working normal.cpp
quilted code so below is an my initial attempt at a fix for surfaces
perpendicular to the x, y and z axis. This updated code passes most of
my test cases but of course has varying results with respect to curved
surfaces - as does the original. Whether this is what we want for a
best quilted fix - I don't know! I don't think we really know what the
original coders expected or perhaps even got to one degree or another in
older versions of code
One puzzle for me is I looked at no_bump_scale in the upper right render
(C). I expected it to have some effect on all three surfaces, but it's
only changing the -x one! Not dug into code. Anyone have an idea what's
going on? This touches on me not being a big user of normals. Not sure
I've ever used no_bump_scale myself.
DBL just means double - an sdl float. The normal is the incoming normal.
fabs is abs in sdl. The () ? ... : ... stuff is select. floor and ceil
are floor and ceil. The quilt_cubic you, Bill, understand better than me
at this point.
This the sort of thing you're looking for?
----------
DBL nx = normal.x(), ny = normal.y(), nz = normal.z();
DBL ax = fabs(nx), ay = fabs(ny), az = fabs(nz);
DBL x = EPoint.x(), y = EPoint.y(), z = EPoint.z();
DBL flx = floor(x), fly = floor(y), flz = floor(z);
DBL sx = (x-flx < 0.5) ? -1 : 1,
sy = (y-fly < 0.5) ? -1 : 1,
sz = (z-flz < 0.5) ? -1 : 1;
DBL xm = flx+(ceil(flx+4.4e-8)-flx)/2.0;
DBL ym = fly+(ceil(fly+4.4e-8)-fly)/2.0;
DBL zm = flz+(ceil(flz+4.4e-8)-flz)/2.0;
DBL c0 = pattern->Control0, c1 = pattern->Control1;
DBL na = Tnormal->Amount;
if ((ax >= ay) && (ax >= az))
{
DBL vy = quilt_cubic(fabs(y-ym),c0,c1)*sy;
DBL vz = quilt_cubic(fabs(z-zm),c0,c1)*sz;
nz = (nz < 0.0) ? -1 : 1;
ny = ny + (na * vy);
nz = nz + (na * vz);
}
else if ((ay >= ax) && (ay >= az))
{
DBL vx = quilt_cubic(fabs(x-xm),c0,c1)*sx;
DBL vz = quilt_cubic(fabs(z-zm),c0,c1)*sz;
nx = nx + (na * vx);
ny = (ny < 0.0) ? -1 : 1;
nz = nz + (na * vz);
}
else
{
DBL vx = quilt_cubic(fabs(x-xm),c0,c1)*sx;
DBL vy = quilt_cubic(fabs(y-ym),c0,c1)*sy;
nx = nx + (na * vx);
ny = ny + (na * vy);
nz = (nz < 0.0) ? -1 : 1;
}
normal = Vector3d(nx,ny,nz);
normal.normalize(); // <-- this normal vector what gets updated.
---------
All images in attached image using AA. Why noisy v3.8 results of(A)
looks less noisy at the expense of being quite slow.
A) v3.8 at master.
normal {quilted 0.5 control0 +1.0 control1 +1.0 scale 0.5}
B) povr with a fix.
normal {quilted 0.5 control0 +1.0 control1 +1.0 scale 0.5}
C) normal {quilted 0.5 control0 +1.0 control1 +1.0
no_bump_scale scale 0.5}
D) normal {quilted 0.5 control0 +0.0 control1 +1.0 scale 0.5}
E) normal {quilted 0.5 control0 +1.0 control1 +0.0 scale 0.5}
F) normal {quilted 0.5 control0 +0.0 control1 +0.0 scale 0.5}
G) normal {quilted 0.5 control0 +0.3 control1 +0.3 scale 0.5}
H) normal {quilted 0.5 control0 -0.3 control1 +0.3 scale 0.5}
I) normal {quilted 0.5 control0 +0.3 control1 -0.3 scale 0.5}
Bill P.
Post a reply to this message
Attachments:
Download 'aquiltednormalfix.jpg' (137 KB)
Preview of image 'aquiltednormalfix.jpg'
|
|