Docking kind of works but overall unstable

* crashes when reloading render module
* spurious crashes on the first frame
simple_math_single_header
Martin Felis 2018-02-12 13:05:19 +01:00
parent bf5c1a5528
commit dc1ee2e33c
87 changed files with 4005 additions and 315 deletions

View File

@ -19,8 +19,8 @@
#include "renderer_gl.cpp" #include "renderer_gl.cpp"
#include "renderer_vk.cpp" #include "renderer_vk.cpp"
#include "renderer_gnm.cpp" #include "renderer_gnm.cpp"
#include "shader_dxbc.cpp" //#include "shader_dxbc.cpp"
#include "shader_dx9bc.cpp" //#include "shader_dx9bc.cpp"
#include "shader_spirv.cpp" #include "shader_spirv.cpp"
#include "topology.cpp" #include "topology.cpp"
#include "vertexdecl.cpp" #include "vertexdecl.cpp"

View File

@ -81,6 +81,7 @@ SUBDIRS (
SET ( protot_SRCS SET ( protot_SRCS
src/RuntimeModuleManager.cc src/RuntimeModuleManager.cc
src/Utils.cc
3rdparty/glfw/deps/glad.c 3rdparty/glfw/deps/glad.c
3rdparty/imgui_dock/imgui_dock.cpp 3rdparty/imgui_dock/imgui_dock.cpp

6
data/shaders/Makefile Normal file
View File

@ -0,0 +1,6 @@
all:
cd debug && $(MAKE)
cd lines && $(MAKE)
cd scene && $(MAKE)
cd shadowmap && $(MAKE)
cd skybox && $(MAKE)

View File

@ -0,0 +1,322 @@
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#ifndef BGFX_SHADER_H_HEADER_GUARD
#define BGFX_SHADER_H_HEADER_GUARD
#if !defined(BGFX_CONFIG_MAX_BONES)
# define BGFX_CONFIG_MAX_BONES 32
#endif // !defined(BGFX_CONFIG_MAX_BONES)
#ifndef __cplusplus
#if BGFX_SHADER_LANGUAGE_HLSL
# define dFdx(_x) ddx(_x)
# define dFdy(_y) ddy(-_y)
# define inversesqrt(_x) rsqrt(_x)
# define fract(_x) frac(_x)
# define bvec2 bool2
# define bvec3 bool3
# define bvec4 bool4
# if BGFX_SHADER_LANGUAGE_HLSL > 3
struct BgfxSampler2D
{
SamplerState m_sampler;
Texture2D m_texture;
};
vec4 bgfxTexture2D(BgfxSampler2D _sampler, vec2 _coord)
{
return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
}
vec4 bgfxTexture2DLod(BgfxSampler2D _sampler, vec2 _coord, float _level)
{
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
}
vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec3 _coord)
{
vec2 coord = _coord.xy * rcp(_coord.z);
return _sampler.m_texture.Sample(_sampler.m_sampler, coord);
}
vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec4 _coord)
{
vec2 coord = _coord.xy * rcp(_coord.w);
return _sampler.m_texture.Sample(_sampler.m_sampler, coord);
}
struct BgfxSampler2DShadow
{
SamplerComparisonState m_sampler;
Texture2D m_texture;
};
float bgfxShadow2D(BgfxSampler2DShadow _sampler, vec3 _coord)
{
return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, _coord.xy, _coord.z * 2.0 - 1.0);
}
float bgfxShadow2DProj(BgfxSampler2DShadow _sampler, vec4 _coord)
{
vec3 coord = _coord.xyz * rcp(_coord.w);
return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, coord.xy, coord.z * 2.0 - 1.0);
}
struct BgfxSampler3D
{
SamplerState m_sampler;
Texture3D m_texture;
};
struct BgfxISampler3D
{
Texture3D<ivec4> m_texture;
};
struct BgfxUSampler3D
{
Texture3D<uvec4> m_texture;
};
vec4 bgfxTexture3D(BgfxSampler3D _sampler, vec3 _coord)
{
return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
}
vec4 bgfxTexture3DLod(BgfxSampler3D _sampler, vec3 _coord, float _level)
{
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
}
ivec4 bgfxTexture3D(BgfxISampler3D _sampler, vec3 _coord)
{
ivec3 size;
_sampler.m_texture.GetDimensions(size.x, size.y, size.z);
return _sampler.m_texture.Load(ivec4(_coord * size, 0) );
}
uvec4 bgfxTexture3D(BgfxUSampler3D _sampler, vec3 _coord)
{
uvec3 size;
_sampler.m_texture.GetDimensions(size.x, size.y, size.z);
return _sampler.m_texture.Load(uvec4(_coord * size, 0) );
}
struct BgfxSamplerCube
{
SamplerState m_sampler;
TextureCube m_texture;
};
vec4 bgfxTextureCube(BgfxSamplerCube _sampler, vec3 _coord)
{
return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
}
vec4 bgfxTextureCubeLod(BgfxSamplerCube _sampler, vec3 _coord, float _level)
{
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
}
# define SAMPLER2D(_name, _reg) \
uniform SamplerState _name ## Sampler : register(s[_reg]); \
uniform Texture2D _name ## Texture : register(t[_reg]); \
static BgfxSampler2D _name = { _name ## Sampler, _name ## Texture }
# define sampler2D BgfxSampler2D
# define texture2D(_sampler, _coord) bgfxTexture2D(_sampler, _coord)
# define texture2DLod(_sampler, _coord, _level) bgfxTexture2DLod(_sampler, _coord, _level)
# define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord)
# define SAMPLER2DSHADOW(_name, _reg) \
uniform SamplerComparisonState _name ## Sampler : register(s[_reg]); \
uniform Texture2D _name ## Texture : register(t[_reg]); \
static BgfxSampler2DShadow _name = { _name ## Sampler, _name ## Texture }
# define sampler2DShadow BgfxSampler2DShadow
# define shadow2D(_sampler, _coord) bgfxShadow2D(_sampler, _coord)
# define shadow2DProj(_sampler, _coord) bgfxShadow2DProj(_sampler, _coord)
# define SAMPLER3D(_name, _reg) \
uniform SamplerState _name ## Sampler : register(s[_reg]); \
uniform Texture3D _name ## Texture : register(t[_reg]); \
static BgfxSampler3D _name = { _name ## Sampler, _name ## Texture }
# define ISAMPLER3D(_name, _reg) \
uniform Texture3D<ivec4> _name ## Texture : register(t[_reg]); \
static BgfxISampler3D _name = { _name ## Texture }
# define USAMPLER3D(_name, _reg) \
uniform Texture3D<uvec4> _name ## Texture : register(t[_reg]); \
static BgfxUSampler3D _name = { _name ## Texture }
# define sampler3D BgfxSampler3D
# define texture3D(_sampler, _coord) bgfxTexture3D(_sampler, _coord)
# define texture3DLod(_sampler, _coord, _level) bgfxTexture3DLod(_sampler, _coord, _level)
# define SAMPLERCUBE(_name, _reg) \
uniform SamplerState _name ## Sampler : register(s[_reg]); \
uniform TextureCube _name ## Texture : register(t[_reg]); \
static BgfxSamplerCube _name = { _name ## Sampler, _name ## Texture }
# define samplerCube BgfxSamplerCube
# define textureCube(_sampler, _coord) bgfxTextureCube(_sampler, _coord)
# define textureCubeLod(_sampler, _coord, _level) bgfxTextureCubeLod(_sampler, _coord, _level)
# else
# define sampler2DShadow sampler2D
vec4 bgfxTexture2DProj(sampler2D _sampler, vec3 _coord)
{
return tex2Dproj(_sampler, vec4(_coord.xy, 0.0, _coord.z) );
}
vec4 bgfxTexture2DProj(sampler2D _sampler, vec4 _coord)
{
return tex2Dproj(_sampler, _coord);
}
float bgfxShadow2D(sampler2DShadow _sampler, vec3 _coord)
{
#if 0
float occluder = tex2D(_sampler, _coord.xy).x;
return step(_coord.z * 2.0 - 1.0, occluder);
#else
return tex2Dproj(_sampler, vec4(_coord.xy, _coord.z * 2.0 - 1.0, 1.0) ).x;
#endif // 0
}
float bgfxShadow2DProj(sampler2DShadow _sampler, vec4 _coord)
{
#if 0
vec3 coord = _coord.xyz * rcp(_coord.w);
float occluder = tex2D(_sampler, coord.xy).x;
return step(coord.z * 2.0 - 1.0, occluder);
#else
return tex2Dproj(_sampler, _coord).x;
#endif // 0
}
# define SAMPLER2D(_name, _reg) uniform sampler2D _name : register(s ## _reg)
# define texture2D(_sampler, _coord) tex2D(_sampler, _coord)
# define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord)
# define SAMPLER2DSHADOW(_name, _reg) uniform sampler2DShadow _name : register(s ## _reg)
# define shadow2D(_sampler, _coord) bgfxShadow2D(_sampler, _coord)
# define shadow2DProj(_sampler, _coord) bgfxShadow2DProj(_sampler, _coord)
# define SAMPLER3D(_name, _reg) uniform sampler3D _name : register(s ## _reg)
# define texture3D(_sampler, _coord) tex3D(_sampler, _coord)
# define SAMPLERCUBE(_name, _reg) uniform samplerCUBE _name : register(s[_reg])
# define textureCube(_sampler, _coord) texCUBE(_sampler, _coord)
# if BGFX_SHADER_LANGUAGE_HLSL == 2
# define texture2DLod(_sampler, _coord, _level) tex2D(_sampler, (_coord).xy)
# define texture3DLod(_sampler, _coord, _level) tex3D(_sampler, (_coord).xyz)
# define textureCubeLod(_sampler, _coord, _level) texCUBE(_sampler, (_coord).xyz)
# else
# define texture2DLod(_sampler, _coord, _level) tex2Dlod(_sampler, vec4( (_coord).xy, 0.0, _level) )
# define texture3DLod(_sampler, _coord, _level) tex3Dlod(_sampler, vec4( (_coord).xyz, _level) )
# define textureCubeLod(_sampler, _coord, _level) texCUBElod(_sampler, vec4( (_coord).xyz, _level) )
# endif // BGFX_SHADER_LANGUAGE_HLSL == 2
# endif // BGFX_SHADER_LANGUAGE_HLSL > 3
vec2 vec2_splat(float _x) { return vec2(_x, _x); }
vec3 vec3_splat(float _x) { return vec3(_x, _x, _x); }
vec4 vec4_splat(float _x) { return vec4(_x, _x, _x, _x); }
uvec2 uvec2_splat(uint _x) { return uvec2(_x, _x); }
uvec3 uvec3_splat(uint _x) { return uvec3(_x, _x, _x); }
uvec4 uvec4_splat(uint _x) { return uvec4(_x, _x, _x, _x); }
vec3 instMul(vec3 _vec, mat3 _mtx) { return mul(_mtx, _vec); }
vec3 instMul(mat3 _mtx, vec3 _vec) { return mul(_vec, _mtx); }
vec4 instMul(vec4 _vec, mat4 _mtx) { return mul(_mtx, _vec); }
vec4 instMul(mat4 _mtx, vec4 _vec) { return mul(_vec, _mtx); }
bvec2 lessThan(vec2 _a, vec2 _b) { return _a < _b; }
bvec3 lessThan(vec3 _a, vec3 _b) { return _a < _b; }
bvec4 lessThan(vec4 _a, vec4 _b) { return _a < _b; }
bvec2 lessThanEqual(vec2 _a, vec2 _b) { return _a <= _b; }
bvec3 lessThanEqual(vec3 _a, vec3 _b) { return _a <= _b; }
bvec4 lessThanEqual(vec4 _a, vec4 _b) { return _a <= _b; }
bvec2 greaterThan(vec2 _a, vec2 _b) { return _a > _b; }
bvec3 greaterThan(vec3 _a, vec3 _b) { return _a > _b; }
bvec4 greaterThan(vec4 _a, vec4 _b) { return _a > _b; }
bvec2 greaterThanEqual(vec2 _a, vec2 _b) { return _a >= _b; }
bvec3 greaterThanEqual(vec3 _a, vec3 _b) { return _a >= _b; }
bvec4 greaterThanEqual(vec4 _a, vec4 _b) { return _a >= _b; }
bvec2 notEqual(vec2 _a, vec2 _b) { return _a != _b; }
bvec3 notEqual(vec3 _a, vec3 _b) { return _a != _b; }
bvec4 notEqual(vec4 _a, vec4 _b) { return _a != _b; }
bvec2 equal(vec2 _a, vec2 _b) { return _a == _b; }
bvec3 equal(vec3 _a, vec3 _b) { return _a == _b; }
bvec4 equal(vec4 _a, vec4 _b) { return _a == _b; }
float mix(float _a, float _b, float _t) { return lerp(_a, _b, _t); }
vec2 mix(vec2 _a, vec2 _b, vec2 _t) { return lerp(_a, _b, _t); }
vec3 mix(vec3 _a, vec3 _b, vec3 _t) { return lerp(_a, _b, _t); }
vec4 mix(vec4 _a, vec4 _b, vec4 _t) { return lerp(_a, _b, _t); }
float mod(float _a, float _b) { return _a - _b * floor(_a / _b); }
vec2 mod(vec2 _a, vec2 _b) { return _a - _b * floor(_a / _b); }
vec3 mod(vec3 _a, vec3 _b) { return _a - _b * floor(_a / _b); }
vec4 mod(vec4 _a, vec4 _b) { return _a - _b * floor(_a / _b); }
#else
# define atan2(_x, _y) atan(_x, _y)
# define mul(_a, _b) ( (_a) * (_b) )
# define saturate(_x) clamp(_x, 0.0, 1.0)
# define SAMPLER2D(_name, _reg) uniform sampler2D _name
# define SAMPLER3D(_name, _reg) uniform sampler3D _name
# define SAMPLERCUBE(_name, _reg) uniform samplerCube _name
# define SAMPLER2DSHADOW(_name, _reg) uniform sampler2DShadow _name
# define vec2_splat(_x) vec2(_x)
# define vec3_splat(_x) vec3(_x)
# define vec4_splat(_x) vec4(_x)
# define uvec2_splat(_x) uvec2(_x)
# define uvec3_splat(_x) uvec3(_x)
# define uvec4_splat(_x) uvec4(_x)
# if BGFX_SHADER_LANGUAGE_GLSL >= 130
# define ISAMPLER3D(_name, _reg) uniform isampler3D _name
# define USAMPLER3D(_name, _reg) uniform usampler3D _name
ivec4 texture3D(isampler3D _sampler, vec3 _coord) { return texture(_sampler, _coord); }
uvec4 texture3D(usampler3D _sampler, vec3 _coord) { return texture(_sampler, _coord); }
# endif // BGFX_SHADER_LANGUAGE_GLSL >= 130
vec3 instMul(vec3 _vec, mat3 _mtx) { return mul(_vec, _mtx); }
vec3 instMul(mat3 _mtx, vec3 _vec) { return mul(_mtx, _vec); }
vec4 instMul(vec4 _vec, mat4 _mtx) { return mul(_vec, _mtx); }
vec4 instMul(mat4 _mtx, vec4 _vec) { return mul(_mtx, _vec); }
float rcp(float _a) { return 1.0/_a; }
vec2 rcp(vec2 _a) { return vec2(1.0)/_a; }
vec3 rcp(vec3 _a) { return vec3(1.0)/_a; }
vec4 rcp(vec4 _a) { return vec4(1.0)/_a; }
#endif // BGFX_SHADER_LANGUAGE_*
uniform vec4 u_viewRect;
uniform vec4 u_viewTexel;
uniform mat4 u_view;
uniform mat4 u_invView;
uniform mat4 u_proj;
uniform mat4 u_invProj;
uniform mat4 u_viewProj;
uniform mat4 u_invViewProj;
uniform mat4 u_model[BGFX_CONFIG_MAX_BONES];
uniform mat4 u_modelView;
uniform mat4 u_modelViewProj;
uniform vec4 u_alphaRef4;
#define u_alphaRef u_alphaRef4.x
#endif // __cplusplus
#endif // BGFX_SHADER_H_HEADER_GUARD

View File

@ -0,0 +1,7 @@
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include <bgfx_shader.sh>
#include "shaderlib.sh"

View File

@ -0,0 +1,352 @@
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#ifndef __SHADERLIB_SH__
#define __SHADERLIB_SH__
vec4 encodeRE8(float _r)
{
float exponent = ceil(log2(_r) );
return vec4(_r / exp2(exponent)
, 0.0
, 0.0
, (exponent + 128.0) / 255.0
);
}
float decodeRE8(vec4 _re8)
{
float exponent = _re8.w * 255.0 - 128.0;
return _re8.x * exp2(exponent);
}
vec4 encodeRGBE8(vec3 _rgb)
{
vec4 rgbe8;
float maxComponent = max(max(_rgb.x, _rgb.y), _rgb.z);
float exponent = ceil(log2(maxComponent) );
rgbe8.xyz = _rgb / exp2(exponent);
rgbe8.w = (exponent + 128.0) / 255.0;
return rgbe8;
}
vec3 decodeRGBE8(vec4 _rgbe8)
{
float exponent = _rgbe8.w * 255.0 - 128.0;
vec3 rgb = _rgbe8.xyz * exp2(exponent);
return rgb;
}
vec3 encodeNormalUint(vec3 _normal)
{
return _normal * 0.5 + 0.5;
}
vec3 decodeNormalUint(vec3 _encodedNormal)
{
return _encodedNormal * 2.0 - 1.0;
}
vec2 encodeNormalSphereMap(vec3 _normal)
{
return normalize(_normal.xy) * sqrt(_normal.z * 0.5 + 0.5);
}
vec3 decodeNormalSphereMap(vec2 _encodedNormal)
{
float zz = dot(_encodedNormal, _encodedNormal) * 2.0 - 1.0;
return vec3(normalize(_encodedNormal.xy) * sqrt(1.0 - zz*zz), zz);
}
// Reference:
// Octahedron normal vector encoding
// http://kriscg.blogspot.com/2014/04/octahedron-normal-vector-encoding.html
vec2 octahedronWrap(vec2 _val)
{
return (1.0 - abs(_val.yx) )
* mix(vec2_splat(-1.0), vec2_splat(1.0), vec2(greaterThanEqual(_val.xy, vec2_splat(0.0) ) ) );
}
vec2 encodeNormalOctahedron(vec3 _normal)
{
_normal /= abs(_normal.x) + abs(_normal.y) + abs(_normal.z);
_normal.xy = _normal.z >= 0.0 ? _normal.xy : octahedronWrap(_normal.xy);
_normal.xy = _normal.xy * 0.5 + 0.5;
return _normal.xy;
}
vec3 decodeNormalOctahedron(vec2 _encodedNormal)
{
_encodedNormal = _encodedNormal * 2.0 - 1.0;
vec3 normal;
normal.z = 1.0 - abs(_encodedNormal.x) - abs(_encodedNormal.y);
normal.xy = normal.z >= 0.0 ? _encodedNormal.xy : octahedronWrap(_encodedNormal.xy);
return normalize(normal);
}
// Reference:
// RGB/XYZ Matrices
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
vec3 convertRGB2XYZ(vec3 _rgb)
{
vec3 xyz;
xyz.x = dot(vec3(0.4124564, 0.3575761, 0.1804375), _rgb);
xyz.y = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
xyz.z = dot(vec3(0.0193339, 0.1191920, 0.9503041), _rgb);
return xyz;
}
vec3 convertXYZ2RGB(vec3 _xyz)
{
vec3 rgb;
rgb.x = dot(vec3( 3.2404542, -1.5371385, -0.4985314), _xyz);
rgb.y = dot(vec3(-0.9692660, 1.8760108, 0.0415560), _xyz);
rgb.z = dot(vec3( 0.0556434, -0.2040259, 1.0572252), _xyz);
return rgb;
}
vec3 convertXYZ2Yxy(vec3 _xyz)
{
// Reference:
// http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_xyY.html
float inv = 1.0/dot(_xyz, vec3(1.0, 1.0, 1.0) );
return vec3(_xyz.y, _xyz.x*inv, _xyz.y*inv);
}
vec3 convertYxy2XYZ(vec3 _Yxy)
{
// Reference:
// http://www.brucelindbloom.com/index.html?Eqn_xyY_to_XYZ.html
vec3 xyz;
xyz.x = _Yxy.x*_Yxy.y/_Yxy.z;
xyz.y = _Yxy.x;
xyz.z = _Yxy.x*(1.0 - _Yxy.y - _Yxy.z)/_Yxy.z;
return xyz;
}
vec3 convertRGB2Yxy(vec3 _rgb)
{
return convertXYZ2Yxy(convertRGB2XYZ(_rgb) );
}
vec3 convertYxy2RGB(vec3 _Yxy)
{
return convertXYZ2RGB(convertYxy2XYZ(_Yxy) );
}
vec3 convertRGB2Yuv(vec3 _rgb)
{
vec3 yuv;
yuv.x = dot(_rgb, vec3(0.299, 0.587, 0.114) );
yuv.y = (_rgb.x - yuv.x)*0.713 + 0.5;
yuv.z = (_rgb.z - yuv.x)*0.564 + 0.5;
return yuv;
}
vec3 convertYuv2RGB(vec3 _yuv)
{
vec3 rgb;
rgb.x = _yuv.x + 1.403*(_yuv.y-0.5);
rgb.y = _yuv.x - 0.344*(_yuv.y-0.5) - 0.714*(_yuv.z-0.5);
rgb.z = _yuv.x + 1.773*(_yuv.z-0.5);
return rgb;
}
vec3 convertRGB2YIQ(vec3 _rgb)
{
vec3 yiq;
yiq.x = dot(vec3(0.299, 0.587, 0.114 ), _rgb);
yiq.y = dot(vec3(0.595716, -0.274453, -0.321263), _rgb);
yiq.z = dot(vec3(0.211456, -0.522591, 0.311135), _rgb);
return yiq;
}
vec3 convertYIQ2RGB(vec3 _yiq)
{
vec3 rgb;
rgb.x = dot(vec3(1.0, 0.9563, 0.6210), _yiq);
rgb.y = dot(vec3(1.0, -0.2721, -0.6474), _yiq);
rgb.z = dot(vec3(1.0, -1.1070, 1.7046), _yiq);
return rgb;
}
vec3 toLinear(vec3 _rgb)
{
return pow(abs(_rgb), vec3_splat(2.2) );
}
vec4 toLinear(vec4 _rgba)
{
return vec4(toLinear(_rgba.xyz), _rgba.w);
}
vec3 toLinearAccurate(vec3 _rgb)
{
vec3 lo = _rgb / 12.92;
vec3 hi = pow( (_rgb + 0.055) / 1.055, vec3_splat(2.4) );
vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.04045) ) ) );
return rgb;
}
vec4 toLinearAccurate(vec4 _rgba)
{
return vec4(toLinearAccurate(_rgba.xyz), _rgba.w);
}
float toGamma(float _r)
{
return pow(abs(_r), 1.0/2.2);
}
vec3 toGamma(vec3 _rgb)
{
return pow(abs(_rgb), vec3_splat(1.0/2.2) );
}
vec4 toGamma(vec4 _rgba)
{
return vec4(toGamma(_rgba.xyz), _rgba.w);
}
vec3 toGammaAccurate(vec3 _rgb)
{
vec3 lo = _rgb * 12.92;
vec3 hi = pow(abs(_rgb), vec3_splat(1.0/2.4) ) * 1.055 - 0.055;
vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.0031308) ) ) );
return rgb;
}
vec4 toGammaAccurate(vec4 _rgba)
{
return vec4(toGammaAccurate(_rgba.xyz), _rgba.w);
}
vec3 toReinhard(vec3 _rgb)
{
return toGamma(_rgb/(_rgb+vec3_splat(1.0) ) );
}
vec4 toReinhard(vec4 _rgba)
{
return vec4(toReinhard(_rgba.xyz), _rgba.w);
}
vec3 toFilmic(vec3 _rgb)
{
_rgb = max(vec3_splat(0.0), _rgb - 0.004);
_rgb = (_rgb*(6.2*_rgb + 0.5) ) / (_rgb*(6.2*_rgb + 1.7) + 0.06);
return _rgb;
}
vec4 toFilmic(vec4 _rgba)
{
return vec4(toFilmic(_rgba.xyz), _rgba.w);
}
vec3 luma(vec3 _rgb)
{
float yy = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
return vec3_splat(yy);
}
vec4 luma(vec4 _rgba)
{
return vec4(luma(_rgba.xyz), _rgba.w);
}
vec3 conSatBri(vec3 _rgb, vec3 _csb)
{
vec3 rgb = _rgb * _csb.z;
rgb = mix(luma(rgb), rgb, _csb.y);
rgb = mix(vec3_splat(0.5), rgb, _csb.x);
return rgb;
}
vec4 conSatBri(vec4 _rgba, vec3 _csb)
{
return vec4(conSatBri(_rgba.xyz, _csb), _rgba.w);
}
vec3 posterize(vec3 _rgb, float _numColors)
{
return floor(_rgb*_numColors) / _numColors;
}
vec4 posterize(vec4 _rgba, float _numColors)
{
return vec4(posterize(_rgba.xyz, _numColors), _rgba.w);
}
vec3 sepia(vec3 _rgb)
{
vec3 color;
color.x = dot(_rgb, vec3(0.393, 0.769, 0.189) );
color.y = dot(_rgb, vec3(0.349, 0.686, 0.168) );
color.z = dot(_rgb, vec3(0.272, 0.534, 0.131) );
return color;
}
vec4 sepia(vec4 _rgba)
{
return vec4(sepia(_rgba.xyz), _rgba.w);
}
vec3 blendOverlay(vec3 _base, vec3 _blend)
{
vec3 lt = 2.0 * _base * _blend;
vec3 gte = 1.0 - 2.0 * (1.0 - _base) * (1.0 - _blend);
return mix(lt, gte, step(vec3_splat(0.5), _base) );
}
vec4 blendOverlay(vec4 _base, vec4 _blend)
{
return vec4(blendOverlay(_base.xyz, _blend.xyz), _base.w);
}
vec3 adjustHue(vec3 _rgb, float _hue)
{
vec3 yiq = convertRGB2YIQ(_rgb);
float angle = _hue + atan2(yiq.z, yiq.y);
float len = length(yiq.yz);
return convertYIQ2RGB(vec3(yiq.x, len*cos(angle), len*sin(angle) ) );
}
vec4 packFloatToRgba(float _value)
{
const vec4 shift = vec4(256 * 256 * 256, 256 * 256, 256, 1.0);
const vec4 mask = vec4(0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
vec4 comp = fract(_value * shift);
comp -= comp.xxyz * mask;
return comp;
}
float unpackRgbaToFloat(vec4 _rgba)
{
const vec4 shift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);
return dot(_rgba, shift);
}
vec2 packHalfFloat(float _value)
{
const vec2 shift = vec2(256, 1.0);
const vec2 mask = vec2(0, 1.0 / 256.0);
vec2 comp = fract(_value * shift);
comp -= comp.xx * mask;
return comp;
}
float unpackHalfFloat(vec2 _rg)
{
const vec2 shift = vec2(1.0 / 256.0, 1.0);
return dot(_rg, shift);
}
float random(vec2 _uv)
{
return fract(sin(dot(_uv.xy, vec2(12.9898, 78.233) ) ) * 43758.5453);
}
#endif // __SHADERLIB_SH__

View File

@ -0,0 +1,3 @@
all: fs_debug.sc varying.def.sc vs_debug.sc
../../../build/3rdparty/bgfx/shaderc -f fs_debug.sc -o ../glsl/fs_debug.sc.bin --type fragment --platform linux -i ../common --varyingdef -p 120
../../../build/3rdparty/bgfx/shaderc -f vs_debug.sc -o ../glsl/vs_debug.sc.bin --type vertex --platform linux -i ../common --varyingdef -p 120

View File

@ -0,0 +1,14 @@
$input v_color0
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
uniform vec4 u_color;
void main()
{
gl_FragColor = u_color * v_color0;
}

Binary file not shown.

View File

@ -0,0 +1,13 @@
vec3 v_view : TEXCOORD0 = vec3(0.0, 0.0, 0.0);
vec4 v_shadowcoord : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0);
vec4 v_position : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0);
vec3 v_dir : TEXCOORD3 = vec3(0.0, 0.0, 0.0);
vec2 v_texcoord0 : TEXCOORD4 = vec2(0.0, 0.0);
vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0);
vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0);
vec3 a_position : POSITION;
vec4 a_normal : NORMAL;
vec4 a_color0 : COLOR0;
vec2 a_texcoord0 : TEXCOORD0;

View File

@ -0,0 +1,15 @@
$input a_position, a_color0
$output v_color0
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
void main()
{
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
v_color0 = a_color0;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,503 @@
static const uint8_t fs_sms_mesh_bin[7988] =
{
0x46, 0x53, 0x48, 0x04, 0x08, 0x70, 0x6a, 0x48, 0x03, 0x00, 0x0a, 0x75, 0x5f, 0x6c, 0x69, 0x67, // FSH..pjH...u_lig
0x68, 0x74, 0x50, 0x6f, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x07, 0x75, 0x5f, 0x63, 0x6f, // htPos.......u_co
0x6c, 0x6f, 0x72, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, // lor.......u_shad
0x6f, 0x77, 0x4d, 0x61, 0x70, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0xf4, 0x1e, 0x00, 0x00, 0x76, // owMap..........v
0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x6e, 0x6f, // arying vec3 v_no
0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, // rmal;.varying ve
0x63, 0x34, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, // c4 v_shadowcoord
0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ;.varying vec3 v
0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, // _view;.uniform v
0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x50, 0x6f, 0x73, 0x3b, 0x0a, // ec4 u_lightPos;.
0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x63, // uniform vec4 u_c
0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, // olor;.uniform sa
0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x75, 0x5f, // mpler2DShadow u_
0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // shadowMap;.void
0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, // main ().{. vec2
0x20, 0x6c, 0x63, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, // lc_1;. vec3 tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_2;. tmpvar
0x5f, 0x32, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, // _2 = -(normalize
0x28, 0x75, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x50, 0x6f, 0x73, 0x2e, 0x78, 0x79, 0x7a, 0x29, // (u_lightPos.xyz)
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // );. float tmpva
0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, // r_3;. tmpvar_3
0x3d, 0x20, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2c, // = dot (v_normal,
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, // tmpvar_2);. ve
0x63, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, // c2 tmpvar_4;. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // mpvar_4.x = tmpv
0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, // ar_3;. tmpvar_4
0x2e, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // .y = (((. flo
0x61, 0x74, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3e, 0x3d, 0x20, // at((tmpvar_3 >=
0x30, 0x2e, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, // 0.0)). * .
0x6d, 0x61, 0x78, 0x20, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x28, // max (0.0, dot ((
0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, // (. (2.0 * t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, // mpvar_3). *
0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x29, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, // v_normal) - tmpv
0x61, 0x72, 0x5f, 0x32, 0x29, 0x2c, 0x20, 0x2d, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, // ar_2), -(normali
0x7a, 0x65, 0x28, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, // ze(v_view)))).
0x29, 0x20, 0x2a, 0x20, 0x33, 0x2e, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x38, 0x2e, 0x30, 0x29, 0x3b, // ) * 3.0) / 8.0);
0x0a, 0x20, 0x20, 0x6c, 0x63, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x28, 0x74, // . lc_1 = max (t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // mpvar_4, 0.0);.
0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, // float tmpvar_5;
0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, // . float result_
0x36, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 6;. vec2 tmpvar
0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, // _7;. tmpvar_7 =
0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, // (v_shadowcoord.
0x78, 0x79, 0x20, 0x2f, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, // xy / v_shadowcoo
0x72, 0x64, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6d, // rd.w);. bool tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, // pvar_8;. if (an
0x79, 0x28, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x28, 0x74, // y(greaterThan (t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, // mpvar_7, vec2(1.
0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // 0, 1.0)))) {.
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x6f, 0x6c, // tmpvar_8 = bool
0x28, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, // (1);. } else {.
0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x61, // tmpvar_8 = a
0x6e, 0x79, 0x28, 0x6c, 0x65, 0x73, 0x73, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x28, 0x74, 0x6d, 0x70, // ny(lessThan (tmp
0x76, 0x61, 0x72, 0x5f, 0x37, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, // var_7, vec2(0.0,
0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, // 0.0)));. };.
0x69, 0x66, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x20, 0x7b, 0x0a, // if (tmpvar_8) {.
0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x31, // tmpvar_5 = 1
0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, // .0;. } else {.
0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, // vec2 tmpvar_9
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, // ;. tmpvar_9 =
0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x39, 0x37, 0x36, 0x35, // (vec2(0.0009765
0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, // 625, 0.000976562
0x35, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, // 5) * v_shadowcoo
0x72, 0x64, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // rd.w);. vec4
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_10;. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, // mpvar_10.zw = ve
0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // c2(0.0, 0.0);.
0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x3d, // tmpvar_10.xy =
0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2d, 0x31, 0x2e, 0x35, 0x2c, 0x20, 0x2d, 0x31, 0x2e, // (vec2(-1.5, -1.
0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, // 5) * tmpvar_9);.
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, // vec4 _shadow
0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, // Coord_11;. _s
0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, // hadowCoord_11 =
0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, // (v_shadowcoord +
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // tmpvar_10);.
0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, // vec3 tmpvar_12;
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, // . tmpvar_12 =
0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, // (_shadowCoord_1
0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, // 1.xyz / _shadowC
0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // oord_11.w);.
0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, // vec3 tmpvar_13;.
0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x78, 0x79, // tmpvar_13.xy
0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x78, 0x79, 0x3b, // = tmpvar_12.xy;
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x7a, // . tmpvar_13.z
0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x7a, 0x20, // = (tmpvar_12.z
0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, // - 0.0001);. r
0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, // esult_6 = shadow
0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, // 2D (u_shadowMap,
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x29, 0x2e, 0x78, 0x3b, 0x0a, 0x20, // tmpvar_13).x;.
0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // vec4 tmpvar_1
0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, // 4;. tmpvar_14
0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, // .zw = vec2(0.0,
0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 0.0);. tmpvar
0x5f, 0x31, 0x34, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2d, // _14.xy = (vec2(-
0x31, 0x2e, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // 1.5, -0.5) * tmp
0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // var_9);. vec4
0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, 0x35, // _shadowCoord_15
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, // ;. _shadowCoo
0x72, 0x64, 0x5f, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, // rd_15 = (v_shado
0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // wcoord + tmpvar_
0x31, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, // 14);. vec3 tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // pvar_16;. tmp
0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, // var_16 = (_shado
0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, // wCoord_15.xyz /
0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, 0x35, 0x2e, // _shadowCoord_15.
0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, // w);. vec3 tmp
0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // var_17;. tmpv
0x61, 0x72, 0x5f, 0x31, 0x37, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ar_17.xy = tmpva
0x72, 0x5f, 0x31, 0x36, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // r_16.xy;. tmp
0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // var_17.z = (tmpv
0x61, 0x72, 0x5f, 0x31, 0x36, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, // ar_16.z - 0.0001
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, // );. result_6
0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, // = (result_6 + sh
0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, // adow2D (u_shadow
0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x29, 0x2e, // Map, tmpvar_17).
0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // x);. vec4 tmp
0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // var_18;. tmpv
0x61, 0x72, 0x5f, 0x31, 0x38, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // ar_18.zw = vec2(
0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // 0.0, 0.0);. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, // mpvar_18.xy = (v
0x65, 0x63, 0x32, 0x28, 0x2d, 0x31, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2a, // ec2(-1.5, 0.5) *
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_9);.
0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, // vec4 _shadowCoor
0x64, 0x5f, 0x31, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, // d_19;. _shado
0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, // wCoord_19 = (v_s
0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, // hadowcoord + tmp
0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // var_18);. vec
0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 3 tmpvar_20;.
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, // tmpvar_20 = (_s
0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x31, 0x39, 0x2e, 0x78, 0x79, // hadowCoord_19.xy
0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, // z / _shadowCoord
0x5f, 0x31, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, // _19.w);. vec3
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_21;.
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, // tmpvar_21.xy = t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, // mpvar_20.xy;.
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, // tmpvar_21.z = (
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, // tmpvar_20.z - 0.
0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, // 0001);. resul
0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, // t_6 = (result_6
0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, // + shadow2D (u_sh
0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // adowMap, tmpvar_
0x32, 0x31, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // 21).x);. vec4
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_22;.
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x32, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, // tmpvar_22.zw = v
0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // ec2(0.0, 0.0);.
0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x32, 0x2e, 0x78, 0x79, 0x20, // tmpvar_22.xy
0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2d, 0x31, 0x2e, 0x35, 0x2c, 0x20, 0x31, 0x2e, // = (vec2(-1.5, 1.
0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, // 5) * tmpvar_9);.
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, // vec4 _shadow
0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x32, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, // Coord_23;. _s
0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x32, 0x33, 0x20, 0x3d, 0x20, // hadowCoord_23 =
0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, // (v_shadowcoord +
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // tmpvar_22);.
0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x34, 0x3b, // vec3 tmpvar_24;
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x34, 0x20, 0x3d, // . tmpvar_24 =
0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x32, // (_shadowCoord_2
0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, // 3.xyz / _shadowC
0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x32, 0x33, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // oord_23.w);.
0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, 0x3b, 0x0a, // vec3 tmpvar_25;.
0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, 0x2e, 0x78, 0x79, // tmpvar_25.xy
0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x34, 0x2e, 0x78, 0x79, 0x3b, // = tmpvar_24.xy;
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, 0x2e, 0x7a, // . tmpvar_25.z
0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x34, 0x2e, 0x7a, 0x20, // = (tmpvar_24.z
0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, // - 0.0001);. r
0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, // esult_6 = (resul
0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, // t_6 + shadow2D (
0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, // u_shadowMap, tmp
0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // var_25).x);.
0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x36, 0x3b, 0x0a, // vec4 tmpvar_26;.
0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x36, 0x2e, 0x7a, 0x77, // tmpvar_26.zw
0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, // = vec2(0.0, 0.0
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x36, // );. tmpvar_26
0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2d, 0x30, 0x2e, 0x35, // .xy = (vec2(-0.5
0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // , -1.5) * tmpvar
0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, // _9);. vec4 _s
0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x32, 0x37, 0x3b, 0x0a, 0x20, // hadowCoord_27;.
0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, // _shadowCoord_
0x32, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, // 27 = (v_shadowco
0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x36, 0x29, // ord + tmpvar_26)
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ;. vec3 tmpva
0x72, 0x5f, 0x32, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // r_28;. tmpvar
0x5f, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, // _28 = (_shadowCo
0x6f, 0x72, 0x64, 0x5f, 0x32, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, // ord_27.xyz / _sh
0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x32, 0x37, 0x2e, 0x77, 0x29, 0x3b, // adowCoord_27.w);
0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // . vec3 tmpvar
0x5f, 0x32, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // _29;. tmpvar_
0x32, 0x39, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // 29.xy = tmpvar_2
0x38, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 8.xy;. tmpvar
0x5f, 0x32, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // _29.z = (tmpvar_
0x32, 0x38, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, // 28.z - 0.0001);.
0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, // result_6 = (
0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, // result_6 + shado
0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, // w2D (u_shadowMap
0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x39, 0x29, 0x2e, 0x78, 0x29, 0x3b, // , tmpvar_29).x);
0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // . vec4 tmpvar
0x5f, 0x33, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // _30;. tmpvar_
0x33, 0x30, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, // 30.zw = vec2(0.0
0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // , 0.0);. tmpv
0x61, 0x72, 0x5f, 0x33, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, // ar_30.xy = (vec2
0x28, 0x2d, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, // (-0.5, -0.5) * t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // mpvar_9);. ve
0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, // c4 _shadowCoord_
0x33, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, // 31;. _shadowC
0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, // oord_31 = (v_sha
0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // dowcoord + tmpva
0x72, 0x5f, 0x33, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // r_30);. vec3
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_32;. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, // mpvar_32 = (_sha
0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x33, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, // dowCoord_31.xyz
0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x33, // / _shadowCoord_3
0x31, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, // 1.w);. vec3 t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // mpvar_33;. tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x33, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // pvar_33.xy = tmp
0x76, 0x61, 0x72, 0x5f, 0x33, 0x32, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // var_32.xy;. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, // mpvar_33.z = (tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x32, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, // pvar_32.z - 0.00
0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, // 01);. result_
0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, // 6 = (result_6 +
0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, // shadow2D (u_shad
0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x33, // owMap, tmpvar_33
0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // ).x);. vec4 t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // mpvar_34;. tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x34, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, // pvar_34.zw = vec
0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 2(0.0, 0.0);.
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x34, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, // tmpvar_34.xy =
0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2d, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, // (vec2(-0.5, 0.5)
0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, // * tmpvar_9);.
0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, // vec4 _shadowCo
0x6f, 0x72, 0x64, 0x5f, 0x33, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, // ord_35;. _sha
0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x76, // dowCoord_35 = (v
0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, // _shadowcoord + t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // mpvar_34);. v
0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x36, 0x3b, 0x0a, 0x20, // ec3 tmpvar_36;.
0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x28, // tmpvar_36 = (
0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x33, 0x35, 0x2e, // _shadowCoord_35.
0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, // xyz / _shadowCoo
0x72, 0x64, 0x5f, 0x33, 0x35, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // rd_35.w);. ve
0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x37, 0x3b, 0x0a, 0x20, 0x20, // c3 tmpvar_37;.
0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x37, 0x2e, 0x78, 0x79, 0x20, 0x3d, // tmpvar_37.xy =
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x36, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, // tmpvar_36.xy;.
0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x37, 0x2e, 0x7a, 0x20, 0x3d, // tmpvar_37.z =
0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x36, 0x2e, 0x7a, 0x20, 0x2d, 0x20, // (tmpvar_36.z -
0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, // 0.0001);. res
0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, // ult_6 = (result_
0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, // 6 + shadow2D (u_
0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // shadowMap, tmpva
0x72, 0x5f, 0x33, 0x37, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // r_37).x);. ve
0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x38, 0x3b, 0x0a, 0x20, 0x20, // c4 tmpvar_38;.
0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x38, 0x2e, 0x7a, 0x77, 0x20, 0x3d, // tmpvar_38.zw =
0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, // vec2(0.0, 0.0);
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x38, 0x2e, 0x78, // . tmpvar_38.x
0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2d, 0x30, 0x2e, 0x35, 0x2c, 0x20, // y = (vec2(-0.5,
0x31, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, // 1.5) * tmpvar_9)
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, // ;. vec4 _shad
0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x33, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // owCoord_39;.
0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x33, 0x39, 0x20, // _shadowCoord_39
0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, // = (v_shadowcoord
0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x38, 0x29, 0x3b, 0x0a, 0x20, // + tmpvar_38);.
0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, // vec3 tmpvar_4
0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x30, // 0;. tmpvar_40
0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, // = (_shadowCoord
0x5f, 0x33, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, // _39.xyz / _shado
0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x33, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, // wCoord_39.w);.
0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x31, // vec3 tmpvar_41
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x31, 0x2e, // ;. tmpvar_41.
0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x30, 0x2e, 0x78, // xy = tmpvar_40.x
0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x31, // y;. tmpvar_41
0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x30, 0x2e, // .z = (tmpvar_40.
0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // z - 0.0001);.
0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, // result_6 = (res
0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, // ult_6 + shadow2D
0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, // (u_shadowMap, t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x31, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, // mpvar_41).x);.
0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x32, // vec4 tmpvar_42
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x32, 0x2e, // ;. tmpvar_42.
0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, // zw = vec2(0.0, 0
0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // .0);. tmpvar_
0x34, 0x32, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, // 42.xy = (vec2(0.
0x35, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 5, -1.5) * tmpva
0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // r_9);. vec4 _
0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x34, 0x33, 0x3b, 0x0a, // shadowCoord_43;.
0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, // _shadowCoord
0x5f, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, // _43 = (v_shadowc
0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x32, // oord + tmpvar_42
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // );. vec3 tmpv
0x61, 0x72, 0x5f, 0x34, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ar_44;. tmpva
0x72, 0x5f, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, // r_44 = (_shadowC
0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x34, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, // oord_43.xyz / _s
0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x34, 0x33, 0x2e, 0x77, 0x29, // hadowCoord_43.w)
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ;. vec3 tmpva
0x72, 0x5f, 0x34, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // r_45;. tmpvar
0x5f, 0x34, 0x35, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // _45.xy = tmpvar_
0x34, 0x34, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 44.xy;. tmpva
0x72, 0x5f, 0x34, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // r_45.z = (tmpvar
0x5f, 0x34, 0x34, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, // _44.z - 0.0001);
0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, // . result_6 =
0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, // (result_6 + shad
0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, // ow2D (u_shadowMa
0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x35, 0x29, 0x2e, 0x78, 0x29, // p, tmpvar_45).x)
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ;. vec4 tmpva
0x72, 0x5f, 0x34, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // r_46;. tmpvar
0x5f, 0x34, 0x36, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, // _46.zw = vec2(0.
0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // 0, 0.0);. tmp
0x76, 0x61, 0x72, 0x5f, 0x34, 0x36, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, // var_46.xy = (vec
0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, // 2(0.5, -0.5) * t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // mpvar_9);. ve
0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, // c4 _shadowCoord_
0x34, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, // 47;. _shadowC
0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, // oord_47 = (v_sha
0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // dowcoord + tmpva
0x72, 0x5f, 0x34, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // r_46);. vec3
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_48;. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, // mpvar_48 = (_sha
0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x34, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, // dowCoord_47.xyz
0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x34, // / _shadowCoord_4
0x37, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, // 7.w);. vec3 t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // mpvar_49;. tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x39, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // pvar_49.xy = tmp
0x76, 0x61, 0x72, 0x5f, 0x34, 0x38, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // var_48.xy;. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, // mpvar_49.z = (tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x38, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, // pvar_48.z - 0.00
0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, // 01);. result_
0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, // 6 = (result_6 +
0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, // shadow2D (u_shad
0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x39, // owMap, tmpvar_49
0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // ).x);. vec4 t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // mpvar_50;. tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x30, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, // pvar_50.zw = vec
0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 2(0.0, 0.0);.
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, // tmpvar_50.xy =
0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, // (vec2(0.5, 0.5)
0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // * tmpvar_9);.
0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, // vec4 _shadowCoo
0x72, 0x64, 0x5f, 0x35, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, // rd_51;. _shad
0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, // owCoord_51 = (v_
0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, // shadowcoord + tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // pvar_50);. ve
0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x32, 0x3b, 0x0a, 0x20, 0x20, // c3 tmpvar_52;.
0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x5f, // tmpvar_52 = (_
0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, 0x31, 0x2e, 0x78, // shadowCoord_51.x
0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, // yz / _shadowCoor
0x64, 0x5f, 0x35, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // d_51.w);. vec
0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 3 tmpvar_53;.
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x33, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, // tmpvar_53.xy =
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x32, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, // tmpvar_52.xy;.
0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_53.z =
0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x32, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, // (tmpvar_52.z - 0
0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, // .0001);. resu
0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, // lt_6 = (result_6
0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, // + shadow2D (u_s
0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // hadowMap, tmpvar
0x5f, 0x35, 0x33, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // _53).x);. vec
0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 4 tmpvar_54;.
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x34, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, // tmpvar_54.zw =
0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, // vec2(0.0, 0.0);.
0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x34, 0x2e, 0x78, 0x79, // tmpvar_54.xy
0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x31, 0x2e, // = (vec2(0.5, 1.
0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, // 5) * tmpvar_9);.
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, // vec4 _shadow
0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, // Coord_55;. _s
0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, 0x35, 0x20, 0x3d, 0x20, // hadowCoord_55 =
0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, // (v_shadowcoord +
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // tmpvar_54);.
0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x36, 0x3b, // vec3 tmpvar_56;
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x36, 0x20, 0x3d, // . tmpvar_56 =
0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, // (_shadowCoord_5
0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, // 5.xyz / _shadowC
0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, 0x35, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // oord_55.w);.
0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x37, 0x3b, 0x0a, // vec3 tmpvar_57;.
0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x37, 0x2e, 0x78, 0x79, // tmpvar_57.xy
0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x36, 0x2e, 0x78, 0x79, 0x3b, // = tmpvar_56.xy;
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x37, 0x2e, 0x7a, // . tmpvar_57.z
0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x36, 0x2e, 0x7a, 0x20, // = (tmpvar_56.z
0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, // - 0.0001);. r
0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, // esult_6 = (resul
0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, // t_6 + shadow2D (
0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, // u_shadowMap, tmp
0x76, 0x61, 0x72, 0x5f, 0x35, 0x37, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // var_57).x);.
0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x38, 0x3b, 0x0a, // vec4 tmpvar_58;.
0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x38, 0x2e, 0x7a, 0x77, // tmpvar_58.zw
0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, // = vec2(0.0, 0.0
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x38, // );. tmpvar_58
0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x35, 0x2c, // .xy = (vec2(1.5,
0x20, 0x2d, 0x31, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // -1.5) * tmpvar_
0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, // 9);. vec4 _sh
0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, 0x39, 0x3b, 0x0a, 0x20, 0x20, // adowCoord_59;.
0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, // _shadowCoord_5
0x39, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, // 9 = (v_shadowcoo
0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x38, 0x29, 0x3b, // rd + tmpvar_58);
0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // . vec3 tmpvar
0x5f, 0x36, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // _60;. tmpvar_
0x36, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, // 60 = (_shadowCoo
0x72, 0x64, 0x5f, 0x35, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, // rd_59.xyz / _sha
0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x35, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x0a, // dowCoord_59.w);.
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // vec3 tmpvar_
0x36, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // 61;. tmpvar_6
0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x30, // 1.xy = tmpvar_60
0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // .xy;. tmpvar_
0x36, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // 61.z = (tmpvar_6
0x30, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, // 0.z - 0.0001);.
0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, // result_6 = (r
0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, // esult_6 + shadow
0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, // 2D (u_shadowMap,
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x31, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, // tmpvar_61).x);.
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // vec4 tmpvar_
0x36, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // 62;. tmpvar_6
0x32, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, // 2.zw = vec2(0.0,
0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 0.0);. tmpva
0x72, 0x5f, 0x36, 0x32, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, // r_62.xy = (vec2(
0x31, 0x2e, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // 1.5, -0.5) * tmp
0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // var_9);. vec4
0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x36, 0x33, // _shadowCoord_63
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, // ;. _shadowCoo
0x72, 0x64, 0x5f, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, // rd_63 = (v_shado
0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // wcoord + tmpvar_
0x36, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, // 62);. vec3 tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // pvar_64;. tmp
0x76, 0x61, 0x72, 0x5f, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, // var_64 = (_shado
0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x36, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, // wCoord_63.xyz /
0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x36, 0x33, 0x2e, // _shadowCoord_63.
0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, // w);. vec3 tmp
0x76, 0x61, 0x72, 0x5f, 0x36, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // var_65;. tmpv
0x61, 0x72, 0x5f, 0x36, 0x35, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ar_65.xy = tmpva
0x72, 0x5f, 0x36, 0x34, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // r_64.xy;. tmp
0x76, 0x61, 0x72, 0x5f, 0x36, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // var_65.z = (tmpv
0x61, 0x72, 0x5f, 0x36, 0x34, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, // ar_64.z - 0.0001
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, // );. result_6
0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, // = (result_6 + sh
0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, // adow2D (u_shadow
0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x35, 0x29, 0x2e, // Map, tmpvar_65).
0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // x);. vec4 tmp
0x76, 0x61, 0x72, 0x5f, 0x36, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // var_66;. tmpv
0x61, 0x72, 0x5f, 0x36, 0x36, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // ar_66.zw = vec2(
0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // 0.0, 0.0);. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x36, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x76, // mpvar_66.xy = (v
0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, // ec2(1.5, 0.5) *
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // tmpvar_9);. v
0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, // ec4 _shadowCoord
0x5f, 0x36, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, // _67;. _shadow
0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x68, // Coord_67 = (v_sh
0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, // adowcoord + tmpv
0x61, 0x72, 0x5f, 0x36, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, // ar_66);. vec3
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_68;.
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x73, 0x68, // tmpvar_68 = (_sh
0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x36, 0x37, 0x2e, 0x78, 0x79, 0x7a, // adowCoord_67.xyz
0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, // / _shadowCoord_
0x36, 0x37, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // 67.w);. vec3
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_69;. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x39, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, // mpvar_69.xy = tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x38, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // pvar_68.xy;.
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, // tmpvar_69.z = (t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x38, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, // mpvar_68.z - 0.0
0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, // 001);. result
0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x2b, // _6 = (result_6 +
0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x73, 0x68, 0x61, // shadow2D (u_sha
0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // dowMap, tmpvar_6
0x39, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // 9).x);. vec4
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_70;. t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x30, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, // mpvar_70.zw = ve
0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // c2(0.0, 0.0);.
0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x3d, // tmpvar_70.xy =
0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x35, 0x29, // (vec2(1.5, 1.5)
0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, // * tmpvar_9);.
0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, // vec4 _shadowCo
0x6f, 0x72, 0x64, 0x5f, 0x37, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x68, 0x61, // ord_71;. _sha
0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x76, // dowCoord_71 = (v
0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, // _shadowcoord + t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // mpvar_70);. v
0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x32, 0x3b, 0x0a, 0x20, // ec3 tmpvar_72;.
0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x28, // tmpvar_72 = (
0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5f, 0x37, 0x31, 0x2e, // _shadowCoord_71.
0x78, 0x79, 0x7a, 0x20, 0x2f, 0x20, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6f, // xyz / _shadowCoo
0x72, 0x64, 0x5f, 0x37, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // rd_71.w);. ve
0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x33, 0x3b, 0x0a, 0x20, 0x20, // c3 tmpvar_73;.
0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x33, 0x2e, 0x78, 0x79, 0x20, 0x3d, // tmpvar_73.xy =
0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x32, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, // tmpvar_72.xy;.
0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x33, 0x2e, 0x7a, 0x20, 0x3d, // tmpvar_73.z =
0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x32, 0x2e, 0x7a, 0x20, 0x2d, 0x20, // (tmpvar_72.z -
0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, // 0.0001);. res
0x75, 0x6c, 0x74, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, // ult_6 = (result_
0x36, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, // 6 + shadow2D (u_
0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x4d, 0x61, 0x70, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // shadowMap, tmpva
0x72, 0x5f, 0x37, 0x33, 0x29, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // r_73).x);. tm
0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, // pvar_5 = (result
0x5f, 0x36, 0x20, 0x2f, 0x20, 0x31, 0x36, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, // _6 / 16.0);. };
0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, // . vec4 tmpvar_7
0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x34, 0x2e, 0x77, // 4;. tmpvar_74.w
0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // = 1.0;. tmpvar
0x5f, 0x37, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x61, // _74.xyz = pow (a
0x62, 0x73, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x31, 0x20, 0x2a, 0x20, // bs((. (0.1 *
0x75, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, // u_color.xyz).
0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x28, 0x28, 0x6c, 0x63, 0x5f, 0x31, 0x2e, 0x78, // + . (((lc_1.x
0x20, 0x2b, 0x20, 0x6c, 0x63, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x63, // + lc_1.y) * u_c
0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // olor.xyz) * tmpv
0x61, 0x72, 0x5f, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // ar_5). )), vec3
0x28, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x35, // (0.4545454, 0.45
0x34, 0x35, 0x34, 0x35, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, // 45454, 0.4545454
0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // ));. gl_FragCol
0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x34, 0x3b, 0x0a, // or = tmpvar_74;.
0x7d, 0x0a, 0x0a, 0x00, // }...
};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,386 @@
/*
* Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef __SHADERLIB_SH__
#define __SHADERLIB_SH__
vec4 encodeRE8(float _r)
{
float exponent = ceil(log2(_r) );
return vec4(_r / exp2(exponent)
, 0.0
, 0.0
, (exponent + 128.0) / 255.0
);
}
float decodeRE8(vec4 _re8)
{
float exponent = _re8.w * 255.0 - 128.0;
return _re8.x * exp2(exponent);
}
vec4 encodeRGBE8(vec3 _rgb)
{
vec4 rgbe8;
float maxComponent = max(max(_rgb.x, _rgb.y), _rgb.z);
float exponent = ceil(log2(maxComponent) );
rgbe8.xyz = _rgb / exp2(exponent);
rgbe8.w = (exponent + 128.0) / 255.0;
return rgbe8;
}
vec3 decodeRGBE8(vec4 _rgbe8)
{
float exponent = _rgbe8.w * 255.0 - 128.0;
vec3 rgb = _rgbe8.xyz * exp2(exponent);
return rgb;
}
vec3 encodeNormalUint(vec3 _normal)
{
return _normal * 0.5 + 0.5;
}
vec3 decodeNormalUint(vec3 _encodedNormal)
{
return _encodedNormal * 2.0 - 1.0;
}
vec2 encodeNormalSphereMap(vec3 _normal)
{
return normalize(_normal.xy) * sqrt(_normal.z * 0.5 + 0.5);
}
vec3 decodeNormalSphereMap(vec2 _encodedNormal)
{
float zz = dot(_encodedNormal, _encodedNormal) * 2.0 - 1.0;
return vec3(normalize(_encodedNormal.xy) * sqrt(1.0 - zz*zz), zz);
}
vec2 octahedronWrap(vec2 _val)
{
// Reference:
// Octahedron normal vector encoding
// http://kriscg.blogspot.com/2014/04/octahedron-normal-vector-encoding.html
return (1.0 - abs(_val.yx) )
* mix(vec2_splat(-1.0), vec2_splat(1.0), vec2(greaterThanEqual(_val.xy, vec2_splat(0.0) ) ) );
}
vec2 encodeNormalOctahedron(vec3 _normal)
{
_normal /= abs(_normal.x) + abs(_normal.y) + abs(_normal.z);
_normal.xy = _normal.z >= 0.0 ? _normal.xy : octahedronWrap(_normal.xy);
_normal.xy = _normal.xy * 0.5 + 0.5;
return _normal.xy;
}
vec3 decodeNormalOctahedron(vec2 _encodedNormal)
{
_encodedNormal = _encodedNormal * 2.0 - 1.0;
vec3 normal;
normal.z = 1.0 - abs(_encodedNormal.x) - abs(_encodedNormal.y);
normal.xy = normal.z >= 0.0 ? _encodedNormal.xy : octahedronWrap(_encodedNormal.xy);
return normalize(normal);
}
vec3 convertRGB2XYZ(vec3 _rgb)
{
// Reference:
// RGB/XYZ Matrices
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
vec3 xyz;
xyz.x = dot(vec3(0.4124564, 0.3575761, 0.1804375), _rgb);
xyz.y = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
xyz.z = dot(vec3(0.0193339, 0.1191920, 0.9503041), _rgb);
return xyz;
}
vec3 convertXYZ2RGB(vec3 _xyz)
{
vec3 rgb;
rgb.x = dot(vec3( 3.2404542, -1.5371385, -0.4985314), _xyz);
rgb.y = dot(vec3(-0.9692660, 1.8760108, 0.0415560), _xyz);
rgb.z = dot(vec3( 0.0556434, -0.2040259, 1.0572252), _xyz);
return rgb;
}
vec3 convertXYZ2Yxy(vec3 _xyz)
{
// Reference:
// http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_xyY.html
float inv = 1.0/dot(_xyz, vec3(1.0, 1.0, 1.0) );
return vec3(_xyz.y, _xyz.x*inv, _xyz.y*inv);
}
vec3 convertYxy2XYZ(vec3 _Yxy)
{
// Reference:
// http://www.brucelindbloom.com/index.html?Eqn_xyY_to_XYZ.html
vec3 xyz;
xyz.x = _Yxy.x*_Yxy.y/_Yxy.z;
xyz.y = _Yxy.x;
xyz.z = _Yxy.x*(1.0 - _Yxy.y - _Yxy.z)/_Yxy.z;
return xyz;
}
vec3 convertRGB2Yxy(vec3 _rgb)
{
return convertXYZ2Yxy(convertRGB2XYZ(_rgb) );
}
vec3 convertYxy2RGB(vec3 _Yxy)
{
return convertXYZ2RGB(convertYxy2XYZ(_Yxy) );
}
vec3 convertRGB2Yuv(vec3 _rgb)
{
vec3 yuv;
yuv.x = dot(_rgb, vec3(0.299, 0.587, 0.114) );
yuv.y = (_rgb.x - yuv.x)*0.713 + 0.5;
yuv.z = (_rgb.z - yuv.x)*0.564 + 0.5;
return yuv;
}
vec3 convertYuv2RGB(vec3 _yuv)
{
vec3 rgb;
rgb.x = _yuv.x + 1.403*(_yuv.y-0.5);
rgb.y = _yuv.x - 0.344*(_yuv.y-0.5) - 0.714*(_yuv.z-0.5);
rgb.z = _yuv.x + 1.773*(_yuv.z-0.5);
return rgb;
}
vec3 convertRGB2YIQ(vec3 _rgb)
{
vec3 yiq;
yiq.x = dot(vec3(0.299, 0.587, 0.114 ), _rgb);
yiq.y = dot(vec3(0.595716, -0.274453, -0.321263), _rgb);
yiq.z = dot(vec3(0.211456, -0.522591, 0.311135), _rgb);
return yiq;
}
vec3 convertYIQ2RGB(vec3 _yiq)
{
vec3 rgb;
rgb.x = dot(vec3(1.0, 0.9563, 0.6210), _yiq);
rgb.y = dot(vec3(1.0, -0.2721, -0.6474), _yiq);
rgb.z = dot(vec3(1.0, -1.1070, 1.7046), _yiq);
return rgb;
}
vec3 toLinear(vec3 _rgb)
{
return pow(abs(_rgb), vec3_splat(2.2) );
}
vec4 toLinear(vec4 _rgba)
{
return vec4(toLinear(_rgba.xyz), _rgba.w);
}
vec3 toLinearAccurate(vec3 _rgb)
{
vec3 lo = _rgb / 12.92;
vec3 hi = pow( (_rgb + 0.055) / 1.055, vec3_splat(2.4) );
vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.04045) ) ) );
return rgb;
}
vec4 toLinearAccurate(vec4 _rgba)
{
return vec4(toLinearAccurate(_rgba.xyz), _rgba.w);
}
float toGamma(float _r)
{
return pow(abs(_r), 1.0/2.2);
}
vec3 toGamma(vec3 _rgb)
{
return pow(abs(_rgb), vec3_splat(1.0/2.2) );
}
vec4 toGamma(vec4 _rgba)
{
return vec4(toGamma(_rgba.xyz), _rgba.w);
}
vec3 toGammaAccurate(vec3 _rgb)
{
vec3 lo = _rgb * 12.92;
vec3 hi = pow(abs(_rgb), vec3_splat(1.0/2.4) ) * 1.055 - 0.055;
vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.0031308) ) ) );
return rgb;
}
vec4 toGammaAccurate(vec4 _rgba)
{
return vec4(toGammaAccurate(_rgba.xyz), _rgba.w);
}
vec3 toReinhard(vec3 _rgb)
{
return toGamma(_rgb/(_rgb+vec3_splat(1.0) ) );
}
vec4 toReinhard(vec4 _rgba)
{
return vec4(toReinhard(_rgba.xyz), _rgba.w);
}
vec3 toFilmic(vec3 _rgb)
{
_rgb = max(vec3_splat(0.0), _rgb - 0.004);
_rgb = (_rgb*(6.2*_rgb + 0.5) ) / (_rgb*(6.2*_rgb + 1.7) + 0.06);
return _rgb;
}
vec4 toFilmic(vec4 _rgba)
{
return vec4(toFilmic(_rgba.xyz), _rgba.w);
}
vec3 toAcesFilmic(vec3 _rgb)
{
// Reference:
// ACES Filmic Tone Mapping Curve
// https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
float aa = 2.51f;
float bb = 0.03f;
float cc = 2.43f;
float dd = 0.59f;
float ee = 0.14f;
return saturate( (_rgb*(aa*_rgb + bb) )/(_rgb*(cc*_rgb + dd) + ee) );
}
vec4 toAcesFilmic(vec4 _rgba)
{
return vec4(toAcesFilmic(_rgba.xyz), _rgba.w);
}
vec3 luma(vec3 _rgb)
{
float yy = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
return vec3_splat(yy);
}
vec4 luma(vec4 _rgba)
{
return vec4(luma(_rgba.xyz), _rgba.w);
}
vec3 conSatBri(vec3 _rgb, vec3 _csb)
{
vec3 rgb = _rgb * _csb.z;
rgb = mix(luma(rgb), rgb, _csb.y);
rgb = mix(vec3_splat(0.5), rgb, _csb.x);
return rgb;
}
vec4 conSatBri(vec4 _rgba, vec3 _csb)
{
return vec4(conSatBri(_rgba.xyz, _csb), _rgba.w);
}
vec3 posterize(vec3 _rgb, float _numColors)
{
return floor(_rgb*_numColors) / _numColors;
}
vec4 posterize(vec4 _rgba, float _numColors)
{
return vec4(posterize(_rgba.xyz, _numColors), _rgba.w);
}
vec3 sepia(vec3 _rgb)
{
vec3 color;
color.x = dot(_rgb, vec3(0.393, 0.769, 0.189) );
color.y = dot(_rgb, vec3(0.349, 0.686, 0.168) );
color.z = dot(_rgb, vec3(0.272, 0.534, 0.131) );
return color;
}
vec4 sepia(vec4 _rgba)
{
return vec4(sepia(_rgba.xyz), _rgba.w);
}
vec3 blendOverlay(vec3 _base, vec3 _blend)
{
vec3 lt = 2.0 * _base * _blend;
vec3 gte = 1.0 - 2.0 * (1.0 - _base) * (1.0 - _blend);
return mix(lt, gte, step(vec3_splat(0.5), _base) );
}
vec4 blendOverlay(vec4 _base, vec4 _blend)
{
return vec4(blendOverlay(_base.xyz, _blend.xyz), _base.w);
}
vec3 adjustHue(vec3 _rgb, float _hue)
{
vec3 yiq = convertRGB2YIQ(_rgb);
float angle = _hue + atan2(yiq.z, yiq.y);
float len = length(yiq.yz);
return convertYIQ2RGB(vec3(yiq.x, len*cos(angle), len*sin(angle) ) );
}
vec4 packFloatToRgba(float _value)
{
const vec4 shift = vec4(256 * 256 * 256, 256 * 256, 256, 1.0);
const vec4 mask = vec4(0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
vec4 comp = fract(_value * shift);
comp -= comp.xxyz * mask;
return comp;
}
float unpackRgbaToFloat(vec4 _rgba)
{
const vec4 shift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);
return dot(_rgba, shift);
}
vec2 packHalfFloat(float _value)
{
const vec2 shift = vec2(256, 1.0);
const vec2 mask = vec2(0, 1.0 / 256.0);
vec2 comp = fract(_value * shift);
comp -= comp.xx * mask;
return comp;
}
float unpackHalfFloat(vec2 _rg)
{
const vec2 shift = vec2(1.0 / 256.0, 1.0);
return dot(_rg, shift);
}
float random(vec2 _uv)
{
return fract(sin(dot(_uv.xy, vec2(12.9898, 78.233) ) ) * 43758.5453);
}
vec3 fixCubeLookup(vec3 _v, float _lod, float _topLevelCubeSize)
{
// Reference:
// Seamless cube-map filtering
// http://the-witness.net/news/2012/02/seamless-cube-map-filtering/
float ax = abs(_v.x);
float ay = abs(_v.y);
float az = abs(_v.z);
float vmax = max(max(ax, ay), az);
float scale = 1.0 - exp2(_lod) / _topLevelCubeSize;
if (ax != vmax) { _v.x *= scale; }
if (ay != vmax) { _v.y *= scale; }
if (az != vmax) { _v.z *= scale; }
return _v;
}
#endif // __SHADERLIB_SH__

View File

@ -0,0 +1,5 @@
all: fs_lines_occluded.sc fs_lines.sc varying.def.sc vs_lines.sc
../../../build/3rdparty/bgfx/shaderc -f fs_lines.sc -o ../glsl/fs_lines.sc.bin --type fragment --platform linux -i ../common --varyingdef -p 120
../../../build/3rdparty/bgfx/shaderc -f fs_lines_occluded.sc -o ../glsl/fs_lines_occluded.sc.bin --type fragment --platform linux -i ../common --varyingdef -p 120
../../../build/3rdparty/bgfx/shaderc -f vs_lines.sc -o ../glsl/vs_lines.sc.bin --type vertex --platform linux -i ../common --varyingdef -p 120

View File

@ -0,0 +1,13 @@
$input v_color0, v_path_length
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
void main()
{
gl_FragColor = v_color0;
}

View File

@ -0,0 +1,16 @@
$input v_color0, v_path_length
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
void main()
{
if (mod(v_path_length * 20.0, 2) < 1.0)
discard;
gl_FragColor = v_color0 * 0.8;
}

View File

@ -0,0 +1,9 @@
vec4 v_color0 : COLOR = vec4(1.0, 0.0, 1.0, 1.0);
float v_path_length : FOG = 0.0;
vec3 a_position : POSITION;
vec3 a_texcoord0 : TEXCOORD0 = vec3(1.0, 0.0, 1.0);
vec3 a_texcoord1 : TEXCOORD1 = vec3(1.0, 0.0, 1.0);
vec2 a_texcoord2 : TEXCOORD2 = vec2(0.0, 0.0);
vec4 a_color0 : COLOR0;

View File

@ -0,0 +1,71 @@
$input a_position, a_texcoord0, a_texcoord1, a_texcoord2, a_color0
$output v_color0, v_path_length
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
uniform vec4 u_line_params;
#define thickness u_line_params.x
#define miter u_line_params.y
#define aspect u_line_params.z
#define current_pos a_position
#define prev_pos a_texcoord0
#define next_pos a_texcoord1
#define direction a_texcoord2.x
#define path_length a_texcoord2.y
void main()
{
vec2 aspect_vec = vec2(aspect, 1.0);
// clip space
vec4 current_proj = mul(u_modelViewProj, vec4(current_pos, 1.0));
vec4 prev_proj = mul(u_modelViewProj, vec4(prev_pos, 1.0));
vec4 next_proj = mul(u_modelViewProj, vec4(next_pos, 1.0));
// normalized device coordinates [-1,1]x[-1,1]
vec2 current_screen = current_proj.xy / current_proj.w;
vec2 prev_screen = prev_proj.xy / prev_proj.w;
vec2 next_screen = next_proj.xy / next_proj.w;
float len = thickness;
// uncomment the following line to get a line width
// independent of distance to screen.
// len *= current_proj.w;
float orientation = direction;
vec2 dir = vec2(0.0);
if (current_screen == prev_screen) {
dir = normalize(next_screen - current_screen);
} else if (current_screen == next_screen) {
dir = normalize (current_screen - prev_screen);
} else {
vec2 dirA = normalize (current_screen - prev_screen);
if (miter == 1) {
vec2 dirB = normalize(next_screen - current_screen);
//now compute the miter join normal and length
vec2 tangent = normalize(dirA + dirB);
vec2 perp = vec2(-dirA.y, dirA.x);
vec2 miter_vec = vec2(-tangent.y, tangent.x);
dir = tangent;
len = min (2.5 * thickness, thickness / dot(miter_vec, perp));
} else {
dir = dirA;
}
}
vec2 normal = vec2(-dir.y, dir.x);
normal *= len/2.0;
normal.x /= aspect;
vec4 offset = vec4(normal * orientation, 0.0, 0.0);
gl_Position = current_proj + offset;
v_color0 = a_color0;
v_path_length = path_length;
}

View File

@ -0,0 +1,6 @@
all: fs_sms_mesh.sc fs_sms_mesh_textured.sc fs_sms_shadow.sh varying.def.sc vs_sms_mesh.sc vs_sms_mesh_textured.sc
../../../build/3rdparty/bgfx/shaderc -f fs_sms_mesh.sc -o ../glsl/fs_sms_mesh.sc.bin --type fragment --platform linux -i ../common --varyingdef -p 120
../../../build/3rdparty/bgfx/shaderc -f fs_sms_mesh_textured.sc -o ../glsl/fs_sms_mesh_textured.sc.bin --type fragment --platform linux -i ../common --varyingdef -p 120
../../../build/3rdparty/bgfx/shaderc -f vs_sms_mesh.sc -o ../glsl/vs_sms_mesh.sc.bin --type vertex --platform linux -i ../common --varyingdef -p 120
../../../build/3rdparty/bgfx/shaderc -f vs_sms_mesh_textured.sc -o ../glsl/vs_sms_mesh_textured.sc.bin --type vertex --platform linux -i ../common --varyingdef -p 120

View File

@ -0,0 +1,11 @@
$input v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
#define SHADOW_PACKED_DEPTH 0
#include "fs_sms_shadow.sh"

View File

@ -0,0 +1,12 @@
$input v_view, v_normal, v_shadowcoord, v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
#define SHADOW_PACKED_DEPTH 0
#define TEXTURED 1
#include "fs_sms_shadow.sh"

View File

@ -0,0 +1,115 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
uniform vec4 u_lightPos;
uniform vec4 u_color;
uniform vec4 u_shadowMapParams;
#define u_shadowMapSize u_shadowMapParams.x
#define u_shadowMapBias u_shadowMapParams.y
#if SHADOW_PACKED_DEPTH
SAMPLER2D(u_shadowMap, 0);
# define Sampler sampler2D
#else
SAMPLER2DSHADOW(u_shadowMap, 0);
# define Sampler sampler2DShadow
#endif // SHADOW_PACKED_DEPTH
#if TEXTURED
SAMPLER2D(sceneDefaultTexture, 1);
#endif
vec2 lit(vec3 _ld, vec3 _n, vec3 _vd, float _exp)
{
//diff
float ndotl = dot(_n, _ld);
//spec
vec3 r = 2.0*ndotl*_n - _ld; //reflect(_ld, _n);
float rdotv = dot(r, _n);
float spec = step(0.0, ndotl) * pow(max(0.0, rdotv), _exp) * (2.0 + _exp)/8.0;
return max(vec2(ndotl, spec), 0.0);
}
float hardShadow(Sampler _sampler, vec4 _shadowCoord, float _bias)
{
vec3 texCoord = _shadowCoord.xyz/_shadowCoord.w;
#if SHADOW_PACKED_DEPTH
return step(texCoord.z-_bias, unpackRgbaToFloat(texture2D(_sampler, texCoord.xy) ) );
#else
return shadow2D(_sampler, vec3(texCoord.xy, texCoord.z-_bias) );
#endif // SHADOW_PACKED_DEPTH
}
float PCF(Sampler _sampler, vec4 _shadowCoord, float _bias, vec2 _texelSize)
{
vec2 texCoord = _shadowCoord.xy/_shadowCoord.w;
bool outside = any(greaterThan(texCoord, vec2_splat(1.0)))
|| any(lessThan (texCoord, vec2_splat(0.0)))
;
if (outside)
{
return 1.0;
}
float result = 0.0;
vec2 offset = _texelSize * _shadowCoord.w;
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 1.5) * offset, 0.0, 0.0), _bias);
return result / 16.0;
}
void main()
{
vec3 color = u_color.xyz;
vec3 v = v_view;
vec3 vd = -normalize(v);
vec3 n = v_normal;
vec3 l = u_lightPos.xyz;
vec3 ld = normalize(l);
vec2 lc = lit(ld, n, vd, 1.0);
vec2 texelSize = vec2_splat(1.0/u_shadowMapSize);
float visibility = PCF(u_shadowMap, v_shadowcoord, u_shadowMapBias, texelSize);
vec3 ambient = 0.05 * color;
vec3 brdf = (lc.x * color + lc.y * color) * visibility;
#if TEXTURED
vec4 texcolor = toLinear (texture2D(sceneDefaultTexture, v_texcoord0) );
brdf = brdf * texcolor.xyz;
ambient = ambient * texcolor.xyz;
#endif
vec3 final = toGamma(abs(ambient + brdf) );
gl_FragColor = vec4(final, 1.0);
}

View File

@ -0,0 +1,13 @@
vec3 v_view : TEXCOORD0 = vec3(0.0, 0.0, 0.0);
vec4 v_shadowcoord : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0);
vec4 v_position : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0);
vec3 v_dir : TEXCOORD3 = vec3(0.0, 0.0, 0.0);
vec2 v_texcoord0 : TEXCOORD4 = vec2(0.0, 0.0);
vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0);
vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0);
vec3 a_position : POSITION;
vec4 a_normal : NORMAL;
vec4 a_color0 : COLOR0;
vec2 a_texcoord0 : TEXCOORD0;

View File

@ -0,0 +1,24 @@
$input a_position, a_normal
$output v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
uniform mat4 u_lightMtx;
void main()
{
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
vec4 normal = a_normal * 2.0 - 1.0;
v_normal = normalize(normal.xyz);
v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz;
const float shadowMapOffset = 0.001;
vec3 posOffset = a_position + normal.xyz * shadowMapOffset;
v_shadowcoord = mul(u_lightMtx, vec4(posOffset, 1.0) );
}

View File

@ -0,0 +1,27 @@
$input a_position, a_normal, a_texcoord0
$output v_view, v_normal, v_shadowcoord, v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
uniform mat4 u_lightMtx;
uniform vec4 u_lightPos;
void main()
{
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
vec4 normal = a_normal * 2.0 - 1.0;
v_normal = normalize(normal.xyz);
v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz;
const float shadowMapOffset = 0.001;
vec3 posOffset = a_position + normal.xyz * shadowMapOffset;
v_shadowcoord = mul(u_lightMtx, vec4(posOffset, 1.0) );
v_texcoord0 = a_texcoord0;
}

View File

@ -0,0 +1,3 @@
all: fs_sms_shadow.sc varying.def.sc vs_sms_mesh.sc
../../../build/3rdparty/bgfx/shaderc -f fs_sms_shadow.sc -o ../glsl/fs_sms_shadow.sc.bin --type fragment --platform linux -i ../common --varyingdef -p 120
../../../build/3rdparty/bgfx/shaderc -f vs_sms_mesh.sc -o ../glsl/vs_sms_mesh.sc.bin --type vertex --platform linux -i ../common --varyingdef -p 120

View File

@ -0,0 +1,11 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
void main()
{
gl_FragColor = vec4_splat(0.0);
}

View File

@ -0,0 +1,13 @@
vec3 v_view : TEXCOORD0 = vec3(0.0, 0.0, 0.0);
vec4 v_shadowcoord : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0);
vec4 v_position : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0);
vec3 v_dir : TEXCOORD3 = vec3(0.0, 0.0, 0.0);
vec2 v_texcoord0 : TEXCOORD4 = vec2(0.0, 0.0);
vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0);
vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0);
vec3 a_position : POSITION;
vec4 a_normal : NORMAL;
vec4 a_color0 : COLOR0;
vec2 a_texcoord0 : TEXCOORD0;

View File

@ -0,0 +1,24 @@
$input a_position, a_normal
$output v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
uniform mat4 u_lightMtx;
void main()
{
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
vec4 normal = a_normal * 2.0 - 1.0;
v_normal = normalize(normal.xyz);
v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz;
const float shadowMapOffset = 0.001;
vec3 posOffset = a_position + normal.xyz * shadowMapOffset;
v_shadowcoord = mul(u_lightMtx, vec4(posOffset, 1.0) );
}

View File

@ -0,0 +1,3 @@
all: fs_ibl_skybox.sc shaderlib.sh uniforms.sh varying.def.sc vs_ibl_skybox.sc
../../../build/3rdparty/bgfx/shaderc -f fs_ibl_skybox.sc -o ../glsl/fs_ibl_skybox.sc.bin --type fragment --platform linux -i ../common --varyingdef -p 120
../../../build/3rdparty/bgfx/shaderc -f vs_ibl_skybox.sc -o ../glsl/vs_ibl_skybox.sc.bin --type vertex --platform linux -i ../common --varyingdef -p 120

View File

@ -0,0 +1,33 @@
$input v_dir
/*
* Copyright 2014-2016 Dario Manesku. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_shader.sh"
#include "shaderlib.sh"
#include "uniforms.sh"
SAMPLERCUBE(s_texCube, 0);
SAMPLERCUBE(s_texCubeIrr, 1);
void main()
{
vec3 dir = normalize(v_dir);
vec4 color;
if (u_bgType == 7.0)
{
color = toLinear(textureCube(s_texCubeIrr, dir));
}
else
{
float lod = u_bgType;
dir = fixCubeLookup(dir, lod, 256.0);
color = toLinear(textureCubeLod(s_texCube, dir, lod));
}
color *= exp2(u_exposure);
gl_FragColor = toFilmic(color);
}

View File

@ -0,0 +1,386 @@
/*
* Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef __SHADERLIB_SH__
#define __SHADERLIB_SH__
vec4 encodeRE8(float _r)
{
float exponent = ceil(log2(_r) );
return vec4(_r / exp2(exponent)
, 0.0
, 0.0
, (exponent + 128.0) / 255.0
);
}
float decodeRE8(vec4 _re8)
{
float exponent = _re8.w * 255.0 - 128.0;
return _re8.x * exp2(exponent);
}
vec4 encodeRGBE8(vec3 _rgb)
{
vec4 rgbe8;
float maxComponent = max(max(_rgb.x, _rgb.y), _rgb.z);
float exponent = ceil(log2(maxComponent) );
rgbe8.xyz = _rgb / exp2(exponent);
rgbe8.w = (exponent + 128.0) / 255.0;
return rgbe8;
}
vec3 decodeRGBE8(vec4 _rgbe8)
{
float exponent = _rgbe8.w * 255.0 - 128.0;
vec3 rgb = _rgbe8.xyz * exp2(exponent);
return rgb;
}
vec3 encodeNormalUint(vec3 _normal)
{
return _normal * 0.5 + 0.5;
}
vec3 decodeNormalUint(vec3 _encodedNormal)
{
return _encodedNormal * 2.0 - 1.0;
}
vec2 encodeNormalSphereMap(vec3 _normal)
{
return normalize(_normal.xy) * sqrt(_normal.z * 0.5 + 0.5);
}
vec3 decodeNormalSphereMap(vec2 _encodedNormal)
{
float zz = dot(_encodedNormal, _encodedNormal) * 2.0 - 1.0;
return vec3(normalize(_encodedNormal.xy) * sqrt(1.0 - zz*zz), zz);
}
vec2 octahedronWrap(vec2 _val)
{
// Reference:
// Octahedron normal vector encoding
// http://kriscg.blogspot.com/2014/04/octahedron-normal-vector-encoding.html
return (1.0 - abs(_val.yx) )
* mix(vec2_splat(-1.0), vec2_splat(1.0), vec2(greaterThanEqual(_val.xy, vec2_splat(0.0) ) ) );
}
vec2 encodeNormalOctahedron(vec3 _normal)
{
_normal /= abs(_normal.x) + abs(_normal.y) + abs(_normal.z);
_normal.xy = _normal.z >= 0.0 ? _normal.xy : octahedronWrap(_normal.xy);
_normal.xy = _normal.xy * 0.5 + 0.5;
return _normal.xy;
}
vec3 decodeNormalOctahedron(vec2 _encodedNormal)
{
_encodedNormal = _encodedNormal * 2.0 - 1.0;
vec3 normal;
normal.z = 1.0 - abs(_encodedNormal.x) - abs(_encodedNormal.y);
normal.xy = normal.z >= 0.0 ? _encodedNormal.xy : octahedronWrap(_encodedNormal.xy);
return normalize(normal);
}
vec3 convertRGB2XYZ(vec3 _rgb)
{
// Reference:
// RGB/XYZ Matrices
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
vec3 xyz;
xyz.x = dot(vec3(0.4124564, 0.3575761, 0.1804375), _rgb);
xyz.y = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
xyz.z = dot(vec3(0.0193339, 0.1191920, 0.9503041), _rgb);
return xyz;
}
vec3 convertXYZ2RGB(vec3 _xyz)
{
vec3 rgb;
rgb.x = dot(vec3( 3.2404542, -1.5371385, -0.4985314), _xyz);
rgb.y = dot(vec3(-0.9692660, 1.8760108, 0.0415560), _xyz);
rgb.z = dot(vec3( 0.0556434, -0.2040259, 1.0572252), _xyz);
return rgb;
}
vec3 convertXYZ2Yxy(vec3 _xyz)
{
// Reference:
// http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_xyY.html
float inv = 1.0/dot(_xyz, vec3(1.0, 1.0, 1.0) );
return vec3(_xyz.y, _xyz.x*inv, _xyz.y*inv);
}
vec3 convertYxy2XYZ(vec3 _Yxy)
{
// Reference:
// http://www.brucelindbloom.com/index.html?Eqn_xyY_to_XYZ.html
vec3 xyz;
xyz.x = _Yxy.x*_Yxy.y/_Yxy.z;
xyz.y = _Yxy.x;
xyz.z = _Yxy.x*(1.0 - _Yxy.y - _Yxy.z)/_Yxy.z;
return xyz;
}
vec3 convertRGB2Yxy(vec3 _rgb)
{
return convertXYZ2Yxy(convertRGB2XYZ(_rgb) );
}
vec3 convertYxy2RGB(vec3 _Yxy)
{
return convertXYZ2RGB(convertYxy2XYZ(_Yxy) );
}
vec3 convertRGB2Yuv(vec3 _rgb)
{
vec3 yuv;
yuv.x = dot(_rgb, vec3(0.299, 0.587, 0.114) );
yuv.y = (_rgb.x - yuv.x)*0.713 + 0.5;
yuv.z = (_rgb.z - yuv.x)*0.564 + 0.5;
return yuv;
}
vec3 convertYuv2RGB(vec3 _yuv)
{
vec3 rgb;
rgb.x = _yuv.x + 1.403*(_yuv.y-0.5);
rgb.y = _yuv.x - 0.344*(_yuv.y-0.5) - 0.714*(_yuv.z-0.5);
rgb.z = _yuv.x + 1.773*(_yuv.z-0.5);
return rgb;
}
vec3 convertRGB2YIQ(vec3 _rgb)
{
vec3 yiq;
yiq.x = dot(vec3(0.299, 0.587, 0.114 ), _rgb);
yiq.y = dot(vec3(0.595716, -0.274453, -0.321263), _rgb);
yiq.z = dot(vec3(0.211456, -0.522591, 0.311135), _rgb);
return yiq;
}
vec3 convertYIQ2RGB(vec3 _yiq)
{
vec3 rgb;
rgb.x = dot(vec3(1.0, 0.9563, 0.6210), _yiq);
rgb.y = dot(vec3(1.0, -0.2721, -0.6474), _yiq);
rgb.z = dot(vec3(1.0, -1.1070, 1.7046), _yiq);
return rgb;
}
vec3 toLinear(vec3 _rgb)
{
return pow(abs(_rgb), vec3_splat(2.2) );
}
vec4 toLinear(vec4 _rgba)
{
return vec4(toLinear(_rgba.xyz), _rgba.w);
}
vec3 toLinearAccurate(vec3 _rgb)
{
vec3 lo = _rgb / 12.92;
vec3 hi = pow( (_rgb + 0.055) / 1.055, vec3_splat(2.4) );
vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.04045) ) ) );
return rgb;
}
vec4 toLinearAccurate(vec4 _rgba)
{
return vec4(toLinearAccurate(_rgba.xyz), _rgba.w);
}
float toGamma(float _r)
{
return pow(abs(_r), 1.0/2.2);
}
vec3 toGamma(vec3 _rgb)
{
return pow(abs(_rgb), vec3_splat(1.0/2.2) );
}
vec4 toGamma(vec4 _rgba)
{
return vec4(toGamma(_rgba.xyz), _rgba.w);
}
vec3 toGammaAccurate(vec3 _rgb)
{
vec3 lo = _rgb * 12.92;
vec3 hi = pow(abs(_rgb), vec3_splat(1.0/2.4) ) * 1.055 - 0.055;
vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.0031308) ) ) );
return rgb;
}
vec4 toGammaAccurate(vec4 _rgba)
{
return vec4(toGammaAccurate(_rgba.xyz), _rgba.w);
}
vec3 toReinhard(vec3 _rgb)
{
return toGamma(_rgb/(_rgb+vec3_splat(1.0) ) );
}
vec4 toReinhard(vec4 _rgba)
{
return vec4(toReinhard(_rgba.xyz), _rgba.w);
}
vec3 toFilmic(vec3 _rgb)
{
_rgb = max(vec3_splat(0.0), _rgb - 0.004);
_rgb = (_rgb*(6.2*_rgb + 0.5) ) / (_rgb*(6.2*_rgb + 1.7) + 0.06);
return _rgb;
}
vec4 toFilmic(vec4 _rgba)
{
return vec4(toFilmic(_rgba.xyz), _rgba.w);
}
vec3 toAcesFilmic(vec3 _rgb)
{
// Reference:
// ACES Filmic Tone Mapping Curve
// https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
float aa = 2.51f;
float bb = 0.03f;
float cc = 2.43f;
float dd = 0.59f;
float ee = 0.14f;
return saturate( (_rgb*(aa*_rgb + bb) )/(_rgb*(cc*_rgb + dd) + ee) );
}
vec4 toAcesFilmic(vec4 _rgba)
{
return vec4(toAcesFilmic(_rgba.xyz), _rgba.w);
}
vec3 luma(vec3 _rgb)
{
float yy = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
return vec3_splat(yy);
}
vec4 luma(vec4 _rgba)
{
return vec4(luma(_rgba.xyz), _rgba.w);
}
vec3 conSatBri(vec3 _rgb, vec3 _csb)
{
vec3 rgb = _rgb * _csb.z;
rgb = mix(luma(rgb), rgb, _csb.y);
rgb = mix(vec3_splat(0.5), rgb, _csb.x);
return rgb;
}
vec4 conSatBri(vec4 _rgba, vec3 _csb)
{
return vec4(conSatBri(_rgba.xyz, _csb), _rgba.w);
}
vec3 posterize(vec3 _rgb, float _numColors)
{
return floor(_rgb*_numColors) / _numColors;
}
vec4 posterize(vec4 _rgba, float _numColors)
{
return vec4(posterize(_rgba.xyz, _numColors), _rgba.w);
}
vec3 sepia(vec3 _rgb)
{
vec3 color;
color.x = dot(_rgb, vec3(0.393, 0.769, 0.189) );
color.y = dot(_rgb, vec3(0.349, 0.686, 0.168) );
color.z = dot(_rgb, vec3(0.272, 0.534, 0.131) );
return color;
}
vec4 sepia(vec4 _rgba)
{
return vec4(sepia(_rgba.xyz), _rgba.w);
}
vec3 blendOverlay(vec3 _base, vec3 _blend)
{
vec3 lt = 2.0 * _base * _blend;
vec3 gte = 1.0 - 2.0 * (1.0 - _base) * (1.0 - _blend);
return mix(lt, gte, step(vec3_splat(0.5), _base) );
}
vec4 blendOverlay(vec4 _base, vec4 _blend)
{
return vec4(blendOverlay(_base.xyz, _blend.xyz), _base.w);
}
vec3 adjustHue(vec3 _rgb, float _hue)
{
vec3 yiq = convertRGB2YIQ(_rgb);
float angle = _hue + atan2(yiq.z, yiq.y);
float len = length(yiq.yz);
return convertYIQ2RGB(vec3(yiq.x, len*cos(angle), len*sin(angle) ) );
}
vec4 packFloatToRgba(float _value)
{
const vec4 shift = vec4(256 * 256 * 256, 256 * 256, 256, 1.0);
const vec4 mask = vec4(0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
vec4 comp = fract(_value * shift);
comp -= comp.xxyz * mask;
return comp;
}
float unpackRgbaToFloat(vec4 _rgba)
{
const vec4 shift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);
return dot(_rgba, shift);
}
vec2 packHalfFloat(float _value)
{
const vec2 shift = vec2(256, 1.0);
const vec2 mask = vec2(0, 1.0 / 256.0);
vec2 comp = fract(_value * shift);
comp -= comp.xx * mask;
return comp;
}
float unpackHalfFloat(vec2 _rg)
{
const vec2 shift = vec2(1.0 / 256.0, 1.0);
return dot(_rg, shift);
}
float random(vec2 _uv)
{
return fract(sin(dot(_uv.xy, vec2(12.9898, 78.233) ) ) * 43758.5453);
}
vec3 fixCubeLookup(vec3 _v, float _lod, float _topLevelCubeSize)
{
// Reference:
// Seamless cube-map filtering
// http://the-witness.net/news/2012/02/seamless-cube-map-filtering/
float ax = abs(_v.x);
float ay = abs(_v.y);
float az = abs(_v.z);
float vmax = max(max(ax, ay), az);
float scale = 1.0 - exp2(_lod) / _topLevelCubeSize;
if (ax != vmax) { _v.x *= scale; }
if (ay != vmax) { _v.y *= scale; }
if (az != vmax) { _v.z *= scale; }
return _v;
}
#endif // __SHADERLIB_SH__

View File

@ -0,0 +1,28 @@
/*
* Copyright 2016 Dario Manesku. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 u_params[12];
#define u_mtx0 u_params[0]
#define u_mtx1 u_params[1]
#define u_mtx2 u_params[2]
#define u_mtx3 u_params[3]
#define u_glossiness u_params[4].x
#define u_reflectivity u_params[4].y
#define u_exposure u_params[4].z
#define u_bgType u_params[4].w
#define u_metalOrSpec u_params[5].x
#define u_unused u_params[5].yzw
#define u_doDiffuse u_params[6].x
#define u_doSpecular u_params[6].y
#define u_doDiffuseIbl u_params[6].z
#define u_doSpecularIbl u_params[6].w
#define u_camPos u_params[7].xyz
#define u_unused7 u_params[7].w
#define u_rgbDiff u_params[8]
#define u_rgbSpec u_params[9]
#define u_lightDir u_params[10].xyz
#define u_unused10 u_params[10].w
#define u_lightCol u_params[11].xyz
#define u_unused11 u_params[11].w

View File

@ -0,0 +1,13 @@
vec3 v_view : TEXCOORD0 = vec3(0.0, 0.0, 0.0);
vec4 v_shadowcoord : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0);
vec4 v_position : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0);
vec3 v_dir : TEXCOORD3 = vec3(0.0, 0.0, 0.0);
vec2 v_texcoord0 : TEXCOORD4 = vec2(0.0, 0.0);
vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0);
vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0);
vec3 a_position : POSITION;
vec4 a_normal : NORMAL;
vec4 a_color0 : COLOR0;
vec2 a_texcoord0 : TEXCOORD0;

View File

@ -0,0 +1,29 @@
$input a_position, a_texcoord0
$output v_dir
/*
* Copyright 2014-2016 Dario Manesku. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
#include "uniforms.sh"
uniform mat4 u_mtx;
void main()
{
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
float fov = radians(45.0);
float height = tan(fov*0.5);
float aspect = height*(u_viewRect.z / u_viewRect.w);
vec2 tex = (2.0*a_texcoord0-1.0) * vec2(aspect, height);
mat4 mtx;
mtx[0] = u_mtx0;
mtx[1] = u_mtx1;
mtx[2] = u_mtx2;
mtx[3] = u_mtx3;
v_dir = instMul(mtx, vec4(tex, 1.0, 0.0) ).xyz;
}

View File

@ -0,0 +1,5 @@
all: fs_sms_mesh.sc vs_sms_mesh.sc varying.def.sc fs_sms_shadow.sh
../../build/shaderc -f fs_sms_mesh.sc -o ../glsl/fs_sms_mesh.bin --type fragment --platform linux -i ../common --varyingdef -p 120
../../build/shaderc -f vs_sms_mesh.sc -o ../glsl/vs_sms_mesh.bin --type vertex --platform linux -i ../common --varyingdef -p 120
../../build/shaderc -f fs_sms_mesh.sc -o ../glsl/fs_sms_mesh.bin --type fragment --platform linux -i ../common --varyingdef -p 120 --depends

View File

@ -0,0 +1,466 @@
/*
* Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_SHADER_H_HEADER_GUARD
#define BGFX_SHADER_H_HEADER_GUARD
#if !defined(BGFX_CONFIG_MAX_BONES)
# define BGFX_CONFIG_MAX_BONES 32
#endif // !defined(BGFX_CONFIG_MAX_BONES)
#ifndef __cplusplus
#if BGFX_SHADER_LANGUAGE_HLSL > 3
# define BRANCH [branch]
# define LOOP [loop]
# define UNROLL [unroll]
#else
# define BRANCH
# define LOOP
# define UNROLL
#endif // BGFX_SHADER_LANGUAGE_HLSL > 3
#if BGFX_SHADER_LANGUAGE_HLSL > 3 && BGFX_SHADER_TYPE_FRAGMENT
# define EARLY_DEPTH_STENCIL [earlydepthstencil]
#else
# define EARLY_DEPTH_STENCIL
#endif // BGFX_SHADER_LANGUAGE_HLSL > 3 && BGFX_SHADER_TYPE_FRAGMENT
#if BGFX_SHADER_LANGUAGE_HLSL
# define CONST(_x) static const _x
# define dFdx(_x) ddx(_x)
# define dFdy(_y) ddy(-_y)
# define inversesqrt(_x) rsqrt(_x)
# define fract(_x) frac(_x)
# define bvec2 bool2
# define bvec3 bool3
# define bvec4 bool4
# if BGFX_SHADER_LANGUAGE_HLSL > 3
# if BGFX_SHADER_LANGUAGE_HLSL > 4
# define dFdxCoarse(_x) ddx_coarse(_x)
# define dFdxFine(_x) ddx_fine(_x)
# define dFdyCoarse(_y) ddy_coarse(-_y)
# define dFdyFine(_y) ddy_fine(-_y)
# endif // BGFX_SHADER_LANGUAGE_HLSL > 4
float intBitsToFloat(int _x) { return asfloat(_x); }
vec2 intBitsToFloat(uint2 _x) { return asfloat(_x); }
vec3 intBitsToFloat(uint3 _x) { return asfloat(_x); }
vec4 intBitsToFloat(uint4 _x) { return asfloat(_x); }
float uintBitsToFloat(uint _x) { return asfloat(_x); }
vec2 uintBitsToFloat(uint2 _x) { return asfloat(_x); }
vec3 uintBitsToFloat(uint3 _x) { return asfloat(_x); }
vec4 uintBitsToFloat(uint4 _x) { return asfloat(_x); }
uint floatBitsToUint(float _x) { return asuint(_x); }
uvec2 floatBitsToUint(vec2 _x) { return asuint(_x); }
uvec3 floatBitsToUint(vec3 _x) { return asuint(_x); }
uvec4 floatBitsToUint(vec4 _x) { return asuint(_x); }
int floatBitsToInt(float _x) { return asint(_x); }
ivec2 floatBitsToInt(vec2 _x) { return asint(_x); }
ivec3 floatBitsToInt(vec3 _x) { return asint(_x); }
ivec4 floatBitsToInt(vec4 _x) { return asint(_x); }
uint bitfieldReverse(uint _x) { return reversebits(_x); }
uint2 bitfieldReverse(uint2 _x) { return reversebits(_x); }
uint3 bitfieldReverse(uint3 _x) { return reversebits(_x); }
uint4 bitfieldReverse(uint4 _x) { return reversebits(_x); }
uint packHalf2x16(vec2 _x)
{
return (f32tof16(_x.x)<<16) | f32tof16(_x.y);
}
vec2 unpackHalf2x16(uint _x)
{
return vec2(f16tof32(_x >> 16), f16tof32(_x) );
}
struct BgfxSampler2D
{
SamplerState m_sampler;
Texture2D m_texture;
};
struct BgfxISampler2D
{
Texture2D<ivec4> m_texture;
};
struct BgfxUSampler2D
{
Texture2D<uvec4> m_texture;
};
struct BgfxSampler2DArray
{
SamplerState m_sampler;
Texture2DArray m_texture;
};
struct BgfxSampler2DShadow
{
SamplerComparisonState m_sampler;
Texture2D m_texture;
};
struct BgfxSampler3D
{
SamplerState m_sampler;
Texture3D m_texture;
};
struct BgfxISampler3D
{
Texture3D<ivec4> m_texture;
};
struct BgfxUSampler3D
{
Texture3D<uvec4> m_texture;
};
struct BgfxSamplerCube
{
SamplerState m_sampler;
TextureCube m_texture;
};
struct BgfxSampler2DMS
{
Texture2DMS<vec4> m_texture;
};
vec4 bgfxTexture2D(BgfxSampler2D _sampler, vec2 _coord)
{
return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
}
vec4 bgfxTexture2DLod(BgfxSampler2D _sampler, vec2 _coord, float _level)
{
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
}
vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec3 _coord)
{
vec2 coord = _coord.xy * rcp(_coord.z);
return _sampler.m_texture.Sample(_sampler.m_sampler, coord);
}
vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec4 _coord)
{
vec2 coord = _coord.xy * rcp(_coord.w);
return _sampler.m_texture.Sample(_sampler.m_sampler, coord);
}
vec4 bgfxTexture2DArray(BgfxSampler2DArray _sampler, vec3 _coord)
{
return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
}
vec4 bgfxTexture2DArrayLod(BgfxSampler2DArray _sampler, vec3 _coord, float _lod)
{
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _lod);
}
float bgfxShadow2D(BgfxSampler2DShadow _sampler, vec3 _coord)
{
return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, _coord.xy, _coord.z);
}
float bgfxShadow2DProj(BgfxSampler2DShadow _sampler, vec4 _coord)
{
vec3 coord = _coord.xyz * rcp(_coord.w);
return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, coord.xy, coord.z);
}
vec4 bgfxTexture3D(BgfxSampler3D _sampler, vec3 _coord)
{
return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
}
vec4 bgfxTexture3DLod(BgfxSampler3D _sampler, vec3 _coord, float _level)
{
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
}
ivec4 bgfxTexture3D(BgfxISampler3D _sampler, vec3 _coord)
{
ivec3 size;
_sampler.m_texture.GetDimensions(size.x, size.y, size.z);
return _sampler.m_texture.Load(ivec4(_coord * size, 0) );
}
uvec4 bgfxTexture3D(BgfxUSampler3D _sampler, vec3 _coord)
{
uvec3 size;
_sampler.m_texture.GetDimensions(size.x, size.y, size.z);
return _sampler.m_texture.Load(uvec4(_coord * size, 0) );
}
vec4 bgfxTextureCube(BgfxSamplerCube _sampler, vec3 _coord)
{
return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
}
vec4 bgfxTextureCubeLod(BgfxSamplerCube _sampler, vec3 _coord, float _level)
{
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
}
vec4 bgfxTexelFetch(BgfxSampler2D _sampler, ivec2 _coord, int _lod)
{
return _sampler.m_texture.Load(ivec3(_coord, _lod) );
}
ivec4 bgfxTexelFetch(BgfxISampler2D _sampler, ivec2 _coord, int _lod)
{
return _sampler.m_texture.Load(ivec3(_coord, _lod) );
}
uvec4 bgfxTexelFetch(BgfxUSampler2D _sampler, ivec2 _coord, int _lod)
{
return _sampler.m_texture.Load(ivec3(_coord, _lod) );
}
vec4 bgfxTexelFetch(BgfxSampler2DMS _sampler, ivec2 _coord, int _sampleIdx)
{
return _sampler.m_texture.Load(_coord, _sampleIdx);
}
vec4 bgfxTexelFetch(BgfxSampler3D _sampler, ivec3 _coord, int _lod)
{
return _sampler.m_texture.Load(ivec4(_coord, _lod) );
}
# define SAMPLER2D(_name, _reg) \
uniform SamplerState _name ## Sampler : register(s[_reg]); \
uniform Texture2D _name ## Texture : register(t[_reg]); \
static BgfxSampler2D _name = { _name ## Sampler, _name ## Texture }
# define ISAMPLER2D(_name, _reg) \
uniform Texture2D<ivec4> _name ## Texture : register(t[_reg]); \
static BgfxISampler2D _name = { _name ## Texture }
# define USAMPLER2D(_name, _reg) \
uniform Texture2D<uvec4> _name ## Texture : register(t[_reg]); \
static BgfxUSampler2D _name = { _name ## Texture }
# define sampler2D BgfxSampler2D
# define texture2D(_sampler, _coord) bgfxTexture2D(_sampler, _coord)
# define texture2DLod(_sampler, _coord, _level) bgfxTexture2DLod(_sampler, _coord, _level)
# define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord)
# define SAMPLER2DARRAY(_name, _reg) \
uniform SamplerState _name ## Sampler : register(s[_reg]); \
uniform Texture2DArray _name ## Texture : register(t[_reg]); \
static BgfxSampler2DArray _name = { _name ## Sampler, _name ## Texture }
# define sampler2DArray BgfxSampler2DArray
# define texture2DArray(_sampler, _coord) bgfxTexture2DArray(_sampler, _coord)
# define texture2DArrayLod(_sampler, _coord, _lod) bgfxTexture2DArrayLod(_sampler, _coord, _lod)
# define SAMPLER2DMS(_name, _reg) \
uniform Texture2DMS<vec4> _name ## Texture : register(t[_reg]); \
static BgfxSampler2DMS _name = { _name ## Texture }
# define sampler2DMS BgfxSampler2DMS
# define SAMPLER2DSHADOW(_name, _reg) \
uniform SamplerComparisonState _name ## Sampler : register(s[_reg]); \
uniform Texture2D _name ## Texture : register(t[_reg]); \
static BgfxSampler2DShadow _name = { _name ## Sampler, _name ## Texture }
# define sampler2DShadow BgfxSampler2DShadow
# define shadow2D(_sampler, _coord) bgfxShadow2D(_sampler, _coord)
# define shadow2DProj(_sampler, _coord) bgfxShadow2DProj(_sampler, _coord)
# define SAMPLER3D(_name, _reg) \
uniform SamplerState _name ## Sampler : register(s[_reg]); \
uniform Texture3D _name ## Texture : register(t[_reg]); \
static BgfxSampler3D _name = { _name ## Sampler, _name ## Texture }
# define ISAMPLER3D(_name, _reg) \
uniform Texture3D<ivec4> _name ## Texture : register(t[_reg]); \
static BgfxISampler3D _name = { _name ## Texture }
# define USAMPLER3D(_name, _reg) \
uniform Texture3D<uvec4> _name ## Texture : register(t[_reg]); \
static BgfxUSampler3D _name = { _name ## Texture }
# define sampler3D BgfxSampler3D
# define texture3D(_sampler, _coord) bgfxTexture3D(_sampler, _coord)
# define texture3DLod(_sampler, _coord, _level) bgfxTexture3DLod(_sampler, _coord, _level)
# define SAMPLERCUBE(_name, _reg) \
uniform SamplerState _name ## Sampler : register(s[_reg]); \
uniform TextureCube _name ## Texture : register(t[_reg]); \
static BgfxSamplerCube _name = { _name ## Sampler, _name ## Texture }
# define samplerCube BgfxSamplerCube
# define textureCube(_sampler, _coord) bgfxTextureCube(_sampler, _coord)
# define textureCubeLod(_sampler, _coord, _level) bgfxTextureCubeLod(_sampler, _coord, _level)
# define texelFetch(_sampler, _coord, _lod) bgfxTexelFetch(_sampler, _coord, _lod)
# else
# define sampler2DShadow sampler2D
vec4 bgfxTexture2DProj(sampler2D _sampler, vec3 _coord)
{
return tex2Dproj(_sampler, vec4(_coord.xy, 0.0, _coord.z) );
}
vec4 bgfxTexture2DProj(sampler2D _sampler, vec4 _coord)
{
return tex2Dproj(_sampler, _coord);
}
float bgfxShadow2D(sampler2DShadow _sampler, vec3 _coord)
{
#if 0
float occluder = tex2D(_sampler, _coord.xy).x;
return step(_coord.z, occluder);
#else
return tex2Dproj(_sampler, vec4(_coord.xy, _coord.z, 1.0) ).x;
#endif // 0
}
float bgfxShadow2DProj(sampler2DShadow _sampler, vec4 _coord)
{
#if 0
vec3 coord = _coord.xyz * rcp(_coord.w);
float occluder = tex2D(_sampler, coord.xy).x;
return step(coord.z, occluder);
#else
return tex2Dproj(_sampler, _coord).x;
#endif // 0
}
# define SAMPLER2D(_name, _reg) uniform sampler2D _name : register(s ## _reg)
# define SAMPLER2DMS(_name, _reg) uniform sampler2DMS _name : register(s ## _reg)
# define texture2D(_sampler, _coord) tex2D(_sampler, _coord)
# define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord)
# define SAMPLER2DSHADOW(_name, _reg) uniform sampler2DShadow _name : register(s ## _reg)
# define shadow2D(_sampler, _coord) bgfxShadow2D(_sampler, _coord)
# define shadow2DProj(_sampler, _coord) bgfxShadow2DProj(_sampler, _coord)
# define SAMPLER3D(_name, _reg) uniform sampler3D _name : register(s ## _reg)
# define texture3D(_sampler, _coord) tex3D(_sampler, _coord)
# define SAMPLERCUBE(_name, _reg) uniform samplerCUBE _name : register(s[_reg])
# define textureCube(_sampler, _coord) texCUBE(_sampler, _coord)
# if BGFX_SHADER_LANGUAGE_HLSL == 2
# define texture2DLod(_sampler, _coord, _level) tex2D(_sampler, (_coord).xy)
# define texture3DLod(_sampler, _coord, _level) tex3D(_sampler, (_coord).xyz)
# define textureCubeLod(_sampler, _coord, _level) texCUBE(_sampler, (_coord).xyz)
# else
# define texture2DLod(_sampler, _coord, _level) tex2Dlod(_sampler, vec4( (_coord).xy, 0.0, _level) )
# define texture3DLod(_sampler, _coord, _level) tex3Dlod(_sampler, vec4( (_coord).xyz, _level) )
# define textureCubeLod(_sampler, _coord, _level) texCUBElod(_sampler, vec4( (_coord).xyz, _level) )
# endif // BGFX_SHADER_LANGUAGE_HLSL == 2
# endif // BGFX_SHADER_LANGUAGE_HLSL > 3
vec3 instMul(vec3 _vec, mat3 _mtx) { return mul(_mtx, _vec); }
vec3 instMul(mat3 _mtx, vec3 _vec) { return mul(_vec, _mtx); }
vec4 instMul(vec4 _vec, mat4 _mtx) { return mul(_mtx, _vec); }
vec4 instMul(mat4 _mtx, vec4 _vec) { return mul(_vec, _mtx); }
bvec2 lessThan(vec2 _a, vec2 _b) { return _a < _b; }
bvec3 lessThan(vec3 _a, vec3 _b) { return _a < _b; }
bvec4 lessThan(vec4 _a, vec4 _b) { return _a < _b; }
bvec2 lessThanEqual(vec2 _a, vec2 _b) { return _a <= _b; }
bvec3 lessThanEqual(vec3 _a, vec3 _b) { return _a <= _b; }
bvec4 lessThanEqual(vec4 _a, vec4 _b) { return _a <= _b; }
bvec2 greaterThan(vec2 _a, vec2 _b) { return _a > _b; }
bvec3 greaterThan(vec3 _a, vec3 _b) { return _a > _b; }
bvec4 greaterThan(vec4 _a, vec4 _b) { return _a > _b; }
bvec2 greaterThanEqual(vec2 _a, vec2 _b) { return _a >= _b; }
bvec3 greaterThanEqual(vec3 _a, vec3 _b) { return _a >= _b; }
bvec4 greaterThanEqual(vec4 _a, vec4 _b) { return _a >= _b; }
bvec2 notEqual(vec2 _a, vec2 _b) { return _a != _b; }
bvec3 notEqual(vec3 _a, vec3 _b) { return _a != _b; }
bvec4 notEqual(vec4 _a, vec4 _b) { return _a != _b; }
bvec2 equal(vec2 _a, vec2 _b) { return _a == _b; }
bvec3 equal(vec3 _a, vec3 _b) { return _a == _b; }
bvec4 equal(vec4 _a, vec4 _b) { return _a == _b; }
float mix(float _a, float _b, float _t) { return lerp(_a, _b, _t); }
vec2 mix(vec2 _a, vec2 _b, vec2 _t) { return lerp(_a, _b, _t); }
vec3 mix(vec3 _a, vec3 _b, vec3 _t) { return lerp(_a, _b, _t); }
vec4 mix(vec4 _a, vec4 _b, vec4 _t) { return lerp(_a, _b, _t); }
float mod(float _a, float _b) { return _a - _b * floor(_a / _b); }
vec2 mod(vec2 _a, vec2 _b) { return _a - _b * floor(_a / _b); }
vec3 mod(vec3 _a, vec3 _b) { return _a - _b * floor(_a / _b); }
vec4 mod(vec4 _a, vec4 _b) { return _a - _b * floor(_a / _b); }
#else
# define CONST(_x) const _x
# define atan2(_x, _y) atan(_x, _y)
# define mul(_a, _b) ( (_a) * (_b) )
# define saturate(_x) clamp(_x, 0.0, 1.0)
# define SAMPLER2D(_name, _reg) uniform sampler2D _name
# define SAMPLER2DMS(_name, _reg) uniform sampler2DMS _name
# define SAMPLER3D(_name, _reg) uniform sampler3D _name
# define SAMPLERCUBE(_name, _reg) uniform samplerCube _name
# define SAMPLER2DSHADOW(_name, _reg) uniform sampler2DShadow _name
# define SAMPLER2DARRAY(_name, _reg) uniform sampler2DArray _name
# define SAMPLER2DMSARRAY(_name, _reg) uniform sampler2DMSArray _name
# define SAMPLERCUBEARRAY(_name, _reg) uniform samplerCubeArray _name
# define SAMPLER2DARRAYSHADOW(_name, _reg) uniform sampler2DArrayShadow _name
# if BGFX_SHADER_LANGUAGE_GLSL >= 130
# define ISAMPLER2D(_name, _reg) uniform isampler2D _name
# define USAMPLER2D(_name, _reg) uniform usampler2D _name
# define ISAMPLER3D(_name, _reg) uniform isampler3D _name
# define USAMPLER3D(_name, _reg) uniform usampler3D _name
# define texture2D(_sampler, _coord) texture(_sampler, _coord)
# define texture2DArray(_sampler, _coord) texture(_sampler, _coord)
# define texture3D(_sampler, _coord) texture(_sampler, _coord)
# endif // BGFX_SHADER_LANGUAGE_GLSL >= 130
vec3 instMul(vec3 _vec, mat3 _mtx) { return mul(_vec, _mtx); }
vec3 instMul(mat3 _mtx, vec3 _vec) { return mul(_mtx, _vec); }
vec4 instMul(vec4 _vec, mat4 _mtx) { return mul(_vec, _mtx); }
vec4 instMul(mat4 _mtx, vec4 _vec) { return mul(_mtx, _vec); }
float rcp(float _a) { return 1.0/_a; }
vec2 rcp(vec2 _a) { return vec2(1.0)/_a; }
vec3 rcp(vec3 _a) { return vec3(1.0)/_a; }
vec4 rcp(vec4 _a) { return vec4(1.0)/_a; }
#endif // BGFX_SHADER_LANGUAGE_*
vec2 vec2_splat(float _x) { return vec2(_x, _x); }
vec3 vec3_splat(float _x) { return vec3(_x, _x, _x); }
vec4 vec4_splat(float _x) { return vec4(_x, _x, _x, _x); }
#if BGFX_SHADER_LANGUAGE_GLSL >= 130 || BGFX_SHADER_LANGUAGE_HLSL
uvec2 uvec2_splat(uint _x) { return uvec2(_x, _x); }
uvec3 uvec3_splat(uint _x) { return uvec3(_x, _x, _x); }
uvec4 uvec4_splat(uint _x) { return uvec4(_x, _x, _x, _x); }
#endif // BGFX_SHADER_LANGUAGE_GLSL >= 130 || BGFX_SHADER_LANGUAGE_HLSL
uniform vec4 u_viewRect;
uniform vec4 u_viewTexel;
uniform mat4 u_view;
uniform mat4 u_invView;
uniform mat4 u_proj;
uniform mat4 u_invProj;
uniform mat4 u_viewProj;
uniform mat4 u_invViewProj;
uniform mat4 u_model[BGFX_CONFIG_MAX_BONES];
uniform mat4 u_modelView;
uniform mat4 u_modelViewProj;
uniform vec4 u_alphaRef4;
#define u_alphaRef u_alphaRef4.x
#endif // __cplusplus
#endif // BGFX_SHADER_H_HEADER_GUARD

View File

@ -0,0 +1,13 @@
$input v_color0
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
void main()
{
gl_FragColor = v_color0;
}

View File

@ -0,0 +1,11 @@
$input v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
#define SHADOW_PACKED_DEPTH 0
#include "fs_sms_shadow.sh"

View File

@ -0,0 +1,11 @@
$input v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
#define SHADOW_PACKED_DEPTH 1
#include "fs_sms_shadow.sh"

View File

@ -0,0 +1,12 @@
$input v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
#define SHADOW_PACKED_DEPTH 1
#define TEXTURED 1
#include "fs_sms_shadow.sh"

View File

@ -0,0 +1,115 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
uniform vec4 u_lightPos;
uniform vec4 u_color;
uniform vec4 u_shadowMapParams;
#define u_shadowMapSize u_shadowMapParams.x
#define u_shadowMapBias u_shadowMapParams.y
#if SHADOW_PACKED_DEPTH
SAMPLER2D(u_shadowMap, 0);
# define Sampler sampler2D
#else
SAMPLER2DSHADOW(u_shadowMap, 0);
# define Sampler sampler2DShadow
#endif // SHADOW_PACKED_DEPTH
#if TEXTURED
SAMPLER2D(sceneDefaultTexture, 1);
#endif
vec2 lit(vec3 _ld, vec3 _n, vec3 _vd, float _exp)
{
//diff
float ndotl = dot(_n, _ld);
//spec
vec3 r = 2.0*ndotl*_n - _ld; //reflect(_ld, _n);
float rdotv = dot(r, _n);
float spec = step(0.0, ndotl) * pow(max(0.0, rdotv), _exp) * (2.0 + _exp)/8.0;
return max(vec2(ndotl, spec), 0.0);
}
float hardShadow(Sampler _sampler, vec4 _shadowCoord, float _bias)
{
vec3 texCoord = _shadowCoord.xyz/_shadowCoord.w;
#if SHADOW_PACKED_DEPTH
return step(texCoord.z-_bias, unpackRgbaToFloat(texture2D(_sampler, texCoord.xy) ) );
#else
return shadow2D(_sampler, vec3(texCoord.xy, texCoord.z-_bias) );
#endif // SHADOW_PACKED_DEPTH
}
float PCF(Sampler _sampler, vec4 _shadowCoord, float _bias, vec2 _texelSize)
{
vec2 texCoord = _shadowCoord.xy/_shadowCoord.w;
bool outside = any(greaterThan(texCoord, vec2_splat(1.0)))
|| any(lessThan (texCoord, vec2_splat(0.0)))
;
if (outside)
{
return 1.0;
}
float result = 0.0;
vec2 offset = _texelSize * _shadowCoord.w;
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 1.5) * offset, 0.0, 0.0), _bias);
return result / 16.0;
}
void main()
{
vec3 color = u_color.xyz;
vec3 v = v_view;
vec3 vd = -normalize(v);
vec3 n = v_normal;
vec3 l = u_lightPos.xyz;
vec3 ld = normalize(l);
vec2 lc = lit(ld, n, vd, 1.0);
vec2 texelSize = vec2_splat(1.0/u_shadowMapSize);
float visibility = PCF(u_shadowMap, v_shadowcoord, u_shadowMapBias, texelSize);
vec3 ambient = 0.05 * color;
vec3 brdf = (lc.x * color + lc.y * color) * visibility;
#if TEXTURED
vec4 texcolor = toLinear (texture2D(sceneDefaultTexture, v_texcoord0) );
brdf = brdf * texcolor.xyz;
ambient = ambient * texcolor.xyz;
#endif
vec3 final = toGamma(abs(ambient + brdf) );
gl_FragColor = vec4(final, 1.0);
}

View File

@ -0,0 +1,102 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
uniform vec4 u_lightPos;
uniform vec4 u_color;
#if SHADOW_PACKED_DEPTH
SAMPLER2D(u_shadowMap, 0);
# define Sampler sampler2D
#else
SAMPLER2DSHADOW(u_shadowMap, 0);
# define Sampler sampler2DShadow
#endif // SHADOW_PACKED_DEPTH
vec2 lit(vec3 _ld, vec3 _n, vec3 _vd, float _exp)
{
//diff
float ndotl = dot(_n, _ld);
//spec
vec3 r = 2.0*ndotl*_n - _ld; //reflect(_ld, _n);
float rdotv = dot(r, _vd);
float spec = step(0.0, ndotl) * pow(max(0.0, rdotv), _exp) * (2.0 + _exp)/8.0;
return max(vec2(ndotl, spec), 0.0);
}
float hardShadow(Sampler _sampler, vec4 _shadowCoord, float _bias)
{
vec3 texCoord = _shadowCoord.xyz/_shadowCoord.w;
#if SHADOW_PACKED_DEPTH
return step(texCoord.z-_bias, unpackRgbaToFloat(texture2D(_sampler, texCoord.xy) ) );
#else
return shadow2D(_sampler, vec3(texCoord.xy, texCoord.z-_bias) );
#endif // SHADOW_PACKED_DEPTH
}
float PCF(Sampler _sampler, vec4 _shadowCoord, float _bias, vec2 _texelSize)
{
vec2 texCoord = _shadowCoord.xy/_shadowCoord.w;
bool outside = any(greaterThan(texCoord, vec2_splat(1.0)))
|| any(lessThan (texCoord, vec2_splat(0.0)))
;
if (outside)
{
return 1.0;
}
float result = 0.0;
vec2 offset = _texelSize * _shadowCoord.w;
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -1.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 0.5) * offset, 0.0, 0.0), _bias);
result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 1.5) * offset, 0.0, 0.0), _bias);
return result / 16.0;
}
void main()
{
float shadowMapBias = 0.0001;
vec3 color = u_color.xyz;
vec3 v = v_view;
vec3 vd = -normalize(v);
vec3 n = v_normal;
vec3 l = u_lightPos.xyz;
vec3 ld = -normalize(l);
vec2 lc = lit(ld, n, vd, 1.0);
vec2 texelSize = vec2_splat(1.0/1024.0);
float visibility = PCF(u_shadowMap, v_shadowcoord, shadowMapBias, texelSize);
// float visibility = hardShadow(u_shadowMap, v_shadowcoord, shadowMapBias);
vec3 ambient = 0.1 * color;
vec3 brdf = (lc.x + lc.y) * color * visibility;
vec3 final = toGamma(abs(ambient + brdf) );
gl_FragColor = vec4(final, 1.0);
}

BIN
data/shaders/src/mesh.out Normal file

Binary file not shown.

View File

@ -0,0 +1,386 @@
/*
* Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef __SHADERLIB_SH__
#define __SHADERLIB_SH__
vec4 encodeRE8(float _r)
{
float exponent = ceil(log2(_r) );
return vec4(_r / exp2(exponent)
, 0.0
, 0.0
, (exponent + 128.0) / 255.0
);
}
float decodeRE8(vec4 _re8)
{
float exponent = _re8.w * 255.0 - 128.0;
return _re8.x * exp2(exponent);
}
vec4 encodeRGBE8(vec3 _rgb)
{
vec4 rgbe8;
float maxComponent = max(max(_rgb.x, _rgb.y), _rgb.z);
float exponent = ceil(log2(maxComponent) );
rgbe8.xyz = _rgb / exp2(exponent);
rgbe8.w = (exponent + 128.0) / 255.0;
return rgbe8;
}
vec3 decodeRGBE8(vec4 _rgbe8)
{
float exponent = _rgbe8.w * 255.0 - 128.0;
vec3 rgb = _rgbe8.xyz * exp2(exponent);
return rgb;
}
vec3 encodeNormalUint(vec3 _normal)
{
return _normal * 0.5 + 0.5;
}
vec3 decodeNormalUint(vec3 _encodedNormal)
{
return _encodedNormal * 2.0 - 1.0;
}
vec2 encodeNormalSphereMap(vec3 _normal)
{
return normalize(_normal.xy) * sqrt(_normal.z * 0.5 + 0.5);
}
vec3 decodeNormalSphereMap(vec2 _encodedNormal)
{
float zz = dot(_encodedNormal, _encodedNormal) * 2.0 - 1.0;
return vec3(normalize(_encodedNormal.xy) * sqrt(1.0 - zz*zz), zz);
}
vec2 octahedronWrap(vec2 _val)
{
// Reference:
// Octahedron normal vector encoding
// http://kriscg.blogspot.com/2014/04/octahedron-normal-vector-encoding.html
return (1.0 - abs(_val.yx) )
* mix(vec2_splat(-1.0), vec2_splat(1.0), vec2(greaterThanEqual(_val.xy, vec2_splat(0.0) ) ) );
}
vec2 encodeNormalOctahedron(vec3 _normal)
{
_normal /= abs(_normal.x) + abs(_normal.y) + abs(_normal.z);
_normal.xy = _normal.z >= 0.0 ? _normal.xy : octahedronWrap(_normal.xy);
_normal.xy = _normal.xy * 0.5 + 0.5;
return _normal.xy;
}
vec3 decodeNormalOctahedron(vec2 _encodedNormal)
{
_encodedNormal = _encodedNormal * 2.0 - 1.0;
vec3 normal;
normal.z = 1.0 - abs(_encodedNormal.x) - abs(_encodedNormal.y);
normal.xy = normal.z >= 0.0 ? _encodedNormal.xy : octahedronWrap(_encodedNormal.xy);
return normalize(normal);
}
vec3 convertRGB2XYZ(vec3 _rgb)
{
// Reference:
// RGB/XYZ Matrices
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
vec3 xyz;
xyz.x = dot(vec3(0.4124564, 0.3575761, 0.1804375), _rgb);
xyz.y = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
xyz.z = dot(vec3(0.0193339, 0.1191920, 0.9503041), _rgb);
return xyz;
}
vec3 convertXYZ2RGB(vec3 _xyz)
{
vec3 rgb;
rgb.x = dot(vec3( 3.2404542, -1.5371385, -0.4985314), _xyz);
rgb.y = dot(vec3(-0.9692660, 1.8760108, 0.0415560), _xyz);
rgb.z = dot(vec3( 0.0556434, -0.2040259, 1.0572252), _xyz);
return rgb;
}
vec3 convertXYZ2Yxy(vec3 _xyz)
{
// Reference:
// http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_xyY.html
float inv = 1.0/dot(_xyz, vec3(1.0, 1.0, 1.0) );
return vec3(_xyz.y, _xyz.x*inv, _xyz.y*inv);
}
vec3 convertYxy2XYZ(vec3 _Yxy)
{
// Reference:
// http://www.brucelindbloom.com/index.html?Eqn_xyY_to_XYZ.html
vec3 xyz;
xyz.x = _Yxy.x*_Yxy.y/_Yxy.z;
xyz.y = _Yxy.x;
xyz.z = _Yxy.x*(1.0 - _Yxy.y - _Yxy.z)/_Yxy.z;
return xyz;
}
vec3 convertRGB2Yxy(vec3 _rgb)
{
return convertXYZ2Yxy(convertRGB2XYZ(_rgb) );
}
vec3 convertYxy2RGB(vec3 _Yxy)
{
return convertXYZ2RGB(convertYxy2XYZ(_Yxy) );
}
vec3 convertRGB2Yuv(vec3 _rgb)
{
vec3 yuv;
yuv.x = dot(_rgb, vec3(0.299, 0.587, 0.114) );
yuv.y = (_rgb.x - yuv.x)*0.713 + 0.5;
yuv.z = (_rgb.z - yuv.x)*0.564 + 0.5;
return yuv;
}
vec3 convertYuv2RGB(vec3 _yuv)
{
vec3 rgb;
rgb.x = _yuv.x + 1.403*(_yuv.y-0.5);
rgb.y = _yuv.x - 0.344*(_yuv.y-0.5) - 0.714*(_yuv.z-0.5);
rgb.z = _yuv.x + 1.773*(_yuv.z-0.5);
return rgb;
}
vec3 convertRGB2YIQ(vec3 _rgb)
{
vec3 yiq;
yiq.x = dot(vec3(0.299, 0.587, 0.114 ), _rgb);
yiq.y = dot(vec3(0.595716, -0.274453, -0.321263), _rgb);
yiq.z = dot(vec3(0.211456, -0.522591, 0.311135), _rgb);
return yiq;
}
vec3 convertYIQ2RGB(vec3 _yiq)
{
vec3 rgb;
rgb.x = dot(vec3(1.0, 0.9563, 0.6210), _yiq);
rgb.y = dot(vec3(1.0, -0.2721, -0.6474), _yiq);
rgb.z = dot(vec3(1.0, -1.1070, 1.7046), _yiq);
return rgb;
}
vec3 toLinear(vec3 _rgb)
{
return pow(abs(_rgb), vec3_splat(2.2) );
}
vec4 toLinear(vec4 _rgba)
{
return vec4(toLinear(_rgba.xyz), _rgba.w);
}
vec3 toLinearAccurate(vec3 _rgb)
{
vec3 lo = _rgb / 12.92;
vec3 hi = pow( (_rgb + 0.055) / 1.055, vec3_splat(2.4) );
vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.04045) ) ) );
return rgb;
}
vec4 toLinearAccurate(vec4 _rgba)
{
return vec4(toLinearAccurate(_rgba.xyz), _rgba.w);
}
float toGamma(float _r)
{
return pow(abs(_r), 1.0/2.2);
}
vec3 toGamma(vec3 _rgb)
{
return pow(abs(_rgb), vec3_splat(1.0/2.2) );
}
vec4 toGamma(vec4 _rgba)
{
return vec4(toGamma(_rgba.xyz), _rgba.w);
}
vec3 toGammaAccurate(vec3 _rgb)
{
vec3 lo = _rgb * 12.92;
vec3 hi = pow(abs(_rgb), vec3_splat(1.0/2.4) ) * 1.055 - 0.055;
vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.0031308) ) ) );
return rgb;
}
vec4 toGammaAccurate(vec4 _rgba)
{
return vec4(toGammaAccurate(_rgba.xyz), _rgba.w);
}
vec3 toReinhard(vec3 _rgb)
{
return toGamma(_rgb/(_rgb+vec3_splat(1.0) ) );
}
vec4 toReinhard(vec4 _rgba)
{
return vec4(toReinhard(_rgba.xyz), _rgba.w);
}
vec3 toFilmic(vec3 _rgb)
{
_rgb = max(vec3_splat(0.0), _rgb - 0.004);
_rgb = (_rgb*(6.2*_rgb + 0.5) ) / (_rgb*(6.2*_rgb + 1.7) + 0.06);
return _rgb;
}
vec4 toFilmic(vec4 _rgba)
{
return vec4(toFilmic(_rgba.xyz), _rgba.w);
}
vec3 toAcesFilmic(vec3 _rgb)
{
// Reference:
// ACES Filmic Tone Mapping Curve
// https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
float aa = 2.51f;
float bb = 0.03f;
float cc = 2.43f;
float dd = 0.59f;
float ee = 0.14f;
return saturate( (_rgb*(aa*_rgb + bb) )/(_rgb*(cc*_rgb + dd) + ee) );
}
vec4 toAcesFilmic(vec4 _rgba)
{
return vec4(toAcesFilmic(_rgba.xyz), _rgba.w);
}
vec3 luma(vec3 _rgb)
{
float yy = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
return vec3_splat(yy);
}
vec4 luma(vec4 _rgba)
{
return vec4(luma(_rgba.xyz), _rgba.w);
}
vec3 conSatBri(vec3 _rgb, vec3 _csb)
{
vec3 rgb = _rgb * _csb.z;
rgb = mix(luma(rgb), rgb, _csb.y);
rgb = mix(vec3_splat(0.5), rgb, _csb.x);
return rgb;
}
vec4 conSatBri(vec4 _rgba, vec3 _csb)
{
return vec4(conSatBri(_rgba.xyz, _csb), _rgba.w);
}
vec3 posterize(vec3 _rgb, float _numColors)
{
return floor(_rgb*_numColors) / _numColors;
}
vec4 posterize(vec4 _rgba, float _numColors)
{
return vec4(posterize(_rgba.xyz, _numColors), _rgba.w);
}
vec3 sepia(vec3 _rgb)
{
vec3 color;
color.x = dot(_rgb, vec3(0.393, 0.769, 0.189) );
color.y = dot(_rgb, vec3(0.349, 0.686, 0.168) );
color.z = dot(_rgb, vec3(0.272, 0.534, 0.131) );
return color;
}
vec4 sepia(vec4 _rgba)
{
return vec4(sepia(_rgba.xyz), _rgba.w);
}
vec3 blendOverlay(vec3 _base, vec3 _blend)
{
vec3 lt = 2.0 * _base * _blend;
vec3 gte = 1.0 - 2.0 * (1.0 - _base) * (1.0 - _blend);
return mix(lt, gte, step(vec3_splat(0.5), _base) );
}
vec4 blendOverlay(vec4 _base, vec4 _blend)
{
return vec4(blendOverlay(_base.xyz, _blend.xyz), _base.w);
}
vec3 adjustHue(vec3 _rgb, float _hue)
{
vec3 yiq = convertRGB2YIQ(_rgb);
float angle = _hue + atan2(yiq.z, yiq.y);
float len = length(yiq.yz);
return convertYIQ2RGB(vec3(yiq.x, len*cos(angle), len*sin(angle) ) );
}
vec4 packFloatToRgba(float _value)
{
const vec4 shift = vec4(256 * 256 * 256, 256 * 256, 256, 1.0);
const vec4 mask = vec4(0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
vec4 comp = fract(_value * shift);
comp -= comp.xxyz * mask;
return comp;
}
float unpackRgbaToFloat(vec4 _rgba)
{
const vec4 shift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);
return dot(_rgba, shift);
}
vec2 packHalfFloat(float _value)
{
const vec2 shift = vec2(256, 1.0);
const vec2 mask = vec2(0, 1.0 / 256.0);
vec2 comp = fract(_value * shift);
comp -= comp.xx * mask;
return comp;
}
float unpackHalfFloat(vec2 _rg)
{
const vec2 shift = vec2(1.0 / 256.0, 1.0);
return dot(_rg, shift);
}
float random(vec2 _uv)
{
return fract(sin(dot(_uv.xy, vec2(12.9898, 78.233) ) ) * 43758.5453);
}
vec3 fixCubeLookup(vec3 _v, float _lod, float _topLevelCubeSize)
{
// Reference:
// Seamless cube-map filtering
// http://the-witness.net/news/2012/02/seamless-cube-map-filtering/
float ax = abs(_v.x);
float ay = abs(_v.y);
float az = abs(_v.z);
float vmax = max(max(ax, ay), az);
float scale = 1.0 - exp2(_lod) / _topLevelCubeSize;
if (ax != vmax) { _v.x *= scale; }
if (ay != vmax) { _v.y *= scale; }
if (az != vmax) { _v.z *= scale; }
return _v;
}
#endif // __SHADERLIB_SH__

View File

@ -0,0 +1,28 @@
/*
* Copyright 2016 Dario Manesku. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 u_params[12];
#define u_mtx0 u_params[0]
#define u_mtx1 u_params[1]
#define u_mtx2 u_params[2]
#define u_mtx3 u_params[3]
#define u_glossiness u_params[4].x
#define u_reflectivity u_params[4].y
#define u_exposure u_params[4].z
#define u_bgType u_params[4].w
#define u_metalOrSpec u_params[5].x
#define u_unused u_params[5].yzw
#define u_doDiffuse u_params[6].x
#define u_doSpecular u_params[6].y
#define u_doDiffuseIbl u_params[6].z
#define u_doSpecularIbl u_params[6].w
#define u_camPos u_params[7].xyz
#define u_unused7 u_params[7].w
#define u_rgbDiff u_params[8]
#define u_rgbSpec u_params[9]
#define u_lightDir u_params[10].xyz
#define u_unused10 u_params[10].w
#define u_lightCol u_params[11].xyz
#define u_unused11 u_params[11].w

View File

@ -0,0 +1,13 @@
vec3 v_view : TEXCOORD0 = vec3(0.0, 0.0, 0.0);
vec4 v_shadowcoord : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0);
vec4 v_position : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0);
vec3 v_dir : TEXCOORD3 = vec3(0.0, 0.0, 0.0);
vec2 v_texcoord0 : TEXCOORD4 = vec2(0.0, 0.0);
vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0);
vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0);
vec3 a_position : POSITION;
vec4 a_normal : NORMAL;
vec4 a_color0 : COLOR0;
vec2 a_texcoord0 : TEXCOORD0;

View File

@ -0,0 +1,15 @@
$input a_position, a_color0
$output v_color0
/*
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
void main()
{
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
v_color0 = a_color0;
}

View File

@ -0,0 +1,13 @@
$input a_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "../common/common.sh"
void main()
{
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
}

View File

@ -3,6 +3,9 @@
#include "math_types.h" #include "math_types.h"
#include "Utils.h" #include "Utils.h"
#define USE_DOCKS 1
struct Timer; struct Timer;
extern Timer* gTimer; extern Timer* gTimer;

View File

@ -44,15 +44,13 @@ void RuntimeModuleManager::LoadModule(RuntimeModule* module) {
bool stat_result = stat(module->name.c_str(), &attr); bool stat_result = stat(module->name.c_str(), &attr);
if (glfwGetKey(gWindow, GLFW_KEY_F11) == GLFW_PRESS) { if (glfwGetKey(gWindow, GLFW_KEY_F11) == GLFW_PRESS) {
std::cerr << "Module " << module->name << " id = " << module->id gLog ("Module %s id = %d mtime %d", module->name.c_str(), module->id, module->mtime);
<< " mtime " << ctime((time_t *) &module->mtime) << std::endl;
} }
if ( stat_result == 0 && if ( stat_result == 0 &&
(module->id != attr.st_ino || module->mtime != attr.st_mtime) (module->id != attr.st_ino || module->mtime != attr.st_mtime)
) { ) {
std::cout << "Opening module " << module->name gLog ("Loading module %s (size %d)", module->name.c_str(), attr.st_size);
<< " (size = " << attr.st_size << ")" << std::endl;
void *handle = dlopen(module->name.c_str(), RTLD_NOW | RTLD_GLOBAL); void *handle = dlopen(module->name.c_str(), RTLD_NOW | RTLD_GLOBAL);
if (handle) { if (handle) {
module->handle = handle; module->handle = handle;
@ -63,20 +61,19 @@ void RuntimeModuleManager::LoadModule(RuntimeModule* module) {
if (api != NULL) { if (api != NULL) {
module->api = *api; module->api = *api;
if (module->state == NULL) { if (module->state == NULL) {
std::cout << "Initializing module " << module->name << std::endl; gLog("Initializing module %s", module->name.c_str());
module->state = module->api.init(); module->state = module->api.init();
} }
std::cout << "Reloading module " << module->name << std::endl; gLog("Reloading module %s", module->name.c_str());
module->api.reload(module->state, gReadSerializer); module->api.reload(module->state, gReadSerializer);
} else { } else {
std::cerr << "Error: could not find API for module " << module->name << std::endl; gLog("Loading module failed: Could not find API for module %s", module->name.c_str());
dlclose(module->handle); dlclose(module->handle);
module->handle = NULL; module->handle = NULL;
module->id = 0; module->id = 0;
} }
} else { } else {
std::cerr << "Error: could not load module " << module->name << std::endl; gLog ("Loading module failed: could not load shared library for module %s: %s", module->name.c_str(), dlerror());
std::cerr << dlerror() << std::endl;
module->handle = NULL; module->handle = NULL;
module->id = 0; module->id = 0;
abort(); abort();
@ -143,18 +140,23 @@ void RuntimeModuleManager::UnloadModules() {
gLog("Unloading module %s", mModules[i]->name.c_str()); gLog("Unloading module %s", mModules[i]->name.c_str());
mModules[i]->api.unload(mModules[i]->state, gWriteSerializer); mModules[i]->api.unload(mModules[i]->state, gWriteSerializer);
mModules[i]->state = nullptr; mModules[i]->state = nullptr;
dlclose(mModules[i]->handle); gLog ("Unloading shared library %s", mModules[i]->name.c_str());
int unload_result = dlclose(mModules[i]->handle);
if (unload_result != 0) {
gLog ("Unload failed (code %d): %s", unload_result, dlerror());
}
mModules[i]->handle = 0; mModules[i]->handle = 0;
mModules[i]->id = 0; mModules[i]->id = 0;
gLog("Unloading module %s complete", mModules[i]->name.c_str());
} }
} }
std::cout << "Writing state to file " << state_file << std::endl; gLog ("Writting state to file %s", state_file);
gWriteSerializer->Close(); gWriteSerializer->Close();
} }
void RuntimeModuleManager::LoadModules() { void RuntimeModuleManager::LoadModules() {
std::cout << "Reading state from file " << state_file << std::endl; gLog ("Reading state from file %s", state_file);
gReadSerializer->Open(state_file); gReadSerializer->Open(state_file);
for (int i = 0; i < mModules.size(); i++) { for (int i = 0; i < mModules.size(); i++) {
LoadModule(mModules[i]); LoadModule(mModules[i]);

23
src/Utils.cc Normal file
View File

@ -0,0 +1,23 @@
#include "Utils.h"
#include <fstream>
#include <cstdio>
#include <cstdlib>
FILE *gLogFile = NULL;
void LoggingInit() {
// check if protot.log exists and rename it to protot.log.1 if found
std::ifstream source ("protot.log", std::ios::binary);
if (source.good()) {
std::ofstream destination ("protot.log.1", std::ios::binary | std::ios::trunc);
destination << source.rdbuf();
}
source.close();
gLogFile = fopen("protot.log", "w+");
}

View File

@ -1,5 +1,9 @@
#pragma once #pragma once
#include <cstdio>
#include <cstdlib>
#include <cstdint>
#include <cassert>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -49,11 +53,29 @@ inline double gGetTimeSinceStart () {
return gGetCurrentTime() - gTimeAtStart; return gGetCurrentTime() - gTimeAtStart;
} }
extern FILE *gLogFile;
void LoggingInit();
const int cLogBufferSize = 1024;
inline void gLog (const char* format, ...) { inline void gLog (const char* format, ...) {
assert(gLogFile != NULL);
fprintf (stdout, "%11.6f: ", gGetTimeSinceStart()); fprintf (stdout, "%11.6f: ", gGetTimeSinceStart());
fprintf (gLogFile,"%11.6f: ", gGetTimeSinceStart());
va_list argptr; va_list argptr;
char buffer[cLogBufferSize];
va_start(argptr, format); va_start(argptr, format);
vfprintf(stdout, format, argptr); vsnprintf(buffer, cLogBufferSize, format, argptr);
va_end(argptr); va_end(argptr);
fprintf (stdout, "\n");
fprintf(stdout, "%s\n", buffer);
fprintf(gLogFile, "%s\n", buffer);
fflush(gLogFile);
} }

View File

@ -9,9 +9,12 @@
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <iostream> #include <iostream>
#include <sstream>
#include "bgfx/platform.h" #include "bgfx/platform.h"
#include "bx/timer.h" #include "bx/timer.h"
#include "bx/process.h"
#include "bx/error.h"
#include "Timer.h" #include "Timer.h"
#include "RuntimeModuleManager.h" #include "RuntimeModuleManager.h"
#include "imgui/imgui.h" #include "imgui/imgui.h"
@ -19,6 +22,7 @@
#include "Globals.h" #include "Globals.h"
#include "Serializer.h" #include "Serializer.h"
#include "FileModificationObserver.h"
Timer* gTimer = nullptr; Timer* gTimer = nullptr;
Renderer* gRenderer = nullptr; Renderer* gRenderer = nullptr;
@ -103,6 +107,8 @@ int main(void)
gTimeAtStart = gGetCurrentTime(); gTimeAtStart = gGetCurrentTime();
std::cout << "Time at start: " << gTimeAtStart << std::endl; std::cout << "Time at start: " << gTimeAtStart << std::endl;
LoggingInit();
WriteSerializer out_serializer; WriteSerializer out_serializer;
ReadSerializer in_serializer; ReadSerializer in_serializer;
@ -127,19 +133,21 @@ int main(void)
std::cout << "OpenGL Version: " << glGetString(GL_VERSION) << endl; std::cout << "OpenGL Version: " << glGetString(GL_VERSION) << endl;
std::cout << "GLSL Version : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl; std::cout << "GLSL Version : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl;
// Initialize Renderer // Initialize BGFX
bgfx::glfwSetWindow(gWindow); bgfx::glfwSetWindow(gWindow);
bgfx::renderFrame(); bgfx::renderFrame();
uint32_t debug = BGFX_DEBUG_TEXT;
uint32_t reset = BGFX_RESET_VSYNC;
bool result = bgfx::init(); bool result = bgfx::init();
if (!result) { if (!result) {
std::cerr << "Error: could not initialize renderer!" << std::endl; std::cerr << "Error: could not initialize renderer!" << std::endl;
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
uint32_t debug = BGFX_DEBUG_TEXT;
uint32_t reset = BGFX_RESET_VSYNC | BGFX_RESET_MAXANISOTROPY | BGFX_RESET_MSAA_X16;
bgfx::reset (width, height, reset);
bgfx::setDebug(debug);
// imgui initialization. // imgui initialization.
imguiCreate(); imguiCreate();
GuiInputState gui_input_state; GuiInputState gui_input_state;
@ -166,11 +174,16 @@ int main(void)
module_manager.LoadModules(); module_manager.LoadModules();
int64_t time_offset = bx::getHPCounter(); int64_t time_offset = bx::getHPCounter();
uint64_t frame_counter = 0;
while(!glfwWindowShouldClose(gWindow)) { while(!glfwWindowShouldClose(gWindow)) {
frame_counter++;
// Start the imgui frame such that widgets can be submitted // Start the imgui frame such that widgets can be submitted
handle_mouse(); handle_mouse();
glfwGetWindowSize(gWindow, &width, &height); glfwGetWindowSize(gWindow, &width, &height);
bgfx::reset (width, height);
bgfx::touch(0);
imguiBeginFrame (gGuiInputState->mouseX, imguiBeginFrame (gGuiInputState->mouseX,
gGuiInputState->mouseY, gGuiInputState->mouseY,
@ -183,16 +196,16 @@ int main(void)
static int64_t last = bx::getHPCounter(); static int64_t last = bx::getHPCounter();
int64_t pre_module_check = bx::getHPCounter(); int64_t pre_module_check = bx::getHPCounter();
if (module_manager.CheckModulesChanged()) { // if (module_manager.CheckModulesChanged()) {
std::cout << "Detected module update. Unloading all modules." << std::endl; // gLog("Detected module update at frame %d. Unloading all modules.", frame_counter);
module_manager.UnloadModules(); // module_manager.UnloadModules();
// We need to sleep to make sure we load the new files // // We need to sleep to make sure we load the new files
module_manager.LoadModules(); // module_manager.LoadModules();
// We need to update our last timestamp to ignore the delay due // // We need to update our last timestamp to ignore the delay due
// to reloading of the modules. // // to reloading of the modules.
last = bx::getHPCounter(); // last = bx::getHPCounter();
} // }
// update time that was passed without module reloading // update time that was passed without module reloading
int64_t now = bx::getHPCounter(); int64_t now = bx::getHPCounter();
int64_t module_update = now - pre_module_check; int64_t module_update = now - pre_module_check;
@ -215,14 +228,47 @@ int main(void)
} }
assert (gTimer->mDeltaTime >= 0.0f); assert (gTimer->mDeltaTime >= 0.0f);
module_manager.Update(gTimer->mDeltaTime); #ifdef USE_DOCKS
ImGui::SetNextWindowPos(ImVec2(0.0f, 20.0f));
int width, height;
glfwGetWindowSize(gWindow, &width, &height);
ImGui::SetNextWindowSize(ImVec2(width, height));
if (ImGui::Begin("DockArea", NULL,
ImGuiWindowFlags_NoTitleBar
| ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoMove
| ImGuiWindowFlags_NoBringToFrontOnFocus
)) {
ImGui::BeginDockspace();
glfwPollEvents(); if (ImGui::BeginDock("dock1")) {
ImGui::Text("HEllo 1");
}
ImGui::EndDock();
#endif
module_manager.Update(gTimer->mDeltaTime);
glfwPollEvents();
#ifdef USE_DOCKS
ImGui::EndDockspace();
}
ImGui::End();
#endif
// submit the imgui widgets // submit the imgui widgets
imguiEndFrame(); imguiEndFrame();
usleep(16000); // Advance to next frame. Rendering thread will be kicked to
// process submitted rendering primitives.
bgfx::frame();
usleep(16000);
if (frame_counter > 1) {
gLog ("End of frame %d", frame_counter);
}
} }
module_manager.UnregisterModules(); module_manager.UnregisterModules();

View File

@ -152,11 +152,11 @@ CharacterEntity::CharacterEntity() {
bool load_result = LoadRig (cRigModelFile); bool load_result = LoadRig (cRigModelFile);
assert (load_result); assert (load_result);
cout << "Creating render entity mesh ..." << endl; gLog ("Creating render entity mesh...");
// mState->character->entity->mesh = bgfxutils::createCuboid (1.f, 1.f, 1.f); // mState->character->entity->mesh = bgfxutils::createCuboid (1.f, 1.f, 1.f);
// mState->character->entity->mesh = bgfxutils::createCylinder (20); // mState->character->entity->mesh = bgfxutils::createCylinder (20);
cout << "Creating render entity mesh ... success!" << endl; gLog ("Creating render entity mesh... success!");
gLog ("Loading Animation %s", cAnimFile); gLog ("Loading Animation %s", cAnimFile);
load_result = mAnimation.Load(cAnimFile); load_result = mAnimation.Load(cAnimFile);
@ -185,7 +185,7 @@ bool CharacterEntity::LoadRig(const char* filename) {
bool load_result = LuaModelReadFromTable (model_table, mRigModel, false); bool load_result = LuaModelReadFromTable (model_table, mRigModel, false);
gLog ("Creating rig model from %s ... %s", filename, load_result ? "success" : "failed!"); // gLog ("Creating rig model from %s ... %s", filename, load_result ? "success" : "failed!");
gLog ("Rig model has %d degrees of freedom", mRigModel->qdot_size); gLog ("Rig model has %d degrees of freedom", mRigModel->qdot_size);
mRigState.q = VectorNd::Zero (mRigModel->q_size); mRigState.q = VectorNd::Zero (mRigModel->q_size);
@ -681,7 +681,7 @@ void ShowCharacterPropertiesWindow (CharacterEntity* character) {
} }
static struct module_state *module_init() { static struct module_state *module_init() {
std::cout << "Module init called" << std::endl; gLog ("%s %s called", __FILE__, __FUNCTION__);
module_state *state = (module_state*) malloc(sizeof(*state)); module_state *state = (module_state*) malloc(sizeof(*state));
return state; return state;
} }
@ -693,12 +693,12 @@ static void module_serialize (
} }
static void module_finalize(struct module_state *state) { static void module_finalize(struct module_state *state) {
std::cout << "Module finalize called" << std::endl; gLog ("%s %s called (state %p)", __FILE__, __FUNCTION__, state);
free(state); free(state);
} }
static void module_reload(struct module_state *state, void* read_serializer) { static void module_reload(struct module_state *state, void* read_serializer) {
std::cout << "Module reload called. State: " << state << std::endl; gLog ("%s %s called (state %p)", __FILE__, __FUNCTION__, state);
// load the state of the entity // load the state of the entity
if (read_serializer != nullptr) { if (read_serializer != nullptr) {
module_serialize(state, static_cast<ReadSerializer*>(read_serializer)); module_serialize(state, static_cast<ReadSerializer*>(read_serializer));

View File

@ -5,10 +5,6 @@
#include "3rdparty/ocornut-imgui/imgui_internal.h" #include "3rdparty/ocornut-imgui/imgui_internal.h"
#include "imgui/imgui.h" #include "imgui/imgui.h"
#include "imgui_dock.h" #include "imgui_dock.h"
#define GLFW_EXPOSE_NATIVE_GLX
#define GLFW_EXPOSE_NATIVE_X11
#include <GLFW/glfw3.h>
#include <GLFW/glfw3native.h>
#include "SimpleMath/SimpleMath.h" #include "SimpleMath/SimpleMath.h"
#include "SimpleMath/SimpleMathMap.h" #include "SimpleMath/SimpleMathMap.h"
@ -56,7 +52,7 @@ struct module_state {
}; };
static struct module_state *module_init() { static struct module_state *module_init() {
gLog ("RenderModule init called."); gLog ("%s %s called", __FILE__, __FUNCTION__);
assert (gWindow != nullptr && "Cannot initialize renderer module without gWindow!"); assert (gWindow != nullptr && "Cannot initialize renderer module without gWindow!");
module_state *state = (module_state*) malloc(sizeof(*state)); module_state *state = (module_state*) malloc(sizeof(*state));
@ -82,7 +78,7 @@ static void module_serialize (
} }
static void module_finalize(struct module_state *state) { static void module_finalize(struct module_state *state) {
gLog ("RenderModule finalize called"); gLog ("%s %s called (state %p)", __FILE__, __FUNCTION__, state);
assert (state->renderer != nullptr); assert (state->renderer != nullptr);
delete state->renderer; delete state->renderer;
@ -91,14 +87,12 @@ static void module_finalize(struct module_state *state) {
} }
static void module_reload(struct module_state *state, void *read_serializer) { static void module_reload(struct module_state *state, void *read_serializer) {
gLog ("RenderModule reload called"); gLog ("%s %s called (state %p)", __FILE__, __FUNCTION__, state);
assert (gWindow != nullptr); assert (gWindow != nullptr);
int width, height;
glfwGetWindowSize(gWindow, &width, &height);
gLog ("Renderer initialize"); gLog ("Renderer initialize");
assert (state != nullptr); assert (state != nullptr);
state->renderer->initialize(width, height); state->renderer->initialize(100, 100);
gRenderer = state->renderer; gRenderer = state->renderer;
// load the state of the module // load the state of the module
@ -128,20 +122,12 @@ static void module_unload(struct module_state *state, void* write_serializer) {
static bool module_step(struct module_state *state, float dt) { static bool module_step(struct module_state *state, float dt) {
int width, height; int width, height;
assert (gWindow != nullptr); assert (gWindow != nullptr);
glfwGetWindowSize(gWindow, &width, &height);
state->renderer->updateShaders(); state->renderer->updateShaders();
bgfx::reset (width, height);
int dock_top_offset = 0.0f;
int dock_width = 0;
state->renderer->resize (0, dock_top_offset, width - dock_width, height - dock_top_offset);
ImGuizmo::Enable(true); ImGuizmo::Enable(true);
state->renderer->paintGL();
state->renderer->DrawGui(); state->renderer->DrawGui();
state->renderer->paintGL();
return true; return true;
} }
@ -203,7 +189,8 @@ namespace IBL {
void destroy() void destroy()
{ {
bgfx::destroy(u_params); if (bgfx::isValid(u_params))
bgfx::destroy(u_params);
} }
union union
@ -335,6 +322,7 @@ bool RenderProgram::checkModified() const {
// early out if we don't have filenames // early out if we don't have filenames
if (vertexShaderFileName == "" if (vertexShaderFileName == ""
|| fragmentShaderFileName == "") { || fragmentShaderFileName == "") {
gLog ("Warning! RenderProgram has no shader filenames specified!");
return false; return false;
} }
@ -379,7 +367,7 @@ bool RenderProgram::reload() {
fragmentShaderFileModTime = fragment_mtime; fragmentShaderFileModTime = fragment_mtime;
bgfx::ProgramHandle new_handle = bgfx::ProgramHandle new_handle =
bgfxutils::loadProgramFromFiles ( bgfxutils::loadProgram (
vertexShaderFileName.c_str(), vertexShaderFileName.c_str(),
fragmentShaderFileName.c_str() fragmentShaderFileName.c_str()
); );
@ -1058,8 +1046,8 @@ void Renderer::setupShaders() {
memcpy(IBL::uniforms.m_lightCol, IBL::settings.m_lightCol, 3*sizeof(float) ); memcpy(IBL::uniforms.m_lightCol, IBL::settings.m_lightCol, 3*sizeof(float) );
s_renderStates[RenderState::Skybox].m_program = RenderProgram( s_renderStates[RenderState::Skybox].m_program = RenderProgram(
"shaders/skybox/vs_ibl_skybox.sc", "vs_ibl_skybox.sc",
"shaders/skybox/fs_ibl_skybox.sc" "fs_ibl_skybox.sc"
); );
// Get renderer capabilities info. // Get renderer capabilities info.
@ -1073,18 +1061,18 @@ void Renderer::setupShaders() {
// Depth textures and shadow samplers are supported. // Depth textures and shadow samplers are supported.
s_renderStates[RenderState::ShadowMap].m_program = s_renderStates[RenderState::ShadowMap].m_program =
RenderProgram( RenderProgram(
"shaders/shadowmap/vs_sms_mesh.sc", "vs_sms_mesh.sc",
"shaders/shadowmap/fs_sms_shadow.sc" "fs_sms_shadow.sc"
); );
s_renderStates[RenderState::Scene].m_program = s_renderStates[RenderState::Scene].m_program =
RenderProgram( RenderProgram(
"shaders/scene/vs_sms_mesh.sc", "vs_sms_mesh.sc",
"shaders/scene/fs_sms_mesh.sc" "fs_sms_mesh.sc"
); );
s_renderStates[RenderState::SceneTextured].m_program = s_renderStates[RenderState::SceneTextured].m_program =
RenderProgram( RenderProgram(
"shaders/scene/vs_sms_mesh_textured.sc", "vs_sms_mesh_textured.sc",
"shaders/scene/fs_sms_mesh_textured.sc" "fs_sms_mesh_textured.sc"
); );
// Setup render target for the shadow maps // Setup render target for the shadow maps
@ -1106,19 +1094,23 @@ void Renderer::setupShaders() {
} }
s_renderStates[RenderState::Lines].m_program = RenderProgram( s_renderStates[RenderState::Lines].m_program = RenderProgram(
"shaders/lines/vs_lines.sc", "vs_lines.sc",
"shaders/lines/fs_lines.sc" "fs_lines.sc"
); );
s_renderStates[RenderState::LinesOccluded].m_program = RenderProgram( s_renderStates[RenderState::LinesOccluded].m_program = RenderProgram(
"shaders/lines/vs_lines.sc", "vs_lines.sc",
"shaders/lines/fs_lines_occluded.sc" "fs_lines_occluded.sc"
); );
s_renderStates[RenderState::Debug].m_program = RenderProgram( s_renderStates[RenderState::Debug].m_program = RenderProgram(
"shaders/debug/vs_debug.sc", "vs_debug.sc",
"shaders/debug/fs_debug.sc" "fs_debug.sc"
); );
for (int i = 0, n = RenderState::Count; i < n; ++i) {
s_renderStates[i].m_program.reload();
}
} }
void Renderer::setupRenderPasses() { void Renderer::setupRenderPasses() {
@ -1165,13 +1157,13 @@ void Renderer::setupRenderPasses() {
class BGFXCallbacks: public bgfx::CallbackI { class BGFXCallbacks: public bgfx::CallbackI {
virtual void fatal (bgfx::Fatal::Enum _code, const char *_str) { virtual void fatal (bgfx::Fatal::Enum _code, const char *_str) {
std::cerr << "Fatal (" << _code << "): " << _str << std::endl; gLog ("Fatal bgfx error (code %d): %s", _code, _str);
} }
virtual void traceVargs (const char *_filePath, uint16_t _line, const char* _format, va_list _argList) { virtual void traceVargs (const char *_filePath, uint16_t _line, const char* _format, va_list _argList) {
char output_buffer[255]; char output_buffer[255];
vsprintf (output_buffer, _format, _argList); vsprintf (output_buffer, _format, _argList);
std::cerr << "Trace " << _filePath << ":" << _line << " : " << output_buffer; gLog ("bgfx trace: %s:%d:%s", _filePath, _line, output_buffer);
} }
virtual uint32_t cacheReadSize(uint64_t _id) { virtual uint32_t cacheReadSize(uint64_t _id) {
@ -1198,47 +1190,17 @@ class BGFXCallbacks: public bgfx::CallbackI {
}; };
}; };
namespace bgfx {
inline void glfwSetWindow(GLFWwindow* _window)
{
bgfx::PlatformData pd;
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
pd.ndt = glfwGetX11Display();
pd.nwh = (void*)(uintptr_t)glfwGetGLXWindow(_window);
pd.context = glfwGetGLXContext(_window);
# elif BX_PLATFORM_OSX
pd.ndt = NULL;
pd.nwh = glfwGetCocoaWindow(_window);
pd.context = glfwGetNSGLContext(_window);
# elif BX_PLATFORM_WINDOWS
pd.ndt = NULL;
pd.nwh = glfwGetWin32Window(_window);
pd.context = NULL;
# endif // BX_PLATFORM_WINDOWS
pd.backBuffer = NULL;
pd.backBufferDS = NULL;
bgfx::setPlatformData(pd);
}
}
void Renderer::initialize(int width, int height) { void Renderer::initialize(int width, int height) {
this->view_width = width; this->view_width = width;
this->view_height = height; this->view_height = height;
uint32_t debug = BGFX_DEBUG_TEXT;
uint32_t reset = BGFX_RESET_VSYNC;
reset = BGFX_RESET_VSYNC | BGFX_RESET_MAXANISOTROPY | BGFX_RESET_MSAA_X16;
bgfx::reset(view_width, view_height, reset);
bgfx::setViewClear(0 bgfx::setViewClear(0
, BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
, 0x303030ff , 0x303030ff
, 1.0f , 1.0f
, 0 , 0
); );
bgfx::setViewRect(0, view_offset_x, view_offset_y, view_width, view_height); bgfx::setViewRect(0, 0, 0, view_width, view_height);
bgfx::RendererType::Enum renderer = bgfx::getRendererType(); bgfx::RendererType::Enum renderer = bgfx::getRendererType();
flipV = false flipV = false
@ -1246,8 +1208,6 @@ void Renderer::initialize(int width, int height) {
|| renderer == bgfx::RendererType::OpenGLES || renderer == bgfx::RendererType::OpenGLES
; ;
bgfx::setDebug(debug);
gLog ("Creating Cameras"); gLog ("Creating Cameras");
cameras.push_back (Camera()); cameras.push_back (Camera());
activeCameraIndex = 0; activeCameraIndex = 0;
@ -1266,8 +1226,7 @@ void Renderer::initialize(int width, int height) {
mCurrentLightProbe = LightProbe::Bolonga; mCurrentLightProbe = LightProbe::Bolonga;
initialized = true; initialized = true;
resize (view_offset_x, view_offset_y, view_width, view_height); resize (view_width, view_height);
bgfx::frame();
} }
void Renderer::shutdown() { void Renderer::shutdown() {
@ -1290,6 +1249,8 @@ void Renderer::shutdown() {
bgfx::destroy(u_color); bgfx::destroy(u_color);
bgfx::destroy(u_line_params); bgfx::destroy(u_line_params);
bgfx::destroy(sceneViewBuffer);
for (uint8_t ii = 0; ii < RenderState::Count; ++ii) { for (uint8_t ii = 0; ii < RenderState::Count; ++ii) {
if (bgfx::isValid(s_renderStates[ii].m_program.program)) { if (bgfx::isValid(s_renderStates[ii].m_program.program)) {
bgfx::destroy(s_renderStates[ii].m_program.program); bgfx::destroy(s_renderStates[ii].m_program.program);
@ -1319,30 +1280,23 @@ void Renderer::shutdown() {
cameras.clear(); cameras.clear();
} }
void Renderer::resize (int x, int y, int width, int height) { void Renderer::resize (int width, int height) {
if (initialized) { if (initialized) {
this->view_offset_x = x; gLog ("Resizing to size %d,%d view buffer valid?: %d", width, height, bgfx::isValid(sceneViewBuffer));
this->view_offset_y = y; assert(width > 0 && height > 0);
this->view_width = view_texture_width; this->view_width = width;
this->view_height = view_texture_height; this->view_height = height;
for (uint32_t i = 0; i < cameras.size(); i++) { for (uint32_t i = 0; i < cameras.size(); i++) {
cameras[i].width = static_cast<float>(view_texture_width); cameras[i].width = static_cast<float>(width);
cameras[i].height = static_cast<float>(view_texture_height); cameras[i].height = static_cast<float>(height);
}
if (bgfx::isValid(sceneViewBuffer)) {
bgfx::setViewFrameBuffer(RenderState::Skybox, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::Scene, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::SceneTextured, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::Lines, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::LinesOccluded, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::Debug, sceneViewBuffer);
} }
} }
} }
void Renderer::paintGL() { void Renderer::paintGL() {
assert (initialized);
int64_t now = bx::getHPCounter(); int64_t now = bx::getHPCounter();
static int64_t last = now; static int64_t last = now;
const int64_t frameTime = now - last; const int64_t frameTime = now - last;
@ -1353,6 +1307,19 @@ void Renderer::paintGL() {
float time = (float)( (now-m_timeOffset)/double(bx::getHPFrequency() ) ); float time = (float)( (now-m_timeOffset)/double(bx::getHPFrequency() ) );
bgfx::setUniform (u_time, &time); bgfx::setUniform (u_time, &time);
if (bgfx::isValid(sceneViewBuffer)) {
bgfx::setViewFrameBuffer(RenderState::Skybox, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::Scene, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::SceneTextured, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::Lines, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::LinesOccluded, sceneViewBuffer);
bgfx::setViewFrameBuffer(RenderState::Debug, sceneViewBuffer);
} else {
gLog("Error! sceneViewBuffer is not valid!");
assert(false);
return;
}
// Use debug font to print information about this example. // Use debug font to print information about this example.
bgfx::dbgTextClear(); bgfx::dbgTextClear();
@ -1360,10 +1327,6 @@ void Renderer::paintGL() {
int num_chars = view_width / 8; int num_chars = view_width / 8;
bgfx::dbgTextPrintf(num_chars - 18, 0, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); bgfx::dbgTextPrintf(num_chars - 18, 0, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs);
// This dummy draw call is here to make sure that view 0 is cleared
// if no other draw calls are submitted to view 0.
bgfx::touch(0);
// update camera matrices // update camera matrices
for (uint32_t i = 0; i < cameras.size(); i++) { for (uint32_t i = 0; i < cameras.size(); i++) {
cameras[i].updateMatrices(); cameras[i].updateMatrices();
@ -1428,26 +1391,26 @@ void Renderer::paintGL() {
bx::mtxOrthoRh(proj, 0.f, 1.f, 1.f, 0.f, 0.f, 100.0f, 0.0, bgfx::getCaps()->homogeneousDepth bx::mtxOrthoRh(proj, 0.f, 1.f, 1.f, 0.f, 0.f, 100.0f, 0.0, bgfx::getCaps()->homogeneousDepth
); );
bgfx::setViewRect(RenderState::Skybox, view_offset_x, view_offset_y, view_width, view_height); bgfx::setViewRect(RenderState::Skybox, 0, 0, view_width, view_height);
bgfx::setViewTransform(RenderState::Skybox, view, proj); bgfx::setViewTransform(RenderState::Skybox, view, proj);
bgfx::setViewRect(RenderState::ShadowMap, 0, 0, lights[0].shadowMapSize, lights[0].shadowMapSize); bgfx::setViewRect(RenderState::ShadowMap, 0, 0, lights[0].shadowMapSize, lights[0].shadowMapSize);
bgfx::setViewFrameBuffer(RenderState::ShadowMap, lights[0].shadowMapFB); bgfx::setViewFrameBuffer(RenderState::ShadowMap, lights[0].shadowMapFB);
bgfx::setViewTransform(RenderState::ShadowMap, lights[0].mtxView, lights[0].mtxProj); bgfx::setViewTransform(RenderState::ShadowMap, lights[0].mtxView, lights[0].mtxProj);
bgfx::setViewRect(RenderState::Scene, view_offset_x, view_offset_y, view_width, view_height); bgfx::setViewRect(RenderState::Scene, 0, 0, view_width, view_height);
bgfx::setViewTransform(RenderState::Scene, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj); bgfx::setViewTransform(RenderState::Scene, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj);
bgfx::setViewRect(RenderState::SceneTextured, view_offset_x, view_offset_y, view_width, view_height); bgfx::setViewRect(RenderState::SceneTextured, 0, 0, view_width, view_height);
bgfx::setViewTransform(RenderState::SceneTextured, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj); bgfx::setViewTransform(RenderState::SceneTextured, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj);
bgfx::setViewRect(RenderState::Lines, view_offset_x, view_offset_y, view_width, view_height); bgfx::setViewRect(RenderState::Lines, 0, 0, view_width, view_height);
bgfx::setViewTransform(RenderState::Lines, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj); bgfx::setViewTransform(RenderState::Lines, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj);
bgfx::setViewRect(RenderState::LinesOccluded, view_offset_x, view_offset_y, view_width, view_height); bgfx::setViewRect(RenderState::LinesOccluded, 0, 0, view_width, view_height);
bgfx::setViewTransform(RenderState::LinesOccluded, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj); bgfx::setViewTransform(RenderState::LinesOccluded, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj);
bgfx::setViewRect(RenderState::Debug, view_offset_x, view_offset_y, view_width, view_height); bgfx::setViewRect(RenderState::Debug, 0, 0, view_width, view_height);
bgfx::setViewTransform(RenderState::Debug, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj); bgfx::setViewTransform(RenderState::Debug, cameras[activeCameraIndex].mtxView, cameras[activeCameraIndex].mtxProj);
@ -1479,10 +1442,10 @@ void Renderer::paintGL() {
, 0x303030ff, 1.0f, 0 , 0x303030ff, 1.0f, 0
); );
// bgfx::setViewClear(RenderState::Scene bgfx::setViewClear(RenderState::Scene
// , BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH , BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH
// , 0x303030ff, 1.0f, 0 , 0x303030ff, 1.0f, 0
// ); );
bgfx::touch(RenderState::Scene); bgfx::touch(RenderState::Scene);
bgfx::touch(RenderState::Skybox); bgfx::touch(RenderState::Skybox);
@ -1751,94 +1714,86 @@ void Renderer::paintGL() {
// ImGui::EndDock(); // ImGui::EndDock();
// Advance to next frame. Rendering thread will be kicked to
// process submitted rendering primitives.
bgfx::frame();
// clear debug commands as they have to be issued every frame // clear debug commands as they have to be issued every frame
debugCommands.clear(); debugCommands.clear();
} }
void Renderer::DrawGui() { void Renderer::DrawGui() {
static float docking_offset_x = 600.0f; // static float docking_offset_x = 600.0f;
ImGuiStyle& style = ImGui::GetStyle(); // ImGuiStyle& style = ImGui::GetStyle();
if (ImGui::GetIO().DisplaySize.y > 0) { // if (ImGui::GetIO().DisplaySize.y > 0) {
ImVec2 pos = ImVec2(docking_offset_x, 25); // ImVec2 pos = ImVec2(docking_offset_x, 25);
ImVec2 size = ImGui::GetIO().DisplaySize; // ImVec2 size = ImGui::GetIO().DisplaySize;
size.x -= pos.x; // size.x -= pos.x;
size.y -= pos.y; // size.y -= pos.y;
// TODO(martin): init dock // // TODO(martin): init dock
//
// Draw status bar (no docking) // // Draw status bar (no docking)
ImGui::SetNextWindowSize(ImVec2(size.x, 25.0f), ImGuiCond_Always); // ImGui::SetNextWindowSize(ImVec2(size.x, 25.0f), ImGuiCond_Always);
ImGui::SetNextWindowPos(ImVec2(0, size.y - 32.0f), ImGuiCond_Always); // ImGui::SetNextWindowPos(ImVec2(0, size.y - 32.0f), ImGuiCond_Always);
ImGui::Begin("statusbar", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoResize); // ImGui::Begin("statusbar", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoResize);
ImGui::Text("FPS: %f", ImGui::GetIO().Framerate); // ImGui::Text("FPS: %f", ImGui::GetIO().Framerate);
ImGui::End(); // ImGui::End();
} // }
// if (ImGui::BeginDock("Dock Info", &sDockInfoDock)) { // if (ImGui::BeginDock("Dock Info", &sDockInfoDock)) {
// ImGui::Print(); // ImGui::Print();
// } // }
// ImGui::EndDock(); // ImGui::EndDock();
// if (ImGui::BeginDock("Scene", &sSceneDock)) { #ifdef USE_DOCKS
// ImVec2 size = ImGui::GetContentRegionAvail(); if (ImGui::BeginDock("Scene", &sSceneDock)) {
// ImVec2 pos = ImGui::GetWindowPos(); #endif
// ImVec2 size = ImGui::GetContentRegionAvail();
// if ((size.x > 0 && size.y > 0) && ImVec2 pos = ImGui::GetWindowPos();
// (view_texture_width != size.x || view_texture_height != size.y)) {
// if (bgfx::isValid(sceneViewBuffer)) { if ( (size.x > 0 && size.y > 0) &&
// gLog("Destroying old view frame buffer of size %f, %f", (view_width != size.x || view_height != size.y)) {
// view_texture_width, view_texture_height); gLog ("Creating scene render frame buffer: size %4.0f, %4.0f", size.x, size.y);
// bgfx::destroy(sceneViewBuffer); if (bgfx::isValid(sceneViewBuffer)) {
// } gLog("Destroying old view frame buffer of size %f, %f",
// view_width, view_height);
// sceneViewTexture = bgfx::createTexture2D( bgfx::destroy(sceneViewBuffer);
// size.x, size.y, }
// false, 1,
// bgfx::TextureFormat::RGBA8 sceneViewTexture = bgfx::createTexture2D(
// ); size.x, size.y,
// sceneDepthTexture = bgfx::createTexture2D( false, 1,
// size.x, size.y, bgfx::TextureFormat::RGBA8
// false, 1, );
// bgfx::TextureFormat::D16 sceneDepthTexture = bgfx::createTexture2D(
// ); size.x, size.y,
// false, 1,
// view_texture_width = size.x; bgfx::TextureFormat::D16
// view_texture_height = size.y; );
// view_offset_x = pos.x;
// view_offset_y = pos.y; resize(size.x, size.y);
// view_width = size.x;
// view_height = size.y; gLog("Creating view frame buffer of size %d, %d",
// view_width, view_height);
// assert(view_texture_width > 0.0f);
// assert(view_texture_height > 0.0f); bgfx::TextureHandle fbtextures[] = { sceneViewTexture, sceneDepthTexture };
//
// gLog("Creating view frame buffer of size %f, %f", sceneViewBuffer = bgfx::createFrameBuffer(
// view_texture_width, view_texture_height); BX_COUNTOF(fbtextures), fbtextures, true
// );
// bgfx::TextureHandle fbtextures[] = { sceneViewTexture, sceneDepthTexture };
// ImGuizmo::SetRect(
// sceneViewBuffer = bgfx::createFrameBuffer( pos.x, pos.y,
// BX_COUNTOF(fbtextures), fbtextures, true size.x, size.y
// ); );
// } else {
// ImGuizmo::SetRect( ImGui::Image(sceneViewTexture,
// view_offset_x, view_offset_y, size,
// view_texture_width, view_texture_height ImVec2(0.0f, 1.0f),
// ); ImVec2(1.0f, 0.0f)
// } else { );
// }
// ImGui::Image(sceneViewTexture, #ifdef USE_DOCKS
// size, }
// ImVec2(0.0f, 1.0f), ImGui::EndDock();
// ImVec2(1.0f, 0.0f) #endif
// );
// }
// }
// ImGui::EndDock();
} }
bool Renderer::updateShaders() { bool Renderer::updateShaders() {

View File

@ -376,16 +376,12 @@ struct Renderer {
bool drawDebug; bool drawDebug;
bool drawFloor = true; bool drawFloor = true;
bool drawSkybox = true; bool drawSkybox = true;
uint32_t view_offset_x = 0;
uint32_t view_offset_y = 0;
uint32_t view_width = 1; uint32_t view_width = 1;
uint32_t view_height = 1; uint32_t view_height = 1;
bgfx::UniformHandle sceneDefaultTextureSampler; bgfx::UniformHandle sceneDefaultTextureSampler;
bgfx::TextureHandle sceneDefaultTexture; bgfx::TextureHandle sceneDefaultTexture;
float view_texture_width = 1;
float view_texture_height = 1;
bgfx::TextureHandle sceneViewTexture; bgfx::TextureHandle sceneViewTexture;
bgfx::TextureHandle sceneDepthTexture; bgfx::TextureHandle sceneDepthTexture;
bgfx::FrameBufferHandle sceneViewBuffer; bgfx::FrameBufferHandle sceneViewBuffer;
@ -426,7 +422,7 @@ struct Renderer {
void shutdown(); void shutdown();
void paintGL(); void paintGL();
void DrawGui(); void DrawGui();
void resize (int x, int y, int width, int height); void resize (int width, int height);
// check whether shader files were modified and reload them. Returns // check whether shader files were modified and reload them. Returns
// true on success, otherwise false // true on success, otherwise false

View File

@ -15,6 +15,7 @@ namespace stl = tinystl;
#include <bx/commandline.h> #include <bx/commandline.h>
#include <bx/file.h> #include <bx/file.h>
#include <bx/readerwriter.h> #include <bx/readerwriter.h>
#include <bx/process.h>
#include <bx/math.h> #include <bx/math.h>
#include <bx/string.h> #include <bx/string.h>
#include "entry/dbg.h" #include "entry/dbg.h"
@ -160,29 +161,68 @@ int compileShader(bx::CommandLine& _cmdLine, bx::ReaderSeekerI* _reader, bx::Wri
} }
int compileShader(const char* filename, const char* shader_type)
{
bx::Error error;
bx::ProcessReader process_reader;
const int cCommandMaxLen = 1024;
char command[cCommandMaxLen];
const char* shaderc_binary = "3rdparty/bgfx/shaderc";
bx::snprintf(command, cCommandMaxLen, "-f %s -o %s.bin -i \"shaders/common\" --type %s --platform linux", filename, filename, shader_type);
gLog("Compiling shader '%s'...", filename);
if (!process_reader.open(shaderc_binary, command, &error)) {
fprintf(stderr, "Error compiling shader: could not spawn %s", shaderc_binary);
} else if (!error.isOk()) {
fprintf(stderr, "Unable to compile shader file '%s': %s", filename, error.getMessage().getPtr());
}
const int cMessageMaxLen = 2048;
char buffer[cMessageMaxLen];
int32_t message_len = process_reader.read(buffer, cMessageMaxLen, &error);
process_reader.close();
int32_t result = process_reader.getExitCode();
if (result != 0) {
fprintf(stderr, "Unable to compile shader file '%s':\n%s\n", filename, error.getMessage().getPtr());
fprintf(stderr, "%s", buffer);
} else {
gLog("Successfully compiled shader '%s'!", filename);
}
return result;
}
static bgfx::ShaderHandle loadShader(bx::FileReaderI* _reader, const char* _name) static bgfx::ShaderHandle loadShader(bx::FileReaderI* _reader, const char* _name)
{ {
char filePath[512]; char filePath[512];
const char* shaderPath = "shaders/dx9/"; const char* shaderPath = "data/shaders/dx9/";
switch (bgfx::getRendererType() ) switch (bgfx::getRendererType() )
{ {
case bgfx::RendererType::Direct3D11: case bgfx::RendererType::Direct3D11:
case bgfx::RendererType::Direct3D12: case bgfx::RendererType::Direct3D12:
shaderPath = "shaders/dx11/"; shaderPath = "data/shaders/dx11/";
break; break;
case bgfx::RendererType::OpenGL: case bgfx::RendererType::OpenGL:
shaderPath = "shaders/glsl/"; shaderPath = "data/shaders/glsl/";
break; break;
case bgfx::RendererType::Metal: case bgfx::RendererType::Metal:
shaderPath = "shaders/metal/"; shaderPath = "data/shaders/metal/";
break; break;
case bgfx::RendererType::OpenGLES: case bgfx::RendererType::OpenGLES:
shaderPath = "shaders/gles/"; shaderPath = "data/shaders/gles/";
break; break;
default: default:
@ -193,6 +233,8 @@ static bgfx::ShaderHandle loadShader(bx::FileReaderI* _reader, const char* _name
strcat(filePath, _name); strcat(filePath, _name);
strcat(filePath, ".bin"); strcat(filePath, ".bin");
gLog ("Loading shader %s", filePath);
return bgfx::createShader(loadMem(_reader, filePath) ); return bgfx::createShader(loadMem(_reader, filePath) );
} }
@ -215,89 +257,10 @@ bgfx::ProgramHandle loadProgram(bx::FileReaderI* _reader, const char* _vsName, c
bgfx::ProgramHandle loadProgram(const char* _vsName, const char* _fsName) bgfx::ProgramHandle loadProgram(const char* _vsName, const char* _fsName)
{ {
gLog ("Loading program from %s and %s", _vsName, _fsName);
return loadProgram(entry::getFileReader(), _vsName, _fsName); return loadProgram(entry::getFileReader(), _vsName, _fsName);
} }
bgfx::ProgramHandle loadProgramFromFiles(const char *_vsFileName, const char *_fsFileName) {
gLog ("Loading shader %s", _vsFileName);
const char* argv[10];
argv[0] = "--type";
argv[1] = "vertex";
argv[2] = "--platform";
argv[3] = "linux";
argv[4] = "-i";
argv[5] = "shaders/common";
argv[6] = "-p";
argv[7] = "120";
argv[8] = "-f";
argv[9] = _vsFileName;
// argv[6] = "--varyingdef";
// argv[7] = "-p";
// argv[8] = "120";
// argv[9] = "-f";
// argv[10] = _vsFileName;
bx::CommandLine cmdLine (10, argv);
const bgfx::Memory* vs_source_memory = loadMem(entry::getFileReader(), _vsFileName);
bx::ReaderSeekerI* vs_source_reader = new bx::MemoryReader (vs_source_memory->data, vs_source_memory->size);
bx::MemoryBlock* vs_compiled_memory = new bx::MemoryBlock (entry::getAllocator());
bx::MemoryWriter* vs_compiled_writer = new bx::MemoryWriter (vs_compiled_memory);
setlocale(LC_NUMERIC, "C");
int result = compileShader (cmdLine, vs_source_reader, vs_compiled_writer);
if (result != EXIT_SUCCESS) {
std::cerr << "Error compiling shader " << _vsFileName << std::endl;
return BGFX_INVALID_HANDLE;
}
uint32_t size = vs_compiled_writer->seek(0, bx::Whence::End);
const bgfx::Memory* mem = bgfx::alloc(size+1);
bx::ReaderSeekerI* vs_compiled_reader = new bx::MemoryReader ((uint8_t*) vs_compiled_memory->more(), size);
bx::read(vs_compiled_reader, mem->data, size);
delete vs_compiled_reader;
mem->data[mem->size-1] = '\0';
bgfx::ShaderHandle vsh = bgfx::createShader(mem);
delete vs_source_reader;
delete vs_compiled_writer;
delete vs_compiled_memory;
bgfx::ShaderHandle fsh = BGFX_INVALID_HANDLE;
if (_fsFileName != NULL) {
argv[1] = "fragment";
const bgfx::Memory* fs_source_memory = loadMem(entry::getFileReader(), _fsFileName);
bx::ReaderSeekerI* fs_source_reader = new bx::MemoryReader (fs_source_memory->data, fs_source_memory->size);
bx::MemoryBlock* fs_compiled_memory = new bx::MemoryBlock (entry::getAllocator());
bx::MemoryWriter* fs_compiled_writer = new bx::MemoryWriter (fs_compiled_memory);
result = compileShader (cmdLine, fs_source_reader, fs_compiled_writer);
if (result != EXIT_SUCCESS) {
std::cerr << "Error compiling shader " << _fsFileName << std::endl;
return BGFX_INVALID_HANDLE;
}
uint32_t size = fs_compiled_writer->seek(0, bx::Whence::End);
const bgfx::Memory* mem = bgfx::alloc(size+1);
bx::ReaderSeekerI* fs_compiled_reader = new bx::MemoryReader ((uint8_t*) fs_compiled_memory->more(), size);
bx::read(fs_compiled_reader, mem->data, size);
delete fs_compiled_reader;
mem->data[mem->size-1] = '\0';
fsh = bgfx::createShader(mem);
delete fs_source_reader;
delete fs_compiled_writer;
delete fs_compiled_memory;
}
return bgfx::createProgram(vsh, fsh, true /* destroy shaders when program is destroyed */);
}
typedef unsigned char stbi_uc; typedef unsigned char stbi_uc;
extern "C" stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); extern "C" stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);

