diff --git a/data/shapes/balls/pack1/marble01.normal.png b/data/shapes/balls/pack1/marble01.normal.png new file mode 100644 index 00000000..6c9a13e1 Binary files /dev/null and b/data/shapes/balls/pack1/marble01.normal.png differ diff --git a/data/shapes/balls/pack1/marble02.normal.png b/data/shapes/balls/pack1/marble02.normal.png new file mode 100644 index 00000000..4eccfcc4 Binary files /dev/null and b/data/shapes/balls/pack1/marble02.normal.png differ diff --git a/data/shapes/balls/pack1/marble18.normal.png b/data/shapes/balls/pack1/marble18.normal.png new file mode 100644 index 00000000..6d5e6ebf Binary files /dev/null and b/data/shapes/balls/pack1/marble18.normal.png differ diff --git a/data/shapes/balls/pack1/marble20.normal.png b/data/shapes/balls/pack1/marble20.normal.png new file mode 100644 index 00000000..0195f680 Binary files /dev/null and b/data/shapes/balls/pack1/marble20.normal.png differ diff --git a/data/shapes/balls/pack1/marblefx.normal.png b/data/shapes/balls/pack1/marblefx.normal.png new file mode 100644 index 00000000..5cc37a3a Binary files /dev/null and b/data/shapes/balls/pack1/marblefx.normal.png differ diff --git a/data/shapes/balls/pack1/uskin1.marble.png b/data/shapes/balls/pack1/uskin1.marble.png index c285decb..9c9fd5b3 100644 Binary files a/data/shapes/balls/pack1/uskin1.marble.png and b/data/shapes/balls/pack1/uskin1.marble.png differ diff --git a/data/shapes/balls/pack1/uskin10.marble.png b/data/shapes/balls/pack1/uskin10.marble.png index 2020b508..dc311931 100644 Binary files a/data/shapes/balls/pack1/uskin10.marble.png and b/data/shapes/balls/pack1/uskin10.marble.png differ diff --git a/data/shapes/balls/pack1/uskin11.marble.png b/data/shapes/balls/pack1/uskin11.marble.png index ff771c5c..eda485fd 100644 Binary files a/data/shapes/balls/pack1/uskin11.marble.png and b/data/shapes/balls/pack1/uskin11.marble.png differ diff --git a/data/shapes/balls/pack1/uskin12.marble.png b/data/shapes/balls/pack1/uskin12.marble.png index 0a35aa72..35ddd6e0 100644 Binary files a/data/shapes/balls/pack1/uskin12.marble.png and b/data/shapes/balls/pack1/uskin12.marble.png differ diff --git a/data/shapes/balls/pack1/uskin13.marble.png b/data/shapes/balls/pack1/uskin13.marble.png index 9ca09ab4..f7fd4a5b 100644 Binary files a/data/shapes/balls/pack1/uskin13.marble.png and b/data/shapes/balls/pack1/uskin13.marble.png differ diff --git a/data/shapes/balls/pack1/uskin14.marble.png b/data/shapes/balls/pack1/uskin14.marble.png index f4f6d35e..7c48d09d 100644 Binary files a/data/shapes/balls/pack1/uskin14.marble.png and b/data/shapes/balls/pack1/uskin14.marble.png differ diff --git a/data/shapes/balls/pack1/uskin15.marble.png b/data/shapes/balls/pack1/uskin15.marble.png index ce071e7a..28f6ea94 100644 Binary files a/data/shapes/balls/pack1/uskin15.marble.png and b/data/shapes/balls/pack1/uskin15.marble.png differ diff --git a/data/shapes/balls/pack1/uskin16.marble.png b/data/shapes/balls/pack1/uskin16.marble.png index 57bb8404..28cac5f3 100644 Binary files a/data/shapes/balls/pack1/uskin16.marble.png and b/data/shapes/balls/pack1/uskin16.marble.png differ diff --git a/data/shapes/balls/pack1/uskin17.marble.png b/data/shapes/balls/pack1/uskin17.marble.png index 3434fe53..4a750211 100644 Binary files a/data/shapes/balls/pack1/uskin17.marble.png and b/data/shapes/balls/pack1/uskin17.marble.png differ diff --git a/data/shapes/balls/pack1/uskin19.marble.png b/data/shapes/balls/pack1/uskin19.marble.png index 2198e030..75d5021d 100644 Binary files a/data/shapes/balls/pack1/uskin19.marble.png and b/data/shapes/balls/pack1/uskin19.marble.png differ diff --git a/data/shapes/balls/pack1/uskin20.marble.png b/data/shapes/balls/pack1/uskin20.marble.png index efffa4ee..6882b898 100644 Binary files a/data/shapes/balls/pack1/uskin20.marble.png and b/data/shapes/balls/pack1/uskin20.marble.png differ diff --git a/data/shapes/balls/pack1/uskin21.marble.png b/data/shapes/balls/pack1/uskin21.marble.png index 97650e57..4f9fbd84 100644 Binary files a/data/shapes/balls/pack1/uskin21.marble.png and b/data/shapes/balls/pack1/uskin21.marble.png differ diff --git a/data/shapes/balls/pack1/uskin22.marble.png b/data/shapes/balls/pack1/uskin22.marble.png index 8fe9580b..ebc1a41d 100644 Binary files a/data/shapes/balls/pack1/uskin22.marble.png and b/data/shapes/balls/pack1/uskin22.marble.png differ diff --git a/data/shapes/balls/pack1/uskin23.marble.png b/data/shapes/balls/pack1/uskin23.marble.png index 14cda6e9..f41fdbf8 100644 Binary files a/data/shapes/balls/pack1/uskin23.marble.png and b/data/shapes/balls/pack1/uskin23.marble.png differ diff --git a/data/shapes/balls/pack1/uskin24.marble.png b/data/shapes/balls/pack1/uskin24.marble.png index e26e8412..4bc0bc9c 100644 Binary files a/data/shapes/balls/pack1/uskin24.marble.png and b/data/shapes/balls/pack1/uskin24.marble.png differ diff --git a/data/shapes/balls/pack1/uskin25.marble.png b/data/shapes/balls/pack1/uskin25.marble.png index cdc5b090..aeb3a0f8 100644 Binary files a/data/shapes/balls/pack1/uskin25.marble.png and b/data/shapes/balls/pack1/uskin25.marble.png differ diff --git a/data/shapes/balls/pack1/uskin26.marble.png b/data/shapes/balls/pack1/uskin26.marble.png index eb93f232..24e0b389 100644 Binary files a/data/shapes/balls/pack1/uskin26.marble.png and b/data/shapes/balls/pack1/uskin26.marble.png differ diff --git a/data/shapes/balls/pack1/uskin27.marble.png b/data/shapes/balls/pack1/uskin27.marble.png index 04605bc5..a2550477 100644 Binary files a/data/shapes/balls/pack1/uskin27.marble.png and b/data/shapes/balls/pack1/uskin27.marble.png differ diff --git a/data/shapes/balls/pack1/uskin28.marble.png b/data/shapes/balls/pack1/uskin28.marble.png index 0a887f2d..42499cd5 100644 Binary files a/data/shapes/balls/pack1/uskin28.marble.png and b/data/shapes/balls/pack1/uskin28.marble.png differ diff --git a/data/shapes/balls/pack1/uskin29.marble.png b/data/shapes/balls/pack1/uskin29.marble.png index 88badee3..52e49c9d 100644 Binary files a/data/shapes/balls/pack1/uskin29.marble.png and b/data/shapes/balls/pack1/uskin29.marble.png differ diff --git a/data/shapes/balls/pack1/uskin3.marble.png b/data/shapes/balls/pack1/uskin3.marble.png index 7fb740af..b9e799ec 100644 Binary files a/data/shapes/balls/pack1/uskin3.marble.png and b/data/shapes/balls/pack1/uskin3.marble.png differ diff --git a/data/shapes/balls/pack1/uskin30.marble.png b/data/shapes/balls/pack1/uskin30.marble.png index f6d972e1..e91dbbe0 100644 Binary files a/data/shapes/balls/pack1/uskin30.marble.png and b/data/shapes/balls/pack1/uskin30.marble.png differ diff --git a/data/shapes/balls/pack1/uskin31.marble.png b/data/shapes/balls/pack1/uskin31.marble.png index 5010450e..e6d68542 100644 Binary files a/data/shapes/balls/pack1/uskin31.marble.png and b/data/shapes/balls/pack1/uskin31.marble.png differ diff --git a/data/shapes/balls/pack1/uskin32.marble.png b/data/shapes/balls/pack1/uskin32.marble.png index c99c8514..9b040428 100644 Binary files a/data/shapes/balls/pack1/uskin32.marble.png and b/data/shapes/balls/pack1/uskin32.marble.png differ diff --git a/data/shapes/balls/pack1/uskin33.marble.png b/data/shapes/balls/pack1/uskin33.marble.png index 303d0df2..eb371b85 100644 Binary files a/data/shapes/balls/pack1/uskin33.marble.png and b/data/shapes/balls/pack1/uskin33.marble.png differ diff --git a/data/shapes/balls/pack1/uskin4.marble.png b/data/shapes/balls/pack1/uskin4.marble.png index b9bbe56d..35fa9015 100644 Binary files a/data/shapes/balls/pack1/uskin4.marble.png and b/data/shapes/balls/pack1/uskin4.marble.png differ diff --git a/data/shapes/balls/pack1/uskin5.marble.png b/data/shapes/balls/pack1/uskin5.marble.png index 5189f954..ab759331 100644 Binary files a/data/shapes/balls/pack1/uskin5.marble.png and b/data/shapes/balls/pack1/uskin5.marble.png differ diff --git a/data/shapes/balls/pack1/uskin6.marble.png b/data/shapes/balls/pack1/uskin6.marble.png index 8b8c59b4..d26fa4aa 100644 Binary files a/data/shapes/balls/pack1/uskin6.marble.png and b/data/shapes/balls/pack1/uskin6.marble.png differ diff --git a/data/shapes/balls/pack1/uskin7.marble.png b/data/shapes/balls/pack1/uskin7.marble.png index c71f97bf..4934e2e1 100644 Binary files a/data/shapes/balls/pack1/uskin7.marble.png and b/data/shapes/balls/pack1/uskin7.marble.png differ diff --git a/data/shapes/balls/pack1/uskin8.marble.png b/data/shapes/balls/pack1/uskin8.marble.png index 78d61b63..3135d978 100644 Binary files a/data/shapes/balls/pack1/uskin8.marble.png and b/data/shapes/balls/pack1/uskin8.marble.png differ diff --git a/data/shapes/balls/pack1/uskin9.marble.png b/data/shapes/balls/pack1/uskin9.marble.png index 7ce6f8b2..cc4bd16e 100644 Binary files a/data/shapes/balls/pack1/uskin9.marble.png and b/data/shapes/balls/pack1/uskin9.marble.png differ diff --git a/src/Marble.hx b/src/Marble.hx index ad1e0fc6..c9caed30 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1,5 +1,10 @@ package src; +import shaders.marble.ClassicGlass; +import shaders.marble.ClassicMetal; +import shaders.marble.ClassicMarb3; +import shaders.marble.ClassicMarb2; +import shaders.marble.ClassicGlassPureSphere; import h3d.mat.MaterialDatabase; import shaders.MarbleReflection; import shaders.CubemapRenderer; @@ -315,7 +320,73 @@ class Marble extends GameObject { if (Settings.optionsSettings.reflectiveMarble) { this.cubemapRenderer = new CubemapRenderer(level.scene, level.sky); - mat.mainPass.addShader(new MarbleReflection(this.cubemapRenderer.cubemap)); + + if (Settings.optionsSettings.marbleShader == null + || Settings.optionsSettings.marbleShader == "Default" + || Settings.optionsSettings.marbleShader == "") { + mat.mainPass.addShader(new MarbleReflection(this.cubemapRenderer.cubemap)); + } else { + // Generate tangents for next shaders + for (node in marbleDts.graphNodes) { + for (ch in node.children) { + var chmesh = cast(ch, Mesh); + var chpoly = cast(chmesh.primitive, h3d.prim.Polygon); + chpoly.addTangents(); + } + } + + mat.mainPass.removeShader(mat.textureShader); + + if (Settings.optionsSettings.marbleShader == "ClassicGlassPureSphere") { + var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/pack1/marble01.normal.png").resource; + var classicGlassShader = new ClassicGlassPureSphere(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 12, + new Vector(0.6, 0.6, 0.6, 0.6), this.level.ambient, this.level.dirLight, this.level.dirLightDir, 1); + mat.mainPass.addShader(classicGlassShader); + } + + if (Settings.optionsSettings.marbleShader == "ClassicMarb2") { + var classicMarb2 = new ClassicMarb2(mat.texture, this.cubemapRenderer.cubemap, 12, new Vector(0.6, 0.6, 0.6, 0.6), this.level.ambient, + this.level.dirLight, this.level.dirLightDir, 1); + mat.mainPass.addShader(classicMarb2); + } + + if (Settings.optionsSettings.marbleShader == "ClassicMarb3") { + var classicMarb3 = new ClassicMarb3(mat.texture, this.cubemapRenderer.cubemap, 12, new Vector(0.6, 0.6, 0.6, 0.6), this.level.ambient, + this.level.dirLight, this.level.dirLightDir, 1); + mat.mainPass.addShader(classicMarb3); + } + + if (Settings.optionsSettings.marbleShader == "ClassicMetal") { + var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/pack1/marble18.normal.png").resource; + marbleNormal.wrap = Repeat; + var classicMetalShader = new ClassicMetal(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 12, new Vector(0.6, 0.6, 0.6, 0.6), + this.level.ambient, this.level.dirLight, this.level.dirLightDir, 1); + mat.mainPass.addShader(classicMetalShader); + } + + if (Settings.optionsSettings.marbleShader == "ClassicMarbGlass20") { + var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/pack1/marble20.normal.png").resource; + marbleNormal.wrap = Repeat; + var classicGlassShader = new ClassicGlass(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 12, new Vector(0.6, 0.6, 0.6, 0.6), + this.level.ambient, this.level.dirLight, this.level.dirLightDir, 1); + mat.mainPass.addShader(classicGlassShader); + } + + if (Settings.optionsSettings.marbleShader == "ClassicMarbGlass18") { + var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/pack1/marble18.normal.png").resource; + marbleNormal.wrap = Repeat; + var classicGlassShader = new ClassicGlass(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 12, new Vector(0.6, 0.6, 0.6, 0.6), + this.level.ambient, this.level.dirLight, this.level.dirLightDir, 1); + mat.mainPass.addShader(classicGlassShader); + } + + var thisprops:Dynamic = mat.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + mat.props = thisprops; + mat.castShadows = true; + mat.shadows = true; + mat.receiveShadows = false; + } } } diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index dfcc5c75..4d23ba21 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -313,7 +313,7 @@ class MarbleWorld extends Scheduler { worker.loadFile(file); } - this.scene.camera.zFar = Math.max(4000, Std.parseFloat(this.skyElement.visibledistance)); + this.scene.camera.zFar = Std.parseFloat(this.skyElement.visibledistance); this.sky = new Sky(); diff --git a/src/Settings.hx b/src/Settings.hx index 9e97518f..72ed8279 100644 --- a/src/Settings.hx +++ b/src/Settings.hx @@ -38,6 +38,7 @@ typedef OptionsSettings = { var marbleCategoryIndex:Int; var marbleSkin:String; var marbleModel:String; + var marbleShader:String; } typedef ControlsSettings = { @@ -97,6 +98,7 @@ class Settings { marbleCategoryIndex: 0, marbleSkin: "base", marbleModel: "data/shapes/balls/ball-superball.dts", + marbleShader: "Default", vsync: #if js true #end #if hl false @@ -190,6 +192,7 @@ class Settings { marbleSkin: optionsSettings.marbleSkin, marbleModel: optionsSettings.marbleModel, marbleCategoryIndex: optionsSettings.marbleCategoryIndex, + marbleShader: optionsSettings.marbleShader, }; var scoreCount = 0; var eggCount = 0; @@ -302,6 +305,9 @@ class Settings { if (optionsSettings.marbleCategoryIndex == null) { optionsSettings.marbleCategoryIndex = 0; } + if (optionsSettings.marbleShader == null) { + optionsSettings.marbleShader = "Default"; + } #end highscoreName = json.highscoreName; } else { diff --git a/src/Sky.hx b/src/Sky.hx index 100bea75..953ea7b8 100644 --- a/src/Sky.hx +++ b/src/Sky.hx @@ -46,7 +46,7 @@ class Sky extends Object { // pbrprops.occlusionValue = 0; // pbrprops.metalnessValue = 1; - skyMesh.scale(3500); + // skyMesh.scale(3500); // var env = new Environment(texture); // env.compute(); // var renderer = cast(level.scene.renderer, h3d.scene.pbr.Renderer); diff --git a/src/gui/MarbleSelectGui.hx b/src/gui/MarbleSelectGui.hx index 1c59bf57..d53d7e34 100644 --- a/src/gui/MarbleSelectGui.hx +++ b/src/gui/MarbleSelectGui.hx @@ -23,88 +23,488 @@ class MarbleSelectGui extends GuiImage { var marbleData = [ [ - {name: "Staff's Original", dts: "data/shapes/balls/ball-superball.dts", skin: "base"}, - {name: "3D Marble", dts: "data/shapes/balls/3dMarble.dts", skin: "base"}, - {name: "Mid P", dts: "data/shapes/balls/midp.dts", skin: "base"}, - {name: "Spade", dts: "data/shapes/balls/ball-superball.dts", skin: "skin4"}, - {name: "GMD Logo", dts: "data/shapes/balls/ball-superball.dts", skin: "skin5"}, - {name: "Textured Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin6"}, - {name: "Golden Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin7"}, - {name: "Rainbow Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin8"}, - {name: "Brown Swirls", dts: "data/shapes/balls/ball-superball.dts", skin: "skin9"}, - {name: "Caution Stripes", dts: "data/shapes/balls/ball-superball.dts", skin: "skin10"}, - {name: "Earth", dts: "data/shapes/balls/ball-superball.dts", skin: "skin11"}, - {name: "Golf Ball", dts: "data/shapes/balls/ball-superball.dts", skin: "skin12"}, - {name: "Jupiter", dts: "data/shapes/balls/ball-superball.dts", skin: "skin13"}, - {name: "MB Gold Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin14"}, - {name: "MBP on the Marble!", dts: "data/shapes/balls/ball-superball.dts", skin: "skin15"}, - {name: "Moshe", dts: "data/shapes/balls/ball-superball.dts", skin: "skin16"}, - {name: "Strong Bad", dts: "data/shapes/balls/ball-superball.dts", skin: "skin17"}, - {name: "Venus", dts: "data/shapes/balls/ball-superball.dts", skin: "skin18"}, - {name: "Water", dts: "data/shapes/balls/ball-superball.dts", skin: "skin19"}, - {name: "Evil Eye", dts: "data/shapes/balls/ball-superball.dts", skin: "skin20"}, - {name: "Desert and Sky", dts: "data/shapes/balls/ball-superball.dts", skin: "skin21"}, - {name: "Dirt Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin22"}, - {name: "Friction Textured Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin23"}, - {name: "Grass", dts: "data/shapes/balls/ball-superball.dts", skin: "skin24"}, - {name: "Mars", dts: "data/shapes/balls/ball-superball.dts", skin: "skin25"}, - {name: "Phil's Golf Ball", dts: "data/shapes/balls/ball-superball.dts", skin: "skin26"}, - {name: "Molten", dts: "data/shapes/balls/ball-superball.dts", skin: "skin27"}, - {name: "Lightning", dts: "data/shapes/balls/ball-superball.dts", skin: "skin28"}, - {name: "Phil'sEmpire", dts: "data/shapes/balls/ball-superball.dts", skin: "skin29"}, - {name: "Matan's Red Dragon", dts: "data/shapes/balls/ball-superball.dts", skin: "skin30"}, - {name: "Metallic Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin31"}, - {name: "Sun", dts: "data/shapes/balls/ball-superball.dts", skin: "skin32"}, - {name: "Underwater", dts: "data/shapes/balls/ball-superball.dts", skin: "skin33"}, - {name: "GarageGames logo", dts: "data/shapes/balls/garageGames.dts", skin: "base"}, - {name: "Big Marble 1", dts: "data/shapes/balls/bm1.dts", skin: "base"}, - {name: "Big Marble 2", dts: "data/shapes/balls/bm2.dts", skin: "base"}, - {name: "Big Marble 3", dts: "data/shapes/balls/bm3.dts", skin: "base"}, - {name: "Small Marble 1", dts: "data/shapes/balls/sm1.dts", skin: "base"}, - {name: "Small Marble 2", dts: "data/shapes/balls/sm2.dts", skin: "base"}, - {name: "Small Marble 3", dts: "data/shapes/balls/sm3.dts", skin: "base"} + { + name: "Staff's Original", + dts: "data/shapes/balls/ball-superball.dts", + skin: "base", + shader: "Default" + }, + { + name: "3D Marble", + dts: "data/shapes/balls/3dMarble.dts", + skin: "base", + shader: "Default" + }, + { + name: "Mid P", + dts: "data/shapes/balls/midp.dts", + skin: "base", + shader: "Default" + }, + { + name: "Spade", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin4", + shader: "Default" + }, + { + name: "GMD Logo", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin5", + shader: "Default" + }, + { + name: "Textured Marble", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin6", + shader: "Default" + }, + { + name: "Golden Marble", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin7", + shader: "Default" + }, + { + name: "Rainbow Marble", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin8", + shader: "Default" + }, + { + name: "Brown Swirls", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin9", + shader: "Default" + }, + { + name: "Caution Stripes", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin10", + shader: "Default" + }, + { + name: "Earth", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin11", + shader: "Default" + }, + { + name: "Golf Ball", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin12", + shader: "Default" + }, + { + name: "Jupiter", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin13", + shader: "Default" + }, + { + name: "MB Gold Marble", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin14", + shader: "Default" + }, + { + name: "MBP on the Marble!", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin15", + shader: "Default" + }, + { + name: "Moshe", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin16", + shader: "Default" + }, + { + name: "Strong Bad", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin17", + shader: "Default" + }, + { + name: "Venus", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin18", + shader: "Default" + }, + { + name: "Water", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin19", + shader: "Default" + }, + { + name: "Evil Eye", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin20", + shader: "Default" + }, + { + name: "Desert and Sky", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin21", + shader: "Default" + }, + { + name: "Dirt Marble", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin22", + shader: "Default" + }, + { + name: "Friction Textured Marble", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin23", + shader: "Default" + }, + { + name: "Grass", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin24", + shader: "Default" + }, + { + name: "Mars", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin25", + shader: "Default" + }, + { + name: "Phil's Golf Ball", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin26", + shader: "Default" + }, + { + name: "Molten", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin27", + shader: "Default" + }, + { + name: "Lightning", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin28", + shader: "Default" + }, + { + name: "Phil'sEmpire", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin29", + shader: "Default" + }, + { + name: "Matan's Red Dragon", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin30", + shader: "Default" + }, + { + name: "Metallic Marble", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin31", + shader: "Default" + }, + { + name: "Sun", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin32", + shader: "Default" + }, + { + name: "Underwater", + dts: "data/shapes/balls/ball-superball.dts", + skin: "skin33", + shader: "Default" + }, + { + name: "GarageGames logo", + dts: "data/shapes/balls/garageGames.dts", + skin: "base", + shader: "Default" + }, + { + name: "Big Marble 1", + dts: "data/shapes/balls/bm1.dts", + skin: "base", + shader: "Default" + }, + { + name: "Big Marble 2", + dts: "data/shapes/balls/bm2.dts", + skin: "base", + shader: "Default" + }, + { + name: "Big Marble 3", + dts: "data/shapes/balls/bm3.dts", + skin: "base", + shader: "Default" + }, + { + name: "Small Marble 1", + dts: "data/shapes/balls/sm1.dts", + skin: "base", + shader: "Default" + }, + { + name: "Small Marble 2", + dts: "data/shapes/balls/sm2.dts", + skin: "base", + shader: "Default" + }, + { + name: "Small Marble 3", + dts: "data/shapes/balls/sm3.dts", + skin: "base", + shader: "Default" + } ], [ - {name: "Deep Blue", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin1"}, - {name: "Blood Red", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin2"}, - {name: "Gang Green", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin6"}, - {name: "Pink Candy", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin27"}, - {name: "Chocolate", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin5"}, - {name: "Grape", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin4"}, - {name: "Lemon", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin28"}, - {name: "Lime Green", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin8"}, - {name: "Blueberry", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin7"}, - {name: "Tangerine", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin3"}, - {name: "8 Ball", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin9"}, - {name: "Ace of Hearts", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin22"}, - {name: "Football", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin16"}, - {name: "9 Ball", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin29"}, - {name: "Ace of Spades", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin24"}, - {name: "GarageGames", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin10"}, - {name: "Bob", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin30"}, - {name: "Skully", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin18"}, - {name: "Jack-o-Lantern", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin34"}, - {name: "Walled Up", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin25"}, - {name: "Sunny Side Up", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin11"}, - {name: "Lunar", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin31"}, - {name: "Battery", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin14"}, - {name: "Static", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin32"}, - {name: "Earth", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin20"}, - {name: "Red and X", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin13"}, - {name: "Orange Spiral", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin12"}, - {name: "Blue Spiral", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin15"}, - {name: "Sliced Marble", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin21"}, - {name: "Orange Checkers", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin19"}, - {name: "Torque", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin33"}, - {name: "Fred", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin17"}, - {name: "Pirate", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin26"}, - {name: "Shuriken", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin23"}, - {name: "Eyeball", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin35"}, - {name: "Woody", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin36"}, - {name: "Dat Nostalgia", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin37"}, - {name: "Graffiti", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin38"}, - {name: "Asteroid", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin39"}, - {name: "Disco Ball", dts: "data/shapes/balls/pack1/pack1marble.dts", skin: "uskin40"} + { + name: "Deep Blue", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin1", + shader: "ClassicGlassPureSphere" + }, + { + name: "Blood Red", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin2", + shader: "Default" + }, + { + name: "Gang Green", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin6", + shader: "ClassicGlassPureSphere" + }, + { + name: "Pink Candy", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin27", + shader: "Default" + }, + { + name: "Chocolate", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin5", + shader: "ClassicGlassPureSphere" + }, + { + name: "Grape", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin4", + shader: "ClassicGlassPureSphere" + }, + { + name: "Lemon", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin28", + shader: "Default" + }, + { + name: "Lime Green", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin8", + shader: "Default" + }, + { + name: "Blueberry", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin7", + shader: "ClassicGlassPureSphere" + }, + { + name: "Tangerine", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin3", + shader: "ClassicGlassPureSphere" + }, + { + name: "8 Ball", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin9", + shader: "ClassicMarb3" + }, + { + name: "Ace of Hearts", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin22", + shader: "ClassicMarb3" + }, + { + name: "Football", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin16", + shader: "ClassicMarb3" + }, + { + name: "9 Ball", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin29", + shader: "ClassicMarb3" + }, + { + name: "Ace of Spades", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin24", + shader: "ClassicMarb3" + }, + { + name: "GarageGames", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin10", + shader: "ClassicMarb2" + }, + { + name: "Bob", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin30", + shader: "ClassicMarb3" + }, + { + name: "Skully", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin18", + shader: "Default" + }, + { + name: "Jack-o-Lantern", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin34", + shader: "Default" + }, + { + name: "Walled Up", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin25", + shader: "ClassicMarb3" + }, + { + name: "Sunny Side Up", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin11", + shader: "ClassicMetal" + }, + { + name: "Lunar", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin31", + shader: "ClassicMetal" + }, + { + name: "Battery", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin14", + shader: "ClassicMarb3" + }, + { + name: "Static", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin32", + shader: "ClassicMarb2" + }, + { + name: "Earth", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin20", + shader: "ClassicMarbGlass20" + }, + { + name: "Red and X", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin13", + shader: "ClassicMarb3" + }, + { + name: "Orange Spiral", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin12", + shader: "ClassicGlassPureSphere" + }, + { + name: "Blue Spiral", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin15", + shader: "ClassicGlassPureSphere" + }, + { + name: "Sliced Marble", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin21", + shader: "ClassicMarb3" + }, + { + name: "Orange Checkers", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin19", + shader: "ClassicMarb3" + }, + { + name: "Torque", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin33", + shader: "ClassicMarb3" + }, + { + name: "Fred", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin17", + shader: "ClassicMarb3" + }, + { + name: "Pirate", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin26", + shader: "ClassicMarbGlass18" + }, + { + name: "Shuriken", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin23", + shader: "ClassicMarb3" + }, + { + name: "Eyeball", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin35", + shader: "Default" + }, + { + name: "Woody", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin36", + shader: "Default" + }, + { + name: "Dat Nostalgia", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin37", + shader: "Default" + }, + { + name: "Graffiti", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin38", + shader: "Default" + }, + { + name: "Asteroid", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin39", + shader: "Default" + }, + { + name: "Disco Ball", + dts: "data/shapes/balls/pack1/pack1marble.dts", + skin: "uskin40", + shader: "Default" + } ], ]; @@ -139,6 +539,7 @@ class MarbleSelectGui extends GuiImage { Settings.optionsSettings.marbleCategoryIndex = curCategorySelection; Settings.optionsSettings.marbleSkin = marbleData[curCategorySelection][curSelection].skin; Settings.optionsSettings.marbleModel = marbleData[curCategorySelection][curSelection].dts; + Settings.optionsSettings.marbleShader = marbleData[curCategorySelection][curSelection].shader; Settings.save(); MarbleGame.canvas.popDialog(this); } diff --git a/src/shaders/CubemapRenderer.hx b/src/shaders/CubemapRenderer.hx index 8f83dee7..54261e5d 100644 --- a/src/shaders/CubemapRenderer.hx +++ b/src/shaders/CubemapRenderer.hx @@ -59,11 +59,14 @@ class CubemapRenderer { public function getCameraFrustums() { var frustums = []; + var prevFar = this.camera.zFar; + this.camera.zFar = 300; // Max draw distance for (i in 0...6) { this.camera.setCubeMap(i, position); this.camera.update(); frustums.push(camera.frustum.clone()); } + this.camera.zFar = prevFar; return frustums; } } diff --git a/src/shaders/NoiseTileMaterial.hx b/src/shaders/NoiseTileMaterial.hx index bec4440f..49a8aafa 100644 --- a/src/shaders/NoiseTileMaterial.hx +++ b/src/shaders/NoiseTileMaterial.hx @@ -31,6 +31,7 @@ class NoiseTileMaterial extends hxsl.Shader { var transformedPosition:Vec3; var transformedNormal:Vec3; @var var transformedTangent:Vec4; + @var var fragLightW:Float; function __init__vertex() { transformedTangent = vec4(input.tangent * global.modelView.mat3(), input.tangent.dot(input.tangent) > 0.5 ? 1. : -1.); } @@ -40,6 +41,7 @@ class NoiseTileMaterial extends hxsl.Shader { } function vertex() { calculatedUV = input.uv; + fragLightW = step(0, dot(dirLight, input.normal)); } function fragment() { // Diffuse part @@ -85,7 +87,7 @@ class NoiseTileMaterial extends hxsl.Shader { outCol.xyz *= bumpDot + ambientLight; var r = reflect(dirLightDir, transformedNormal).normalize(); - var specValue = saturate(r.dot((camera.position - transformedPosition).normalize())); + var specValue = saturate(r.dot((camera.position - transformedPosition).normalize())) * fragLightW; var specular = specularColor * pow(specValue, shininess); outCol += specular * diffuse.a; diff --git a/src/shaders/marble/ClassicGlass.hx b/src/shaders/marble/ClassicGlass.hx new file mode 100644 index 00000000..8c24ee43 --- /dev/null +++ b/src/shaders/marble/ClassicGlass.hx @@ -0,0 +1,99 @@ +package shaders.marble; + +class ClassicGlass extends hxsl.Shader { + static var SRC = { + @param var diffuseMap:Sampler2D; + @param var normalMap:Sampler2D; + @param var envMap:SamplerCube; + @param var shininess:Float; + @param var specularColor:Vec4; + @param var ambientLight:Vec3; + @param var dirLight:Vec3; + @param var dirLightDir:Vec3; + @param var uvScaleFactor:Float; + @global var camera:{ + var position:Vec3; + @var var dir:Vec3; + }; + @global var global:{ + @perObject var modelView:Mat4; + @perObject var modelViewInverse:Mat4; + }; + @input var input:{ + var normal:Vec3; + var tangent:Vec3; + var uv:Vec2; + }; + var calculatedUV:Vec2; + var pixelColor:Vec4; + var specColor:Vec3; + var specPower:Float; + var transformedPosition:Vec3; + var transformedNormal:Vec3; + var pixelTransformedPosition:Vec3; + @var var transformedTangent:Vec4; + @var var fragLightW:Float; + function lambert(normal:Vec3, lightPosition:Vec3):Float { + var result = dot(normal, lightPosition); + return saturate(result); + } + function __init__vertex() { + transformedTangent = vec4(input.tangent * global.modelView.mat3(), input.tangent.dot(input.tangent) > 0.5 ? 1. : -1.); + } + function vertex() { + calculatedUV = input.uv * uvScaleFactor; + fragLightW = step(-0.5, dot(dirLight, input.normal)); + } + function fragment() { + // Diffuse part + var texColor = diffuseMap.get(calculatedUV); + var bumpColor = normalMap.get(calculatedUV); + + // Normal + // var n = transformedNormal; + // var transformedNormal = normalize(bumpColor.xyz * 2 - 1); + // var tanX = transformedTangent.xyz.normalize(); + // var tanY = n.cross(tanX) * transformedTangent.w; + // transformedNormal = (nf.x * tanX + nf.y * tanY + nf.z * n).normalize(); + + var diffuse = dirLight * (dot(transformedNormal, -dirLightDir) + 1.3) * 0.5; + + // Specular + var r = reflect(dirLightDir, transformedNormal).normalize(); + var specValue = saturate(r.dot((camera.position - transformedPosition).normalize())) * fragLightW; + var specular = specularColor * pow(specValue, shininess); + + var viewDir = normalize(camera.position - pixelTransformedPosition); + + // Fresnel + var fresnelBias = 0.0; + var fresnelPow = 1.2; + var fresnelScale = 1.0; + var fresnelTerm = fresnelBias + fresnelScale * (1.0 - fresnelBias) * pow(1.0 - max(dot(viewDir, transformedNormal), 0.0), fresnelPow); + + var incidentRay = normalize(pixelTransformedPosition - camera.position); + var reflectionRay = reflect(incidentRay, transformedNormal); + + var reflectColor = envMap.get(reflectionRay); + + var outCol = mix(texColor * 1.2, reflectColor, fresnelTerm); + outCol *= vec4(diffuse, 1); + outCol += specular * bumpColor.a; + + pixelColor = outCol; + } + } + + public function new(diffuse, normal, skybox, shininess, specularVal, ambientLight, dirLight, dirLightDir, uvScaleFactor) { + super(); + this.diffuseMap = diffuse; + this.normalMap = normal; + this.envMap = skybox; + this.shininess = shininess; + this.specularColor = specularVal; + this.ambientLight = ambientLight.clone(); + this.dirLight = dirLight.clone(); + this.dirLightDir = dirLightDir.clone(); + this.uvScaleFactor = uvScaleFactor; + } +} diff --git a/src/shaders/marble/ClassicGlassPureSphere.hx b/src/shaders/marble/ClassicGlassPureSphere.hx new file mode 100644 index 00000000..e9a965b8 --- /dev/null +++ b/src/shaders/marble/ClassicGlassPureSphere.hx @@ -0,0 +1,87 @@ +package shaders.marble; + +class ClassicGlassPureSphere extends hxsl.Shader { + static var SRC = { + @param var diffuseMap:Sampler2D; + @param var normalMap:Sampler2D; + @param var envMap:SamplerCube; + @param var shininess:Float; + @param var specularColor:Vec4; + @param var ambientLight:Vec3; + @param var dirLight:Vec3; + @param var dirLightDir:Vec3; + @param var uvScaleFactor:Float; + @global var camera:{ + var position:Vec3; + @var var dir:Vec3; + }; + @global var global:{ + @perObject var modelView:Mat4; + @perObject var modelViewInverse:Mat4; + }; + @input var input:{ + var normal:Vec3; + var uv:Vec2; + }; + var calculatedUV:Vec2; + var pixelColor:Vec4; + var specColor:Vec3; + var specPower:Float; + var transformedPosition:Vec3; + var transformedNormal:Vec3; + var pixelTransformedPosition:Vec3; + @var var fragLightW:Float; + function lambert(normal:Vec3, lightPosition:Vec3):Float { + var result = dot(normal, lightPosition); + return saturate(result); + } + function vertex() { + calculatedUV = input.uv * uvScaleFactor; + fragLightW = step(-0.5, dot(dirLight, input.normal)); + } + function fragment() { + // Diffuse part + var texColor = diffuseMap.get(calculatedUV); + var bumpColor = normalMap.get(calculatedUV); + + var diffuse = dirLight * (dot(transformedNormal, -dirLightDir) + 1.3) * 0.5; + + // Specular + var r = reflect(dirLightDir, transformedNormal).normalize(); + var specValue = saturate(r.dot((camera.position - transformedPosition).normalize())) * fragLightW; + var specular = specularColor * pow(specValue, shininess); + + var viewDir = normalize(camera.position - pixelTransformedPosition); + + // Fresnel + var fresnelBias = 0.0; + var fresnelPow = 1.2; + var fresnelScale = 1.0; + var fresnelTerm = fresnelBias + fresnelScale * (1.0 - fresnelBias) * pow(1.0 - max(dot(viewDir, transformedNormal), 0.0), fresnelPow); + + var incidentRay = normalize(pixelTransformedPosition - camera.position); + var reflectionRay = reflect(incidentRay, transformedNormal); + + var reflectColor = envMap.get(reflectionRay); + + var outCol = mix(texColor * 1.2, reflectColor, fresnelTerm); + outCol *= vec4(diffuse, 1); + outCol += specular * bumpColor.a; + + pixelColor = outCol; + } + } + + public function new(diffuse, normal, skybox, shininess, specularVal, ambientLight, dirLight, dirLightDir, uvScaleFactor) { + super(); + this.diffuseMap = diffuse; + this.normalMap = normal; + this.envMap = skybox; + this.shininess = shininess; + this.specularColor = specularVal; + this.ambientLight = ambientLight.clone(); + this.dirLight = dirLight.clone(); + this.dirLightDir = dirLightDir.clone(); + this.uvScaleFactor = uvScaleFactor; + } +} diff --git a/src/shaders/marble/ClassicMarb2.hx b/src/shaders/marble/ClassicMarb2.hx new file mode 100644 index 00000000..d20f33f7 --- /dev/null +++ b/src/shaders/marble/ClassicMarb2.hx @@ -0,0 +1,84 @@ +package shaders.marble; + +class ClassicMarb2 extends hxsl.Shader { + static var SRC = { + @param var diffuseMap:Sampler2D; + @param var envMap:SamplerCube; + @param var shininess:Float; + @param var specularColor:Vec4; + @param var ambientLight:Vec3; + @param var dirLight:Vec3; + @param var dirLightDir:Vec3; + @param var uvScaleFactor:Float; + @global var camera:{ + var position:Vec3; + @var var dir:Vec3; + }; + @global var global:{ + @perObject var modelView:Mat4; + @perObject var modelViewInverse:Mat4; + }; + @input var input:{ + var normal:Vec3; + var uv:Vec2; + }; + var calculatedUV:Vec2; + var pixelColor:Vec4; + var specColor:Vec3; + var specPower:Float; + var transformedPosition:Vec3; + var transformedNormal:Vec3; + var pixelTransformedPosition:Vec3; + @var var fragLightW:Float; + function lambert(normal:Vec3, lightPosition:Vec3):Float { + var result = dot(normal, lightPosition); + return saturate(result); + } + function vertex() { + calculatedUV = input.uv * uvScaleFactor; + fragLightW = step(-0.5, dot(dirLight, input.normal)); + } + function fragment() { + // Diffuse part + var texColor = diffuseMap.get(calculatedUV); + + var diffuse = dirLight * (dot(transformedNormal, -dirLightDir) + 1.3) * 0.5; + + // Specular + var r = reflect(dirLightDir, transformedNormal).normalize(); + var specValue = saturate(r.dot((camera.position - transformedPosition).normalize())) * fragLightW; + var specular = specularColor * pow(specValue, shininess); + + var viewDir = normalize(camera.position - pixelTransformedPosition); + + // Fresnel + var fresnelBias = 0.0; + var fresnelPow = 1.2; + var fresnelScale = 1.0; + var fresnelTerm = fresnelBias + fresnelScale * (1.0 - fresnelBias) * pow(1.0 - max(dot(viewDir, transformedNormal), 0.0), fresnelPow); + + var incidentRay = normalize(pixelTransformedPosition - camera.position); + var reflectionRay = reflect(incidentRay, transformedNormal); + + var reflectColor = envMap.get(reflectionRay); + + var outCol = mix(texColor * 1.2, reflectColor, fresnelTerm); + outCol *= vec4(diffuse, 1); + outCol += specular * texColor.a * 0.5; + + pixelColor = outCol; + } + } + + public function new(diffuse, skybox, shininess, specularVal, ambientLight, dirLight, dirLightDir, uvScaleFactor) { + super(); + this.diffuseMap = diffuse; + this.envMap = skybox; + this.shininess = shininess; + this.specularColor = specularVal; + this.ambientLight = ambientLight.clone(); + this.dirLight = dirLight.clone(); + this.dirLightDir = dirLightDir.clone(); + this.uvScaleFactor = uvScaleFactor; + } +} diff --git a/src/shaders/marble/ClassicMarb3.hx b/src/shaders/marble/ClassicMarb3.hx new file mode 100644 index 00000000..fc1dc052 --- /dev/null +++ b/src/shaders/marble/ClassicMarb3.hx @@ -0,0 +1,80 @@ +package shaders.marble; + +class ClassicMarb3 extends hxsl.Shader { + static var SRC = { + @param var diffuseMap:Sampler2D; + @param var envMap:SamplerCube; + @param var shininess:Float; + @param var specularColor:Vec4; + @param var ambientLight:Vec3; + @param var dirLight:Vec3; + @param var dirLightDir:Vec3; + @param var uvScaleFactor:Float; + @global var camera:{ + var position:Vec3; + @var var dir:Vec3; + }; + @global var global:{ + @perObject var modelView:Mat4; + @perObject var modelViewInverse:Mat4; + }; + @input var input:{ + var normal:Vec3; + var uv:Vec2; + }; + var calculatedUV:Vec2; + var pixelColor:Vec4; + var specColor:Vec3; + var specPower:Float; + var transformedPosition:Vec3; + var transformedNormal:Vec3; + var pixelTransformedPosition:Vec3; + @var var fragLightW:Float; + function lambert(normal:Vec3, lightPosition:Vec3):Float { + var result = dot(normal, lightPosition); + return saturate(result); + } + function vertex() { + calculatedUV = input.uv * uvScaleFactor; + fragLightW = step(-0.5, dot(dirLight, input.normal)); + } + function fragment() { + // Diffuse part + var texColor = diffuseMap.get(calculatedUV); + + var diffuse = vec4(dirLight, 1) * (dot(transformedNormal, -dirLightDir) + 1.3) * 0.5; + + // Specular + var r = reflect(dirLightDir, transformedNormal).normalize(); + var specValue = saturate(r.dot((camera.position - transformedPosition).normalize())) * fragLightW; + var specular = specularColor * pow(specValue, shininess); + + var viewDir = normalize(camera.position - pixelTransformedPosition); + + var incidentRay = normalize(pixelTransformedPosition - camera.position); + var reflectionRay = reflect(incidentRay, transformedNormal); + + var reflectColor = envMap.get(reflectionRay); + + var avgColor = vec4((reflectColor.r + reflectColor.g + reflectColor.b) / 3.0); + var finalReflectColor = mix(reflectColor, avgColor, 1); + + var outCol = mix(texColor * diffuse * 1.2, finalReflectColor * diffuse, texColor.a); + outCol += specular * 0.5; + + pixelColor = outCol; + } + } + + public function new(diffuse, skybox, shininess, specularVal, ambientLight, dirLight, dirLightDir, uvScaleFactor) { + super(); + this.diffuseMap = diffuse; + this.envMap = skybox; + this.shininess = shininess; + this.specularColor = specularVal; + this.ambientLight = ambientLight.clone(); + this.dirLight = dirLight.clone(); + this.dirLightDir = dirLightDir.clone(); + this.uvScaleFactor = uvScaleFactor; + } +} diff --git a/src/shaders/marble/ClassicMetal.hx b/src/shaders/marble/ClassicMetal.hx new file mode 100644 index 00000000..b038ff52 --- /dev/null +++ b/src/shaders/marble/ClassicMetal.hx @@ -0,0 +1,100 @@ +package shaders.marble; + +class ClassicMetal extends hxsl.Shader { + static var SRC = { + @param var diffuseMap:Sampler2D; + @param var normalMap:Sampler2D; + @param var envMap:SamplerCube; + @param var shininess:Float; + @param var specularColor:Vec4; + @param var ambientLight:Vec3; + @param var dirLight:Vec3; + @param var dirLightDir:Vec3; + @param var uvScaleFactor:Float; + @global var camera:{ + var position:Vec3; + @var var dir:Vec3; + }; + @global var global:{ + @perObject var modelView:Mat4; + @perObject var modelViewInverse:Mat4; + }; + @input var input:{ + var normal:Vec3; + var tangent:Vec3; + var uv:Vec2; + }; + var calculatedUV:Vec2; + var pixelColor:Vec4; + var specColor:Vec3; + var specPower:Float; + var transformedPosition:Vec3; + var transformedNormal:Vec3; + var pixelTransformedPosition:Vec3; + @var var transformedTangent:Vec4; + @var var fragLightW:Float; + function lambert(normal:Vec3, lightPosition:Vec3):Float { + var result = dot(normal, lightPosition); + return saturate(result); + } + function __init__vertex() { + transformedTangent = vec4(input.tangent * global.modelView.mat3(), input.tangent.dot(input.tangent) > 0.5 ? 1. : -1.); + } + function vertex() { + calculatedUV = input.uv * uvScaleFactor; + fragLightW = step(-0.5, dot(dirLight, input.normal)); + } + function fragment() { + // Diffuse part + var texColor = diffuseMap.get(calculatedUV); + var bumpColor = normalMap.get(calculatedUV); + + // Normal + var n = transformedNormal; + var nf = unpackNormal(bumpColor); + var tanX = transformedTangent.xyz.normalize(); + var tanY = n.cross(tanX) * transformedTangent.w; + transformedNormal = (nf.x * tanX + nf.y * tanY + nf.z * n).normalize(); + + var diffuse = dirLight * (dot(transformedNormal, -dirLightDir) + 1.3) * 0.5; + + // Specular + var r = reflect(dirLightDir, transformedNormal).normalize(); + var specValue = saturate(r.dot((camera.position - transformedPosition).normalize())) * fragLightW; + var specular = specularColor * pow(specValue, shininess); + + var viewDir = normalize(camera.position - pixelTransformedPosition); + + // Fresnel + var fresnelBias = 0.0; + var fresnelPow = 1.2; + var fresnelScale = 1.0; + var fresnelTerm = fresnelBias + fresnelScale * (1.0 - fresnelBias) * pow(1.0 - max(dot(viewDir, transformedNormal), 0.0), fresnelPow); + + var incidentRay = normalize(pixelTransformedPosition - camera.position); + var reflectionRay = reflect(incidentRay, transformedNormal); + + var reflectColor = envMap.get(reflectionRay); + var finalReflectColor = vec4((reflectColor.r + reflectColor.g + reflectColor.b) / 3.0); + + var outCol = texColor * mix(vec4(1), finalReflectColor, bumpColor.a); + outCol *= vec4(diffuse, 1); + outCol += specular * bumpColor.a; + + pixelColor = outCol; + } + } + + public function new(diffuse, normal, skybox, shininess, specularVal, ambientLight, dirLight, dirLightDir, uvScaleFactor) { + super(); + this.diffuseMap = diffuse; + this.normalMap = normal; + this.envMap = skybox; + this.shininess = shininess; + this.specularColor = specularVal; + this.ambientLight = ambientLight.clone(); + this.dirLight = dirLight.clone(); + this.dirLightDir = dirLightDir.clone(); + this.uvScaleFactor = uvScaleFactor; + } +}