mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
reflection quality
This commit is contained in:
parent
4846643a3e
commit
3ab79b461b
10 changed files with 120 additions and 34 deletions
|
|
@ -958,6 +958,16 @@ class DifBuilder {
|
|||
var retrievefunc = shaderMaterialDict[exactName];
|
||||
shaderWorker.addTask(fwd -> {
|
||||
retrievefunc(shad -> {
|
||||
var zPass = material.mainPass.clone();
|
||||
zPass.removeShader(material.textureShader);
|
||||
var tx = zPass.getShader(h3d.shader.Texture);
|
||||
zPass.removeShader(tx);
|
||||
zPass.setColorMask(false, false, false, false);
|
||||
zPass.depthWrite = true;
|
||||
zPass.setPassName("zPass");
|
||||
material.addPass(zPass);
|
||||
|
||||
material.mainPass.depthTest = LessEqual;
|
||||
material.mainPass.removeShader(material.textureShader);
|
||||
material.mainPass.addShader(shad);
|
||||
var thisprops:Dynamic = material.getDefaultProps();
|
||||
|
|
@ -965,6 +975,7 @@ class DifBuilder {
|
|||
material.props = thisprops;
|
||||
material.shadows = false;
|
||||
material.receiveShadows = true;
|
||||
material.mainPass.setPassName("interior");
|
||||
fwd();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -241,6 +241,34 @@ class InstanceManager {
|
|||
|
||||
minfo.meshbatch.material.addPass(gpass);
|
||||
}
|
||||
var zPass = mat.getPass("zPass");
|
||||
if (zPass != null) {
|
||||
var gpass = zPass.clone();
|
||||
gpass.enableLights = false;
|
||||
gpass.depthTest = zPass.depthTest;
|
||||
gpass.blendSrc = zPass.blendSrc;
|
||||
gpass.blendDst = zPass.blendDst;
|
||||
gpass.blendOp = zPass.blendOp;
|
||||
gpass.blendAlphaSrc = zPass.blendAlphaSrc;
|
||||
gpass.blendAlphaDst = zPass.blendAlphaDst;
|
||||
gpass.blendAlphaOp = zPass.blendAlphaOp;
|
||||
gpass.colorMask = zPass.colorMask;
|
||||
minfoshaders = [];
|
||||
|
||||
for (shader in gpass.getShaders()) {
|
||||
minfoshaders.push(shader);
|
||||
}
|
||||
for (shader in minfoshaders)
|
||||
gpass.removeShader(shader);
|
||||
var addshaders = [];
|
||||
for (shader in zPass.getShaders()) {
|
||||
addshaders.push(shader);
|
||||
}
|
||||
for (shader in addshaders)
|
||||
gpass.addShader(shader);
|
||||
|
||||
minfo.meshbatch.material.addPass(gpass);
|
||||
}
|
||||
// var dtsshader = mat.mainPass.getShader(DtsTexture);
|
||||
// if (dtsshader != null) {
|
||||
// minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader);
|
||||
|
|
|
|||
|
|
@ -128,10 +128,9 @@ class Main extends hxd.App {
|
|||
|
||||
override function update(dt:Float) {
|
||||
super.update(dt);
|
||||
ProfilerUI.begin();
|
||||
ProfilerUI.measure("updateBegin");
|
||||
if (loaded) {
|
||||
ProfilerUI.begin();
|
||||
ProfilerUI.measure("updateBegin");
|
||||
|
||||
// try {
|
||||
// timeAccumulator += dt;
|
||||
// while (timeAccumulator > 1 / 60) {
|
||||
|
|
@ -154,9 +153,9 @@ class Main extends hxd.App {
|
|||
if (loaded) {
|
||||
ProfilerUI.measure("renderBegin");
|
||||
marbleGame.render(e);
|
||||
ProfilerUI.end();
|
||||
}
|
||||
super.render(e);
|
||||
ProfilerUI.end();
|
||||
}
|
||||
|
||||
static function main() {
|
||||
|
|
|
|||
|
|
@ -336,7 +336,7 @@ class Marble extends GameObject {
|
|||
mat.receiveShadows = false;
|
||||
// mat.mainPass.culling = None;
|
||||
|
||||
if (Settings.optionsSettings.reflectiveMarble) {
|
||||
if (Settings.optionsSettings.reflectionDetail > 0) {
|
||||
var csky = level != null ? level.sky : (@:privateAccess MarbleGame.instance.previewWorld.sky);
|
||||
this.cubemapRenderer = new CubemapRenderer(MarbleGame.instance.scene, csky);
|
||||
|
||||
|
|
|
|||
|
|
@ -200,6 +200,8 @@ class MarbleWorld extends Scheduler {
|
|||
var oobSchedule:Float;
|
||||
var oobSchedule2:Float;
|
||||
|
||||
var _cubemapNeedsUpdate:Bool = false;
|
||||
|
||||
var lock:Bool = false;
|
||||
|
||||
public function new(scene:Scene, scene2d:h2d.Scene, mission:Mission, record:Bool = false) {
|
||||
|
|
@ -1044,6 +1046,7 @@ class MarbleWorld extends Scheduler {
|
|||
for (marble in marbles) {
|
||||
marble.update(timeState, collisionWorld, this.pathedInteriors);
|
||||
}
|
||||
_cubemapNeedsUpdate = true;
|
||||
if (this.rewinding) {
|
||||
// Update camera separately
|
||||
marble.camera.update(timeState.currentAttemptTime, realDt);
|
||||
|
|
@ -1086,8 +1089,12 @@ class MarbleWorld extends Scheduler {
|
|||
if (this.playGui != null && _ready)
|
||||
this.playGui.render(e);
|
||||
if (this.marble != null && this.marble.cubemapRenderer != null) {
|
||||
this.marble.cubemapRenderer.position.load(this.marble.getAbsPos().getPosition());
|
||||
this.marble.cubemapRenderer.render(e, 0.002);
|
||||
ProfilerUI.measure("renderCubemap");
|
||||
if (_cubemapNeedsUpdate) {
|
||||
this.marble.cubemapRenderer.position.load(this.marble.getAbsPos().getPosition());
|
||||
this.marble.cubemapRenderer.render(e);
|
||||
_cubemapNeedsUpdate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ class PreviewWorld extends Scheduler {
|
|||
var itrAddTime:Float = 0;
|
||||
|
||||
var _loadToken = 0;
|
||||
var _cubemapNeedsUpdate:Bool = false;
|
||||
|
||||
public function new(scene:Scene) {
|
||||
this.scene = scene;
|
||||
|
|
@ -595,14 +596,18 @@ class PreviewWorld extends Scheduler {
|
|||
for (marb in marbles) {
|
||||
marb.update(timeState, this.collisionWorld, []);
|
||||
}
|
||||
_cubemapNeedsUpdate = true;
|
||||
this.instanceManager.render();
|
||||
}
|
||||
|
||||
public function render(e:h3d.Engine) {
|
||||
for (marble in marbles) {
|
||||
if (marble != null && marble.cubemapRenderer != null) {
|
||||
marble.cubemapRenderer.position.load(marble.getAbsPos().getPosition());
|
||||
marble.cubemapRenderer.render(e, 0.002);
|
||||
if (_cubemapNeedsUpdate) {
|
||||
marble.cubemapRenderer.position.load(marble.getAbsPos().getPosition());
|
||||
marble.cubemapRenderer.render(e);
|
||||
_cubemapNeedsUpdate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ import h3d.Vector;
|
|||
import shaders.Blur;
|
||||
import h3d.pass.ScreenFx;
|
||||
import h3d.mat.DepthBuffer;
|
||||
import src.ProfilerUI;
|
||||
import src.Settings;
|
||||
|
||||
class Renderer extends h3d.scene.Renderer {
|
||||
var def(get, never):h3d.pass.Base;
|
||||
|
|
@ -62,12 +64,8 @@ class Renderer extends h3d.scene.Renderer {
|
|||
}
|
||||
|
||||
override function getPassByName(name:String):h3d.pass.Base {
|
||||
if (name == "alpha"
|
||||
|| name == "additive"
|
||||
|| name == "glowPre"
|
||||
|| name == "glow"
|
||||
|| name == "refract"
|
||||
|| name == "glowPreNoRender")
|
||||
if (name == "alpha" || name == "additive" || name == "glowPre" || name == "glow" || name == "refract" || name == "glowPreNoRender"
|
||||
|| name == "interior" || name == "zPass")
|
||||
return defaultPass;
|
||||
return super.getPassByName(name);
|
||||
}
|
||||
|
|
@ -99,13 +97,32 @@ class Renderer extends h3d.scene.Renderer {
|
|||
// 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"));
|
||||
if (!cubemapPass)
|
||||
ProfilerUI.measure("sky");
|
||||
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 1) {
|
||||
renderPass(defaultPass, get("sky"));
|
||||
renderPass(defaultPass, get("skyshape"), backToFront);
|
||||
}
|
||||
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 2) {
|
||||
if (!cubemapPass)
|
||||
ProfilerUI.measure("interiorZPass");
|
||||
renderPass(defaultPass, get("zPass"));
|
||||
if (!cubemapPass)
|
||||
ProfilerUI.measure("interior");
|
||||
renderPass(defaultPass, get("interior"));
|
||||
}
|
||||
if (!cubemapPass)
|
||||
ProfilerUI.measure("render");
|
||||
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 3) {
|
||||
renderPass(defaultPass, get("default"));
|
||||
}
|
||||
if (!cubemapPass)
|
||||
ProfilerUI.measure("glow");
|
||||
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 4)
|
||||
renderPass(defaultPass, get("glowPre"));
|
||||
|
||||
// Glow pass
|
||||
if (!cubemapPass) {
|
||||
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 4) {
|
||||
var glowObjects = get("glow");
|
||||
if (!glowObjects.isEmpty()) {
|
||||
ctx.engine.pushTarget(glowBuffer);
|
||||
|
|
@ -119,17 +136,23 @@ class Renderer extends h3d.scene.Renderer {
|
|||
copyPass.render();
|
||||
}
|
||||
}
|
||||
if (!cubemapPass)
|
||||
ProfilerUI.measure("refract");
|
||||
// Refraction pass
|
||||
if (!cubemapPass) {
|
||||
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 4) {
|
||||
var refractObjects = get("refract");
|
||||
if (!refractObjects.isEmpty()) {
|
||||
h3d.pass.Copy.run(backBuffer, sfxBuffer);
|
||||
renderPass(defaultPass, refractObjects);
|
||||
}
|
||||
}
|
||||
if (!cubemapPass)
|
||||
ProfilerUI.measure("alpha");
|
||||
|
||||
renderPass(defaultPass, get("alpha"), backToFront);
|
||||
renderPass(defaultPass, get("additive"));
|
||||
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 4) {
|
||||
renderPass(defaultPass, get("alpha"), backToFront);
|
||||
renderPass(defaultPass, get("additive"));
|
||||
}
|
||||
|
||||
ctx.engine.popTarget();
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ typedef OptionsSettings = {
|
|||
var fovX:Int;
|
||||
var frameRateVis:Bool;
|
||||
var oobInsults:Bool;
|
||||
var reflectiveMarble:Bool;
|
||||
var marbleIndex:Int;
|
||||
var marbleCategoryIndex:Int;
|
||||
var marbleSkin:String;
|
||||
|
|
@ -44,6 +43,7 @@ typedef OptionsSettings = {
|
|||
var marbleShader:String;
|
||||
var rewindEnabled:Bool;
|
||||
var rewindTimescale:Float;
|
||||
var reflectionDetail:Int;
|
||||
}
|
||||
|
||||
typedef ControlsSettings = {
|
||||
|
|
@ -119,7 +119,6 @@ class Settings {
|
|||
fovX: 90,
|
||||
frameRateVis: true,
|
||||
oobInsults: true,
|
||||
reflectiveMarble: true,
|
||||
marbleIndex: 0,
|
||||
marbleCategoryIndex: 0,
|
||||
marbleSkin: "base",
|
||||
|
|
@ -127,6 +126,7 @@ class Settings {
|
|||
marbleShader: "Default",
|
||||
rewindEnabled: false,
|
||||
rewindTimescale: 1,
|
||||
reflectionDetail: 3,
|
||||
vsync: #if js true #end
|
||||
#if hl
|
||||
false
|
||||
|
|
@ -352,6 +352,10 @@ class Settings {
|
|||
optionsSettings.rewindEnabled = false;
|
||||
if (optionsSettings.rewindTimescale == 0 #if js || optionsSettings.rewindTimescale == null #end)
|
||||
optionsSettings.rewindTimescale = 1;
|
||||
#if js
|
||||
if (optionsSettings.reflectionDetail == null)
|
||||
optionsSettings.reflectionDetail = 2;
|
||||
#end
|
||||
controlsSettings = json.controls;
|
||||
if (json.touch != null) {
|
||||
touchSettings = json.touch;
|
||||
|
|
|
|||
|
|
@ -153,6 +153,21 @@ class VideoOptionsGui extends GuiImage {
|
|||
}
|
||||
innerCtrl.addChild(fovOpt);
|
||||
|
||||
yPos += 60;
|
||||
|
||||
var rfOpt = new GuiXboxOptionsList(1, "Reflection Detail", ["None", "Sky Only", "Level and Sky", "Level, Sky and Items", "Everything"], 0.35);
|
||||
|
||||
rfOpt.vertSizing = Bottom;
|
||||
rfOpt.horizSizing = Right;
|
||||
rfOpt.position = new Vector(380, yPos);
|
||||
rfOpt.extent = new Vector(815, 94);
|
||||
rfOpt.setCurrentOption(Settings.optionsSettings.reflectionDetail);
|
||||
rfOpt.onChangeFunc = (idx) -> {
|
||||
Settings.optionsSettings.reflectionDetail = idx;
|
||||
return true;
|
||||
}
|
||||
innerCtrl.addChild(rfOpt);
|
||||
|
||||
var bottomBar = new GuiControl();
|
||||
bottomBar.position = new Vector(0, 590);
|
||||
bottomBar.extent = new Vector(640, 200);
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ class CubemapRenderer {
|
|||
var camera:Camera;
|
||||
var scene:Scene;
|
||||
var nextFaceToRender:Int;
|
||||
var facesPerRender:Int = 2;
|
||||
|
||||
public function new(scene:Scene, sky:Sky) {
|
||||
this.scene = scene;
|
||||
|
|
@ -28,14 +29,13 @@ class CubemapRenderer {
|
|||
this.nextFaceToRender = 0;
|
||||
}
|
||||
|
||||
public function render(e:Engine, budget:Float = 1e8) {
|
||||
public function render(e:Engine) {
|
||||
var scenecam = scene.camera;
|
||||
scene.camera = camera;
|
||||
|
||||
var start = haxe.Timer.stamp();
|
||||
var renderedFaces = 0;
|
||||
Renderer.cubemapPass = true;
|
||||
for (i in 0...6) {
|
||||
for (i in 0...facesPerRender) {
|
||||
var index = (nextFaceToRender + i) % 6;
|
||||
|
||||
e.pushTarget(cubemap, index);
|
||||
|
|
@ -45,12 +45,6 @@ class CubemapRenderer {
|
|||
e.popTarget();
|
||||
|
||||
renderedFaces++;
|
||||
var time = haxe.Timer.stamp();
|
||||
var elapsed = time - start;
|
||||
var elapsedPerFace = elapsed / renderedFaces;
|
||||
|
||||
if (elapsedPerFace * (renderedFaces + 1) >= budget)
|
||||
break;
|
||||
}
|
||||
Renderer.cubemapPass = false;
|
||||
scene.camera = scenecam;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue