diff --git a/marblegame.hl b/marblegame.hl index c00f9a92..4f4f3d0b 100644 Binary files a/marblegame.hl and b/marblegame.hl differ diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx index ebc4e956..0a5ce142 100644 --- a/src/DifBuilder.hx +++ b/src/DifBuilder.hx @@ -40,6 +40,12 @@ class DifBuilderTriangle { public function new() {} } +typedef VertexBucket = { + var referenceNormal:Point3F; + var triangleIndices:Array; + var normals:Array; +} + class DifBuilder { static var materialDict = [ "friction_none" => { @@ -96,6 +102,8 @@ class DifBuilder { return tex.substring(slashpos, dotpos); } + var vertexBuckets = new Map>(); + for (i in 0...hulls.length) { var hullTris = []; var hull = hulls[i]; @@ -196,6 +204,33 @@ class DifBuilder { colliderSurface.indices.push(colliderSurface.indices.length); colliderSurface.indices.push(colliderSurface.indices.length); colliderSurface.indices.push(colliderSurface.indices.length); + + for (v in [p1, p2, p3]) { + var buckets = vertexBuckets.get(v); + if (buckets == null) { + buckets = []; + vertexBuckets.set(v, buckets); + } + + var bucket:VertexBucket = null; + for (j in 0...buckets.length) { + bucket = buckets[j]; + if (normal.dot(bucket.referenceNormal) > Math.cos(Math.PI / 12)) + break; + bucket = null; + } + if (bucket == null) { + bucket = { + referenceNormal: normal, + triangleIndices: [], + normals: [] + }; + buckets.push(bucket); + } + + bucket.triangleIndices.push(triangles.length - 1); + bucket.normals.push(normal); + } } colliderSurface.generateBoundingBox(); @@ -203,6 +238,28 @@ class DifBuilder { } } + for (vtex => buckets in vertexBuckets) { + for (i in 0...buckets.length) { + var bucket = buckets[i]; + var avgNormal = new Point3F(); + + for (normal in bucket.normals) + avgNormal = avgNormal.add(normal); + avgNormal = avgNormal.scalarDiv(bucket.normals.length); + + for (j in 0...bucket.triangleIndices.length) { + var index = bucket.triangleIndices[j]; + var tri = triangles[index]; + if (tri.p1 == vtex) + tri.normal1 = avgNormal; + if (tri.p2 == vtex) + tri.normal2 = avgNormal; + if (tri.p3 == vtex) + tri.normal3 = avgNormal; + } + } + } + var mats = new Map>(); for (index => value in triangles) { diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index f355ea6c..6ff4b469 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -38,6 +38,8 @@ class MarbleGame { js.Browser.document.addEventListener('pointerlockchange', () -> { if (!paused && world != null) { if (world.finishTime == null && world._ready) { + trace(js.Browser.document.pointerLockElement); + trace(@:privateAccess Window.getInstance().canvas); if (js.Browser.document.pointerLockElement != @:privateAccess Window.getInstance().canvas) { paused = true; handlePauseGame(); @@ -102,7 +104,7 @@ class MarbleGame { }, (sender) -> { canvas.popDialog(exitGameDlg); world.restart(); - world.setCursorLock(true); + // world.setCursorLock(true); paused = !paused; }); canvas.pushDialog(exitGameDlg);