water optimizations
This commit is contained in:
parent
1df8c9e1d6
commit
4f913f36b5
|
|
@ -144,6 +144,7 @@ set(MAIN_SOURCE
|
||||||
src/i18n.cpp
|
src/i18n.cpp
|
||||||
src/meow.cpp
|
src/meow.cpp
|
||||||
src/modloader.cpp
|
src/modloader.cpp
|
||||||
|
src/sunshine.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
|
|
||||||
|
|
||||||
uniform sampler2D texture;
|
uniform sampler2D texture;
|
||||||
|
uniform sampler2D noiseTexture;
|
||||||
|
|
||||||
uniform float uTime;
|
uniform float uTime;
|
||||||
uniform float aniIndex;
|
uniform float aniIndex;
|
||||||
|
|
@ -18,62 +17,11 @@ const float SpriteAreaH = 128.0;
|
||||||
const float atAniOffset = 32.0*3.0;
|
const float atAniOffset = 32.0*3.0;
|
||||||
const vec2 AtlasSize = vec2(96.0, 128.0);
|
const vec2 AtlasSize = vec2(96.0, 128.0);
|
||||||
|
|
||||||
vec4 mod289(vec4 x)
|
float pnoise(vec2 P){
|
||||||
{
|
vec2 uv = P;
|
||||||
return x - floor(x * (1.0 / 289.0)) * 289.0;
|
uv *= 0.025;
|
||||||
}
|
uv -= floor(uv);
|
||||||
|
return texture2D(noiseTexture, uv);
|
||||||
vec4 permute(vec4 x)
|
|
||||||
{
|
|
||||||
return mod289(((x*34.0)+1.0)*x);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 taylorInvSqrt(vec4 r)
|
|
||||||
{
|
|
||||||
return 1.79284291400159 - 0.85373472095314 * r;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec2 fade(vec2 t) {
|
|
||||||
return t*t*t*(t*(t*6.0-15.0)+10.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
float pnoise(vec2 P)
|
|
||||||
{
|
|
||||||
vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
|
|
||||||
vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
|
|
||||||
Pi = mod289(Pi); // To avoid truncation effects in permutation
|
|
||||||
vec4 ix = Pi.xzxz;
|
|
||||||
vec4 iy = Pi.yyww;
|
|
||||||
vec4 fx = Pf.xzxz;
|
|
||||||
vec4 fy = Pf.yyww;
|
|
||||||
|
|
||||||
vec4 i = permute(permute(ix) + iy);
|
|
||||||
|
|
||||||
vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
|
|
||||||
vec4 gy = abs(gx) - 0.5 ;
|
|
||||||
vec4 tx = floor(gx + 0.5);
|
|
||||||
gx = gx - tx;
|
|
||||||
|
|
||||||
vec2 g00 = vec2(gx.x,gy.x);
|
|
||||||
vec2 g10 = vec2(gx.y,gy.y);
|
|
||||||
vec2 g01 = vec2(gx.z,gy.z);
|
|
||||||
vec2 g11 = vec2(gx.w,gy.w);
|
|
||||||
|
|
||||||
vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
|
|
||||||
g00 *= norm.x;
|
|
||||||
g01 *= norm.y;
|
|
||||||
g10 *= norm.z;
|
|
||||||
g11 *= norm.w;
|
|
||||||
|
|
||||||
float n00 = dot(g00, vec2(fx.x, fy.x));
|
|
||||||
float n10 = dot(g10, vec2(fx.y, fy.y));
|
|
||||||
float n01 = dot(g01, vec2(fx.z, fy.z));
|
|
||||||
float n11 = dot(g11, vec2(fx.w, fy.w));
|
|
||||||
|
|
||||||
vec2 fade_xy = fade(Pf.xy);
|
|
||||||
vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
|
|
||||||
float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
|
|
||||||
return 2.3 * n_xy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void main(){
|
void main(){
|
||||||
|
|
@ -88,16 +36,16 @@ void main(){
|
||||||
vec2 uv = worldCoord / 16.0 * vec2(1.0, 4.0);
|
vec2 uv = worldCoord / 16.0 * vec2(1.0, 4.0);
|
||||||
uv = floor(uv * vec2(8.0, 2.0)) / vec2(8.0, 2.0);
|
uv = floor(uv * vec2(8.0, 2.0)) / vec2(8.0, 2.0);
|
||||||
|
|
||||||
float noise = (pnoise(uv) + 1.0) / 2.0;
|
float noise = pnoise(uv);
|
||||||
|
|
||||||
float offsetTime = uTime + 100.0;
|
float offsetTime = uTime + 100.0;
|
||||||
|
|
||||||
vec2 uv1 = uv - vec2(offsetTime, offsetTime * 0.5 + 0.5) * 0.56;
|
vec2 uv1 = uv - vec2(offsetTime, offsetTime * 0.5 + 0.5) * 0.56;
|
||||||
float noise1 = (pnoise(uv1 + vec2(WATER_DISTORTION, -WATER_DISTORTION) * noise) + 1.0) / 2.0;
|
float noise1 = pnoise(uv1 + vec2(WATER_DISTORTION, -WATER_DISTORTION) * noise);
|
||||||
float p = pow(noise1 + 0.2, 10.0);
|
float p = pow(noise1 + 0.2, 10.0);
|
||||||
|
|
||||||
vec2 uv2 = uv - vec2(offsetTime - 1.5, -offsetTime * 0.5) * 0.24;
|
vec2 uv2 = uv - vec2(offsetTime - 1.5, -offsetTime * 0.5) * 0.24;
|
||||||
float noise2 = (pnoise(uv2 + vec2(WATER_DISTORTION, -WATER_DISTORTION) * noise) + 1.0) / 2.0;
|
float noise2 = pnoise(uv2 + vec2(WATER_DISTORTION, -WATER_DISTORTION) * noise);
|
||||||
float p2 = pow(noise2 + 0.2, 10.0);
|
float p2 = pow(noise2 + 0.2, 10.0);
|
||||||
|
|
||||||
vec4 frag = mix(vec4(waterColor1.rgb, 1.0), vec4(waterColor2.rgb, 1.0), noise1) + vec4(vec3(mix(p, 1.0, textureColor.r)) * waterColor3.rgb, 1.0);
|
vec4 frag = mix(vec4(waterColor1.rgb, 1.0), vec4(waterColor2.rgb, 1.0), noise1) + vec4(vec3(mix(p, 1.0, textureColor.r)) * waterColor3.rgb, 1.0);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
uniform sampler2D texture;
|
uniform sampler2D texture;
|
||||||
|
uniform sampler2D noiseTexture;
|
||||||
|
|
||||||
uniform lowp vec4 tone;
|
uniform lowp vec4 tone;
|
||||||
|
|
||||||
|
|
@ -18,71 +19,24 @@ uniform vec2 texSizeInv;
|
||||||
const vec3 lumaF = vec3(.299, .587, .114);
|
const vec3 lumaF = vec3(.299, .587, .114);
|
||||||
const float WATER_DISTORTION = 0.75;
|
const float WATER_DISTORTION = 0.75;
|
||||||
|
|
||||||
vec4 mod289(vec4 x){
|
|
||||||
return x - floor(x * (1.0 / 289.0)) * 289.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 permute(vec4 x){
|
|
||||||
return mod289(((x*34.0)+1.0)*x);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 taylorInvSqrt(vec4 r){
|
|
||||||
return 1.79284291400159 - 0.85373472095314 * r;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec2 fade(vec2 t) {
|
|
||||||
return t*t*t*(t*(t*6.0-15.0)+10.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
float pnoise(vec2 P){
|
float pnoise(vec2 P){
|
||||||
vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
|
vec2 uv = P;
|
||||||
vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
|
uv *= 0.025;
|
||||||
Pi = mod289(Pi); // To avoid truncation effects in permutation
|
uv -= floor(uv);
|
||||||
vec4 ix = Pi.xzxz;
|
return texture2D(noiseTexture, uv);
|
||||||
vec4 iy = Pi.yyww;
|
|
||||||
vec4 fx = Pf.xzxz;
|
|
||||||
vec4 fy = Pf.yyww;
|
|
||||||
|
|
||||||
vec4 i = permute(permute(ix) + iy);
|
|
||||||
|
|
||||||
vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
|
|
||||||
vec4 gy = abs(gx) - 0.5 ;
|
|
||||||
vec4 tx = floor(gx + 0.5);
|
|
||||||
gx = gx - tx;
|
|
||||||
|
|
||||||
vec2 g00 = vec2(gx.x,gy.x);
|
|
||||||
vec2 g10 = vec2(gx.y,gy.y);
|
|
||||||
vec2 g01 = vec2(gx.z,gy.z);
|
|
||||||
vec2 g11 = vec2(gx.w,gy.w);
|
|
||||||
|
|
||||||
vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
|
|
||||||
g00 *= norm.x;
|
|
||||||
g01 *= norm.y;
|
|
||||||
g10 *= norm.z;
|
|
||||||
g11 *= norm.w;
|
|
||||||
|
|
||||||
float n00 = dot(g00, vec2(fx.x, fy.x));
|
|
||||||
float n10 = dot(g10, vec2(fx.y, fy.y));
|
|
||||||
float n01 = dot(g01, vec2(fx.z, fy.z));
|
|
||||||
float n11 = dot(g11, vec2(fx.w, fy.w));
|
|
||||||
|
|
||||||
vec2 fade_xy = fade(Pf.xy);
|
|
||||||
vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
|
|
||||||
float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
|
|
||||||
return 2.3 * n_xy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void main(){
|
void main(){
|
||||||
vec2 uv = v_texCoord * texSizeInv * 8192.0;
|
vec2 uv = v_texCoord * texSizeInv * 8192.0;
|
||||||
uv = floor(uv * 16.0) / 16.0;
|
uv = floor(uv * 16.0) / 16.0;
|
||||||
|
|
||||||
float noise = (pnoise(uv) + 1.0) / 2.0;
|
float noise = pnoise(uv);
|
||||||
vec2 uv1 = uv - vec2(uTime, uTime * 0.5 + 0.5) * 0.56;
|
vec2 uv1 = uv - vec2(uTime, uTime * 0.5 + 0.5) * 0.56;
|
||||||
float noise1 = (pnoise(uv1 + vec2(WATER_DISTORTION, -WATER_DISTORTION) * noise) + 1.0) / 2.0;
|
float noise1 = pnoise(uv1 + vec2(WATER_DISTORTION, -WATER_DISTORTION) * noise);
|
||||||
float p = pow(noise1 + 0.02, 20.0);
|
float p = pow(noise1 + 0.02, 20.0);
|
||||||
|
|
||||||
vec2 uv2 = uv - vec2(uTime - 1.5, -uTime * 0.5) * 0.24;
|
vec2 uv2 = uv - vec2(uTime - 1.5, -uTime * 0.5) * 0.24;
|
||||||
float noise2 = (pnoise(uv2 + vec2(WATER_DISTORTION, -WATER_DISTORTION) * noise) + 1.0) / 2.0;
|
float noise2 = pnoise(uv2 + vec2(WATER_DISTORTION, -WATER_DISTORTION) * noise);
|
||||||
float p2 = pow(noise2 + 0.02, 20.0);
|
float p2 = pow(noise2 + 0.02, 20.0);
|
||||||
|
|
||||||
vec4 frag = mix(vec4(color.r, color.g, color.b, 1.0) * color.a, vec4(color.r, color.g, color.b, 1.0) * tone.a, noise1) + vec4(p, p, p, 1.0) * tone;
|
vec4 frag = mix(vec4(color.r, color.g, color.b, 1.0) * color.a, vec4(color.r, color.g, color.b, 1.0) * tone.a, noise1) + vec4(p, p, p, 1.0) * tone;
|
||||||
|
|
|
||||||
|
|
@ -309,6 +309,9 @@ void Plane::draw(){
|
||||||
|
|
||||||
defaultSpriteShaderInit(shader);
|
defaultSpriteShaderInit(shader);
|
||||||
|
|
||||||
|
if (shState->sunshine().noiseBitmap)
|
||||||
|
shader.setNoiseTexture(shState->sunshine().noiseBitmap->getGLTypes().tex);
|
||||||
|
|
||||||
base = &shader;
|
base = &shader;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@
|
||||||
#include "obscured.frag.xxd"
|
#include "obscured.frag.xxd"
|
||||||
|
|
||||||
#include "meow.h"
|
#include "meow.h"
|
||||||
|
#include "sunshine.h"
|
||||||
|
|
||||||
#define INIT_SHADER(vert, frag, name){ \
|
#define INIT_SHADER(vert, frag, name){ \
|
||||||
Shader::init(shader_##vert##_vert, shader_##vert##_vert_len, shader_##frag##_frag, shader_##frag##_frag_len, \
|
Shader::init(shader_##vert##_vert, shader_##vert##_vert_len, shader_##frag##_frag, shader_##frag##_frag_len, \
|
||||||
|
|
@ -428,6 +429,12 @@ WMShader::WMShader(){
|
||||||
WaterShader::WaterShader(){
|
WaterShader::WaterShader(){
|
||||||
INIT_SHADER(simple, water, WaterShader);
|
INIT_SHADER(simple, water, WaterShader);
|
||||||
SpriteShaderBase::SpriteShaderInit();
|
SpriteShaderBase::SpriteShaderInit();
|
||||||
|
|
||||||
|
GET_U(noiseTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WaterShader::setNoiseTexture(TEX::ID texture){
|
||||||
|
setTexUniform(u_noiseTexture, 1, texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
CRTShader::CRTShader(){
|
CRTShader::CRTShader(){
|
||||||
|
|
@ -493,6 +500,7 @@ TilemapWaterShader::TilemapWaterShader(){
|
||||||
|
|
||||||
GET_U(aniIndex);
|
GET_U(aniIndex);
|
||||||
GET_U(offset);
|
GET_U(offset);
|
||||||
|
GET_U(noiseTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TilemapWaterShader::setAniIndex(int value){
|
void TilemapWaterShader::setAniIndex(int value){
|
||||||
|
|
@ -503,6 +511,10 @@ void TilemapWaterShader::setOffset(const Vec2i &value){
|
||||||
gl.Uniform2f(u_offset, value.x, value.y);
|
gl.Uniform2f(u_offset, value.x, value.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TilemapWaterShader::setNoiseTexture(TEX::ID texture){
|
||||||
|
setTexUniform(u_noiseTexture, 1, texture);
|
||||||
|
}
|
||||||
|
|
||||||
FlashMapShader::FlashMapShader(){
|
FlashMapShader::FlashMapShader(){
|
||||||
INIT_SHADER(simpleColor, flashMap, FlashMapShader);
|
INIT_SHADER(simpleColor, flashMap, FlashMapShader);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,11 @@ public:
|
||||||
class WaterShader : public SpriteShaderBase{
|
class WaterShader : public SpriteShaderBase{
|
||||||
public:
|
public:
|
||||||
WaterShader();
|
WaterShader();
|
||||||
|
|
||||||
|
void setNoiseTexture(TEX::ID texture);
|
||||||
|
|
||||||
|
private:
|
||||||
|
GLint u_noiseTexture;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CRTShader : public SpriteShaderBase{
|
class CRTShader : public SpriteShaderBase{
|
||||||
|
|
@ -202,9 +207,10 @@ public:
|
||||||
|
|
||||||
void setAniIndex(int value);
|
void setAniIndex(int value);
|
||||||
void setOffset(const Vec2i &value);
|
void setOffset(const Vec2i &value);
|
||||||
|
void setNoiseTexture(TEX::ID texture);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLint u_aniIndex, u_offset;
|
GLint u_aniIndex, u_offset, u_noiseTexture;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PlaneShader : public ShaderBase{
|
class PlaneShader : public ShaderBase{
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "oneshot.h"
|
#include "oneshot.h"
|
||||||
|
#include "sunshine.h"
|
||||||
#ifdef STEAM
|
#ifdef STEAM
|
||||||
#include "steam.h"
|
#include "steam.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -66,6 +67,7 @@ struct SharedStatePrivate{
|
||||||
Audio audio;
|
Audio audio;
|
||||||
|
|
||||||
Oneshot oneshot;
|
Oneshot oneshot;
|
||||||
|
Sunshine sunshine;
|
||||||
#ifdef STEAM
|
#ifdef STEAM
|
||||||
Steam steam;
|
Steam steam;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -102,6 +104,7 @@ struct SharedStatePrivate{
|
||||||
input(*threadData),
|
input(*threadData),
|
||||||
audio(*threadData),
|
audio(*threadData),
|
||||||
oneshot(*threadData),
|
oneshot(*threadData),
|
||||||
|
sunshine(),
|
||||||
_glState(threadData->config),
|
_glState(threadData->config),
|
||||||
fontState(threadData->config),
|
fontState(threadData->config),
|
||||||
stampCounter(0)
|
stampCounter(0)
|
||||||
|
|
@ -164,6 +167,8 @@ void SharedState::initInstance(RGSSThreadData *threadData){
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedState::instance->p->defaultFont = defaultFont;
|
SharedState::instance->p->defaultFont = defaultFont;
|
||||||
|
|
||||||
|
SharedState::instance->p->sunshine.loadNoise();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SharedState::finiInstance(){
|
void SharedState::finiInstance(){
|
||||||
|
|
@ -195,6 +200,7 @@ GSATT(Graphics&, graphics)
|
||||||
GSATT(Input&, input)
|
GSATT(Input&, input)
|
||||||
GSATT(Audio&, audio)
|
GSATT(Audio&, audio)
|
||||||
GSATT(Oneshot&, oneshot)
|
GSATT(Oneshot&, oneshot)
|
||||||
|
GSATT(Sunshine&, sunshine)
|
||||||
#ifdef STEAM
|
#ifdef STEAM
|
||||||
GSATT(Steam&, steam)
|
GSATT(Steam&, steam)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ class Graphics;
|
||||||
class Input;
|
class Input;
|
||||||
class Audio;
|
class Audio;
|
||||||
class Oneshot;
|
class Oneshot;
|
||||||
|
class Sunshine;
|
||||||
#ifdef STEAM
|
#ifdef STEAM
|
||||||
class Steam;
|
class Steam;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -74,6 +75,7 @@ struct SharedState{
|
||||||
Audio &audio() const;
|
Audio &audio() const;
|
||||||
|
|
||||||
Oneshot &oneshot() const;
|
Oneshot &oneshot() const;
|
||||||
|
Sunshine &sunshine() const;
|
||||||
#ifdef STEAM
|
#ifdef STEAM
|
||||||
Steam &steam() const;
|
Steam &steam() const;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -530,6 +530,9 @@ void Sprite::draw(){
|
||||||
|
|
||||||
base = &shader;
|
base = &shader;
|
||||||
|
|
||||||
|
if (shState->sunshine().noiseBitmap)
|
||||||
|
shader.setNoiseTexture(shState->sunshine().noiseBitmap->getGLTypes().tex);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ShaderType::SHADER_crt:
|
case ShaderType::SHADER_crt:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
#include "sunshine.h"
|
||||||
|
|
||||||
|
Sunshine::Sunshine() {}
|
||||||
|
|
||||||
|
void Sunshine::loadNoise()
|
||||||
|
{
|
||||||
|
if(!noiseLoaded){
|
||||||
|
Sunshine::noiseBitmap = new Bitmap(Sunshine::noisePath);
|
||||||
|
noiseLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,19 @@
|
||||||
#include <boost/chrono.hpp>
|
#include <boost/chrono.hpp>
|
||||||
|
|
||||||
|
#include "bitmap.h"
|
||||||
//помойка ебаная
|
//помойка ебаная
|
||||||
inline boost::chrono::high_resolution_clock::time_point startTime;
|
inline boost::chrono::high_resolution_clock::time_point startTime;
|
||||||
|
|
||||||
|
class Sunshine{
|
||||||
|
public:
|
||||||
|
Sunshine();
|
||||||
|
|
||||||
|
const char* noisePath = "Graphics/Misc/noise";
|
||||||
|
|
||||||
|
Bitmap* noiseBitmap;
|
||||||
|
|
||||||
|
void loadNoise();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool noiseLoaded = false;
|
||||||
|
};
|
||||||
|
|
@ -732,6 +732,9 @@ struct TilemapPrivate {
|
||||||
boost::chrono::duration<float> elapsed = currentTime - startTime;
|
boost::chrono::duration<float> elapsed = currentTime - startTime;
|
||||||
tilemapShader.setTime(elapsed.count());
|
tilemapShader.setTime(elapsed.count());
|
||||||
|
|
||||||
|
if (shState->sunshine().noiseBitmap)
|
||||||
|
tilemapShader.setNoiseTexture(shState->sunshine().noiseBitmap->getGLTypes().tex);
|
||||||
|
|
||||||
shaderVar = &tilemapShader;
|
shaderVar = &tilemapShader;
|
||||||
}/*
|
}/*
|
||||||
else if(tiles.animated){
|
else if(tiles.animated){
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue