confirmation that some tricks would not work

This commit is contained in:
minjaesong
2021-08-14 17:02:54 +09:00
parent 168e4f08b5
commit 3d5bb55514
3 changed files with 46 additions and 18 deletions

View File

@@ -76,6 +76,27 @@ internal class UnsafeCvecArray(val width: Int, val height: Int) {
setA(x, y, getA(x, y) * scalar) setA(x, y, getA(x, y) * scalar)
} }
fun mulAndAssign(x: Int, y: Int, scalar: Float) {
val addr = toAddr(x, y)
for (k in 0..3) {
array.setFloat(addr + 4*k, (array.getFloat(addr + 4*k) * scalar))
}
}
fun forAllMulAssign(scalar: Float) {
for (i in 0 until TOTAL_SIZE_IN_BYTES step 4) {
array.setFloat(i, array.getFloat(i) * scalar)
}
}
fun forAllMulAssign(vector: Cvec) {
for (i in 0 until TOTAL_SIZE_IN_BYTES step 16) {
for (k in 0 until 4) {
array.setFloat(i + 4*k, array.getFloat(i + 4*k) * vector.getElem(k))
}
}
}
fun destroy() = this.array.destroy() fun destroy() = this.array.destroy()
} }

View File

@@ -120,7 +120,7 @@ object BlockCodex {
} }
}*/ }*/
operator fun get(blockID: ItemID?): BlockProp { operator fun get(blockID: ItemID?): BlockProp {
if (blockID == null || blockID == "basegame:"+Block.NULL) { if (blockID == null || blockID == Block.NULL) {
return nullProp return nullProp
} }
@@ -136,7 +136,7 @@ object BlockCodex {
// TODO fluid from other mods // TODO fluid from other mods
if (fluidType == null || fluidType.value == 0) { if (fluidType == null || fluidType.value == 0) {
return blockProps["basegame:"+Block.AIR]!! return blockProps[Block.AIR]!!
} }
try { try {

View File

@@ -10,9 +10,11 @@ import net.torvald.terrarum.AppLoader.printdbg
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.BlockCodex
import net.torvald.terrarum.blockproperties.BlockProp
import net.torvald.terrarum.blockproperties.Fluid import net.torvald.terrarum.blockproperties.Fluid
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameactors.Luminous import net.torvald.terrarum.gameactors.Luminous
import net.torvald.terrarum.gameitem.ItemID
import net.torvald.terrarum.gameworld.BlockAddress import net.torvald.terrarum.gameworld.BlockAddress
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.modulebasegame.IngameRenderer
@@ -205,9 +207,8 @@ object LightmapRenderer {
AppLoader.measureDebugTime("Renderer.LightPrecalc") { AppLoader.measureDebugTime("Renderer.LightPrecalc") {
// when disabled, light will "decay out" instead of "instantly out", which can have a cool effect // when disabled, light will "decay out" instead of "instantly out", which can have a cool effect
// but the performance boost is measly 0.1 ms on 6700K // but the performance boost is measly 0.1 ms on 6700K
lightmap.zerofill()
_mapLightLevelThis.zerofill() _mapLightLevelThis.zerofill()
//lightsourceMap.clear()
for (y in for_y_start - overscan_open..for_y_end + overscan_open) { for (y in for_y_start - overscan_open..for_y_end + overscan_open) {
for (x in for_x_start - overscan_open..for_x_end + overscan_open) { for (x in for_x_start - overscan_open..for_x_end + overscan_open) {
@@ -218,7 +219,7 @@ object LightmapRenderer {
// 'NEWLIGHT2' LIGHT SWIPER // 'NEWLIGHT2' LIGHT SWIPER
// O((8*2)n) where n is a size of the map. // O((8*2)n) where n is a size of the map.
fun r1() { /* - */fun r1() {
swipeDiag = false swipeDiag = false
for (line in 1 until LIGHTMAP_HEIGHT - 1) { for (line in 1 until LIGHTMAP_HEIGHT - 1) {
swipeLight( swipeLight(
@@ -228,7 +229,7 @@ object LightmapRenderer {
) )
} }
} }
fun r2() { /* | */fun r2() {
swipeDiag = false swipeDiag = false
for (line in 1 until LIGHTMAP_WIDTH - 1) { for (line in 1 until LIGHTMAP_WIDTH - 1) {
swipeLight( swipeLight(
@@ -238,7 +239,7 @@ object LightmapRenderer {
) )
} }
} }
fun r3() { /* \ */fun r3() {
swipeDiag = true swipeDiag = true
/* construct indices such that: /* construct indices such that:
56789ABC 56789ABC
@@ -275,7 +276,7 @@ object LightmapRenderer {
) )
} }
} }
fun r4() { /* / */fun r4() {
swipeDiag = true swipeDiag = true
/* /*
1 w-2 1 w-2
@@ -329,6 +330,7 @@ object LightmapRenderer {
r1();r2();r3();r4() r1();r2();r3();r4()
r1();r2();r3();r4() // two looks better than one r1();r2();r3();r4() // two looks better than one
// no rendering trickery will eliminate the need of 2nd pass, even the "decay out"
} }
} }
@@ -407,6 +409,9 @@ object LightmapRenderer {
private val _thisTileOpacity2 = Cvec(0) // thisTileOpacity * sqrt(2) private val _thisTileOpacity2 = Cvec(0) // thisTileOpacity * sqrt(2)
private val _fluidAmountToCol = Cvec(0) private val _fluidAmountToCol = Cvec(0)
private val _thisTileLuminosity = Cvec(0) private val _thisTileLuminosity = Cvec(0)
private var _thisTerrainProp: BlockProp = BlockProp()
private var _thisWallProp: BlockProp = BlockProp()
private var _thisFluidProp: BlockProp = BlockProp()
fun precalculate(rawx: Int, rawy: Int) { fun precalculate(rawx: Int, rawy: Int) {
val lx = rawx.convX(); val ly = rawy.convY() val lx = rawx.convX(); val ly = rawy.convY()
@@ -421,8 +426,11 @@ object LightmapRenderer {
_thisTerrain = world.getTileFromTerrainRaw(worldX, worldY) _thisTerrain = world.getTileFromTerrainRaw(worldX, worldY)
_thisFluid = world.getFluid(worldX, worldY) _thisTerrainProp = BlockCodex[world.tileNumberToNameMap[_thisTerrain]]
_thisWall = world.getTileFromWallRaw(worldX, worldY) _thisWall = world.getTileFromWallRaw(worldX, worldY)
_thisWallProp = BlockCodex[world.tileNumberToNameMap[_thisWall]]
_thisFluid = world.getFluid(worldX, worldY)
_thisFluidProp = BlockCodex[_thisFluid.type]
// regarding the issue #26 // regarding the issue #26
@@ -448,18 +456,17 @@ object LightmapRenderer {
exitProcess(1) exitProcess(1)
}*/ }*/
if (_thisFluid.type != Fluid.NULL) { if (_thisFluid.type != Fluid.NULL) {
_fluidAmountToCol.set(_thisFluid.amount, _thisFluid.amount, _thisFluid.amount, _thisFluid.amount) _fluidAmountToCol.set(_thisFluid.amount, _thisFluid.amount, _thisFluid.amount, _thisFluid.amount)
_thisTileLuminosity.set(BlockCodex[world.tileNumberToNameMap[_thisTerrain]].getLumCol(worldX, worldY)) _thisTileLuminosity.set(_thisTerrainProp.getLumCol(worldX, worldY))
_thisTileLuminosity.maxAndAssign(BlockCodex[_thisFluid.type].getLumCol(worldX, worldY).mul(_fluidAmountToCol)) // already been div by four _thisTileLuminosity.maxAndAssign(_thisFluidProp.getLumCol(worldX, worldY).mul(_fluidAmountToCol)) // already been div by four
_mapThisTileOpacity.setVec(lx, ly, BlockCodex[world.tileNumberToNameMap[_thisTerrain]].opacity) _mapThisTileOpacity.setVec(lx, ly, _thisTerrainProp.opacity)
_mapThisTileOpacity.max(lx, ly, BlockCodex[_thisFluid.type].opacity.mul(_fluidAmountToCol))// already been div by four _mapThisTileOpacity.max(lx, ly, _thisFluidProp.opacity.mul(_fluidAmountToCol))// already been div by four
} }
else { else {
_thisTileLuminosity.set(BlockCodex[world.tileNumberToNameMap[_thisTerrain]].getLumCol(worldX, worldY)) _thisTileLuminosity.set(_thisTerrainProp.getLumCol(worldX, worldY))
_mapThisTileOpacity.setVec(lx, ly, BlockCodex[world.tileNumberToNameMap[_thisTerrain]].opacity) _mapThisTileOpacity.setVec(lx, ly, _thisTerrainProp.opacity)
} }
_mapThisTileOpacity2.setR(lx, ly, _mapThisTileOpacity.getR(lx, ly) * 1.41421356f) _mapThisTileOpacity2.setR(lx, ly, _mapThisTileOpacity.getR(lx, ly) * 1.41421356f)
@@ -469,8 +476,8 @@ object LightmapRenderer {
// open air || luminous tile backed by sunlight // open air || luminous tile backed by sunlight
if ((world.tileNumberToNameMap[_thisTerrain] == AIR && world.tileNumberToNameMap[_thisWall] == AIR) || if ((!_thisTerrainProp.isSolid && !_thisWallProp.isSolid) ||
(_thisTileLuminosity.nonZero() && world.tileNumberToNameMap[_thisWall] == AIR)) { (_thisTileLuminosity.nonZero() && !_thisWallProp.isSolid)) {
_mapLightLevelThis.setVec(lx, ly, sunLight) _mapLightLevelThis.setVec(lx, ly, sunLight)
} }