mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
Implement transparency fading stuff for dts
This commit is contained in:
parent
5279ba0247
commit
cb12352f4f
8 changed files with 134 additions and 12 deletions
|
|
@ -73,7 +73,6 @@ class CameraController extends Object {
|
||||||
Sdl.warpMouseGlobal(cast this.screenWidth / 2, cast this.screenHeight / 2);
|
Sdl.warpMouseGlobal(cast this.screenWidth / 2, cast this.screenHeight / 2);
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
trace(e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function orbit(mouseX:Float, mouseY:Float) {
|
function orbit(mouseX:Float, mouseY:Float) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import shaders.DtsMaterial;
|
||||||
|
import shaders.DtsTexture;
|
||||||
|
import shaders.DtsMaterialSetup;
|
||||||
|
import h3d.shader.AlphaMult;
|
||||||
import sys.io.File;
|
import sys.io.File;
|
||||||
import src.MarbleWorld;
|
import src.MarbleWorld;
|
||||||
import src.GameObject;
|
import src.GameObject;
|
||||||
|
|
@ -94,6 +98,7 @@ class DtsObject extends GameObject {
|
||||||
var colliders:Array<CollisionEntity>;
|
var colliders:Array<CollisionEntity>;
|
||||||
|
|
||||||
var mountPointNodes:Array<Int>;
|
var mountPointNodes:Array<Int>;
|
||||||
|
var alphaShader:AlphaMult;
|
||||||
|
|
||||||
public function new() {
|
public function new() {
|
||||||
super();
|
super();
|
||||||
|
|
@ -321,6 +326,11 @@ class DtsObject extends GameObject {
|
||||||
var texture:Texture = ResourceLoader.getTexture(fullName);
|
var texture:Texture = ResourceLoader.getTexture(fullName);
|
||||||
texture.wrap = Wrap.Repeat;
|
texture.wrap = Wrap.Repeat;
|
||||||
material.texture = texture;
|
material.texture = texture;
|
||||||
|
var dtsshader = new DtsTexture();
|
||||||
|
dtsshader.texture = texture;
|
||||||
|
dtsshader.currentOpacity = 1;
|
||||||
|
material.mainPass.removeShader(material.textureShader);
|
||||||
|
material.mainPass.addShader(dtsshader);
|
||||||
// TODO TRANSLUENCY SHIT
|
// TODO TRANSLUENCY SHIT
|
||||||
}
|
}
|
||||||
if (flags & 4 > 0) {
|
if (flags & 4 > 0) {
|
||||||
|
|
@ -338,6 +348,8 @@ class DtsObject extends GameObject {
|
||||||
// }
|
// }
|
||||||
// ((flags & 32) || environmentMaterial) ? new Materia
|
// ((flags & 32) || environmentMaterial) ? new Materia
|
||||||
|
|
||||||
|
material.mainPass.addShader(new AlphaMult());
|
||||||
|
|
||||||
this.materials.push(material);
|
this.materials.push(material);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -736,4 +748,27 @@ class DtsObject extends GameObject {
|
||||||
}
|
}
|
||||||
return this.getTransform().clone();
|
return this.getTransform().clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setOpacity(opacity:Float) {
|
||||||
|
if (opacity == this.currentOpacity)
|
||||||
|
return;
|
||||||
|
this.currentOpacity = opacity;
|
||||||
|
|
||||||
|
for (material in this.materials) {
|
||||||
|
if (this.currentOpacity != 1) {
|
||||||
|
material.blendMode = BlendMode.Alpha;
|
||||||
|
if (this.alphaShader == null) {
|
||||||
|
this.alphaShader = new AlphaMult();
|
||||||
|
}
|
||||||
|
if (material.mainPass.getShader(AlphaMult) == null) {
|
||||||
|
material.mainPass.addShader(this.alphaShader);
|
||||||
|
}
|
||||||
|
this.alphaShader.alpha = this.currentOpacity;
|
||||||
|
} else {
|
||||||
|
if (alphaShader != null) {
|
||||||
|
alphaShader.alpha = this.currentOpacity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,4 +4,5 @@ import h3d.scene.Object;
|
||||||
|
|
||||||
class GameObject extends Object {
|
class GameObject extends Object {
|
||||||
public var identifier:String;
|
public var identifier:String;
|
||||||
|
public var currentOpacity:Float = 1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import shaders.DtsTexture;
|
||||||
|
import h3d.mat.Pass;
|
||||||
|
import h3d.shader.AlphaMult;
|
||||||
import h2d.col.Matrix;
|
import h2d.col.Matrix;
|
||||||
import src.GameObject;
|
import src.GameObject;
|
||||||
import h3d.scene.Scene;
|
import h3d.scene.Scene;
|
||||||
|
|
@ -8,11 +11,17 @@ import h3d.scene.Mesh;
|
||||||
import h3d.scene.MeshBatch;
|
import h3d.scene.MeshBatch;
|
||||||
|
|
||||||
typedef MeshBatchInfo = {
|
typedef MeshBatchInfo = {
|
||||||
var instances:Array<Object>;
|
var instances:Array<MeshInstance>;
|
||||||
var meshbatch:MeshBatch;
|
var meshbatch:MeshBatch;
|
||||||
|
var ?transparencymeshbatch:MeshBatch;
|
||||||
var mesh:Mesh;
|
var mesh:Mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef MeshInstance = {
|
||||||
|
var emptyObj:Object;
|
||||||
|
var gameObject:GameObject;
|
||||||
|
}
|
||||||
|
|
||||||
class InstanceManager {
|
class InstanceManager {
|
||||||
var objects:Map<String, Array<MeshBatchInfo>> = new Map();
|
var objects:Map<String, Array<MeshBatchInfo>> = new Map();
|
||||||
var scene:Scene;
|
var scene:Scene;
|
||||||
|
|
@ -25,13 +34,29 @@ class InstanceManager {
|
||||||
for (obj => meshes in objects) {
|
for (obj => meshes in objects) {
|
||||||
for (minfo in meshes) {
|
for (minfo in meshes) {
|
||||||
if (minfo.meshbatch != null) {
|
if (minfo.meshbatch != null) {
|
||||||
minfo.meshbatch.begin(minfo.instances.length);
|
var opaqueinstances = minfo.instances.filter(x -> x.gameObject.currentOpacity == 1);
|
||||||
for (instance in minfo.instances) {
|
minfo.meshbatch.begin(opaqueinstances.length);
|
||||||
var transform = instance.getAbsPos().clone();
|
for (instance in opaqueinstances) { // Draw the opaque shit first
|
||||||
|
var transform = instance.emptyObj.getAbsPos().clone();
|
||||||
minfo.meshbatch.setTransform(transform);
|
minfo.meshbatch.setTransform(transform);
|
||||||
minfo.meshbatch.emitInstance();
|
minfo.meshbatch.emitInstance();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (minfo.transparencymeshbatch != null) {
|
||||||
|
var transparentinstances = minfo.instances.filter(x -> x.gameObject.currentOpacity != 1);
|
||||||
|
minfo.transparencymeshbatch.begin(transparentinstances.length);
|
||||||
|
for (instance in transparentinstances) { // Non opaque shit
|
||||||
|
var dtsShader = minfo.transparencymeshbatch.material.mainPass.getShader(DtsTexture);
|
||||||
|
minfo.transparencymeshbatch.material.blendMode = Alpha;
|
||||||
|
if (dtsShader != null) {
|
||||||
|
dtsShader.currentOpacity = instance.gameObject.currentOpacity;
|
||||||
|
minfo.transparencymeshbatch.shadersChanged = true;
|
||||||
|
}
|
||||||
|
var transform = instance.emptyObj.getAbsPos().clone();
|
||||||
|
minfo.transparencymeshbatch.setTransform(transform);
|
||||||
|
minfo.transparencymeshbatch.emitInstance();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -50,7 +75,7 @@ class InstanceManager {
|
||||||
var objs = getAllChildren(object);
|
var objs = getAllChildren(object);
|
||||||
var minfos = objects.get(object.identifier);
|
var minfos = objects.get(object.identifier);
|
||||||
for (i in 0...objs.length) {
|
for (i in 0...objs.length) {
|
||||||
minfos[i].instances.push(objs[i]);
|
minfos[i].instances.push({emptyObj: objs[i], gameObject: object});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// First time appending the thing so bruh
|
// First time appending the thing so bruh
|
||||||
|
|
@ -60,10 +85,21 @@ class InstanceManager {
|
||||||
for (obj in objs) {
|
for (obj in objs) {
|
||||||
var isMesh = obj is Mesh;
|
var isMesh = obj is Mesh;
|
||||||
var minfo:MeshBatchInfo = {
|
var minfo:MeshBatchInfo = {
|
||||||
instances: [obj],
|
instances: [{emptyObj: obj, gameObject: object}],
|
||||||
meshbatch: isMesh ? new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene) : null,
|
meshbatch: isMesh ? new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene) : null,
|
||||||
mesh: isMesh ? cast obj : null
|
mesh: isMesh ? cast obj : null
|
||||||
}
|
}
|
||||||
|
if (isMesh) {
|
||||||
|
var mat = cast(obj, Mesh).material;
|
||||||
|
var dtsshader = mat.mainPass.getShader(DtsTexture);
|
||||||
|
if (dtsshader != null) {
|
||||||
|
minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader);
|
||||||
|
minfo.meshbatch.material.mainPass.addShader(dtsshader);
|
||||||
|
}
|
||||||
|
minfo.transparencymeshbatch = new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene);
|
||||||
|
minfo.transparencymeshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader);
|
||||||
|
minfo.transparencymeshbatch.material.mainPass.addShader(dtsshader);
|
||||||
|
}
|
||||||
minfos.push(minfo);
|
minfos.push(minfo);
|
||||||
}
|
}
|
||||||
objects.set(object.identifier, minfos);
|
objects.set(object.identifier, minfos);
|
||||||
|
|
|
||||||
11
src/Main.hx
11
src/Main.hx
|
|
@ -1,5 +1,6 @@
|
||||||
package;
|
package;
|
||||||
|
|
||||||
|
import shapes.SuperSpeed;
|
||||||
import shapes.SignFinish;
|
import shapes.SignFinish;
|
||||||
import shapes.Trapdoor;
|
import shapes.Trapdoor;
|
||||||
import shapes.AntiGravity;
|
import shapes.AntiGravity;
|
||||||
|
|
@ -34,8 +35,8 @@ class Main extends hxd.App {
|
||||||
override function init() {
|
override function init() {
|
||||||
super.init();
|
super.init();
|
||||||
|
|
||||||
dtsObj = new SignFinish();
|
dtsObj = new SuperSpeed();
|
||||||
dtsObj.z = 5;
|
// dtsObj.z = 5;
|
||||||
|
|
||||||
world = new MarbleWorld(s3d);
|
world = new MarbleWorld(s3d);
|
||||||
|
|
||||||
|
|
@ -86,6 +87,12 @@ class Main extends hxd.App {
|
||||||
// world.addPathedInterior(pi);
|
// world.addPathedInterior(pi);
|
||||||
|
|
||||||
world.addDtsObject(dtsObj);
|
world.addDtsObject(dtsObj);
|
||||||
|
dtsObj.setOpacity(0.5);
|
||||||
|
|
||||||
|
var dto = new SuperSpeed();
|
||||||
|
world.addDtsObject(dto);
|
||||||
|
dto.setOpacity(1);
|
||||||
|
dto.z = 1;
|
||||||
|
|
||||||
// for (i in 0...10) {
|
// for (i in 0...10) {
|
||||||
// for (j in 0...10) {
|
// for (j in 0...10) {
|
||||||
|
|
|
||||||
10
src/Sky.hx
10
src/Sky.hx
|
|
@ -1,5 +1,7 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import h3d.shader.pbr.PropsValues;
|
||||||
|
import h3d.shader.AmbientLight;
|
||||||
import h3d.scene.pbr.Environment;
|
import h3d.scene.pbr.Environment;
|
||||||
import src.Util;
|
import src.Util;
|
||||||
import src.MarbleWorld;
|
import src.MarbleWorld;
|
||||||
|
|
@ -25,13 +27,15 @@ class Sky extends Object {
|
||||||
sky.addUVs();
|
sky.addUVs();
|
||||||
var skyMesh = new h3d.scene.Mesh(sky, this);
|
var skyMesh = new h3d.scene.Mesh(sky, this);
|
||||||
skyMesh.material.mainPass.culling = Front;
|
skyMesh.material.mainPass.culling = Front;
|
||||||
skyMesh.material.mainPass.setPassName("overlay");
|
// This is such a hack
|
||||||
|
skyMesh.material.mainPass.addShader(new h3d.shader.pbr.PropsValues(1, 0, 0, 1));
|
||||||
|
skyMesh.material.blendMode = None;
|
||||||
skyMesh.scale(200);
|
skyMesh.scale(200);
|
||||||
var env = new Environment(texture);
|
var env = new Environment(texture);
|
||||||
env.compute();
|
env.compute();
|
||||||
var renderer = cast(level.scene.renderer, h3d.scene.pbr.Renderer);
|
var renderer = cast(level.scene.renderer, h3d.scene.pbr.Renderer);
|
||||||
// renderer.env = env;
|
var shad = new h3d.shader.pbr.CubeLod(texture);
|
||||||
skyMesh.material.mainPass.addShader(new h3d.shader.pbr.CubeLod(texture));
|
skyMesh.material.mainPass.addShader(shad);
|
||||||
skyMesh.material.shadows = false;
|
skyMesh.material.shadows = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
39
src/shaders/DtsTexture.hx
Normal file
39
src/shaders/DtsTexture.hx
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
package shaders;
|
||||||
|
|
||||||
|
class DtsTexture extends hxsl.Shader {
|
||||||
|
static var SRC = {
|
||||||
|
@input var input:{
|
||||||
|
var uv:Vec2;
|
||||||
|
};
|
||||||
|
@const var additive:Bool;
|
||||||
|
@const var killAlpha:Bool;
|
||||||
|
@const var specularAlpha:Bool;
|
||||||
|
@range(0, 1) @param var killAlphaThreshold:Float;
|
||||||
|
@param var texture:Sampler2D;
|
||||||
|
@param var currentOpacity:Float;
|
||||||
|
var calculatedUV:Vec2;
|
||||||
|
var pixelColor:Vec4;
|
||||||
|
var specColor:Vec3;
|
||||||
|
function vertex() {
|
||||||
|
calculatedUV = input.uv;
|
||||||
|
}
|
||||||
|
function fragment() {
|
||||||
|
var c = texture.get(calculatedUV);
|
||||||
|
if (killAlpha && c.a - killAlphaThreshold < 0)
|
||||||
|
discard;
|
||||||
|
if (additive)
|
||||||
|
pixelColor += c;
|
||||||
|
else
|
||||||
|
pixelColor *= c;
|
||||||
|
if (specularAlpha)
|
||||||
|
specColor *= c.aaa;
|
||||||
|
pixelColor.a *= currentOpacity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function new(?tex) {
|
||||||
|
super();
|
||||||
|
this.texture = tex;
|
||||||
|
killAlphaThreshold = h3d.mat.Defaults.defaultKillAlphaThreshold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -9,5 +9,6 @@ class SuperSpeed extends DtsObject {
|
||||||
this.isCollideable = false;
|
this.isCollideable = false;
|
||||||
this.isTSStatic = false;
|
this.isTSStatic = false;
|
||||||
this.identifier = "SuperSpeed";
|
this.identifier = "SuperSpeed";
|
||||||
|
this.useInstancing = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue