faster block tiling hash

This commit is contained in:
minjaesong
2025-10-13 20:08:22 +09:00
parent 99bd56317d
commit 767aa09a17
3 changed files with 54 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
package net.torvald.terrarum package net.torvald.terrarum
import net.torvald.random.XXHash32 import net.torvald.random.XXHash32
import net.torvald.terrarum.gameworld.fmod
import org.dyn4j.geometry.Vector2 import org.dyn4j.geometry.Vector2
/** /**
@@ -118,7 +119,7 @@ class Point2i() {
return this return this
} }
override fun hashCode(): Int = XXHash32.hashGeoCoord(x, y) override fun hashCode(): Int = getHashCoord(x, y)
override fun equals(other: Any?) = if (other is Point2i) override fun equals(other: Any?) = if (other is Point2i)
this.x == other.x && this.y == other.y this.x == other.x && this.y == other.y
else else
@@ -130,4 +131,20 @@ class Point2i() {
operator fun component2() = y operator fun component2() = y
fun toVector() = Vector2(this.x.toDouble(), this.y.toDouble()) fun toVector() = Vector2(this.x.toDouble(), this.y.toDouble())
companion object {
private fun tavGrainSynthesisRNG(frame: Int, band: Int, x: Int, y: Int): Int {
var hash = frame * 0x9e3779b9.toInt() xor band * 0x7f4a7c15 xor (y shl 16) xor x
hash = hash xor (hash shr 16)
hash = hash * 0x7feb352d
hash = hash xor (hash shr 15)
hash = hash * 0x846ca68b.toInt()
hash = hash xor (hash shr 16)
return hash
}
private fun getHashCoord(x: Int, y: Int): Int {
return tavGrainSynthesisRNG(31, 65003, x, y)
}
}
} }

View File

@@ -59,14 +59,14 @@ class BlockProp : TaggedProp {
fun getLumCol(x: Int, y: Int) = if (dynamicLuminosityFunction == 0) { fun getLumCol(x: Int, y: Int) = if (dynamicLuminosityFunction == 0) {
baseLumCol baseLumCol
} else { } else {
val offset = XXHash32.hashGeoCoord(x, y).fmod(BlockCodex.DYNAMIC_RANDOM_CASES) val offset = getHashCoord(x, y, BlockCodex.DYNAMIC_RANDOM_CASES)
BlockCodex[BlockCodex.tileToVirtual[id]!![offset]]._lumCol BlockCodex[BlockCodex.tileToVirtual[id]!![offset]]._lumCol
} }
fun getLumCol(x: Int, y: Int, channel: Int): Float = if (dynamicLuminosityFunction == 0) { fun getLumCol(x: Int, y: Int, channel: Int): Float = if (dynamicLuminosityFunction == 0) {
baseLumCol.lane(channel) baseLumCol.lane(channel)
} else { } else {
val offset = XXHash32.hashGeoCoord(x, y).fmod(BlockCodex.DYNAMIC_RANDOM_CASES) val offset = getHashCoord(x, y, BlockCodex.DYNAMIC_RANDOM_CASES)
BlockCodex[BlockCodex.tileToVirtual[id]!![offset]]._lumCol.lane(channel) BlockCodex[BlockCodex.tileToVirtual[id]!![offset]]._lumCol.lane(channel)
} }
@@ -112,4 +112,20 @@ class BlockProp : TaggedProp {
val isSolidForTileCnx: Boolean val isSolidForTileCnx: Boolean
get() = if (tags.contains("DORENDER") || !isActorBlock) isSolid else false get() = if (tags.contains("DORENDER") || !isActorBlock) isSolid else false
companion object {
private fun tavGrainSynthesisRNG(frame: Int, band: Int, x: Int, y: Int): Int {
var hash = frame * 0x9e3779b9.toInt() xor band * 0x7f4a7c15 xor (y shl 16) xor x
hash = hash xor (hash shr 16)
hash = hash * 0x7feb352d
hash = hash xor (hash shr 15)
hash = hash * 0x846ca68b.toInt()
hash = hash xor (hash shr 16)
return hash
}
private fun getHashCoord(x: Int, y: Int, mod: Int): Int {
return tavGrainSynthesisRNG(31, 65003, x, y) fmod mod
}
}
} }

View File

@@ -8,7 +8,6 @@ import com.badlogic.gdx.graphics.glutils.FrameBuffer
import com.badlogic.gdx.math.Matrix4 import com.badlogic.gdx.math.Matrix4
import com.jme3.math.FastMath import com.jme3.math.FastMath
import net.torvald.gdx.graphics.Cvec import net.torvald.gdx.graphics.Cvec
import net.torvald.random.XXHash64
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.App.measureDebugTime import net.torvald.terrarum.App.measureDebugTime
import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.App.printdbg
@@ -21,8 +20,6 @@ import net.torvald.terrarum.gameworld.FLUID_MIN_MASS
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.gameworld.fmod
import net.torvald.terrarum.modulebasegame.worldgenerator.shake import net.torvald.terrarum.modulebasegame.worldgenerator.shake
import net.torvald.terrarum.realestate.LandUtil
import net.torvald.terrarum.serialise.toBig64
import net.torvald.terrarum.worlddrawer.CreateTileAtlas.Companion.WALL_OVERLAY_COLOUR import net.torvald.terrarum.worlddrawer.CreateTileAtlas.Companion.WALL_OVERLAY_COLOUR
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import net.torvald.unsafe.UnsafeLong2D import net.torvald.unsafe.UnsafeLong2D
@@ -410,13 +407,28 @@ internal object BlocksDrawer {
} }
private fun tavGrainSynthesisRNG(frame: Int, band: Int, x: Int, y: Int): Int {
var hash = frame * 0x9e3779b9.toInt() xor band * 0x7f4a7c15 xor (y shl 16) xor x
hash = hash xor (hash shr 16)
hash = hash * 0x7feb352d
hash = hash xor (hash shr 15)
hash = hash * 0x846ca68b.toInt()
hash = hash xor (hash shr 16)
return hash
}
private fun getHashCoord(x: Int, y: Int, mod: Long, layer: Int, tileNumber: Int): Int {
private fun getHashCoord(x: Int, y: Int, mod: Int, layer: Int, tileNumber: Int): Int {
val (x, y) = world.coerceXY(x, y) val (x, y) = world.coerceXY(x, y)
return (XXHash64.hash( /*return (XXHash64.hash(
LandUtil.getBlockAddr(world, x, y).toBig64(), LandUtil.getBlockAddr(world, x, y).toBig64(),
world.generatorSeed shake tileNumber.toLong() shake layer.toLong() world.generatorSeed shake tileNumber.toLong() shake layer.toLong()
) fmod mod).toInt() ) fmod mod).toInt()*/
return tavGrainSynthesisRNG(
world.worldIndex.leastSignificantBits.toInt(),
(world.generatorSeed shake tileNumber.toLong() shake layer.toLong()).toInt(),
x, y
) fmod mod
} }
private var for_y_start = 0 private var for_y_start = 0