From 8b1615ccae2c56e61a6aae88197fb5a389647fec Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Wed, 23 Jun 2021 17:39:26 +0530 Subject: [PATCH] mbg lighting --- src/MarbleWorld.hx | 2 +- src/shaders/DirLight.hx | 41 +++++++++++++++++++++++++++++++++++ src/shaders/DirLightShader.hx | 39 +++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/shaders/DirLight.hx create mode 100644 src/shaders/DirLightShader.hx diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 5014059f..c617b3ac 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -4,7 +4,7 @@ import src.MarbleGame; import gui.EndGameGui; import sdl.Cursor; import src.ForceObject; -import h3d.scene.fwd.DirLight; +import shaders.DirLight; import h3d.col.Bounds; import triggers.HelpTrigger; import triggers.InBoundsTrigger; diff --git a/src/shaders/DirLight.hx b/src/shaders/DirLight.hx new file mode 100644 index 00000000..3b36cb8c --- /dev/null +++ b/src/shaders/DirLight.hx @@ -0,0 +1,41 @@ +package shaders; + +import h3d.scene.Light; + +class DirLight extends Light { + var dshader:DirLightShader; + + public function new(?dir:h3d.Vector, ?parent) { + dshader = new DirLightShader(); + super(dshader, parent); + priority = 100; + if (dir != null) + setDirection(dir); + } + + override function get_color() { + return dshader.color; + } + + override function set_color(v) { + return dshader.color = v; + } + + override function get_enableSpecular() { + return dshader.enableSpecular; + } + + override function set_enableSpecular(b) { + return dshader.enableSpecular = b; + } + + override function getShadowDirection():h3d.Vector { + return absPos.front(); + } + + override function emit(ctx) { + dshader.direction.load(absPos.front()); + dshader.direction.normalize(); + super.emit(ctx); + } +} diff --git a/src/shaders/DirLightShader.hx b/src/shaders/DirLightShader.hx new file mode 100644 index 00000000..42f79e54 --- /dev/null +++ b/src/shaders/DirLightShader.hx @@ -0,0 +1,39 @@ +package shaders; + +class DirLightShader extends hxsl.Shader { + static var SRC = { + @param var color:Vec3; + @param var direction:Vec3; + @const var enableSpecular:Bool; + @global var camera:{ + var position:Vec3; + }; + var lightColor:Vec3; + var lightPixelColor:Vec3; + var transformedNormal:Vec3; + var transformedPosition:Vec3; + var specPower:Float; + var specColor:Vec3; + function calcLighting():Vec3 { + var diff = transformedNormal.dot(-direction).max(0.); + if (!enableSpecular) + return color * diff; + var r = reflect(direction, transformedNormal).normalize(); + var specValue = r.dot((camera.position - transformedPosition).normalize()).max(0.); + return color * (diff + specColor * pow(specValue, specPower)); + } + function vertex() { + lightColor.rgb += calcLighting(); + lightColor = saturate(lightColor); + } + function fragment() { + lightPixelColor.rgb += calcLighting(); + lightPixelColor = saturate(lightPixelColor); + } + } + + public function new() { + super(); + color.set(1, 1, 1); + } +}