mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-19 04:15:14 -04:00
minor general performance improvements
This commit is contained in:
parent
2c76371578
commit
61e4b4534d
@ -463,14 +463,17 @@ class Chunk(
|
|||||||
sectionLoop@ for (sectionIndex in startY.sectionHeight downTo 0) {
|
sectionLoop@ for (sectionIndex in startY.sectionHeight downTo 0) {
|
||||||
val section = sections[sectionIndex] ?: continue
|
val section = sections[sectionIndex] ?: continue
|
||||||
|
|
||||||
|
section.acquire()
|
||||||
for (sectionY in ProtocolDefinition.SECTION_MAX_Y downTo 0) {
|
for (sectionY in ProtocolDefinition.SECTION_MAX_Y downTo 0) {
|
||||||
val light = section.blocks[x, sectionY, z]?.lightProperties ?: continue
|
val light = section.blocks.unsafeGet(x, sectionY, z)?.lightProperties ?: continue
|
||||||
if (light.propagatesSkylight) {
|
if (light.propagatesSkylight) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
y = (sectionIndex + lowestSection) * ProtocolDefinition.SECTION_HEIGHT_Y + sectionY
|
y = (sectionIndex + lowestSection) * ProtocolDefinition.SECTION_HEIGHT_Y + sectionY
|
||||||
|
section.release()
|
||||||
break@sectionLoop
|
break@sectionLoop
|
||||||
}
|
}
|
||||||
|
section.release()
|
||||||
}
|
}
|
||||||
skylightHeightmap[(z shl 4) or x] = y
|
skylightHeightmap[(z shl 4) or x] = y
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,6 @@ class BlockSectionDataProvider(
|
|||||||
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)
|
||||||
var nextFloodId = 1.toShort()
|
|
||||||
|
|
||||||
fun trace(x: Int, y: Int, z: Int, nextId: Short) {
|
fun trace(x: Int, y: Int, z: Int, nextId: Short) {
|
||||||
val index = y shl 8 or (z shl 4) or x
|
val index = y shl 8 or (z shl 4) or x
|
||||||
@ -119,9 +118,6 @@ class BlockSectionDataProvider(
|
|||||||
}
|
}
|
||||||
val blockState = unsafeGet(index)
|
val blockState = unsafeGet(index)
|
||||||
if (blockState.isSolid()) {
|
if (blockState.isSolid()) {
|
||||||
if (nextId == nextFloodId) {
|
|
||||||
nextFloodId++
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
regions[index] = nextId
|
regions[index] = nextId
|
||||||
@ -133,10 +129,11 @@ class BlockSectionDataProvider(
|
|||||||
if (z < ProtocolDefinition.SECTION_MAX_Z) trace(x, y, z + 1, nextId)
|
if (z < ProtocolDefinition.SECTION_MAX_Z) trace(x, y, z + 1, nextId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var nextFloodId = 1.toShort()
|
||||||
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, nextFloodId)
|
trace(x, y, z, nextFloodId++)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.data.world.positions
|
||||||
|
|
||||||
|
object BlockPositionUtil {
|
||||||
|
|
||||||
|
fun generatePositionHash(x: Int, y: Int, z: Int): Long {
|
||||||
|
var hash = (x * 3129871L) xor z.toLong() * 116129781L xor y.toLong()
|
||||||
|
hash = hash * hash * 42317861L + hash * 11L
|
||||||
|
return hash shr 16
|
||||||
|
}
|
||||||
|
|
||||||
|
inline val BlockPosition.positionHash: Long
|
||||||
|
get() = generatePositionHash(x, y, z)
|
||||||
|
|
||||||
|
}
|
@ -20,10 +20,10 @@ import de.bixilon.minosoft.data.abilities.Gamemodes
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
|
import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
||||||
|
import de.bixilon.minosoft.data.world.positions.BlockPositionUtil.positionHash
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.OverlayFactory
|
import de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.OverlayFactory
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil
|
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.blockPosition
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.blockPosition
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.EMPTY
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -58,7 +58,7 @@ class WallOverlay(renderWindow: RenderWindow, z: Float) : SimpleOverlay(renderWi
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun draw() {
|
override fun draw() {
|
||||||
random.setSeed(VecUtil.generatePositionHash(position.x, position.y, position.z))
|
random.setSeed(position.positionHash)
|
||||||
texture = blockState?.blockModel?.getParticleTexture(random, position) ?: return
|
texture = blockState?.blockModel?.getParticleTexture(random, position) ?: return
|
||||||
|
|
||||||
tintColor = RGBColor(0.1f, 0.1f, 0.1f, 1.0f)
|
tintColor = RGBColor(0.1f, 0.1f, 0.1f, 1.0f)
|
||||||
|
@ -17,10 +17,10 @@ import de.bixilon.kotlinglm.vec3.Vec3i
|
|||||||
import de.bixilon.kutil.exception.Broken
|
import de.bixilon.kutil.exception.Broken
|
||||||
import de.bixilon.minosoft.data.direction.Directions
|
import de.bixilon.minosoft.data.direction.Directions
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
|
import de.bixilon.minosoft.data.world.positions.BlockPositionUtil.positionHash
|
||||||
import de.bixilon.minosoft.gui.rendering.models.baked.block.BakedBlockModel
|
import de.bixilon.minosoft.gui.rendering.models.baked.block.BakedBlockModel
|
||||||
import de.bixilon.minosoft.gui.rendering.models.properties.AbstractFaceProperties
|
import de.bixilon.minosoft.gui.rendering.models.properties.AbstractFaceProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil
|
|
||||||
import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh
|
import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
@ -64,7 +64,7 @@ class WeightedBakedModel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getParticleTexture(random: Random, blockPosition: Vec3i): AbstractTexture? {
|
override fun getParticleTexture(random: Random, blockPosition: Vec3i): AbstractTexture? {
|
||||||
random.setSeed(VecUtil.generatePositionHash(blockPosition.x, blockPosition.y, blockPosition.z))
|
random.setSeed(blockPosition.positionHash)
|
||||||
return getModel(random)?.getParticleTexture(random, blockPosition)
|
return getModel(random)?.getParticleTexture(random, blockPosition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,14 +16,16 @@ package de.bixilon.minosoft.gui.rendering.models.baked.block
|
|||||||
import de.bixilon.kotlinglm.vec3.Vec3i
|
import de.bixilon.kotlinglm.vec3.Vec3i
|
||||||
import de.bixilon.minosoft.data.direction.Directions
|
import de.bixilon.minosoft.data.direction.Directions
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
|
import de.bixilon.minosoft.data.world.positions.BlockPositionUtil
|
||||||
import de.bixilon.minosoft.gui.rendering.models.CullUtil.canCull
|
import de.bixilon.minosoft.gui.rendering.models.CullUtil.canCull
|
||||||
import de.bixilon.minosoft.gui.rendering.models.properties.AbstractFaceProperties
|
import de.bixilon.minosoft.gui.rendering.models.properties.AbstractFaceProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil
|
import de.bixilon.minosoft.gui.rendering.tint.TintManager
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.toVec3
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.toVec3
|
||||||
import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh
|
import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh
|
||||||
import de.bixilon.minosoft.gui.rendering.world.preparer.cull.SolidCullSectionPreparer
|
import de.bixilon.minosoft.gui.rendering.world.preparer.cull.SolidCullSectionPreparer
|
||||||
|
import de.bixilon.minosoft.util.KUtil.getOrElse
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class BakedBlockStateModel(
|
class BakedBlockStateModel(
|
||||||
@ -54,7 +56,7 @@ class BakedBlockStateModel(
|
|||||||
val neighboursModel = neighbour?.blockModel
|
val neighboursModel = neighbour?.blockModel
|
||||||
var neighbourProperties: Array<AbstractFaceProperties>? = null
|
var neighbourProperties: Array<AbstractFaceProperties>? = null
|
||||||
if (neighboursModel != null) {
|
if (neighboursModel != null) {
|
||||||
random.setSeed(VecUtil.generatePositionHash(position.x + direction.vector.x, position.y + direction.vector.y, position.z + direction.vector.z))
|
random.setSeed(BlockPositionUtil.generatePositionHash(position.x + direction.vector.x, position.y + direction.vector.y, position.z + direction.vector.z))
|
||||||
neighbourProperties = neighboursModel.getTouchingFaceProperties(random, direction.inverted)
|
neighbourProperties = neighboursModel.getTouchingFaceProperties(random, direction.inverted)
|
||||||
}
|
}
|
||||||
for (face in faces) {
|
for (face in faces) {
|
||||||
@ -66,7 +68,7 @@ class BakedBlockStateModel(
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tint = tints?.getOrNull(face.tintIndex) ?: -1
|
tint = tints?.getOrElse(face.tintIndex, TintManager.DEFAULT_TINT_INDEX) ?: TintManager.DEFAULT_TINT_INDEX
|
||||||
currentLight = (face.cullFace?.let { light[it.ordinal] } ?: light[SolidCullSectionPreparer.SELF_LIGHT_INDEX]).toInt()
|
currentLight = (face.cullFace?.let { light[it.ordinal] } ?: light[SolidCullSectionPreparer.SELF_LIGHT_INDEX]).toInt()
|
||||||
face.singleRender(positionArray, mesh, currentLight, tint)
|
face.singleRender(positionArray, mesh, currentLight, tint)
|
||||||
if (!rendered) {
|
if (!rendered) {
|
||||||
|
@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec2.Vec2
|
|||||||
import de.bixilon.kutil.primitive.IntUtil.toInt
|
import de.bixilon.kutil.primitive.IntUtil.toInt
|
||||||
import de.bixilon.minosoft.data.direction.Directions
|
import de.bixilon.minosoft.data.direction.Directions
|
||||||
import de.bixilon.minosoft.gui.rendering.models.unbaked.element.UnbakedElement.Companion.BLOCK_RESOLUTION
|
import de.bixilon.minosoft.gui.rendering.models.unbaked.element.UnbakedElement.Companion.BLOCK_RESOLUTION
|
||||||
|
import de.bixilon.minosoft.gui.rendering.tint.TintManager
|
||||||
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast
|
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast
|
||||||
|
|
||||||
data class UnbakedElementFace(
|
data class UnbakedElementFace(
|
||||||
@ -48,7 +49,7 @@ data class UnbakedElementFace(
|
|||||||
texture = data["texture"].toString(),
|
texture = data["texture"].toString(),
|
||||||
cullFace = cullFace,
|
cullFace = cullFace,
|
||||||
rotation = data["rotation"]?.toInt() ?: 0,
|
rotation = data["rotation"]?.toInt() ?: 0,
|
||||||
tintIndex = data["tintindex"]?.toInt() ?: -1,
|
tintIndex = data["tintindex"]?.toInt() ?: TintManager.DEFAULT_TINT_INDEX,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,6 +107,7 @@ class TintManager(private val connection: PlayConnection) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
const val DEFAULT_TINT_INDEX = -1
|
||||||
|
|
||||||
fun getJsonColor(color: Int): RGBColor? {
|
fun getJsonColor(color: Int): RGBColor? {
|
||||||
if (color == 0) {
|
if (color == 0) {
|
||||||
|
@ -26,6 +26,7 @@ import de.bixilon.minosoft.data.direction.Directions
|
|||||||
import de.bixilon.minosoft.data.registries.AABB
|
import de.bixilon.minosoft.data.registries.AABB
|
||||||
import de.bixilon.minosoft.data.registries.blocks.RandomOffsetTypes
|
import de.bixilon.minosoft.data.registries.blocks.RandomOffsetTypes
|
||||||
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
||||||
|
import de.bixilon.minosoft.data.world.positions.BlockPositionUtil
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.get
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.get
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
@ -191,7 +192,7 @@ object VecUtil {
|
|||||||
return Vec3.EMPTY
|
return Vec3.EMPTY
|
||||||
}
|
}
|
||||||
|
|
||||||
val positionHash = generatePositionHash(x, 0, z)
|
val positionHash = BlockPositionUtil.generatePositionHash(x, 0, z)
|
||||||
val maxModelOffset = 0.25f // ToDo: PixLyzer: use block.model.max_model_offset
|
val maxModelOffset = 0.25f // ToDo: PixLyzer: use block.model.max_model_offset
|
||||||
|
|
||||||
fun horizontal(axisHash: Long): Float {
|
fun horizontal(axisHash: Long): Float {
|
||||||
@ -230,12 +231,6 @@ object VecUtil {
|
|||||||
val Vec3d.empty: Boolean
|
val Vec3d.empty: Boolean
|
||||||
get() = this.length() < 0.001
|
get() = this.length() < 0.001
|
||||||
|
|
||||||
fun generatePositionHash(x: Int, y: Int, z: Int): Long {
|
|
||||||
var hash = (x * 3129871L) xor z.toLong() * 116129781L xor y.toLong()
|
|
||||||
hash = hash * hash * 42317861L + hash * 11L
|
|
||||||
return hash shr 16
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getDistanceToNextIntegerAxisInDirection(position: Vec3d, direction: Vec3d): Double {
|
fun getDistanceToNextIntegerAxisInDirection(position: Vec3d, direction: Vec3d): Double {
|
||||||
fun getTarget(direction: Vec3d, position: Vec3d, axis: Axes): Int {
|
fun getTarget(direction: Vec3d, position: Vec3d, axis: Axes): Int {
|
||||||
return if (direction[axis] > 0) {
|
return if (direction[axis] > 0) {
|
||||||
|
@ -34,7 +34,7 @@ abstract class Mesh(
|
|||||||
private var _data: DirectArrayFloatList? = data ?: if (onDemand) null else DirectArrayFloatList(initialCacheSize)
|
private var _data: DirectArrayFloatList? = data ?: if (onDemand) null else DirectArrayFloatList(initialCacheSize)
|
||||||
var data: DirectArrayFloatList
|
var data: DirectArrayFloatList
|
||||||
get() {
|
get() {
|
||||||
if (onDemand && _data == null) {
|
if (_data == null && onDemand) {
|
||||||
_data = DirectArrayFloatList(initialCacheSize)
|
_data = DirectArrayFloatList(initialCacheSize)
|
||||||
}
|
}
|
||||||
return _data as DirectArrayFloatList
|
return _data as DirectArrayFloatList
|
||||||
|
@ -30,13 +30,13 @@ import de.bixilon.minosoft.data.registries.fluid.Fluid
|
|||||||
import de.bixilon.minosoft.data.text.formatting.color.Colors
|
import de.bixilon.minosoft.data.text.formatting.color.Colors
|
||||||
import de.bixilon.minosoft.data.world.chunk.Chunk
|
import de.bixilon.minosoft.data.world.chunk.Chunk
|
||||||
import de.bixilon.minosoft.data.world.chunk.ChunkSection
|
import de.bixilon.minosoft.data.world.chunk.ChunkSection
|
||||||
|
import de.bixilon.minosoft.data.world.positions.BlockPositionUtil.positionHash
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.models.CullUtil.canCull
|
import de.bixilon.minosoft.gui.rendering.models.CullUtil.canCull
|
||||||
import de.bixilon.minosoft.gui.rendering.models.properties.FaceProperties
|
import de.bixilon.minosoft.gui.rendering.models.properties.FaceProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparencies
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparencies
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.getMesh
|
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.getMesh
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil
|
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.EMPTY
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.rotate
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.rotate
|
||||||
@ -96,7 +96,7 @@ class FluidCullSectionPreparer(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
val model = neighbour.blockModel ?: return false
|
val model = neighbour.blockModel ?: return false
|
||||||
random.setSeed(VecUtil.generatePositionHash(neighbourPosition.x, neighbourPosition.y, neighbourPosition.z))
|
random.setSeed(neighbourPosition.positionHash)
|
||||||
val size = model.getTouchingFaceProperties(random, direction.inverted)
|
val size = model.getTouchingFaceProperties(random, direction.inverted)
|
||||||
return size?.canCull(FLUID_FACE_PROPERTY, false) ?: false
|
return size?.canCull(FLUID_FACE_PROPERTY, false) ?: false
|
||||||
}
|
}
|
||||||
|
@ -31,9 +31,10 @@ import de.bixilon.minosoft.data.world.chunk.Chunk
|
|||||||
import de.bixilon.minosoft.data.world.chunk.ChunkSection
|
import de.bixilon.minosoft.data.world.chunk.ChunkSection
|
||||||
import de.bixilon.minosoft.data.world.chunk.light.SectionLight
|
import de.bixilon.minosoft.data.world.chunk.light.SectionLight
|
||||||
import de.bixilon.minosoft.data.world.container.BlockSectionDataProvider
|
import de.bixilon.minosoft.data.world.container.BlockSectionDataProvider
|
||||||
|
import de.bixilon.minosoft.data.world.positions.BlockPosition
|
||||||
|
import de.bixilon.minosoft.data.world.positions.BlockPositionUtil.positionHash
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.models.SingleBlockRenderable
|
import de.bixilon.minosoft.gui.rendering.models.SingleBlockRenderable
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil
|
|
||||||
import de.bixilon.minosoft.gui.rendering.world.entities.BlockEntityRenderer
|
import de.bixilon.minosoft.gui.rendering.world.entities.BlockEntityRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.world.entities.MeshedBlockEntityRenderer
|
import de.bixilon.minosoft.gui.rendering.world.entities.MeshedBlockEntityRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.world.entities.OnlyMeshedBlockEntityRenderer
|
import de.bixilon.minosoft.gui.rendering.world.entities.OnlyMeshedBlockEntityRenderer
|
||||||
@ -68,7 +69,7 @@ class SolidCullSectionPreparer(
|
|||||||
var blockEntity: BlockEntity?
|
var blockEntity: BlockEntity?
|
||||||
var model: SingleBlockRenderable
|
var model: SingleBlockRenderable
|
||||||
var blockState: BlockState
|
var blockState: BlockState
|
||||||
var position: Vec3i
|
val position = BlockPosition()
|
||||||
var rendered: Boolean
|
var rendered: Boolean
|
||||||
var tints: IntArray?
|
var tints: IntArray?
|
||||||
val neighbourBlocks: Array<BlockState?> = arrayOfNulls(Directions.SIZE)
|
val neighbourBlocks: Array<BlockState?> = arrayOfNulls(Directions.SIZE)
|
||||||
@ -79,8 +80,10 @@ class SolidCullSectionPreparer(
|
|||||||
val offsetZ = chunkPosition.y * ProtocolDefinition.SECTION_WIDTH_Z
|
val offsetZ = chunkPosition.y * ProtocolDefinition.SECTION_WIDTH_Z
|
||||||
|
|
||||||
for (y in 0 until ProtocolDefinition.SECTION_HEIGHT_Y) {
|
for (y in 0 until ProtocolDefinition.SECTION_HEIGHT_Y) {
|
||||||
|
position.y = offsetY + y
|
||||||
val fastBedrock = y == 0 && isLowestSection && fastBedrock
|
val fastBedrock = y == 0 && isLowestSection && fastBedrock
|
||||||
for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) {
|
for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) {
|
||||||
|
position.x = offsetX + x
|
||||||
for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) {
|
for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) {
|
||||||
val baseIndex = (z shl 4) or x
|
val baseIndex = (z shl 4) or x
|
||||||
val index = (y shl 8) or baseIndex
|
val index = (y shl 8) or baseIndex
|
||||||
@ -89,7 +92,7 @@ class SolidCullSectionPreparer(
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
light[SELF_LIGHT_INDEX] = sectionLight[index]
|
light[SELF_LIGHT_INDEX] = sectionLight[index]
|
||||||
position = Vec3i(offsetX + x, offsetY + y, offsetZ + z)
|
position.z = offsetZ + z
|
||||||
|
|
||||||
val maxHeight = chunk.skylightHeightmap[baseIndex]
|
val maxHeight = chunk.skylightHeightmap[baseIndex]
|
||||||
if (position.y >= maxHeight) {
|
if (position.y >= maxHeight) {
|
||||||
@ -152,7 +155,7 @@ class SolidCullSectionPreparer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (randomBlockModels) {
|
if (randomBlockModels) {
|
||||||
random.setSeed(VecUtil.generatePositionHash(position.x, position.y, position.z))
|
random.setSeed(position.positionHash)
|
||||||
} else {
|
} else {
|
||||||
random.setSeed(0L)
|
random.setSeed(0L)
|
||||||
}
|
}
|
||||||
@ -205,11 +208,11 @@ class SolidCullSectionPreparer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private inline fun setNeighbour(neighbourBlocks: Array<BlockState?>, x: Int, y: Int, z: Int, light: ByteArray, position: Vec3i, blocks: BlockSectionDataProvider?, sectionLight: SectionLight, chunk: Chunk, ordinal: Int) {
|
private inline fun setNeighbour(neighbourBlocks: Array<BlockState?>, x: Int, y: Int, z: Int, light: ByteArray, position: Vec3i, blocks: BlockSectionDataProvider?, sectionLight: SectionLight, chunk: Chunk, ordinal: Int) {
|
||||||
val nextBaseIndex = (z shl 4) or x
|
val heightmapIndex = (z shl 4) or x
|
||||||
val neighbourIndex = y shl 8 or nextBaseIndex
|
val neighbourIndex = y shl 8 or heightmapIndex
|
||||||
neighbourBlocks[ordinal] = blocks?.unsafeGet(neighbourIndex)
|
neighbourBlocks[ordinal] = blocks?.unsafeGet(neighbourIndex)
|
||||||
light[ordinal] = sectionLight[neighbourIndex]
|
light[ordinal] = sectionLight[neighbourIndex]
|
||||||
if (position.y > chunk.skylightHeightmap[nextBaseIndex]) {
|
if (position.y > chunk.skylightHeightmap[heightmapIndex]) {
|
||||||
light[ordinal] = (light[ordinal].toInt() or 0xF0).toByte()
|
light[ordinal] = (light[ordinal].toInt() or 0xF0).toByte()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -322,4 +322,11 @@ object KUtil {
|
|||||||
this[index] = value
|
this[index] = value
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fun IntArray.getOrElse(index: Int, `else`: Int): Int {
|
||||||
|
if (index < 0 || index >= this.size) {
|
||||||
|
return `else`
|
||||||
|
}
|
||||||
|
return this[index]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
/*
|
/*
|
||||||
* Minosoft
|
* Minosoft
|
||||||
* Copyright (C) 2021 Moritz Zwerger
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
package de.bixilon.minosoft.util.collections.bytes
|
package de.bixilon.minosoft.util.collections.bytes
|
||||||
|
|
||||||
class HeapArrayByteList(
|
class HeapArrayByteList(
|
||||||
@ -53,23 +53,31 @@ class HeapArrayByteList(
|
|||||||
while (newSize - size < needed) {
|
while (newSize - size < needed) {
|
||||||
newSize += nextGrowStep
|
newSize += nextGrowStep
|
||||||
}
|
}
|
||||||
|
grow(newSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun grow(size: Int) {
|
||||||
val oldData = data
|
val oldData = data
|
||||||
data = ByteArray(newSize)
|
data = ByteArray(size)
|
||||||
System.arraycopy(oldData, 0, data, 0, oldData.size)
|
System.arraycopy(oldData, 0, data, 0, oldData.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun add(value: Byte) {
|
override fun add(value: Byte) {
|
||||||
ensureSize(1)
|
ensureSize(1)
|
||||||
data[size++] = value
|
data[size++] = value
|
||||||
|
if (outputUpToDate) {
|
||||||
outputUpToDate = false
|
outputUpToDate = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun addAll(bytes: ByteArray) {
|
override fun addAll(bytes: ByteArray) {
|
||||||
ensureSize(bytes.size)
|
ensureSize(bytes.size)
|
||||||
System.arraycopy(bytes, 0, data, size, bytes.size)
|
System.arraycopy(bytes, 0, data, size, bytes.size)
|
||||||
size += bytes.size
|
size += bytes.size
|
||||||
|
if (outputUpToDate) {
|
||||||
outputUpToDate = false
|
outputUpToDate = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun addAll(byteList: AbstractByteList) {
|
override fun addAll(byteList: AbstractByteList) {
|
||||||
ensureSize(byteList.size)
|
ensureSize(byteList.size)
|
||||||
@ -84,6 +92,10 @@ class HeapArrayByteList(
|
|||||||
}
|
}
|
||||||
System.arraycopy(source, 0, data, size, byteList.size)
|
System.arraycopy(source, 0, data, size, byteList.size)
|
||||||
size += byteList.size
|
size += byteList.size
|
||||||
|
|
||||||
|
if (outputUpToDate) {
|
||||||
|
outputUpToDate = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkOutputArray() {
|
private fun checkOutputArray() {
|
||||||
|
@ -52,9 +52,13 @@ class DirectArrayFloatList(
|
|||||||
} else {
|
} else {
|
||||||
nextGrowStep
|
nextGrowStep
|
||||||
}
|
}
|
||||||
|
grow(newSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun grow(size: Int) {
|
||||||
val oldBuffer = buffer
|
val oldBuffer = buffer
|
||||||
buffer = memAllocFloat(newSize)
|
buffer = memAllocFloat(size)
|
||||||
limit = newSize
|
limit = size
|
||||||
if (FLOAT_PUT_METHOD == null) { // Java < 16
|
if (FLOAT_PUT_METHOD == null) { // Java < 16
|
||||||
for (i in 0 until oldBuffer.position()) {
|
for (i in 0 until oldBuffer.position()) {
|
||||||
buffer.put(oldBuffer.get(i))
|
buffer.put(oldBuffer.get(i))
|
||||||
@ -69,8 +73,10 @@ class DirectArrayFloatList(
|
|||||||
override fun add(value: Float) {
|
override fun add(value: Float) {
|
||||||
ensureSize(1)
|
ensureSize(1)
|
||||||
buffer.put(value)
|
buffer.put(value)
|
||||||
|
if (outputUpToDate) {
|
||||||
outputUpToDate = false
|
outputUpToDate = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun addAll(floats: FloatArray) {
|
override fun addAll(floats: FloatArray) {
|
||||||
ensureSize(floats.size)
|
ensureSize(floats.size)
|
||||||
@ -81,8 +87,10 @@ class DirectArrayFloatList(
|
|||||||
|
|
||||||
exception.printStackTrace()
|
exception.printStackTrace()
|
||||||
}
|
}
|
||||||
|
if (outputUpToDate) {
|
||||||
outputUpToDate = false
|
outputUpToDate = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun addAll(floatList: AbstractFloatList) {
|
override fun addAll(floatList: AbstractFloatList) {
|
||||||
if (floatList is DirectArrayFloatList) {
|
if (floatList is DirectArrayFloatList) {
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
/*
|
/*
|
||||||
* Minosoft
|
* Minosoft
|
||||||
* Copyright (C) 2021 Moritz Zwerger
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
package de.bixilon.minosoft.util.collections.floats
|
package de.bixilon.minosoft.util.collections.floats
|
||||||
|
|
||||||
class HeapArrayFloatList(
|
class HeapArrayFloatList(
|
||||||
@ -53,23 +53,31 @@ class HeapArrayFloatList(
|
|||||||
while (newSize - size < needed) {
|
while (newSize - size < needed) {
|
||||||
newSize += nextGrowStep
|
newSize += nextGrowStep
|
||||||
}
|
}
|
||||||
|
grow(newSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun grow(size: Int) {
|
||||||
val oldData = data
|
val oldData = data
|
||||||
data = FloatArray(newSize)
|
data = FloatArray(size)
|
||||||
System.arraycopy(oldData, 0, data, 0, oldData.size)
|
System.arraycopy(oldData, 0, data, 0, oldData.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun add(value: Float) {
|
override fun add(value: Float) {
|
||||||
ensureSize(1)
|
ensureSize(1)
|
||||||
data[size++] = value
|
data[size++] = value
|
||||||
|
if (outputUpToDate) {
|
||||||
outputUpToDate = false
|
outputUpToDate = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun addAll(floats: FloatArray) {
|
override fun addAll(floats: FloatArray) {
|
||||||
ensureSize(floats.size)
|
ensureSize(floats.size)
|
||||||
System.arraycopy(floats, 0, data, size, floats.size)
|
System.arraycopy(floats, 0, data, size, floats.size)
|
||||||
size += floats.size
|
size += floats.size
|
||||||
|
if (outputUpToDate) {
|
||||||
outputUpToDate = false
|
outputUpToDate = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun addAll(floatList: AbstractFloatList) {
|
override fun addAll(floatList: AbstractFloatList) {
|
||||||
ensureSize(floatList.size)
|
ensureSize(floatList.size)
|
||||||
@ -84,6 +92,9 @@ class HeapArrayFloatList(
|
|||||||
}
|
}
|
||||||
System.arraycopy(source, 0, data, size, floatList.size)
|
System.arraycopy(source, 0, data, size, floatList.size)
|
||||||
size += floatList.size
|
size += floatList.size
|
||||||
|
if (outputUpToDate) {
|
||||||
|
outputUpToDate = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkOutputArray() {
|
private fun checkOutputArray() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user