bgfx/examples/41-tess/isubd.sh
kingscallop e5d25a7d88
Fixes example 41 on OpenGL (#2234)
The glsl function findMSB is overriden, causing an error on Windows and Linux
when running on AMD or Intel gpus. Nvidia, for whatever reason, seems to allow
overriding the function.
2020-08-16 11:43:28 -07:00

128 lines
2.2 KiB
Bash

uint findMSB_(uint x)
{
uint i;
uint mask;
uint res = -1;
for (i = 0; i < 32; i++)
{
mask = 0x80000000 >> i;
if ((x & mask) != 0)
{
res = 31 - i;
break;
}
}
return res;
}
uint parentKey(in uint key)
{
return (key >> 1u);
}
void childrenKeys(in uint key, out uint children[2])
{
children[0] = (key << 1u) | 0u;
children[1] = (key << 1u) | 1u;
}
bool isRootKey(in uint key)
{
return (key == 1u);
}
bool isLeafKey(in uint key)
{
return findMSB_(key) == 31;
}
bool isChildZeroKey(in uint key)
{
return ((key & 1u) == 0u);
}
// barycentric interpolation
vec3 berp(in vec3 v[3], in vec2 u)
{
return v[0] + u.x * (v[1] - v[0]) + u.y * (v[2] - v[0]);
}
vec4 berp(in vec4 v[3], in vec2 u)
{
return v[0] + u.x * (v[1] - v[0]) + u.y * (v[2] - v[0]);
}
// get xform from bit value
mat3 bitToXform(in uint bit)
{
float b = float(bit);
float c = 1.0f - b;
vec3 c1 = vec3(0.0f, c , b );
vec3 c2 = vec3(0.5f, b , 0.0f);
vec3 c3 = vec3(0.5f, 0.0f, c );
return mtxFromCols(c1, c2, c3);
}
// get xform from key
mat3 keyToXform(in uint key)
{
vec3 c1 = vec3(1.0f, 0.0f, 0.0f);
vec3 c2 = vec3(0.0f, 1.0f, 0.0f);
vec3 c3 = vec3(0.0f, 0.0f, 1.0f);
mat3 xf = mtxFromCols(c1, c2, c3);
while (key > 1u) {
xf = mul(xf, bitToXform(key & 1u));
key = key >> 1u;
}
return xf;
}
// get xform from key as well as xform from parent key
mat3 keyToXform(in uint key, out mat3 xfp)
{
xfp = keyToXform(parentKey(key));
return keyToXform(key);
}
// subdivision routine (vertex position only)
void subd(in uint key, in vec4 v_in[3], out vec4 v_out[3])
{
mat3 xf = keyToXform(key);
mat4x3 m = mtxFromRows(v_in[0], v_in[1], v_in[2]);
mat4x3 v = mul(xf, m);
v_out[0] = mtxGetRow(v, 0);
v_out[1] = mtxGetRow(v, 1);
v_out[2] = mtxGetRow(v, 2);
}
// subdivision routine (vertex position only)
// also computes parent position
void subd(in uint key, in vec4 v_in[3], out vec4 v_out[3], out vec4 v_out_p[3])
{
mat3 xfp; mat3 xf = keyToXform(key, xfp);
mat4x3 m = mtxFromRows(v_in[0], v_in[1], v_in[2]);
mat4x3 v = mul(xf, m);
mat4x3 vp = mul(xfp, m);
v_out[0] = mtxGetRow(v, 0);
v_out[1] = mtxGetRow(v, 1);
v_out[2] = mtxGetRow(v, 2);
v_out_p[0] = mtxGetRow(vp, 0);
v_out_p[1] = mtxGetRow(vp, 1);
v_out_p[2] = mtxGetRow(vp, 2);
}