Skip to content

Commit

Permalink
improve certain block rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
wefhy committed Jan 15, 2023
1 parent e4c345f commit b3439df
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 22 deletions.
14 changes: 14 additions & 0 deletions src/main/java/dev/wefhy/whymap/config/RenderConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,19 @@ object RenderConfig {
"tripwire"
)

private val forceOverlay = arrayOf(
"pointed_dripstone",
"mangrove_roots",
"cobweb",
"spawner",
"cactus"
)

private val forceSolid = arrayOf<String>(

)

fun shouldBlockOverlayBeIgnored(name: String) = ignoredOverlayBlocks.any { name.contains(it) }

fun isOverlayForced(name: String) = forceOverlay.any { name.contains(it) }
}
55 changes: 33 additions & 22 deletions src/main/java/dev/wefhy/whymap/tiles/region/MapArea.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import dev.wefhy.whymap.CurrentWorldProvider
import dev.wefhy.whymap.WhyMapMod.Companion.LOGGER
import dev.wefhy.whymap.WhyWorld
import dev.wefhy.whymap.communication.BlockData
import dev.wefhy.whymap.config.RenderConfig.isOverlayForced
import dev.wefhy.whymap.config.RenderConfig.shouldBlockOverlayBeIgnored
import dev.wefhy.whymap.config.WhyMapConfig.latestFileVersion
import dev.wefhy.whymap.config.WhyMapConfig.reRenderInterval
Expand All @@ -16,7 +17,6 @@ import dev.wefhy.whymap.config.WhyMapConfig.storageTileChunks
import dev.wefhy.whymap.config.WhyMapConfig.tileMetadataSize
import dev.wefhy.whymap.tiles.details.ExperimentalTextureProvider
import dev.wefhy.whymap.tiles.region.BlockMappingsManager.getRemapLookup
import dev.wefhy.whymap.tiles.region.FileVersionManager.WhyMapFileVersion.*
import dev.wefhy.whymap.tiles.region.FileVersionManager.WhyMapFileVersion.Companion.recognizeVersion
import dev.wefhy.whymap.tiles.region.FileVersionManager.WhyMapMetadata
import dev.wefhy.whymap.utils.*
Expand Down Expand Up @@ -81,49 +81,53 @@ class MapArea private constructor(val location: LocalTileRegion) {
if ((position.regionX != location.x) || (position.regionZ != location.z)) return null
val startX = position.regionRelativeX shl 4
val startZ = position.regionRelativeZ shl 4
return Array(16) {z ->
return Array(16) { z ->
blockIdMap[startZ + z].slice(startX until (startX + 16)).map {
decodeBlock(it)
}
}
}

fun getChunkOverlay(position: ChunkPos): Array<List<BlockState>>? {
//TODO load only if in exists array; save exists array to file
if ((position.regionX != location.x) || (position.regionZ != location.z)) return null
val startX = position.regionRelativeX shl 4
val startZ = position.regionRelativeZ shl 4
return Array(16) {z ->
return Array(16) { z ->
blockOverlayIdMap[startZ + z].slice(startX until (startX + 16)).map {
decodeBlock(it)
}
}
}

fun getChunkBiomeFoliageAndWater(position: ChunkPos): Array<List<Pair<FloatColor, Color>>>? {
//TODO load only if in exists array; save exists array to file
if ((position.regionX != location.x) || (position.regionZ != location.z)) return null
val startX = position.regionRelativeX shl 4
val startZ = position.regionRelativeZ shl 4
return Array(16) {z ->
return Array(16) { z ->
biomeMap[startZ + z].slice(startX until (startX + 16)).map {
Pair(biomeManager.decodeBiomeFoliage(it), biomeManager.decodeBiomeWaterColor(it))
}
}
}

fun getChunkHeightmap(position: ChunkPos): Array<ShortArray>? {
//TODO load only if in exists array; save exists array to file
if ((position.regionX != location.x) || (position.regionZ != location.z)) return null
val startX = position.regionRelativeX shl 4
val startZ = position.regionRelativeZ shl 4
return Array(16) {z ->
return Array(16) { z ->
heightMap[startZ + z].sliceArray(startX until (startX + 16))
}
}

fun getChunkDepthmap(position: ChunkPos): Array<ByteArray>? {
//TODO load only if in exists array; save exists array to file
if ((position.regionX != location.x) || (position.regionZ != location.z)) return null
val startX = position.regionRelativeX shl 4
val startZ = position.regionRelativeZ shl 4
return Array(16) {z ->
return Array(16) { z ->
depthMap[startZ + z].sliceArray(startX until (startX + 16))
}
}
Expand All @@ -132,8 +136,8 @@ class MapArea private constructor(val location: LocalTileRegion) {
if ((position.regionX != location.x) || (position.regionZ != location.z)) return null
val startX = position.regionRelativeX shl 4
val startZ = position.regionRelativeZ shl 4
return Array(16) {z ->
Array(16) {x ->
return Array(16) { z ->
Array(16) { x ->
getNormalSharp(startX + x, startZ + z)
}
}
Expand Down Expand Up @@ -168,7 +172,7 @@ class MapArea private constructor(val location: LocalTileRegion) {
shortShortBuffer.flip()
byteBuffer.flip()
val xzOutupt = ByteArrayOutputStream()
XZOutputStream(xzOutupt, LZMA2Options(3)).use {xz ->
XZOutputStream(xzOutupt, LZMA2Options(3)).use { xz ->
xz.write(latestFileVersion.getMetadataArray())
xz.write(data)
xz.close()
Expand Down Expand Up @@ -242,7 +246,13 @@ class MapArea private constructor(val location: LocalTileRegion) {
// getBlockState(mutablePosition).hasSidedTransparency()
// getBlockState(mutablePosition).isOpaque
// Block.isFaceFullSquare(null, Direction.UP)
while (!getBlockState(mutablePosition).material.isSolid and (y > bottomY)) { //TODO or isOpaque
// while (!getBlockState(mutablePosition).material.isSolid && (y > bottomY) && (fastOverlayLookup.contains(getBlockState(mutablePosition).block.defaultState))) { //TODO or isOpaque
while (getBlockState(mutablePosition).let { block ->
(!block.material.isSolid || fastOverlayLookup.contains(block.block.defaultState))
&& (y > bottomY)
}
) { //TODO or isOpaque

mutablePosition.y = --y
}
output[z][x] = y //TODO this will point to air block just like regular heightmap
Expand Down Expand Up @@ -328,7 +338,6 @@ class MapArea private constructor(val location: LocalTileRegion) {
// }



blockIdMap[regionRelativeZ][regionRelativeX] = encodeBlock(block)
blockOverlayIdMap[regionRelativeZ][regionRelativeX] = encodeBlock(overlayBlock)
biomeMap[regionRelativeZ][regionRelativeX] = biomeManager.encodeBiome(biome)
Expand Down Expand Up @@ -363,15 +372,17 @@ class MapArea private constructor(val location: LocalTileRegion) {
}

private fun shouldBeReRendered(scaleLog: Int): Boolean {
return when(scaleLog) {
return when (scaleLog) {
0 -> {
val elapsed = currentTime() - lastUpdate
// LOGGER.debug("Region: $location, elapsed: $elapsed, interval: $updateInterval, modified: $modifiedSinceRender, verdict: ${(elapsed >= updateInterval) && modifiedSinceRender}")
(elapsed >= reRenderInterval) && modifiedSinceRender
}

regionThumbnailScaleLog -> {
false
}

else -> true
}
}
Expand Down Expand Up @@ -408,15 +419,15 @@ class MapArea private constructor(val location: LocalTileRegion) {
BufferedImage(storageTileBlocks shr scaleLog, storageTileBlocks shr scaleLog, BufferedImage.TYPE_3BYTE_BGR)
val scale = 1 shl scaleLog

for (z in 0 until storageTileBlocks step scale) {
for (x in 0 until storageTileBlocks step scale) {
try {
for (z in 0 until storageTileBlocks step scale) {
for (x in 0 until storageTileBlocks step scale) {
try {

val block = decodeBlock(blockIdMap[z][x])
val block = decodeBlock(blockIdMap[z][x])
val foliageColor = biomeManager.decodeBiomeFoliage(biomeMap[z][x])
val baseBlockColor = Color(decodeBlockColor(blockIdMap[z][x]))
val overlayBlock = decodeBlock(blockOverlayIdMap[z][x])
val overlayBlockColor = if(waterBlocks.contains(overlayBlock))
val overlayBlockColor = if (waterBlocks.contains(overlayBlock))
biomeManager.decodeBiomeWaterColor(biomeMap[z][x])
else
Color(decodeBlockColor(blockOverlayIdMap[z][x]))
Expand All @@ -437,11 +448,11 @@ class MapArea private constructor(val location: LocalTileRegion) {
color = waterColor.mixWeight(color, getDepthShade(depth))
}
bitmap.setRGB(x shr scaleLog, z shr scaleLog, color.toInt())
} catch (_: IndexOutOfBoundsException) {
} catch (_: IndexOutOfBoundsException) {
// print("Failed to render map area (${location.x}, ${location.z})")
}
}
}
}

if (scaleLog == 0) {
rendered = bitmap
Expand Down Expand Up @@ -537,6 +548,8 @@ class MapArea private constructor(val location: LocalTileRegion) {
internal val minecraftBlocks = Block.STATE_IDS.map { it.block.translationKey }.toSet().toTypedArray().sortedArray()
private val blockNameMap = Block.STATE_IDS.map { it.block.defaultState }.associateBy { it.block.translationKey }
private val fastIgnoreLookup = minecraftBlocks.map { shouldBlockOverlayBeIgnored(it) }.toTypedArray()
private val fastOverlayLookup: List<BlockState> = blockNameMap.toList().filter { isOverlayForced(it.first) }.map { it.second }

val foliageBlocks = minecraftBlocks.filter {
it.contains("vine") ||
it.contains("leaves") ||
Expand All @@ -558,16 +571,14 @@ class MapArea private constructor(val location: LocalTileRegion) {
val fastLookupBlocks = minecraftBlocks.map { blockNameMap[it]!! }.toTypedArray()
val fastLookupBlockColor = fastLookupBlocks.map {
ExperimentalTextureProvider.getBitmap(it.block)?.run {
if(it in ignoreAlphaBlocks)
if (it in ignoreAlphaBlocks)
getAverageLeavesColor()
else
getAverageColor()
} ?: it.material.color.color
}.toIntArray().also { LOGGER.warn("MISSING TEXTURES: ${ExperimentalTextureProvider.missingTextures}") }




// val biomes = BiomeKeys::class.java.declaredFields.filter { Modifier.isStatic(it.modifiers) }.map {
// val instance = it::class.java.newInstance()
// it.get(instance)
Expand Down

0 comments on commit b3439df

Please sign in to comment.