Implement bump-mapping in pcg
This commit is contained in:
parent
e1b1030160
commit
2a3337a912
1 changed files with 50 additions and 0 deletions
50
libs/pcg/include/psemek/pcg/bump.hpp
Normal file
50
libs/pcg/include/psemek/pcg/bump.hpp
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
#pragma once
|
||||
|
||||
#include <psemek/pcg/seamless.hpp>
|
||||
|
||||
#include <psemek/gfx/pixmap.hpp>
|
||||
|
||||
namespace psemek::pcg
|
||||
{
|
||||
|
||||
inline gfx::basic_pixmap<geom::vector<float, 3>> bump(gfx::pixmap_float const & height_map, seamless_tag)
|
||||
{
|
||||
gfx::basic_pixmap<geom::vector<float, 3>> result(height_map.dims());
|
||||
|
||||
float const dx = 1.f / result.width();
|
||||
float const dy = 1.f / result.height();
|
||||
|
||||
for (auto i : result.indices())
|
||||
{
|
||||
auto ix0 = i;
|
||||
ix0[0] = (ix0[0] + result.width() - 1) % result.width();
|
||||
|
||||
auto ix1 = i;
|
||||
ix1[0] = (ix1[0] + 1) % result.width();
|
||||
|
||||
auto iy0 = i;
|
||||
iy0[1] = (iy0[1] + result.height() - 1) % result.height();
|
||||
|
||||
auto iy1 = i;
|
||||
iy1[1] = (iy1[1] + 1) % result.height();
|
||||
|
||||
float h = height_map(i);
|
||||
float hx0 = height_map(ix0);
|
||||
float hx1 = height_map(ix1);
|
||||
float hy0 = height_map(iy0);
|
||||
float hy1 = height_map(iy1);
|
||||
|
||||
auto n = geom::vector<float, 3>::zero();
|
||||
|
||||
n += geom::normalized(geom::vector{hx0 - h, 0.f, dx});
|
||||
n += geom::normalized(geom::vector{h - hx1, 0.f, dx});
|
||||
n += geom::normalized(geom::vector{0.f, hy0 - h, dy});
|
||||
n += geom::normalized(geom::vector{0.f, h - hy1, dy});
|
||||
|
||||
result(i) = geom::normalized(n);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue