diff --git a/data/skies/env_DN.png b/data/skies/env_DN.png new file mode 100644 index 00000000..7ab65df0 Binary files /dev/null and b/data/skies/env_DN.png differ diff --git a/data/skies/env_EA.png b/data/skies/env_EA.png new file mode 100644 index 00000000..4d894947 Binary files /dev/null and b/data/skies/env_EA.png differ diff --git a/data/skies/env_NO.png b/data/skies/env_NO.png new file mode 100644 index 00000000..dac1f109 Binary files /dev/null and b/data/skies/env_NO.png differ diff --git a/data/skies/env_SO.png b/data/skies/env_SO.png new file mode 100644 index 00000000..a4cd1388 Binary files /dev/null and b/data/skies/env_SO.png differ diff --git a/data/skies/env_UP.png b/data/skies/env_UP.png new file mode 100644 index 00000000..6d8d163e Binary files /dev/null and b/data/skies/env_UP.png differ diff --git a/data/skies/env_WE.png b/data/skies/env_WE.png new file mode 100644 index 00000000..6128e62c Binary files /dev/null and b/data/skies/env_WE.png differ diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index 71c0d77d..61c9ca30 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -78,8 +78,9 @@ class InstanceManager { minfo.meshbatch.material.mainPass.depthTest = minfo.mesh.material.mainPass.depthTest; // minfo.meshbatch.shadersChanged = true; minfo.meshbatch.material.mainPass.setPassName(minfo.mesh.material.mainPass.name); - // minfo.meshbatch.material.mainPass.enableLights = minfo.mesh.material.mainPass.enableLights; + minfo.meshbatch.material.mainPass.enableLights = minfo.mesh.material.mainPass.enableLights; minfo.meshbatch.worldPosition = transform; + minfo.meshbatch.material.mainPass.culling = minfo.mesh.material.mainPass.culling; minfo.meshbatch.emitInstance(); } } @@ -151,7 +152,21 @@ class InstanceManager { } var glowPass = mat.getPass("glow"); if (glowPass != null) { - minfo.meshbatch.material.addPass(glowPass.clone()); + var gpass = glowPass.clone(); + gpass.enableLights = false; + gpass.depthTest = LessEqual; + minfoshaders = []; + + for (shader in gpass.getShaders()) { + minfoshaders.push(shader); + } + for (shader in minfoshaders) + gpass.removeShader(shader); + for (shader in glowPass.getShaders()) { + gpass.addShader(shader); + } + + minfo.meshbatch.material.addPass(gpass); } // var dtsshader = mat.mainPass.getShader(DtsTexture); // if (dtsshader != null) { diff --git a/src/shaders/DefaultCubemapMaterial.hx b/src/shaders/DefaultCubemapMaterial.hx index 200a2078..fc77f3c9 100644 --- a/src/shaders/DefaultCubemapMaterial.hx +++ b/src/shaders/DefaultCubemapMaterial.hx @@ -30,6 +30,7 @@ class DefaultCubemapMaterial extends hxsl.Shader { var specPower:Float; var pixelTransformedPosition:Vec3; var transformedNormal:Vec3; + @const var doGammaRamp:Bool; // @var var outReflectVec:Vec3; @var var outLightVec:Vec4; @var var outPos:Vec3; @@ -82,11 +83,13 @@ class DefaultCubemapMaterial extends hxsl.Shader { outCol += specular * diffuse.a; // Gamma correction using our regression model - var a = 1.00759; - var b = 1.18764; - outCol.x = a * pow(outCol.x, b); - outCol.y = a * pow(outCol.y, b); - outCol.z = a * pow(outCol.z, b); + if (doGammaRamp) { + var a = 1.00759; + var b = 1.18764; + outCol.x = a * pow(outCol.x, b); + outCol.y = a * pow(outCol.y, b); + outCol.z = a * pow(outCol.z, b); + } pixelColor = outCol; } @@ -100,5 +103,6 @@ class DefaultCubemapMaterial extends hxsl.Shader { this.shininess = shininess; this.specularColor = specularColor; this.secondaryMapUvFactor = secondaryMapUvFactor; + this.doGammaRamp = true; } } diff --git a/src/shapes/AntiGravity.hx b/src/shapes/AntiGravity.hx index 181a338d..ee55e274 100644 --- a/src/shapes/AntiGravity.hx +++ b/src/shapes/AntiGravity.hx @@ -70,12 +70,28 @@ class AntiGravity extends PowerUp { material.receiveShadows = true; } if (matName == "item_glow") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/items/antigrav_glow.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + var glowpass = material.mainPass.clone(); + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + if (dtsshader != null) + glowpass.removeShader(dtsshader); glowpass.setPassName("glow"); glowpass.depthTest = LessEqual; - + glowpass.enableLights = false; material.addPass(glowpass); + material.mainPass.setPassName("glowPre"); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + if (dtsshader != null) + material.mainPass.removeShader(dtsshader); + material.mainPass.enableLights = false; var thisprops:Dynamic = material.getDefaultProps(); thisprops.light = false; // We will calculate our own lighting diff --git a/src/shapes/Blast.hx b/src/shapes/Blast.hx index 94ba0a65..d555e613 100644 --- a/src/shapes/Blast.hx +++ b/src/shapes/Blast.hx @@ -54,5 +54,34 @@ class Blast extends PowerUp { material.shadows = false; material.receiveShadows = true; } + if (matName == "item_glow") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/items/item_glow.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + + var glowpass = material.mainPass.clone(); + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + if (dtsshader != null) + glowpass.removeShader(dtsshader); + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.enableLights = false; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPre"); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + if (dtsshader != null) + material.mainPass.removeShader(dtsshader); + material.mainPass.enableLights = false; + + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + } } } diff --git a/src/shapes/EndPad.hx b/src/shapes/EndPad.hx index 45541342..2939f309 100644 --- a/src/shapes/EndPad.hx +++ b/src/shapes/EndPad.hx @@ -36,7 +36,7 @@ class EndPad extends DtsObject { this.dtsPath = "data/shapes/pads/endarea.dts"; this.isCollideable = true; this.identifier = "EndPad"; - this.useInstancing = false; + this.useInstancing = true; } public override function init(level:MarbleWorld, onFinish:Void->Void) { @@ -120,6 +120,76 @@ class EndPad extends DtsObject { // We can safely remove the firework } } + + override function postProcessMaterial(matName:String, material:h3d.mat.Material) { + if (matName == "abyss2") { + var glowpass = material.mainPass.clone(); + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.enableLights = false; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPre"); + material.mainPass.enableLights = false; + + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + } + + if (matName == "ringtex") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/pads/ringtex.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + var shader = new shaders.DefaultNormalMaterial(diffuseTex, 14, new h3d.Vector(0.3, 0.3, 0.3, 7), 1); + shader.doGammaRamp = false; + var dtsTex = material.mainPass.getShader(shaders.DtsTexture); + dtsTex.passThrough = true; + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(shader); + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + material.receiveShadows = true; + } + + if (matName == "misty") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/pads/misty.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + + var glowpass = material.mainPass.clone(); + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + if (dtsshader != null) + glowpass.removeShader(dtsshader); + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.enableLights = false; + glowpass.blendSrc = SrcAlpha; + glowpass.blendDst = OneMinusSrcAlpha; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPre"); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + if (dtsshader != null) + material.mainPass.removeShader(dtsshader); + material.mainPass.enableLights = false; + + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + material.blendMode = Alpha; + material.mainPass.blendSrc = SrcAlpha; + material.mainPass.blendDst = OneMinusSrcAlpha; + } + } } final fireworkSmoke:ParticleEmitterOptions = { diff --git a/src/shapes/MegaMarble.hx b/src/shapes/MegaMarble.hx index d9ec633d..432f1d24 100644 --- a/src/shapes/MegaMarble.hx +++ b/src/shapes/MegaMarble.hx @@ -64,5 +64,34 @@ class MegaMarble extends PowerUp { material.shadows = false; material.receiveShadows = true; } + if (matName == "item_glow") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/images/grow_glow.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + + var glowpass = material.mainPass.clone(); + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + if (dtsshader != null) + glowpass.removeShader(dtsshader); + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.enableLights = false; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPre"); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + if (dtsshader != null) + material.mainPass.removeShader(dtsshader); + material.mainPass.enableLights = false; + + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + } } } diff --git a/src/shapes/StartPad.hx b/src/shapes/StartPad.hx index 1dc2f2b5..52905d50 100644 --- a/src/shapes/StartPad.hx +++ b/src/shapes/StartPad.hx @@ -1,6 +1,7 @@ package shapes; import src.DtsObject; +import src.ResourceLoader; class StartPad extends DtsObject { public function new() { @@ -8,6 +9,122 @@ class StartPad extends DtsObject { dtsPath = "data/shapes/pads/startarea.dts"; isCollideable = true; identifier = "StartPad"; - useInstancing = false; + useInstancing = true; + } + + override function postProcessMaterial(matName:String, material:h3d.mat.Material) { + if (matName == "ringglass") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/pads/ringglass.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + var normalTex = ResourceLoader.getTexture("data/shapes/pads/ringnormal.png").resource; + normalTex.wrap = Repeat; + normalTex.mipMap = Nearest; + + var cubemapTex = new h3d.mat.Texture(64, 64, [Cube]); + var cubemapFace1 = ResourceLoader.getImage('data/skies/env_SO.png').resource; + var cubemapFace2 = ResourceLoader.getImage('data/skies/env_NO.png').resource; + var cubemapFace3 = ResourceLoader.getImage('data/skies/env_EA.png').resource; + var cubemapFace4 = ResourceLoader.getImage('data/skies/env_WE.png').resource; + var cubemapFace5 = ResourceLoader.getImage('data/skies/env_UP.png').resource; + var cubemapFace6 = ResourceLoader.getImage('data/skies/env_DN.png').resource; + cubemapTex.uploadPixels(cubemapFace1.getPixels(), 0, 0); + cubemapTex.uploadPixels(cubemapFace2.getPixels(), 0, 1); + cubemapTex.uploadPixels(cubemapFace3.getPixels(), 0, 2); + cubemapTex.uploadPixels(cubemapFace4.getPixels(), 0, 3); + cubemapTex.uploadPixels(cubemapFace5.getPixels(), 0, 4); + cubemapTex.uploadPixels(cubemapFace6.getPixels(), 0, 5); + + var shader = new shaders.DefaultCubemapMaterial(diffuseTex, normalTex, 12, new h3d.Vector(0.8, 0.8, 0.8, 1), 1, cubemapTex); + shader.doGammaRamp = false; + var dtsTex = material.mainPass.getShader(shaders.DtsTexture); + dtsTex.passThrough = true; + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(shader); + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + material.receiveShadows = true; + material.blendMode = Alpha; + material.mainPass.culling = None; + // material.blendMode = Alpha; + } + + if (matName == "ringtex") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/pads/ringtex.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + var shader = new shaders.DefaultNormalMaterial(diffuseTex, 14, new h3d.Vector(0.3, 0.3, 0.3, 7), 1); + shader.doGammaRamp = false; + var dtsTex = material.mainPass.getShader(shaders.DtsTexture); + dtsTex.passThrough = true; + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(shader); + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + material.receiveShadows = true; + } + + if (matName == "abyss") { + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + material.receiveShadows = true; + } + + if (matName == "abyss2") { + var glowpass = material.mainPass.clone(); + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.enableLights = false; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPre"); + material.mainPass.enableLights = false; + + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + } + + if (matName == "misty") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/pads/misty.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + + var glowpass = material.mainPass.clone(); + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + if (dtsshader != null) + glowpass.removeShader(dtsshader); + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.enableLights = false; + glowpass.blendSrc = SrcAlpha; + glowpass.blendDst = OneMinusSrcAlpha; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPre"); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + if (dtsshader != null) + material.mainPass.removeShader(dtsshader); + material.mainPass.enableLights = false; + + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + material.blendMode = Alpha; + material.mainPass.blendSrc = SrcAlpha; + material.mainPass.blendDst = OneMinusSrcAlpha; + } } } diff --git a/src/shapes/SuperSpeed.hx b/src/shapes/SuperSpeed.hx index 52f28c75..55f182d6 100644 --- a/src/shapes/SuperSpeed.hx +++ b/src/shapes/SuperSpeed.hx @@ -107,5 +107,34 @@ class SuperSpeed extends PowerUp { material.shadows = false; material.receiveShadows = true; } + if (matName == "superSpeed_star") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/items/superSpeed_star.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + + var glowpass = material.mainPass.clone(); + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + if (dtsshader != null) + glowpass.removeShader(dtsshader); + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.enableLights = false; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPre"); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + if (dtsshader != null) + material.mainPass.removeShader(dtsshader); + material.mainPass.enableLights = false; + + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + } } }