diff --git a/data/tmp/cache.dat b/data/tmp/cache.dat index 089f899a..480678ae 100644 --- a/data/tmp/cache.dat +++ b/data/tmp/cache.dat @@ -1 +1 @@ -by17:font%2FExpo50.fntaoy3:veri1y4:timei1625241820y4:hashy40:f2bb3df897a1cbe1bc70650168d9ecf7de1195f1y3:outy24:tmp%2Ffont%2FExpo50.bfntghy17:font%2FExpo32.fntaoR1i1R2i1625241820R3y40:d3397b6efedac7bfa90be848901a0167dfd32e7eR5y24:tmp%2Ffont%2FExpo32.bfntghy24:font%2FDomCasual32px.fntaoR1i1R2i1625241820R3y40:f9ae7ff4e7b94f78bd6a050e51a9f92fbfdbb40cR5y31:tmp%2Ffont%2FDomCasual32px.bfntghy24:font%2FDomCasual24px.fntaoR1i1R2i1625241820R3y40:f5f86d351ba84a7e1a5f1a459463a4eaf66ca893R5y31:tmp%2Ffont%2FDomCasual24px.bfntghy24:font%2FArialBold14px.fntaoR1i1R2i1625241820R3y40:4f58a547a119d447806129c12b660d267212a382R5y31:tmp%2Ffont%2FArialBold14px.bfntghy18:font%2FArial14.fntaoR1i1R2i1625241820R3y40:5433840b11f487315b7372dd95a79eda5986d558R5y25:tmp%2Ffont%2FArial14.bfntghh \ No newline at end of file +by17:font%2FExpo50.fntaoy3:veri1y4:timei1626163037y4:hashy40:f2bb3df897a1cbe1bc70650168d9ecf7de1195f1y3:outy24:tmp%2Ffont%2FExpo50.bfntghy17:font%2FExpo32.fntaoR1i1R2i1626163037R3y40:d3397b6efedac7bfa90be848901a0167dfd32e7eR5y24:tmp%2Ffont%2FExpo32.bfntghy24:font%2FDomCasual32px.fntaoR1i1R2i1626163037R3y40:f9ae7ff4e7b94f78bd6a050e51a9f92fbfdbb40cR5y31:tmp%2Ffont%2FDomCasual32px.bfntghy24:font%2FDomCasual24px.fntaoR1i1R2i1626163037R3y40:f5f86d351ba84a7e1a5f1a459463a4eaf66ca893R5y31:tmp%2Ffont%2FDomCasual24px.bfntghy24:font%2FArialBold14px.fntaoR1i1R2i1626163037R3y40:4f58a547a119d447806129c12b660d267212a382R5y31:tmp%2Ffont%2FArialBold14px.bfntghy18:font%2FArial14.fntaoR1i1R2i1626163037R3y40:5433840b11f487315b7372dd95a79eda5986d558R5y25:tmp%2Ffont%2FArial14.bfntghh \ No newline at end of file diff --git a/marblegame.hl b/marblegame.hl index 1e03d26b..e5a00250 100644 Binary files a/marblegame.hl and b/marblegame.hl differ diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx index a3a6af47..ebc4e956 100644 --- a/src/DifBuilder.hx +++ b/src/DifBuilder.hx @@ -305,6 +305,7 @@ class DifBuilder { if (canFindTex(grp)) { texture = ResourceLoader.getFileEntry(tex(grp)).toImage().toTexture(); texture.wrap = Wrap.Repeat; + texture.mipMap = Nearest; material = h3d.mat.Material.create(texture); } else { material = Material.create(); diff --git a/src/Main.hx b/src/Main.hx index b76e2377..7aef833e 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -63,11 +63,6 @@ class Main extends hxd.App { static function main() { // h3d.mat.PbrMaterialSetup.set(); - #if hl - sdl.Sdl.setGLOptions(3, 2, 24, 8, 1, 2); - sdl.Sdl.setHint("SDL_HINT_RENDER_SCALE_QUALITY", "1"); - #end - h3d.Engine.ANTIALIASING = 4; new Main(); } } diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index b9f059d8..e6d4ea45 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -116,9 +116,11 @@ class MarbleGame { public function quitMission() { world.setCursorLock(false); paused = false; + var pmg = new PlayMissionGui(); + PlayMissionGui.currentSelectionStatic = world.mission.index; world.dispose(); world = null; - canvas.setContent(new PlayMissionGui()); + canvas.setContent(pmg); } public function playMission(mission:Mission) { diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index acba055f..f3196dcd 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -193,9 +193,7 @@ class MarbleWorld extends Scheduler { this.instanceManager = new InstanceManager(scene); this.particleManager = new ParticleManager(cast this); - // var renderer = cast(this.scene.renderer, h3d.scene.pbr.Renderer); - - // renderer.skyMode = Hide; + var renderer = cast(this.scene.renderer, h3d.scene.fwd.Renderer); for (element in mission.root.elements) { if (element._type != MissionElementType.Sun) @@ -975,7 +973,9 @@ class MarbleWorld extends Scheduler { var egg:EndGameGui = null; egg = new EndGameGui((sender) -> { this.dispose(); - MarbleGame.canvas.setContent(new PlayMissionGui()); + var pmg = new PlayMissionGui(); + PlayMissionGui.currentSelectionStatic = mission.index + 1; + MarbleGame.canvas.setContent(pmg); }, (sender) -> { MarbleGame.canvas.popDialog(egg); this.setCursorLock(true); diff --git a/src/ResourceLoader.hx b/src/ResourceLoader.hx index 21cc34f3..d7ad2d09 100644 --- a/src/ResourceLoader.hx +++ b/src/ResourceLoader.hx @@ -97,7 +97,13 @@ class ResourceLoader { if (textureCache.exists(path)) return textureCache.get(path); if (fileSystem.exists(path)) { - var tex = loader.load(path).toTexture(); + var img = loader.load(path).toImage(); + Image.setupTextureFlags = (texObj) -> { + texObj.flags.set(MipMapped); + } + var tex = img.toTexture(); + tex.mipMap = Nearest; + // tex.filter = Nearest; textureCache.set(path, tex); return tex; diff --git a/src/collision/Collision.hx b/src/collision/Collision.hx index ddab67a7..ae58394d 100644 --- a/src/collision/Collision.hx +++ b/src/collision/Collision.hx @@ -64,11 +64,10 @@ class Collision { normal: null }; - var pnorm = v1.sub(v0).cross(v2.sub(v0)).normalized(); - var d = -v0.dot(normal); + var pnorm = normal.clone(); + var d = -v0.dot(pnorm); - var p = PlaneF.PointNormal(new Point3F(v0.x, v0.y, v0.z), new Point3F(normal.x, normal.y, normal.z)); - var pdist = p.distance(new Point3F(center.x, center.y, center.z)); + var pdist = center.dot(pnorm) + d; if (pdist < 0.001) { return res; // Dont collide internal edges diff --git a/src/collision/CollisionEntity.hx b/src/collision/CollisionEntity.hx index 47b97937..f274b52d 100644 --- a/src/collision/CollisionEntity.hx +++ b/src/collision/CollisionEntity.hx @@ -130,17 +130,13 @@ class CollisionEntity implements IOctreeObject { var closest = res.point; // var closest = Collision.ClosestPtPointTriangle(position, radius, v0, v, v2, surfacenormal); if (closest != null) { - if (position.sub(closest).lengthSq() <= radius * radius) { + var contactDist = closest.distanceSq(position); + if (contactDist <= radius * radius) { var normal = res.normal; if (position.sub(closest).dot(surfacenormal) > 0) { normal.normalize(); - var supportVec = surface.support(normal, tform); - if (!(supportVec.equals(v0) || supportVec.equals(v) || supportVec.equals(v2))) { - // normal = surfacenormal; - } - // We find the normal that is closest to the surface normal, sort of fixes weird edge cases of when colliding with var testDot = normal.dot(surfacenormal); if (testDot > bestDot) { @@ -151,7 +147,7 @@ class CollisionEntity implements IOctreeObject { cinfo.point = closest; // cinfo.collider = this; cinfo.velocity = this.velocity.clone(); - cinfo.contactDistance = closest.distance(position); + cinfo.contactDistance = Math.sqrt(contactDist); cinfo.otherObject = this.go; // cinfo.penetration = radius - (position.sub(closest).dot(normal)); cinfo.restitution = surface.restitution; diff --git a/src/gui/OptionsDlg.hx b/src/gui/OptionsDlg.hx index 903bf700..5b8a8c93 100644 --- a/src/gui/OptionsDlg.hx +++ b/src/gui/OptionsDlg.hx @@ -1,5 +1,6 @@ package gui; +import gui.GuiControl.MouseState; import src.AudioManager; import hxd.Key; import src.Settings; @@ -12,6 +13,8 @@ import src.ResourceLoader; import src.Util; class OptionsDlg extends GuiImage { + var musicSliderFunc:(dt:Float, mouseState:MouseState) -> Void; + public function new() { super(ResourceLoader.getImage("data/ui/background.jpg").toTile()); this.horizSizing = Width; @@ -297,6 +300,21 @@ class OptionsDlg extends GuiImage { } audioPane.addChild(audSndKnob); + musicSliderFunc = (dt:Float, mouseState:MouseState) -> { + if (mouseState.button == Key.MOUSE_LEFT) { + var musRect = audMusKnob.getRenderRectangle(); + if (musRect.inRect(mouseState.position)) { + Settings.optionsSettings.musicVolume = audMusKnob.sliderValue; + AudioManager.updateVolumes(); + } + var sndRect = audSndKnob.getRenderRectangle(); + if (sndRect.inRect(mouseState.position)) { + Settings.optionsSettings.soundVolume = audSndKnob.sliderValue; + AudioManager.updateVolumes(); + } + } + } + var audTxtWndo = new GuiImage(ResourceLoader.getImage("data/ui/options/aud_txt_wndo.png").toTile()); audTxtWndo.position = new Vector(26, 130); audTxtWndo.extent = new Vector(396, 132); @@ -662,4 +680,10 @@ Extensions: EAX 2.0, EAX 3.0, EAX Unified, and EAX-AC3"; this.render(MarbleGame.canvas.scene2d); } } + + public override function update(dt:Float, mouseState:MouseState) { + super.update(dt, mouseState); + if (musicSliderFunc != null) + musicSliderFunc(dt, mouseState); + } } diff --git a/src/gui/PlayMissionGui.hx b/src/gui/PlayMissionGui.hx index 185bbdb9..0593d1ad 100644 --- a/src/gui/PlayMissionGui.hx +++ b/src/gui/PlayMissionGui.hx @@ -21,17 +21,30 @@ import h3d.Vector; import src.Util; class PlayMissionGui extends GuiImage { + static var currentSelectionStatic:Int = -1; + static var currentCategoryStatic:String = "beginner"; + var currentSelection:Int = 0; var currentCategory:String = "beginner"; var currentList:Array; var setSelectedFunc:Int->Void; + var setCategoryFunc:(String, ?Bool) -> Void; var buttonHoldFunc:(dt:Float, mouseState:MouseState) -> Void; var buttonCooldown:Float = 0.5; var maxButtonCooldown:Float = 0.5; public function new() { + MissionList.buildMissionList(); + + if (currentSelectionStatic == -1) + currentSelectionStatic = cast Math.min(MissionList.beginnerMissions.length - 1, + Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)]); + + currentSelection = PlayMissionGui.currentSelectionStatic; + currentCategory = PlayMissionGui.currentCategoryStatic; + super(ResourceLoader.getImage("data/ui/background.jpg").toTile()); this.horizSizing = Width; @@ -39,8 +52,6 @@ class PlayMissionGui extends GuiImage { this.extent = new Vector(640, 480); this.position = new Vector(0, 0); - MissionList.buildMissionList(); - var localContainer = new GuiControl(); localContainer.horizSizing = Center; localContainer.vertSizing = Center; @@ -56,15 +67,12 @@ class PlayMissionGui extends GuiImage { return [normal, hover, pressed, disabled]; } - var setCategoryFunc:String->Void = null; - var tabAdvanced = new GuiImage(ResourceLoader.getImage("data/ui/play/tab_adv.png").toTile()); tabAdvanced.position = new Vector(410, 21); tabAdvanced.extent = new Vector(166, 43); tabAdvanced.pressedAction = (sender) -> { currentList = MissionList.advancedMissions; currentCategory = "advanced"; - setSelectedFunc(cast Math.min(Settings.progression[2], currentList.length - 1)); setCategoryFunc("advanced"); } localContainer.addChild(tabAdvanced); @@ -75,7 +83,6 @@ class PlayMissionGui extends GuiImage { tabIntermediate.pressedAction = (sender) -> { currentList = MissionList.intermediateMissions; currentCategory = "intermediate"; - setSelectedFunc(cast Math.min(Settings.progression[1], currentList.length - 1)); setCategoryFunc("intermediate"); } localContainer.addChild(tabIntermediate); @@ -86,7 +93,6 @@ class PlayMissionGui extends GuiImage { tabCustom.pressedAction = (sender) -> { currentList = MissionList.customMissions; currentCategory = "custom"; - setSelectedFunc(currentList.length - 1); setCategoryFunc("custom"); } localContainer.addChild(tabCustom); @@ -165,6 +171,8 @@ class PlayMissionGui extends GuiImage { // Wacky hacks currentList[currentSelection].index = currentSelection; currentList[currentSelection].difficultyIndex = ["beginner", "intermediate", "advanced"].indexOf(currentCategory); + currentSelectionStatic = currentSelection; + currentCategoryStatic = currentCategory; cast(this.parent, Canvas).marbleGame.playMission(currentList[currentSelection]); } pmBox.addChild(pmPlay); @@ -296,19 +304,21 @@ class PlayMissionGui extends GuiImage { currentList = MissionList.beginnerMissions; - setCategoryFunc = function(category:String) { + setCategoryFunc = function(category:String, ?doRender:Bool = true) { localContainer.removeChild(tabBeginner); localContainer.removeChild(tabIntermediate); localContainer.removeChild(tabAdvanced); localContainer.removeChild(tabCustom); localContainer.removeChild(pmBox); - AudioManager.playSound(ResourceLoader.getAudio("data/sound/buttonpress.wav")); + if (doRender) + AudioManager.playSound(ResourceLoader.getAudio("data/sound/buttonpress.wav")); if (category == "beginner") { localContainer.addChild(tabIntermediate); localContainer.addChild(tabAdvanced); localContainer.addChild(tabCustom); localContainer.addChild(pmBox); localContainer.addChild(tabBeginner); + currentList = MissionList.beginnerMissions; } if (category == "intermediate") { localContainer.addChild(tabBeginner); @@ -316,6 +326,7 @@ class PlayMissionGui extends GuiImage { localContainer.addChild(tabCustom); localContainer.addChild(pmBox); localContainer.addChild(tabIntermediate); + currentList = MissionList.intermediateMissions; } if (category == "advanced") { localContainer.addChild(tabBeginner); @@ -323,6 +334,7 @@ class PlayMissionGui extends GuiImage { localContainer.addChild(tabCustom); localContainer.addChild(pmBox); localContainer.addChild(tabAdvanced); + currentList = MissionList.advancedMissions; } if (category == "custom") { localContainer.addChild(tabBeginner); @@ -330,8 +342,16 @@ class PlayMissionGui extends GuiImage { localContainer.addChild(tabAdvanced); localContainer.addChild(pmBox); localContainer.addChild(tabCustom); + currentList = MissionList.customMissions; } - this.render(cast(this.parent, Canvas).scene2d); + currentCategoryStatic = currentCategory; + if (currentCategory != "custom") + setSelectedFunc(cast Math.min(currentList.length - 1, + Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)])); + else + setSelectedFunc(currentList.length - 1); + if (doRender) + this.render(cast(this.parent, Canvas).scene2d); } function splitTextWithPadding(textElement:Text, textStr:String) { @@ -371,6 +391,7 @@ class PlayMissionGui extends GuiImage { } currentSelection = index; + currentSelectionStatic = currentSelection; var currentMission = currentList[currentSelection]; @@ -447,15 +468,13 @@ class PlayMissionGui extends GuiImage { levelBkgnd.text.text = currentCategory.charAt(0).toUpperCase() + currentCategory.substr(1) + ' Level ${currentSelection + 1}'; levelFgnd.text.text = currentCategory.charAt(0).toUpperCase() + currentCategory.substr(1) + ' Level ${currentSelection + 1}'; } + + setCategoryFunc(currentCategoryStatic, false); } public override function render(scene2d:Scene) { super.render(scene2d); - if (currentCategory != "custom") - setSelectedFunc(cast Math.min(currentList.length - 1, Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)])); - else - setSelectedFunc(currentList.length - 1); - // setSelectedFunc(0); + setSelectedFunc(currentSelectionStatic); } public override function update(dt:Float, mouseState:MouseState) {