View File

@ -173,7 +173,7 @@ void update_character(module_state* state, float dt) {
} }
static struct module_state *module_init() { static struct module_state *module_init() {
std::cout << "Module init called" << std::endl; gLog ("%s %s called", __FILE__, __FUNCTION__);
module_state *state = (module_state*) malloc(sizeof(*state)); module_state *state = (module_state*) malloc(sizeof(*state));
state->modules_window_selected_index = -1; state->modules_window_selected_index = -1;
@ -195,14 +195,14 @@ static void module_serialize (
} }
static void module_finalize(struct module_state *state) { static void module_finalize(struct module_state *state) {
std::cout << "Module finalize called" << std::endl; gLog ("%s %s called (state %p)", __FILE__, __FUNCTION__, state);
free(state); free(state);
} }
static void module_reload(struct module_state *state, void* read_serializer) { static void module_reload(struct module_state *state, void* read_serializer) {
std::cout << "Module reload called. State: " << state << std::endl; gLog ("%s %s called (state %p)", __FILE__, __FUNCTION__, state);
cout << "Creating render entity ..." << endl; gLog ("Creating render entity");
state->character = new CharacterEntity; state->character = new CharacterEntity;
state->character->mPosition = Vector3f (0.f, 0.f, 0.f); state->character->mPosition = Vector3f (0.f, 0.f, 0.f);
@ -214,16 +214,17 @@ static void module_reload(struct module_state *state, void* read_serializer) {
} }
static void module_unload(struct module_state *state, void* write_serializer) { static void module_unload(struct module_state *state, void* write_serializer) {
gLog ("%s %s called (state %p)", __FILE__, __FUNCTION__, state);
// serialize the state of the entity // serialize the state of the entity
if (write_serializer != nullptr) { if (write_serializer != nullptr) {
gLog ("Serializing state");
module_serialize(state, static_cast<WriteSerializer*>(write_serializer)); module_serialize(state, static_cast<WriteSerializer*>(write_serializer));
} }
// clean up // clean up
state->character->mEntity = nullptr; state->character->mEntity = nullptr;
delete state->character; delete state->character;
gLog ("Cleanup complete");
std::cout << "TestModule unloaded. State: " << state << std::endl;
} }
void ShowModulesWindow(struct module_state *state) { void ShowModulesWindow(struct module_state *state) {
@ -297,6 +298,7 @@ static bool module_step(struct module_state *state, float dt) {
{ {
ImGui::Checkbox("Modules", &state->modules_window_visible); ImGui::Checkbox("Modules", &state->modules_window_visible);
ImGui::Checkbox("ImGui Demo", &state->imgui_demo_window_visible); ImGui::Checkbox("ImGui Demo", &state->imgui_demo_window_visible);
gLog ("show demo: %d", state->imgui_demo_window_visible == true);
ImGui::Checkbox("Character", &state->character_properties_window_visible); ImGui::Checkbox("Character", &state->character_properties_window_visible);
ImGui::EndMenu(); ImGui::EndMenu();

View File

@ -5,17 +5,18 @@ set (GOOGLETEST_DIR
include_directories ( include_directories (
${GOOGLETEST_DIR}/include ${GOOGLETEST_DIR}/include
${CMAKE_SOURCE_DIR}/3rdparty/bx/include ${CMAKE_SOURCE_DIR}/3rdparty/bx/include
${CMAKE_SOURCE_DIR}/3rdparty/bx/3rdparty
) )
set (TEST_SRCS set (TEST_SRCS
RenderModuleTests.cc RenderModuleTests.cc
${GOOGLETEST_DIR}/src/gtest_main.cc ${GOOGLETEST_DIR}/src/gtest_main.cc
${CMAKE_SOURCE_DIR}/3rdparty/bx/src/math.cpp ${CMAKE_SOURCE_DIR}/3rdparty/bx/src/amalgamated.cpp
${CMAKE_SOURCE_DIR}/3rdparty/bx/src/bx.cpp
) )
add_executable ( runtests ${TEST_SRCS} ) add_executable ( runtests ${TEST_SRCS} )
target_link_libraries (runtests target_link_libraries (runtests
${CMAKE_DL_LIBS}
gtest gtest
) )