mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
renderer and glow
This commit is contained in:
parent
f151d5cc81
commit
dc9dd42de1
9 changed files with 236 additions and 5 deletions
|
|
@ -74,9 +74,11 @@ class InstanceManager {
|
||||||
dtsShader.currentOpacity = instance.gameObject.currentOpacity;
|
dtsShader.currentOpacity = instance.gameObject.currentOpacity;
|
||||||
}
|
}
|
||||||
var transform = instance.emptyObj.getAbsPos();
|
var transform = instance.emptyObj.getAbsPos();
|
||||||
minfo.meshbatch.shadersChanged = true;
|
minfo.meshbatch.material.mainPass.depthWrite = minfo.mesh.material.mainPass.depthWrite;
|
||||||
|
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.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.worldPosition = transform;
|
||||||
minfo.meshbatch.emitInstance();
|
minfo.meshbatch.emitInstance();
|
||||||
}
|
}
|
||||||
|
|
@ -147,6 +149,10 @@ class InstanceManager {
|
||||||
for (shader in mat.mainPass.getShaders()) {
|
for (shader in mat.mainPass.getShaders()) {
|
||||||
minfo.meshbatch.material.mainPass.addShader(shader);
|
minfo.meshbatch.material.mainPass.addShader(shader);
|
||||||
}
|
}
|
||||||
|
var glowPass = mat.getPass("glow");
|
||||||
|
if (glowPass != null) {
|
||||||
|
minfo.meshbatch.material.addPass(glowPass.clone());
|
||||||
|
}
|
||||||
// var dtsshader = mat.mainPass.getShader(DtsTexture);
|
// var dtsshader = mat.mainPass.getShader(DtsTexture);
|
||||||
// if (dtsshader != null) {
|
// if (dtsshader != null) {
|
||||||
// minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader);
|
// minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import h3d.Vector;
|
||||||
import src.ProfilerUI;
|
import src.ProfilerUI;
|
||||||
import src.Gamepad;
|
import src.Gamepad;
|
||||||
import src.Http;
|
import src.Http;
|
||||||
|
import src.Renderer;
|
||||||
|
|
||||||
class Main extends hxd.App {
|
class Main extends hxd.App {
|
||||||
var marbleGame:MarbleGame;
|
var marbleGame:MarbleGame;
|
||||||
|
|
@ -35,6 +36,8 @@ class Main extends hxd.App {
|
||||||
override function init() {
|
override function init() {
|
||||||
super.init();
|
super.init();
|
||||||
|
|
||||||
|
s3d.renderer = new Renderer();
|
||||||
|
|
||||||
#if (hl && !android)
|
#if (hl && !android)
|
||||||
hl.UI.closeConsole();
|
hl.UI.closeConsole();
|
||||||
#end
|
#end
|
||||||
|
|
|
||||||
|
|
@ -294,7 +294,7 @@ class MarbleWorld extends Scheduler {
|
||||||
this.particleManager = new ParticleManager(cast this);
|
this.particleManager = new ParticleManager(cast this);
|
||||||
|
|
||||||
var worker = new ResourceLoaderWorker(() -> {
|
var worker = new ResourceLoaderWorker(() -> {
|
||||||
var renderer = cast(this.scene.renderer, h3d.scene.fwd.Renderer);
|
var renderer = cast(this.scene.renderer, src.Renderer);
|
||||||
|
|
||||||
for (element in mission.root.elements) {
|
for (element in mission.root.elements) {
|
||||||
if (element._type != MissionElementType.Sun)
|
if (element._type != MissionElementType.Sun)
|
||||||
|
|
|
||||||
152
src/Renderer.hx
Normal file
152
src/Renderer.hx
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
package src;
|
||||||
|
|
||||||
|
import h3d.Vector;
|
||||||
|
import shaders.Blur;
|
||||||
|
import h3d.pass.ScreenFx;
|
||||||
|
import h3d.mat.DepthBuffer;
|
||||||
|
|
||||||
|
class Renderer extends h3d.scene.Renderer {
|
||||||
|
var def(get, never):h3d.pass.Base;
|
||||||
|
|
||||||
|
public var depth:h3d.pass.Base = new h3d.scene.fwd.Renderer.DepthPass();
|
||||||
|
public var normal:h3d.pass.Base = new h3d.scene.fwd.Renderer.NormalPass();
|
||||||
|
public var shadow = new h3d.pass.DefaultShadowMap(1024);
|
||||||
|
|
||||||
|
var glowBuffer:h3d.mat.Texture;
|
||||||
|
var backBuffers:Array<h3d.mat.Texture>;
|
||||||
|
var curentBackBuffer = 0;
|
||||||
|
var blurShader:ScreenFx<Blur>;
|
||||||
|
var growBufferTemps:Array<h3d.mat.Texture>;
|
||||||
|
var copyPass:h3d.pass.Copy;
|
||||||
|
var backBuffer:h3d.mat.Texture;
|
||||||
|
|
||||||
|
public function new() {
|
||||||
|
super();
|
||||||
|
defaultPass = new h3d.pass.Default("default");
|
||||||
|
allPasses = [defaultPass, depth, normal, shadow];
|
||||||
|
blurShader = new ScreenFx<Blur>(new Blur());
|
||||||
|
copyPass = new h3d.pass.Copy();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline function get_def()
|
||||||
|
return defaultPass;
|
||||||
|
|
||||||
|
public inline function getBackBuffer():h3d.mat.Texture {
|
||||||
|
return backBuffers[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// can be overriden for benchmark purposes
|
||||||
|
function renderPass(p:h3d.pass.Base, passes, ?sort) {
|
||||||
|
p.draw(passes, sort);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function getPassByName(name:String):h3d.pass.Base {
|
||||||
|
if (name == "alpha" || name == "additive" || name == "glowPre" || name == "glow")
|
||||||
|
return defaultPass;
|
||||||
|
return super.getPassByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function render() {
|
||||||
|
if (backBuffer == null) {
|
||||||
|
backBuffer = ctx.textures.allocTarget("backBuffer", ctx.engine.width, ctx.engine.height);
|
||||||
|
}
|
||||||
|
ctx.engine.pushTarget(backBuffer);
|
||||||
|
ctx.engine.clear(0, 1);
|
||||||
|
|
||||||
|
if (has("shadow"))
|
||||||
|
renderPass(shadow, get("shadow"));
|
||||||
|
|
||||||
|
if (has("depth"))
|
||||||
|
renderPass(depth, get("depth"));
|
||||||
|
|
||||||
|
if (has("normal"))
|
||||||
|
renderPass(normal, get("normal"));
|
||||||
|
|
||||||
|
if (backBuffers == null) {
|
||||||
|
var commonDepth = new DepthBuffer(ctx.engine.width, ctx.engine.height);
|
||||||
|
backBuffers = [
|
||||||
|
ctx.textures.allocTarget("backbuffer1", 320, 320, false),
|
||||||
|
ctx.textures.allocTarget("backbuffer2", 320, 320, false),
|
||||||
|
];
|
||||||
|
backBuffers[0].depthBuffer = commonDepth;
|
||||||
|
// backBuffers[1].depthBuffer = commonDepth;
|
||||||
|
// new h3d.mat.Texture(ctx.engine.width, ctx.engine.height, [Target]);
|
||||||
|
// refractTexture.depthBuffer = new DepthBuffer(ctx.engine.width, ctx.engine.height);
|
||||||
|
}
|
||||||
|
if (growBufferTemps == null) {
|
||||||
|
glowBuffer = ctx.textures.allocTarget("glowBuffer", ctx.engine.width, ctx.engine.height);
|
||||||
|
growBufferTemps = [
|
||||||
|
ctx.textures.allocTarget("gb1", 320, 320, false),
|
||||||
|
ctx.textures.allocTarget("gb2", 320, 320, false),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// ctx.engine.pushTarget(backBuffers[0]);
|
||||||
|
// ctx.engine.clear(0, 1);
|
||||||
|
|
||||||
|
renderPass(defaultPass, get("sky"));
|
||||||
|
renderPass(defaultPass, get("skyshape"), backToFront);
|
||||||
|
renderPass(defaultPass, get("default"));
|
||||||
|
renderPass(defaultPass, get("glowPre"));
|
||||||
|
|
||||||
|
ctx.engine.pushTarget(glowBuffer);
|
||||||
|
ctx.engine.clear(0);
|
||||||
|
renderPass(defaultPass, get("glow"));
|
||||||
|
bloomPass(ctx);
|
||||||
|
ctx.engine.popTarget();
|
||||||
|
copyPass.shader.texture = growBufferTemps[0];
|
||||||
|
copyPass.pass.blend(One, One);
|
||||||
|
copyPass.pass.depth(false, Always);
|
||||||
|
copyPass.render();
|
||||||
|
|
||||||
|
renderPass(defaultPass, get("alpha"), backToFront);
|
||||||
|
renderPass(defaultPass, get("additive"));
|
||||||
|
|
||||||
|
ctx.engine.popTarget();
|
||||||
|
|
||||||
|
copyPass.pass.blend(One, Zero);
|
||||||
|
copyPass.shader.texture = backBuffer;
|
||||||
|
copyPass.render();
|
||||||
|
|
||||||
|
// h3d.pass.Copy.run(backBuffers[0], backBuffers[1]);
|
||||||
|
// renderPass(defaultPass, get("refract"));
|
||||||
|
// ctx.engine.popTarget();
|
||||||
|
// h3d.pass.Copy.run(backBuffers[0], null);
|
||||||
|
|
||||||
|
// curentBackBuffer = 1 - curentBackBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
function bloomPass(ctx:h3d.scene.RenderContext) {
|
||||||
|
h3d.pass.Copy.run(glowBuffer, growBufferTemps[0]);
|
||||||
|
|
||||||
|
var offsets = [-7.5, -6.25, -5, -3.75, -2.5, -1.25, 0, 1.25, 2.5, 3.75, 5, 6.25, 7.5];
|
||||||
|
var divisors = [0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 1.0, 0.7, 0.5, 0.5, 0.4, 0.3, 0.1];
|
||||||
|
|
||||||
|
var divisor = 0.0;
|
||||||
|
|
||||||
|
var kernel = [];
|
||||||
|
for (i in 0...13) {
|
||||||
|
kernel.push(new Vector(offsets[i] / 320, 0, divisors[i]));
|
||||||
|
divisor += divisors[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
blurShader.shader.kernel = kernel;
|
||||||
|
blurShader.shader.divisor = divisor;
|
||||||
|
blurShader.shader.texture = growBufferTemps[0];
|
||||||
|
ctx.engine.pushTarget(growBufferTemps[1]);
|
||||||
|
ctx.engine.clear(0, 1);
|
||||||
|
blurShader.render();
|
||||||
|
ctx.engine.popTarget();
|
||||||
|
|
||||||
|
for (i in 0...13) {
|
||||||
|
kernel[i].set(0, offsets[i] / 320, divisors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
blurShader.shader.kernel = kernel;
|
||||||
|
blurShader.shader.divisor = divisor;
|
||||||
|
blurShader.shader.texture = growBufferTemps[1];
|
||||||
|
ctx.engine.pushTarget(growBufferTemps[0]);
|
||||||
|
ctx.engine.clear(0, 1);
|
||||||
|
blurShader.render();
|
||||||
|
ctx.engine.popTarget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -58,6 +58,7 @@ class Sky extends Object {
|
||||||
skyMesh.material.mainPass.addShader(shad);
|
skyMesh.material.mainPass.addShader(shad);
|
||||||
skyMesh.material.mainPass.depthWrite = false;
|
skyMesh.material.mainPass.depthWrite = false;
|
||||||
skyMesh.material.mainPass.depth(false, h3d.mat.Data.Compare.LessEqual);
|
skyMesh.material.mainPass.depth(false, h3d.mat.Data.Compare.LessEqual);
|
||||||
|
skyMesh.material.mainPass.setPassName("sky");
|
||||||
cubemap = texture;
|
cubemap = texture;
|
||||||
onFinish();
|
onFinish();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
20
src/shaders/Blur.hx
Normal file
20
src/shaders/Blur.hx
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
package shaders;
|
||||||
|
|
||||||
|
import h3d.shader.ScreenShader;
|
||||||
|
|
||||||
|
class Blur extends ScreenShader {
|
||||||
|
static var SRC = {
|
||||||
|
@param var texture:Sampler2D;
|
||||||
|
@param var kernel:Array<Vec4, 13>;
|
||||||
|
@param var divisor:Float;
|
||||||
|
function fragment() {
|
||||||
|
var accumColor = vec4(0);
|
||||||
|
for (i in 0...13) {
|
||||||
|
accumColor += texture.get(input.uv + kernel[i].xy) * kernel[i].z;
|
||||||
|
}
|
||||||
|
pixelColor = accumColor / divisor;
|
||||||
|
pixelColor.a = pixelColor.x + pixelColor.y + pixelColor.z / 3.0;
|
||||||
|
pixelColor.xyz *= 2.0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
34
src/shaders/TrivialMaterial.hx
Normal file
34
src/shaders/TrivialMaterial.hx
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
package shaders;
|
||||||
|
|
||||||
|
class TrivialMaterial extends hxsl.Shader {
|
||||||
|
static var SRC = {
|
||||||
|
@param var diffuseMap:Sampler2D;
|
||||||
|
@global var global:{
|
||||||
|
@perObject var modelView:Mat4;
|
||||||
|
@perObject var modelViewInverse:Mat4;
|
||||||
|
};
|
||||||
|
@input var input:{
|
||||||
|
var position:Vec3;
|
||||||
|
var normal:Vec3;
|
||||||
|
var uv:Vec2;
|
||||||
|
var t:Vec3;
|
||||||
|
var b:Vec3;
|
||||||
|
var n:Vec3;
|
||||||
|
};
|
||||||
|
var calculatedUV:Vec2;
|
||||||
|
var pixelColor:Vec4;
|
||||||
|
function vertex() {
|
||||||
|
calculatedUV = input.uv;
|
||||||
|
}
|
||||||
|
function fragment() {
|
||||||
|
// Diffuse part
|
||||||
|
var diffuse = diffuseMap.get(calculatedUV);
|
||||||
|
pixelColor = diffuse * vec4(1.08, 1.03, 0.90, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function new(diffuse) {
|
||||||
|
super();
|
||||||
|
this.diffuseMap = diffuse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -16,6 +16,7 @@ class AntiGravity extends PowerUp {
|
||||||
this.identifier = "AntiGravity";
|
this.identifier = "AntiGravity";
|
||||||
this.pickUpName = "Gravity Defier";
|
this.pickUpName = "Gravity Defier";
|
||||||
this.autoUse = true;
|
this.autoUse = true;
|
||||||
|
this.useInstancing = true;
|
||||||
if (norespawn)
|
if (norespawn)
|
||||||
this.cooldownDuration = Math.NEGATIVE_INFINITY;
|
this.cooldownDuration = Math.NEGATIVE_INFINITY;
|
||||||
}
|
}
|
||||||
|
|
@ -58,8 +59,8 @@ class AntiGravity extends PowerUp {
|
||||||
normalTex.mipMap = Nearest;
|
normalTex.mipMap = Nearest;
|
||||||
var shader = new shaders.DefaultMaterial(diffuseTex, normalTex, 32, new h3d.Vector(0.8, 0.8, 0.6, 1), 1);
|
var shader = new shaders.DefaultMaterial(diffuseTex, normalTex, 32, new h3d.Vector(0.8, 0.8, 0.6, 1), 1);
|
||||||
shader.doGammaRamp = false;
|
shader.doGammaRamp = false;
|
||||||
var dtsTex = material.mainPass.getShader(shaders.DtsTexture);
|
// var dtsTex = material.mainPass.getShader(shaders.DtsTexture);
|
||||||
dtsTex.passThrough = true;
|
// dtsTex.passThrough = true;
|
||||||
material.mainPass.removeShader(material.textureShader);
|
material.mainPass.removeShader(material.textureShader);
|
||||||
material.mainPass.addShader(shader);
|
material.mainPass.addShader(shader);
|
||||||
var thisprops:Dynamic = material.getDefaultProps();
|
var thisprops:Dynamic = material.getDefaultProps();
|
||||||
|
|
@ -68,5 +69,18 @@ class AntiGravity extends PowerUp {
|
||||||
material.shadows = false;
|
material.shadows = false;
|
||||||
material.receiveShadows = true;
|
material.receiveShadows = true;
|
||||||
}
|
}
|
||||||
|
if (matName == "item_glow") {
|
||||||
|
var glowpass = material.mainPass.clone();
|
||||||
|
glowpass.setPassName("glow");
|
||||||
|
glowpass.depthTest = LessEqual;
|
||||||
|
|
||||||
|
material.addPass(glowpass);
|
||||||
|
material.mainPass.setPassName("glowPre");
|
||||||
|
|
||||||
|
var thisprops:Dynamic = material.getDefaultProps();
|
||||||
|
thisprops.light = false; // We will calculate our own lighting
|
||||||
|
material.props = thisprops;
|
||||||
|
material.shadows = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ class Sky extends DtsObject {
|
||||||
mat.receiveShadows = false;
|
mat.receiveShadows = false;
|
||||||
mat.blendMode = Alpha;
|
mat.blendMode = Alpha;
|
||||||
mat.mainPass.culling = h3d.mat.Data.Face.None;
|
mat.mainPass.culling = h3d.mat.Data.Face.None;
|
||||||
|
mat.mainPass.setPassName("skyshape");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue