mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-17 03:15:35 -04:00
optimize Section flood filling
the position is now not wrapped inside a Number object by the compiler anymore
This commit is contained in:
parent
33fb02ac50
commit
2fb7c61007
@ -46,34 +46,34 @@ class SectionOcclusion(
|
|||||||
update(calculateOcclusion(floodFill()), notify)
|
update(calculateOcclusion(floodFill()), notify)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun trace(regions: ShortArray, x: Int, y: Int, z: Int, nextId: Short) {
|
||||||
|
val index = y shl 8 or (z shl 4) or x
|
||||||
|
if (regions[index] > 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val state = provider[index]
|
||||||
|
if (state.isFullyOpaque()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
regions[index] = nextId
|
||||||
|
if (x > 0) trace(regions, x - 1, y, z, nextId)
|
||||||
|
if (x < ProtocolDefinition.SECTION_MAX_X) trace(regions, x + 1, y, z, nextId)
|
||||||
|
if (y > 0) trace(regions, x, y - 1, z, nextId)
|
||||||
|
if (y < ProtocolDefinition.SECTION_MAX_Y) trace(regions, x, y + 1, z, nextId)
|
||||||
|
if (z > 0) trace(regions, x, y, z - 1, nextId)
|
||||||
|
if (z < ProtocolDefinition.SECTION_MAX_Z) trace(regions, x, y, z + 1, nextId)
|
||||||
|
}
|
||||||
|
|
||||||
private fun floodFill(): ShortArray {
|
private fun floodFill(): ShortArray {
|
||||||
// mark regions and check direct neighbours
|
// mark regions and check direct neighbours
|
||||||
val regions = ShortArray(ProtocolDefinition.BLOCKS_PER_SECTION)
|
val regions = ShortArray(ProtocolDefinition.BLOCKS_PER_SECTION)
|
||||||
|
|
||||||
fun trace(x: Int, y: Int, z: Int, nextId: Short) {
|
|
||||||
val index = y shl 8 or (z shl 4) or x
|
|
||||||
if (regions[index] > 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
val state = provider[index]
|
|
||||||
if (state.isFullyOpaque()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
regions[index] = nextId
|
|
||||||
if (x > 0) trace(x - 1, y, z, nextId)
|
|
||||||
if (x < ProtocolDefinition.SECTION_MAX_X) trace(x + 1, y, z, nextId)
|
|
||||||
if (y > 0) trace(x, y - 1, z, nextId)
|
|
||||||
if (y < ProtocolDefinition.SECTION_MAX_Y) trace(x, y + 1, z, nextId)
|
|
||||||
if (z > 0) trace(x, y, z - 1, nextId)
|
|
||||||
if (z < ProtocolDefinition.SECTION_MAX_Z) trace(x, y, z + 1, nextId)
|
|
||||||
}
|
|
||||||
|
|
||||||
var next: Short = 1
|
var next: Short = 0
|
||||||
for (y in 0 until ProtocolDefinition.SECTION_HEIGHT_Y) {
|
for (y in 0 until ProtocolDefinition.SECTION_HEIGHT_Y) {
|
||||||
for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) {
|
for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) {
|
||||||
for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) {
|
for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) {
|
||||||
trace(x, y, z, next++)
|
trace(regions, x, y, z, ++next)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user