rainshader prototype

This commit is contained in:
Cameron Taylor 2023-09-11 11:10:08 -04:00
parent cf9915ef60
commit 32ec724da6
4 changed files with 174 additions and 2 deletions

View file

@ -0,0 +1,12 @@
package funkin.shaderslmfao;
import flixel.addons.display.FlxRuntimeShader;
import openfl.Assets;
class PuddleShader extends FlxRuntimeShader
{
public function new()
{
super(Assets.getText(Paths.frag('puddle')));
}
}

View file

@ -0,0 +1,51 @@
package funkin.shaderslmfao;
import flixel.FlxG;
import flixel.addons.display.FlxRuntimeShader;
import flixel.system.FlxAssets.FlxShader;
import haxe.CallStack;
import lime.graphics.opengl.GLProgram;
import lime.utils.Log;
class RuntimePostEffectShader extends FlxRuntimeShader
{
@:glVertexHeader("
varying vec2 fragCoord; // normalized texture coord
varying vec2 screenPos; // y: always between 0 and 1, x: between 0 and (width/height)
uniform vec2 screenResolution;
", true)
@:glVertexBody("
fragCoord = vec2(
openfl_TextureCoord.x > 0.0 ? 1.0 : 0.0,
openfl_TextureCoord.y > 0.0 ? 1.0 : 0.0
);
screenPos = fragCoord * vec2(screenResolution.x / screenResolution.y, 1.0);
")
@:glFragmentHeader("
varying vec2 fragCoord;
varying vec2 screenPos;
vec2 texCoordSize() { // hack
return openfl_TextureCoordv / fragCoord;
}
", true)
public function new(fragmentSource:String = null, glVersion:String = null)
{
super(fragmentSource, null, glVersion);
screenResolution.value = [FlxG.width, FlxG.height];
}
override function __createGLProgram(vertexSource:String, fragmentSource:String):GLProgram
{
try
{
final res = super.__createGLProgram(vertexSource, fragmentSource);
return res;
}
catch (error)
{
Log.warn(error);
return null;
}
}
}

View file

@ -0,0 +1,111 @@
package funkin.shaderslmfao;
import flixel.system.FlxAssets.FlxShader;
import openfl.display.BitmapData;
import openfl.display.ShaderParameter;
import openfl.display.ShaderParameterType;
import openfl.utils.Assets;
typedef Light =
{
var position:Array<Float>;
var color:Array<Float>;
var radius:Float;
}
class RuntimeRainShader extends RuntimePostEffectShader
{
static final MAX_LIGHTS:Int = 8;
public var lights:Array<
{
position:ShaderParameter<Float>,
color:ShaderParameter<Float>,
radius:ShaderParameter<Float>,
}>;
// This is a property, whenever the value is set it calls the set_time function.
// This makes the code cleaner elsewhere.
public var time(default, set):Float = 1;
function set_time(value:Float):Float
{
this.setFloat('uTime', value);
return time = value;
}
public var puddleMap(default, set):BitmapData;
public var groundMap(default, set):BitmapData;
function set_groundMap(value:BitmapData):BitmapData
{
trace("groundmap set");
this.setBitmapData('uGroundMap', value);
// this.setFloat2('uPuddleTextureSize', value.width, value.height);
return groundMap = value;
}
function set_puddleMap(value:BitmapData):BitmapData
{
this.setBitmapData('uPuddleMap', value);
return puddleMap = value;
}
public var lightMap(default, set):BitmapData;
function set_lightMap(value:BitmapData):BitmapData
{
trace("lightmap set");
this.setBitmapData('uLightMap', value);
return lightMap = value;
}
public var numLights(default, set):Int = 0;
function set_numLights(value:Int):Int
{
this.setInt('numLights', value);
return numLights = value;
}
public function new()
{
super(Assets.getText(Paths.frag("rain")));
}
public function update(elapsed:Float):Void
{
time += elapsed;
}
override function __processGLData(source:String, storageType:String):Void
{
super.__processGLData(source, storageType);
if (storageType == "uniform")
{
lights = [
for (i in 0...MAX_LIGHTS)
{
position: addFloatUniform("lights[" + i + "].position", 2),
color: addFloatUniform("lights[" + i + "].color", 3),
radius: addFloatUniform("lights[" + i + "].radius", 1),
}
];
}
}
@:access(openfl.display.ShaderParameter)
function addFloatUniform(name:String, length:Int):ShaderParameter<Float>
{
final res = new ShaderParameter<Float>();
res.name = name;
res.type = [null, FLOAT, FLOAT2, FLOAT3, FLOAT4][length];
res.__arrayLength = 1;
res.__isFloat = true;
res.__isUniform = true;
res.__length = length;
__paramFloat.push(res);
return res;
}
}

View file

@ -276,8 +276,6 @@ class Stage extends FlxSpriteGroup implements IPlayStateScriptedClass
{
namedProps.set(name, prop);
prop.name = name;
FlxG.debugger.track(prop, name);
FlxG.debugger.track(prop.scale, name + '.scale');
}
this.add(prop);
}