mbu marbles, fix cubemap rendering, fix js

This commit is contained in:
RandomityGuy 2022-12-09 20:38:35 +05:30
parent 1d1513026b
commit 0fc64d9b70
8 changed files with 176 additions and 63 deletions

View file

@ -177,8 +177,10 @@ class DifBuilder {
var worker = new ResourceLoaderWorker(() -> { var worker = new ResourceLoaderWorker(() -> {
var diffuseTex = ResourceLoader.getTexture('data/interiors_mbu/${baseTexture}').resource; var diffuseTex = ResourceLoader.getTexture('data/interiors_mbu/${baseTexture}').resource;
diffuseTex.wrap = Repeat; diffuseTex.wrap = Repeat;
diffuseTex.mipMap = Nearest;
var normalTex = ResourceLoader.getTexture('data/shaders/tex/${normalTexture}').resource; var normalTex = ResourceLoader.getTexture('data/shaders/tex/${normalTexture}').resource;
normalTex.wrap = Repeat; normalTex.wrap = Repeat;
normalTex.mipMap = Nearest;
var shader = new PhongMaterial(diffuseTex, normalTex, shininess, specularColor, MarbleGame.instance.world.ambient, var shader = new PhongMaterial(diffuseTex, normalTex, shininess, specularColor, MarbleGame.instance.world.ambient,
MarbleGame.instance.world.dirLight, MarbleGame.instance.world.dirLightDir, uvScaleFactor); MarbleGame.instance.world.dirLight, MarbleGame.instance.world.dirLightDir, uvScaleFactor);
onFinish(shader); onFinish(shader);
@ -192,10 +194,13 @@ class DifBuilder {
var worker = new ResourceLoaderWorker(() -> { var worker = new ResourceLoaderWorker(() -> {
var diffuseTex = ResourceLoader.getTexture('data/interiors_mbu/${baseTexture}').resource; var diffuseTex = ResourceLoader.getTexture('data/interiors_mbu/${baseTexture}').resource;
diffuseTex.wrap = Repeat; diffuseTex.wrap = Repeat;
diffuseTex.mipMap = Nearest;
var normalTex = ResourceLoader.getTexture('data/shaders/tex/tile_mbu.normal.png').resource; var normalTex = ResourceLoader.getTexture('data/shaders/tex/tile_mbu.normal.png').resource;
normalTex.wrap = Repeat; normalTex.wrap = Repeat;
normalTex.mipMap = Nearest;
var noiseTex = ResourceLoader.getTexture('data/shaders/tex/noise${noiseSuffix}.jpg').resource; var noiseTex = ResourceLoader.getTexture('data/shaders/tex/noise${noiseSuffix}.jpg').resource;
noiseTex.wrap = Repeat; noiseTex.wrap = Repeat;
noiseTex.mipMap = Nearest;
var shader = new NoiseTileMaterial(diffuseTex, normalTex, noiseTex, shininess, specular, MarbleGame.instance.world.ambient, var shader = new NoiseTileMaterial(diffuseTex, normalTex, noiseTex, shininess, specular, MarbleGame.instance.world.ambient,
MarbleGame.instance.world.dirLight, MarbleGame.instance.world.dirLightDir, 1); MarbleGame.instance.world.dirLight, MarbleGame.instance.world.dirLightDir, 1);
onFinish(shader); onFinish(shader);

View file

@ -15,6 +15,7 @@ import h3d.scene.Scene;
import h3d.scene.Object; import h3d.scene.Object;
import h3d.scene.Mesh; import h3d.scene.Mesh;
import h3d.scene.MeshBatch; import h3d.scene.MeshBatch;
import src.MarbleGame;
typedef MeshBatchInfo = { typedef MeshBatchInfo = {
var instances:Array<MeshInstance>; var instances:Array<MeshInstance>;
@ -38,7 +39,12 @@ class InstanceManager {
this.scene = scene; this.scene = scene;
} }
public function update(dt:Float) { public function render() {
var renderFrustums = [scene.camera.frustum];
// This sucks holy shit
if (MarbleGame.instance.world.marble != null && MarbleGame.instance.world.marble.cubemapRenderer != null)
renderFrustums = renderFrustums.concat(MarbleGame.instance.world.marble.cubemapRenderer.getCameraFrustums());
for (meshes in objects) { for (meshes in objects) {
for (minfo in meshes) { for (minfo in meshes) {
var visibleinstances = []; var visibleinstances = [];
@ -47,8 +53,11 @@ class InstanceManager {
for (inst in minfo.instances) { for (inst in minfo.instances) {
var objBounds = @:privateAccess cast(minfo.meshbatch.primitive, Instanced).baseBounds.clone(); var objBounds = @:privateAccess cast(minfo.meshbatch.primitive, Instanced).baseBounds.clone();
objBounds.transform(inst.emptyObj.getAbsPos()); objBounds.transform(inst.emptyObj.getAbsPos());
if (scene.camera.frustum.hasBounds(objBounds)) { for (frustum in renderFrustums) {
if (frustum.hasBounds(objBounds)) {
visibleinstances.push(inst); visibleinstances.push(inst);
break;
}
} }
} }
} }

View file

@ -364,8 +364,12 @@ class MarbleWorld extends Scheduler {
"shapes/items/gem.dts", // Ew ew "shapes/items/gem.dts", // Ew ew
"shapes/items/gemshine.png" "shapes/items/gemshine.png"
]; ];
// Hacky
marblefiles.push(StringTools.replace(Settings.optionsSettings.marbleModel, "data/", "")); marblefiles.push(StringTools.replace(Settings.optionsSettings.marbleModel, "data/", ""));
if (Settings.optionsSettings.marbleCategoryIndex == 0)
marblefiles.push("shapes/balls/" + Settings.optionsSettings.marbleSkin + ".marble.png"); marblefiles.push("shapes/balls/" + Settings.optionsSettings.marbleSkin + ".marble.png");
else
marblefiles.push("shapes/balls/pack1/" + Settings.optionsSettings.marbleSkin + ".marble.png");
for (file in marblefiles) { for (file in marblefiles) {
worker.loadFile(file); worker.loadFile(file);
} }
@ -1178,7 +1182,7 @@ class MarbleWorld extends Scheduler {
marble.update(timeState, collisionWorld, this.pathedInteriors); marble.update(timeState, collisionWorld, this.pathedInteriors);
} }
ProfilerUI.measure("updateInstances"); ProfilerUI.measure("updateInstances");
this.instanceManager.update(dt); this.instanceManager.render();
ProfilerUI.measure("updateParticles"); ProfilerUI.measure("updateParticles");
this.particleManager.update(1000 * timeState.timeSinceLoad, dt); this.particleManager.update(1000 * timeState.timeSinceLoad, dt);
ProfilerUI.measure("updatePlayGui"); ProfilerUI.measure("updatePlayGui");

View file

@ -202,7 +202,9 @@ class ResourceLoader {
static function preloadShapes(onFinish:Void->Void) { static function preloadShapes(onFinish:Void->Void) {
var toloadfiles = [ var toloadfiles = [
StringTools.replace(Settings.optionsSettings.marbleModel, "data/", ""), StringTools.replace(Settings.optionsSettings.marbleModel, "data/", ""),
"shapes/balls/" + Settings.optionsSettings.marbleSkin + ".marble.png" (Settings.optionsSettings.marbleCategoryIndex == 0)
? "shapes/balls/" + Settings.optionsSettings.marbleSkin + ".marble.png" : "shapes/balls/pack1/" + Settings.optionsSettings.marbleSkin +
".marble.png"
]; ];
// var toloaddirs = []; // var toloaddirs = [];
// var filestats = fileSystem.dir("shapes"); // var filestats = fileSystem.dir("shapes");

View file

@ -35,6 +35,7 @@ typedef OptionsSettings = {
var oobInsults:Bool; var oobInsults:Bool;
var reflectiveMarble:Bool; var reflectiveMarble:Bool;
var marbleIndex:Int; var marbleIndex:Int;
var marbleCategoryIndex:Int;
var marbleSkin:String; var marbleSkin:String;
var marbleModel:String; var marbleModel:String;
} }
@ -93,6 +94,7 @@ class Settings {
oobInsults: true, oobInsults: true,
reflectiveMarble: true, reflectiveMarble: true,
marbleIndex: 0, marbleIndex: 0,
marbleCategoryIndex: 0,
marbleSkin: "base", marbleSkin: "base",
marbleModel: "data/shapes/balls/ball-superball.dts", marbleModel: "data/shapes/balls/ball-superball.dts",
vsync: #if js true #end vsync: #if js true #end
@ -187,6 +189,7 @@ class Settings {
marbleIndex: optionsSettings.marbleIndex, marbleIndex: optionsSettings.marbleIndex,
marbleSkin: optionsSettings.marbleSkin, marbleSkin: optionsSettings.marbleSkin,
marbleModel: optionsSettings.marbleModel, marbleModel: optionsSettings.marbleModel,
marbleCategoryIndex: optionsSettings.marbleCategoryIndex,
}; };
var scoreCount = 0; var scoreCount = 0;
var eggCount = 0; var eggCount = 0;
@ -296,6 +299,9 @@ class Settings {
optionsSettings.marbleSkin = "base"; optionsSettings.marbleSkin = "base";
optionsSettings.marbleModel = "data/shapes/balls/ball-superball.dts"; optionsSettings.marbleModel = "data/shapes/balls/ball-superball.dts";
} }
if (optionsSettings.marbleCategoryIndex == null) {
optionsSettings.marbleCategoryIndex = 0;
}
#end #end
highscoreName = json.highscoreName; highscoreName = json.highscoreName;
} else { } else {

View file

@ -331,7 +331,9 @@ class DtsFile {
matDetailScales = []; matDetailScales = [];
matReflectionAmounts = []; matReflectionAmounts = [];
for (i in 0...numMaterials) { for (i in 0...numMaterials) {
matNames.push(br.readStr()); var mname = br.readStr();
mname = StringTools.replace(mname, '\x00', '');
matNames.push(mname);
} }
for (i in 0...numMaterials) { for (i in 0...numMaterials) {
matFlags.push(br.readInt32()); matFlags.push(br.readInt32());

View file

@ -22,6 +22,7 @@ class MarbleSelectGui extends GuiImage {
this.extent = new Vector(493, 361); this.extent = new Vector(493, 361);
var marbleData = [ var marbleData = [
[
{name: "Staff's Original", dts: "data/shapes/balls/ball-superball.dts", skin: "base"}, {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: "3D Marble", dts: "data/shapes/balls/3dMarble.dts", skin: "base"},
{name: "Mid P", dts: "data/shapes/balls/midp.dts", skin: "base"}, {name: "Mid P", dts: "data/shapes/balls/midp.dts", skin: "base"},
@ -61,10 +62,57 @@ class MarbleSelectGui extends GuiImage {
{name: "Big Marble 3", dts: "data/shapes/balls/bm3.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 1", dts: "data/shapes/balls/sm1.dts", skin: "base"},
{name: "Small Marble 2", dts: "data/shapes/balls/sm2.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: "Small Marble 3", dts: "data/shapes/balls/sm3.dts", skin: "base"}
],
[
{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"}
],
]; ];
var categoryNames = ["Official Marbles", "MBUltra"];
var curSelection:Int = Settings.optionsSettings.marbleIndex; var curSelection:Int = Settings.optionsSettings.marbleIndex;
var curCategorySelection:Int = Settings.optionsSettings.marbleCategoryIndex;
function loadButtonImages(path:String) { function loadButtonImages(path:String) {
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
@ -88,15 +136,16 @@ class MarbleSelectGui extends GuiImage {
selectBtn.extent = new Vector(95, 45); selectBtn.extent = new Vector(95, 45);
selectBtn.pressedAction = (e) -> { selectBtn.pressedAction = (e) -> {
Settings.optionsSettings.marbleIndex = curSelection; Settings.optionsSettings.marbleIndex = curSelection;
Settings.optionsSettings.marbleSkin = marbleData[curSelection].skin; Settings.optionsSettings.marbleCategoryIndex = curCategorySelection;
Settings.optionsSettings.marbleModel = marbleData[curSelection].dts; Settings.optionsSettings.marbleSkin = marbleData[curCategorySelection][curSelection].skin;
Settings.optionsSettings.marbleModel = marbleData[curCategorySelection][curSelection].dts;
Settings.save(); Settings.save();
MarbleGame.canvas.popDialog(this); MarbleGame.canvas.popDialog(this);
} }
this.addChild(selectBtn); this.addChild(selectBtn);
var marbleShow = buildObjectShow(marbleData[curSelection].dts, new Vector(171, 97), new Vector(150, 150), 2.6, 0, var marbleShow = buildObjectShow(marbleData[curCategorySelection][curSelection].dts, new Vector(171, 97), new Vector(150, 150), 2.6, 0,
["base.marble" => marbleData[curSelection].skin + ".marble"]); ["base.marble" => marbleData[curCategorySelection][curSelection].skin + ".marble"]);
marbleShow.horizSizing = Center; marbleShow.horizSizing = Center;
marbleShow.vertSizing = Bottom; marbleShow.vertSizing = Bottom;
marbleShow.visible = true; marbleShow.visible = true;
@ -109,7 +158,7 @@ class MarbleSelectGui extends GuiImage {
titleText.vertSizing = Bottom; titleText.vertSizing = Bottom;
titleText.position = new Vector(140, 67); titleText.position = new Vector(140, 67);
titleText.extent = new Vector(213, 27); titleText.extent = new Vector(213, 27);
titleText.text.text = '<p align="center">Official Marbles</p>'; titleText.text.text = '<p align="center">${categoryNames[curCategorySelection]}</p>';
this.addChild(titleText); this.addChild(titleText);
var marbleText = new GuiMLText(markerFelt24, null); var marbleText = new GuiMLText(markerFelt24, null);
@ -119,7 +168,7 @@ class MarbleSelectGui extends GuiImage {
marbleText.vertSizing = Bottom; marbleText.vertSizing = Bottom;
marbleText.position = new Vector(86, 243); marbleText.position = new Vector(86, 243);
marbleText.extent = new Vector(320, 22); marbleText.extent = new Vector(320, 22);
marbleText.text.text = '<p align="center">${marbleData[curSelection].name}</p>'; marbleText.text.text = '<p align="center">${marbleData[curCategorySelection][curSelection].name}</p>';
this.addChild(marbleText); this.addChild(marbleText);
var changeMarbleText = new GuiImage(ResourceLoader.getResource("data/ui/play/change_marble_text.png", ResourceLoader.getImage, this.imageResources) var changeMarbleText = new GuiImage(ResourceLoader.getResource("data/ui/play/change_marble_text.png", ResourceLoader.getImage, this.imageResources)
@ -129,14 +178,21 @@ class MarbleSelectGui extends GuiImage {
changeMarbleText.extent = new Vector(300, 39); changeMarbleText.extent = new Vector(300, 39);
this.addChild(changeMarbleText); this.addChild(changeMarbleText);
function setMarbleSelection(idx:Int) { function setMarbleSelection(idx:Int, categoryIdx:Int) {
if (idx < 0) if (categoryIdx < 0)
idx = marbleData.length + idx; categoryIdx = marbleData.length + categoryIdx;
if (idx >= marbleData.length) if (categoryIdx >= marbleData.length)
idx -= marbleData.length; categoryIdx -= marbleData.length;
curSelection = idx;
var marble = marbleData[idx];
if (idx < 0)
idx = marbleData[categoryIdx].length + idx;
if (idx >= marbleData[categoryIdx].length)
idx -= marbleData[categoryIdx].length;
curSelection = idx;
curCategorySelection = categoryIdx;
var marble = marbleData[categoryIdx][idx];
titleText.text.text = '<p align="center">${categoryNames[curCategorySelection]}</p>';
marbleText.text.text = '<p align="center">${marble.name}</p>'; marbleText.text.text = '<p align="center">${marble.name}</p>';
var dtsObj = new DtsObject(); var dtsObj = new DtsObject();
@ -182,7 +238,7 @@ class MarbleSelectGui extends GuiImage {
nextBtn.position = new Vector(296, 270); nextBtn.position = new Vector(296, 270);
nextBtn.extent = new Vector(75, 45); nextBtn.extent = new Vector(75, 45);
nextBtn.pressedAction = (e) -> { nextBtn.pressedAction = (e) -> {
setMarbleSelection(curSelection + 1); setMarbleSelection(curSelection + 1, curCategorySelection);
} }
this.addChild(nextBtn); this.addChild(nextBtn);
@ -190,9 +246,26 @@ class MarbleSelectGui extends GuiImage {
prevBtn.position = new Vector(123, 270); prevBtn.position = new Vector(123, 270);
prevBtn.extent = new Vector(75, 45); prevBtn.extent = new Vector(75, 45);
prevBtn.pressedAction = (e) -> { prevBtn.pressedAction = (e) -> {
setMarbleSelection(curSelection - 1); setMarbleSelection(curSelection - 1, curCategorySelection);
} }
setMarbleSelection(curSelection);
var nextCategoryBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/nextcat"));
nextCategoryBtn.position = new Vector(371, 270);
nextCategoryBtn.extent = new Vector(85, 45);
nextCategoryBtn.pressedAction = (e) -> {
setMarbleSelection(0, curCategorySelection + 1);
}
this.addChild(nextCategoryBtn);
var prevCategoryBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/prevcat"));
prevCategoryBtn.position = new Vector(37, 270);
prevCategoryBtn.extent = new Vector(85, 45);
prevCategoryBtn.pressedAction = (e) -> {
setMarbleSelection(0, curCategorySelection - 1);
}
this.addChild(prevCategoryBtn);
setMarbleSelection(curSelection, curCategorySelection);
this.addChild(prevBtn); this.addChild(prevBtn);
} }

View file

@ -5,6 +5,7 @@ import h3d.Vector;
import h3d.scene.Scene; import h3d.scene.Scene;
import h3d.Engine; import h3d.Engine;
import h3d.Camera; import h3d.Camera;
import src.MarbleGame;
import h3d.mat.Texture; import h3d.mat.Texture;
class CubemapRenderer { class CubemapRenderer {
@ -20,6 +21,7 @@ class CubemapRenderer {
this.scene = scene; this.scene = scene;
this.sky = sky; this.sky = sky;
this.cubemap = new Texture(128, 128, [Cube, Dynamic, Target], h3d.mat.Data.TextureFormat.RGB8); this.cubemap = new Texture(128, 128, [Cube, Dynamic, Target], h3d.mat.Data.TextureFormat.RGB8);
this.cubemap.depthBuffer = new h3d.mat.DepthBuffer(128, 128, h3d.mat.DepthBuffer.DepthFormat.Depth24);
this.camera = new Camera(90, 1, 1, 0.02, scene.camera.zFar); this.camera = new Camera(90, 1, 1, 0.02, scene.camera.zFar);
this.position = new Vector(); this.position = new Vector();
this.nextFaceToRender = 0; this.nextFaceToRender = 0;
@ -54,4 +56,14 @@ class CubemapRenderer {
this.nextFaceToRender += renderedFaces; this.nextFaceToRender += renderedFaces;
this.nextFaceToRender %= 6; this.nextFaceToRender %= 6;
} }
public function getCameraFrustums() {
var frustums = [];
for (i in 0...6) {
this.camera.setCubeMap(i, position);
this.camera.update();
frustums.push(camera.frustum.clone());
}
return frustums;
}
} }