diff --git a/src/Marble.hx b/src/Marble.hx index 7c03b542..50e387be 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -366,7 +366,7 @@ class Marble extends GameObject { if (Settings.optionsSettings.reflectionDetail > 0) { var csky = level != null ? level.sky : (@:privateAccess MarbleGame.instance.previewWorld.sky); - this.cubemapRenderer = new CubemapRenderer(MarbleGame.instance.scene, csky, !this.controllable); + this.cubemapRenderer = new CubemapRenderer(MarbleGame.instance.scene, csky, !this.controllable && level != null); if (Settings.optionsSettings.marbleShader == null || Settings.optionsSettings.marbleShader == "Default" @@ -545,8 +545,8 @@ class Marble extends GameObject { public function getMarbleAxis() { var motiondir = new Vector(0, -1, 0); - if (level.isReplayingMovement) - return level.currentInputMoves[1].marbleAxes; + // if (level.isReplayingMovement) + // return level.currentInputMoves[1].marbleAxes; if (this.controllable && !this.isNetUpdate) { motiondir.transform(Matrix.R(0, 0, camera.CameraYaw)); motiondir.transform(level.newOrientationQuat.toMatrix()); @@ -642,8 +642,8 @@ class Marble extends GameObject { var R = currentGravityDir.multiply(-this._radius); var rollVelocity = this.omega.cross(R); var axes = this.getMarbleAxis(); - if (!level.isReplayingMovement) - level.inputRecorder.recordAxis(axes); + // if (!level.isReplayingMovement) + // level.inputRecorder.recordAxis(axes); var sideDir = axes[0]; var motionDir = axes[1]; var upDir = axes[2]; @@ -923,7 +923,7 @@ class Marble extends GameObject { } function bounceEmitter(speed:Float, normal:Vector) { - if (!this.controllable || level.isReplayingMovement || this.isNetUpdate) + if (!this.controllable || this.isNetUpdate) return; if (this.bounceEmitDelay == 0 && this._minBounceSpeed <= speed) { this.level.particleManager.createEmitter(bounceParticleOptions, this.bounceEmitterData, @@ -958,7 +958,7 @@ class Marble extends GameObject { } function playBoundSound(time:Float, contactVel:Float) { - if (level.isReplayingMovement || this.isNetUpdate) + if (this.isNetUpdate) return; if (minVelocityBounceSoft <= contactVel) { var hardBounceSpeed = minVelocityBounceHard; @@ -990,8 +990,8 @@ class Marble extends GameObject { } function updateRollSound(time:TimeState, contactPct:Float, slipAmount:Float) { - if (level.isReplayingMovement) - return; + // if (level.isReplayingMovement) + // return; var rSpat = rollSound.getEffect(Spatialization); rSpat.position = this.collider.transform.getPosition(); @@ -1656,7 +1656,7 @@ class Marble extends GameObject { newPos = this.collider.transform.getPosition(); - if (this.prevPos != null) { + if (this.prevPos != null && this.level != null) { var tempTimeState = timeState.clone(); tempTimeState.currentAttemptTime = passedTime; this.level.callCollisionHandlers(cast this, tempTimeState, oldPos, newPos); @@ -1918,8 +1918,8 @@ class Marble extends GameObject { move = recordMove(); } - if (level.isReplayingMovement) - move = level.currentInputMoves[1].move; + // if (level.isReplayingMovement) + // move = level.currentInputMoves[1].move; if (this.controllable && this.level.isWatching) { move = new Move(); @@ -1934,7 +1934,7 @@ class Marble extends GameObject { this.level.replay.recordMarbleInput(move.d.x, move.d.y); } } - if (!this.controllable && this.connection != null) { + if (!this.controllable && (this.connection != null || this.level == null)) { move = new Move(); move.d = new Vector(0, 0); } @@ -2226,6 +2226,8 @@ class Marble extends GameObject { } inline function isHelicopterEnabled(timeState:TimeState) { + if (this.level == null) + return false; if (!this.level.isMultiplayer) { return timeState.currentAttemptTime - this.helicopterEnableTime < 5; } else { @@ -2238,6 +2240,8 @@ class Marble extends GameObject { } inline function isMegaMarbleEnabled(timeState:TimeState) { + if (this.level == null) + return false; if (!this.level.isMultiplayer) { return timeState.currentAttemptTime - this.megaMarbleEnableTime < 10; } else { diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index 72cddcca..f1d2821b 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -1,5 +1,6 @@ package src; +import net.Net; import gui.LevelSelectGui; import gui.MainMenuGui; #if !js @@ -189,7 +190,7 @@ class MarbleGame { if (Util.isTouchDevice()) { touchInput.update(); } - if (!paused) { + if (!paused || world.isMultiplayer) { world.update(dt * Debug.timeScale); } if (((Key.isPressed(Key.ESCAPE) #if js && paused #end) || Gamepad.isPressed(["start"])) diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 53965429..eccb4f7f 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1096,7 +1096,7 @@ class MarbleWorld extends Scheduler { if (ourMoveStruct != null) { var otherPred = predictions.retrieveState(clientMarbles[Net.clientIdMap[client]], ourMoveStruct.timeState.ticks); if (otherPred != null) { - if (otherPred.getError(lastMove) > 0.001) { + if (otherPred.getError(lastMove) > 0.1) { Debug.drawSphere(@:privateAccess clientMarbles[Net.clientIdMap[client]].newPos, 0.2, 0.5); // trace('Prediction error: ${otherPred.getError(lastMove)}'); trace('Desync for tick ${ourMoveStruct.timeState.ticks}'); @@ -1129,7 +1129,7 @@ class MarbleWorld extends Scheduler { if (ourMoveStruct != null) { var ourPred = predictions.retrieveState(marble, ourMoveStruct.timeState.ticks); if (ourPred != null) { - if (ourPred.getError(ourMove) > 0.001) { + if (ourPred.getError(ourMove) > 0.1) { trace('Desync for tick ${ourMoveStruct.timeState.ticks}'); marble.unpackUpdate(ourMove); needsPrediction |= 1 << Net.clientId; @@ -1200,11 +1200,11 @@ class MarbleWorld extends Scheduler { var m = arr.packets[0]; // if (m.serverTicks == ourLastMoveTime) { var marbleToUpdate = clientMarbles[Net.clientIdMap[client]]; - Debug.drawSphere(@:privateAccess marbleToUpdate.newPos, marbleToUpdate._radius); + // Debug.drawSphere(@:privateAccess marbleToUpdate.newPos, marbleToUpdate._radius); var distFromUs = @:privateAccess marbleToUpdate.newPos.distance(this.marble.newPos); // if (distFromUs < 5) - m.calculationTicks = ourQueuedMoves.length; // ourQueuedMoves.length; + m.calculationTicks = ourQueuedMoves.length; // else // m.calculationTicks = Std.int(Math.max(1, ourQueuedMoves.length - (distFromUs - 5) / 3)); // - Std.int((@:privateAccess Net.clientConnection.moveManager.ackRTT - ourLastMove.moveQueueSize) / 2); @@ -1220,7 +1220,7 @@ class MarbleWorld extends Scheduler { for (move in ourQueuedMoves) { var m = move.move; - // Debug.drawSphere(@:privateAccess this.marble.newPos, this.marble._radius); + Debug.drawSphere(@:privateAccess this.marble.newPos, this.marble._radius); if (marbleNeedsPrediction & (1 << Net.clientId) > 0) { @:privateAccess this.marble.moveMotionDir = move.motionDir; @:privateAccess this.marble.advancePhysics(advanceTimeState, m, this.collisionWorld, this.pathedInteriors); @@ -1231,7 +1231,7 @@ class MarbleWorld extends Scheduler { for (client => m in marblesToTick) { if (m.calculationTicks > 0) { var marbleToUpdate = clientMarbles[Net.clientIdMap[client]]; - // Debug.drawSphere(@:privateAccess marbleToUpdate.newPos, marbleToUpdate._radius); + Debug.drawSphere(@:privateAccess marbleToUpdate.newPos, marbleToUpdate._radius); var mv = m.move.move; @:privateAccess marbleToUpdate.isNetUpdate = true; @@ -1262,6 +1262,14 @@ class MarbleWorld extends Scheduler { } } + public function removePlayer(cc:ClientConnection) { + var otherMarble = this.clientMarbles[cc]; + this.predictions.removeMarbleFromPrediction(otherMarble); + this.scene.removeChild(otherMarble); + this.collisionWorld.removeMarbleEntity(otherMarble.collider); + otherMarble.dispose(); + } + public function rollback(t:Float) { var newT = timeState.currentAttemptTime - t; var rewindFrame = rewindManager.getNextRewindFrame(timeState.currentAttemptTime - t); @@ -1439,9 +1447,9 @@ class MarbleWorld extends Scheduler { obj.update(timeState); } - if (!isReplayingMovement) { - inputRecorder.recordInput(timeState.currentAttemptTime); - } + // if (!isReplayingMovement) { + // inputRecorder.recordInput(timeState.currentAttemptTime); + // } ProfilerUI.measure("updateMarbles"); if (this.isMultiplayer) { @@ -1535,9 +1543,9 @@ class MarbleWorld extends Scheduler { if (!this.rewinding && Settings.optionsSettings.rewindEnabled && !this.isMultiplayer) this.rewindManager.recordFrame(); - if (!this.isReplayingMovement) { - inputRecorder.recordMarble(); - } + // if (!this.isReplayingMovement) { + // inputRecorder.recordMarble(); + // } this.updateTexts(); } diff --git a/src/Renderer.hx b/src/Renderer.hx index a03bedeb..0d0d0472 100644 --- a/src/Renderer.hx +++ b/src/Renderer.hx @@ -28,6 +28,8 @@ class Renderer extends h3d.scene.Renderer { var growBufferTemps:Array; var copyPass:h3d.pass.Copy; var backBuffer:h3d.mat.Texture; + var tempCubemapBuffer:h3d.mat.Texture; + var tempCubemapIndex:Int; public static var dirtyBuffers:Bool = true; @@ -51,6 +53,11 @@ class Renderer extends h3d.scene.Renderer { return sfxBuffer; } + public function setCubemapBuffer(tex:h3d.mat.Texture, idx:Int) { + tempCubemapBuffer = tex; + tempCubemapIndex = idx; + } + inline function get_def() return defaultPass; @@ -93,7 +100,11 @@ class Renderer extends h3d.scene.Renderer { backBuffer = ctx.textures.allocTarget("backBuffer", cast ctx.engine.width / pixelRatio, cast ctx.engine.height / pixelRatio, false); backBuffer.depthBuffer = depthBuffer; } - ctx.engine.pushTarget(backBuffer); + if (tempCubemapBuffer != null) { + ctx.engine.pushTarget(tempCubemapBuffer, tempCubemapIndex); + } else { + ctx.engine.pushTarget(backBuffer); + } ctx.engine.clear(0, 1); if (has("shadow")) @@ -184,9 +195,13 @@ class Renderer extends h3d.scene.Renderer { ctx.engine.popTarget(); - copyPass.pass.blend(One, Zero); - copyPass.shader.texture = backBuffer; - copyPass.render(); + if (tempCubemapBuffer != null) { + tempCubemapBuffer = null; + } else { + copyPass.pass.blend(One, Zero); + copyPass.shader.texture = backBuffer; + copyPass.render(); + } // h3d.pass.Copy.run(backBuffers[0], backBuffers[1]); // renderPass(defaultPass, get("refract")); @@ -199,18 +214,25 @@ class Renderer extends h3d.scene.Renderer { function bloomPass(ctx:h3d.scene.RenderContext) { h3d.pass.Copy.run(glowBuffer, growBufferTemps[0]); - var offsets = [-7.5, -6.25, -5, -3.75, -2.5, -1.25, 0, 1.25, 2.5, 3.75, 5, 6.25, 7.5]; - var divisors = [0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 1.0, 0.7, 0.5, 0.5, 0.4, 0.3, 0.1]; + static var offsets = [-7.5, -6.25, -5, -3.75, -2.5, -1.25, 0, 1.25, 2.5, 3.75, 5, 6.25, 7.5]; + static var divisors = [0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 1.0, 0.7, 0.5, 0.5, 0.4, 0.3, 0.1]; - var divisor = 0.0; - - var kernel = []; - for (i in 0...13) { - kernel.push(new Vector(offsets[i] / 320, 0, divisors[i])); - divisor += divisors[i]; + static var divisor = 0.0; + static var kernelX = []; + static var kernelY = []; + static var kernelComputed = false; + if (!kernelComputed) { + for (i in 0...13) { + kernelX.push(new Vector(offsets[i] / 320, 0, divisors[i])); + divisor += divisors[i]; + } + for (i in 0...13) { + kernelY.push(new Vector(0, offsets[i] / 320, divisors[i])); + } + kernelComputed = true; } - blurShader.shader.kernel = kernel; + blurShader.shader.kernel = kernelX; blurShader.shader.divisor = divisor; blurShader.shader.texture = growBufferTemps[0]; ctx.engine.pushTarget(growBufferTemps[1]); @@ -218,11 +240,7 @@ class Renderer extends h3d.scene.Renderer { blurShader.render(); ctx.engine.popTarget(); - for (i in 0...13) { - kernel[i].set(0, offsets[i] / 320, divisors[i]); - } - - blurShader.shader.kernel = kernel; + blurShader.shader.kernel = kernelY; blurShader.shader.divisor = divisor; blurShader.shader.texture = growBufferTemps[1]; ctx.engine.pushTarget(growBufferTemps[0]); diff --git a/src/net/MarblePredictionStore.hx b/src/net/MarblePredictionStore.hx index b56235ab..07407aaa 100644 --- a/src/net/MarblePredictionStore.hx +++ b/src/net/MarblePredictionStore.hx @@ -30,7 +30,7 @@ class MarblePrediction { if (p.netFlags != 0) subs += 1; // if (p.powerUpId != powerupItemId) - subs += 1; // temp + // subs += 1; // temp // if (isControl) // subs += Math.abs(blastAmount - p.blastAmount); return subs; @@ -78,4 +78,8 @@ class MarblePredictionStore { arr.pop(); } } + + public function removeMarbleFromPrediction(marble:Marble) { + this.predictions.remove(marble); + } } diff --git a/src/net/MasterServerClient.hx b/src/net/MasterServerClient.hx index 061440da..f7d8c89c 100644 --- a/src/net/MasterServerClient.hx +++ b/src/net/MasterServerClient.hx @@ -6,6 +6,7 @@ import haxe.Json; import net.Net.ServerInfo; import hx.ws.WebSocket; import src.Console; +import hx.ws.Types.MessageType; typedef RemoteServerInfo = { name:String, @@ -15,7 +16,7 @@ typedef RemoteServerInfo = { } class MasterServerClient { - static var serverIp = "ws://localhost:8080"; + static var serverIp = "ws://89.58.58.191:8080"; public static var instance:MasterServerClient; var ws:WebSocket; diff --git a/src/shaders/CubemapRenderer.hx b/src/shaders/CubemapRenderer.hx index 8e131b2a..61996d4b 100644 --- a/src/shaders/CubemapRenderer.hx +++ b/src/shaders/CubemapRenderer.hx @@ -26,7 +26,7 @@ class CubemapRenderer { if (useSky) this.cubemap = sky.cubemap; else { - 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.RGBA); this.cubemap.depthBuffer = new h3d.mat.DepthBuffer(128, 128, h3d.mat.DepthBuffer.DepthFormat.Depth24); } this.camera = new Camera(90, 1, 1, 0.1, 1000); @@ -46,11 +46,13 @@ class CubemapRenderer { if (Settings.optionsSettings.reflectionDetail >= 4) Renderer.dirtyBuffers = true; - e.pushTarget(cubemap, index); + // e.pushTarget(cubemap, index); + var ourRenderer = cast(scene.renderer, Renderer); + ourRenderer.setCubemapBuffer(cubemap, index); this.camera.setCubeMap(index, position); - e.clear(0, 1); + // e.clear(0, 1); scene.render(e); - e.popTarget(); + // e.popTarget(); renderedFaces++; var time = haxe.Timer.stamp();