mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-17 11:24:56 -04:00
entity renderer: use camera world offset
This commit is contained in:
parent
544b3a3407
commit
cb121b115b
@ -38,7 +38,7 @@ class WorldOffset(private val camera: Camera) : Drawable {
|
|||||||
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val MAX_DISTANCE = (World.MAX_RENDER_DISTANCE * 2) * ProtocolDefinition.SECTION_WIDTH_X // coordinates higher than that value are not allowed
|
const val MAX_DISTANCE = World.MAX_RENDER_DISTANCE * ProtocolDefinition.SECTION_WIDTH_X // coordinates higher than that value are not allowed
|
||||||
const val MIN_DISTANCE = MAX_DISTANCE - (World.MAX_RENDER_DISTANCE / 4) * ProtocolDefinition.SECTION_WIDTH_X // only if value is lower that that value coordinates will be back offset
|
const val MIN_DISTANCE = MAX_DISTANCE - (World.MAX_RENDER_DISTANCE / 4) * ProtocolDefinition.SECTION_WIDTH_X // only if value is lower that that value coordinates will be back offset
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,8 @@ class EntityRenderer(
|
|||||||
var visibleCount: Int = 0
|
var visibleCount: Int = 0
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
private var reset = false
|
||||||
|
|
||||||
override fun init(latch: CountUpAndDownLatch) {
|
override fun init(latch: CountUpAndDownLatch) {
|
||||||
connection.events.listen<EntitySpawnEvent> { event ->
|
connection.events.listen<EntitySpawnEvent> { event ->
|
||||||
if (event.entity is LocalPlayerEntity) return@listen
|
if (event.entity is LocalPlayerEntity) return@listen
|
||||||
@ -75,6 +77,7 @@ class EntityRenderer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
profile.hitbox::enabled.observe(this) { this.hitboxes = it }
|
profile.hitbox::enabled.observe(this) { this.hitboxes = it }
|
||||||
|
context.camera.offset::offset.observe(this) { reset = true }
|
||||||
|
|
||||||
context.inputHandler.registerKeyCallback(
|
context.inputHandler.registerKeyCallback(
|
||||||
HITBOX_TOGGLE_KEY_COMBINATION,
|
HITBOX_TOGGLE_KEY_COMBINATION,
|
||||||
@ -104,8 +107,12 @@ class EntityRenderer(
|
|||||||
|
|
||||||
override fun prePrepareDraw() {
|
override fun prePrepareDraw() {
|
||||||
val count = AtomicInteger()
|
val count = AtomicInteger()
|
||||||
|
val reset = reset
|
||||||
runAsync {
|
runAsync {
|
||||||
it.entity.draw(millis())
|
it.entity.draw(millis())
|
||||||
|
if (reset) {
|
||||||
|
it.reset()
|
||||||
|
}
|
||||||
it.update = it.checkUpdate()
|
it.update = it.checkUpdate()
|
||||||
it.prepareAsync()
|
it.prepareAsync()
|
||||||
if (it.visible) {
|
if (it.visible) {
|
||||||
@ -113,6 +120,9 @@ class EntityRenderer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.visibleCount = count.get()
|
this.visibleCount = count.get()
|
||||||
|
if (reset) {
|
||||||
|
this.reset = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun postPrepareDraw() {
|
override fun postPrepareDraw() {
|
||||||
|
@ -23,4 +23,6 @@ interface ModelUpdater : Drawable {
|
|||||||
fun prepare() = Unit
|
fun prepare() = Unit
|
||||||
|
|
||||||
fun unload() = Unit
|
fun unload() = Unit
|
||||||
|
|
||||||
|
fun reset() = Unit
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.entity.hitbox
|
package de.bixilon.minosoft.gui.rendering.entity.hitbox
|
||||||
|
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
|
import de.bixilon.kotlinglm.vec3.Vec3d
|
||||||
import de.bixilon.minosoft.data.entities.entities.LivingEntity
|
import de.bixilon.minosoft.data.entities.entities.LivingEntity
|
||||||
import de.bixilon.minosoft.data.registries.shapes.aabb.AABB
|
import de.bixilon.minosoft.data.registries.shapes.aabb.AABB
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
@ -31,7 +32,6 @@ class EntityHitbox(
|
|||||||
private var aabb: AABB = model.aabb
|
private var aabb: AABB = model.aabb
|
||||||
private var data: HitboxData? = null
|
private var data: HitboxData? = null
|
||||||
|
|
||||||
private var update = true
|
|
||||||
|
|
||||||
var enabled: Boolean = true
|
var enabled: Boolean = true
|
||||||
get() = field && model.renderer.hitboxes
|
get() = field && model.renderer.hitboxes
|
||||||
@ -52,7 +52,6 @@ class EntityHitbox(
|
|||||||
}
|
}
|
||||||
this.data = data
|
this.data = data
|
||||||
this.aabb = aabb
|
this.aabb = aabb
|
||||||
update = true
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -80,18 +79,21 @@ class EntityHitbox(
|
|||||||
} else {
|
} else {
|
||||||
mesh.drawAABB(aabb = shrunk, color = data.color, margin = 0.1f)
|
mesh.drawAABB(aabb = shrunk, color = data.color, margin = 0.1f)
|
||||||
}
|
}
|
||||||
val center = Vec3(shrunk.center)
|
val offset = model.context.camera.offset.offset
|
||||||
|
val center = Vec3(shrunk.center - offset)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
data.velocity?.let { mesh.drawLine(center, center + Vec3(it) * 3, color = ChatColors.YELLOW) }
|
data.velocity?.let { mesh.drawLine(center, center + Vec3(it) * 3, color = ChatColors.YELLOW) }
|
||||||
|
|
||||||
val eyeHeight = shrunk.min.y + model.entity.eyeHeight
|
val eyeHeight = shrunk.min.y + model.entity.eyeHeight
|
||||||
val eyeAABB = AABB(Vec3(shrunk.min.x, eyeHeight, shrunk.min.z), Vec3(shrunk.max.x, eyeHeight, shrunk.max.z)).hShrink(RenderConstants.DEFAULT_LINE_WIDTH)
|
val eyeAABB = AABB(Vec3d(shrunk.min.x, eyeHeight, shrunk.min.z), Vec3d(shrunk.max.x, eyeHeight, shrunk.max.z)).hShrink(-RenderConstants.DEFAULT_LINE_WIDTH)
|
||||||
mesh.drawAABB(eyeAABB, RenderConstants.DEFAULT_LINE_WIDTH, ChatColors.DARK_RED)
|
mesh.drawAABB(eyeAABB, RenderConstants.DEFAULT_LINE_WIDTH, ChatColors.DARK_RED)
|
||||||
|
|
||||||
|
|
||||||
val eyeStart = Vec3(center.x, eyeHeight, center.z)
|
val eyeStart = Vec3(center.x, eyeHeight - offset.y, center.z)
|
||||||
|
|
||||||
mesh.drawLine(eyeStart, eyeStart + Vec3(data.rotation.front) * 5.0f, color = ChatColors.BLUE)
|
mesh.drawLine(eyeStart, eyeStart + data.rotation.front * 5.0f, color = ChatColors.BLUE)
|
||||||
this.mesh = mesh
|
this.mesh = mesh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,11 @@ abstract class EntityModel<E : Entity>(
|
|||||||
return update
|
return update
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun reset() {
|
||||||
|
update = true
|
||||||
|
hitbox.reset()
|
||||||
|
}
|
||||||
|
|
||||||
override fun prepareAsync() {
|
override fun prepareAsync() {
|
||||||
if (!update) {
|
if (!update) {
|
||||||
return
|
return
|
||||||
|
@ -77,6 +77,10 @@ class CloudLayer(
|
|||||||
if (offset.y != 0) pushZ(offset.y == 1)
|
if (offset.y != 0) pushZ(offset.y == 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun reset() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private fun reset(cloudPosition: Vec2i) {
|
private fun reset(cloudPosition: Vec2i) {
|
||||||
for (array in arrays.unsafeCast<Array<CloudArray?>>()) {
|
for (array in arrays.unsafeCast<Array<CloudArray?>>()) {
|
||||||
array?.unload()
|
array?.unload()
|
||||||
@ -92,9 +96,13 @@ class CloudLayer(
|
|||||||
return this shr 4
|
return this shr 4
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updatePosition() {
|
private fun calculateCloudPosition(): Vec2i {
|
||||||
val offset = this.offset.toInt()
|
val offset = this.offset.toInt()
|
||||||
val position = clouds.connection.player.physics.positionInfo.chunkPosition + Vec2i(offset / CloudArray.CLOUD_SIZE, 0)
|
return clouds.connection.player.physics.positionInfo.chunkPosition + Vec2i(offset / CloudArray.CLOUD_SIZE, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updatePosition() {
|
||||||
|
val position = calculateCloudPosition()
|
||||||
if (position == this.position) {
|
if (position == this.position) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -63,12 +63,16 @@ class CloudRenderer(
|
|||||||
var delta = 0.0f
|
var delta = 0.0f
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
private var reset = false
|
||||||
|
|
||||||
override val skipOpaque: Boolean
|
override val skipOpaque: Boolean
|
||||||
get() = !sky.effects.clouds || !sky.profile.clouds.enabled || connection.profiles.block.viewDistance < 3 || layers.isEmpty()
|
get() = !sky.effects.clouds || !sky.profile.clouds.enabled || connection.profiles.block.viewDistance < 3 || layers.isEmpty()
|
||||||
|
|
||||||
|
|
||||||
override fun asyncInit(latch: CountUpAndDownLatch) {
|
override fun asyncInit(latch: CountUpAndDownLatch) {
|
||||||
matrix.load(connection.assetsManager)
|
matrix.load(connection.assetsManager)
|
||||||
|
|
||||||
|
context.camera.offset::offset.observe(this) { reset() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getCloudHeight(index: Int): IntRange {
|
private fun getCloudHeight(index: Int): IntRange {
|
||||||
@ -103,6 +107,10 @@ class CloudRenderer(
|
|||||||
sky.profile.clouds::flat.observe(this, instant = true) { this.flat = it }
|
sky.profile.clouds::flat.observe(this, instant = true) { this.flat = it }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun reset() {
|
||||||
|
reset = true
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateLayers(layers: Int) {
|
private fun updateLayers(layers: Int) {
|
||||||
while (layers < this.layers.size) {
|
while (layers < this.layers.size) {
|
||||||
toUnload += this.layers.removeLast()
|
toUnload += this.layers.removeLast()
|
||||||
@ -117,6 +125,11 @@ class CloudRenderer(
|
|||||||
if (!sky.effects.clouds) {
|
if (!sky.effects.clouds) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (reset) {
|
||||||
|
updateLayers(0)
|
||||||
|
updateLayers(nextLayers)
|
||||||
|
reset = false
|
||||||
|
}
|
||||||
if (layers.size != nextLayers) {
|
if (layers.size != nextLayers) {
|
||||||
updateLayers(nextLayers)
|
updateLayers(nextLayers)
|
||||||
}
|
}
|
||||||
@ -236,8 +249,8 @@ class CloudRenderer(
|
|||||||
setYOffset()
|
setYOffset()
|
||||||
|
|
||||||
|
|
||||||
for (array in layers) {
|
for (layer in layers) {
|
||||||
array.draw()
|
layer.draw()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,8 +80,9 @@ open class LineMesh(context: RenderContext) : GenericColorMesh(context) {
|
|||||||
|
|
||||||
fun drawLazyAABB(aabb: AABB, color: RGBColor) {
|
fun drawLazyAABB(aabb: AABB, color: RGBColor) {
|
||||||
data.ensureSize(6 * order.size * GenericColorMeshStruct.FLOATS_PER_VERTEX)
|
data.ensureSize(6 * order.size * GenericColorMeshStruct.FLOATS_PER_VERTEX)
|
||||||
|
val offset = context.camera.offset.offset
|
||||||
for (direction in Directions.VALUES) {
|
for (direction in Directions.VALUES) {
|
||||||
val positions = direction.getPositions(Vec3(aabb.min), Vec3(aabb.max))
|
val positions = direction.getPositions(Vec3(aabb.min - offset), Vec3(aabb.max - offset))
|
||||||
for ((positionIndex, _) in order) {
|
for ((positionIndex, _) in order) {
|
||||||
addVertex(positions[positionIndex], color)
|
addVertex(positions[positionIndex], color)
|
||||||
}
|
}
|
||||||
@ -90,8 +91,9 @@ open class LineMesh(context: RenderContext) : GenericColorMesh(context) {
|
|||||||
|
|
||||||
fun drawAABB(aabb: AABB, lineWidth: Float = RenderConstants.DEFAULT_LINE_WIDTH, color: RGBColor, margin: Float = 0.0f, shape: AbstractVoxelShape? = null) {
|
fun drawAABB(aabb: AABB, lineWidth: Float = RenderConstants.DEFAULT_LINE_WIDTH, color: RGBColor, margin: Float = 0.0f, shape: AbstractVoxelShape? = null) {
|
||||||
data.ensureSize(12 * 4 * order.size * GenericColorMeshStruct.FLOATS_PER_VERTEX)
|
data.ensureSize(12 * 4 * order.size * GenericColorMeshStruct.FLOATS_PER_VERTEX)
|
||||||
val min = aabb.min - margin
|
val offset = context.camera.offset.offset
|
||||||
val max = aabb.max + margin
|
val min = aabb.min - margin - offset
|
||||||
|
val max = aabb.max + margin - offset
|
||||||
|
|
||||||
fun tryDrawLine(start: Vec3, end: Vec3) {
|
fun tryDrawLine(start: Vec3, end: Vec3) {
|
||||||
tryDrawLine(start, end, lineWidth, color, shape)
|
tryDrawLine(start, end, lineWidth, color, shape)
|
||||||
|
@ -63,7 +63,6 @@ class BlockOutlineRenderer(
|
|||||||
override var unload: Boolean = false
|
override var unload: Boolean = false
|
||||||
|
|
||||||
override fun init(latch: CountUpAndDownLatch) {
|
override fun init(latch: CountUpAndDownLatch) {
|
||||||
val profile = connection.profiles.block
|
|
||||||
this.profile::enabled.observe(this) { reload = true }
|
this.profile::enabled.observe(this) { reload = true }
|
||||||
this.profile::collisions.observe(this) { reload = true }
|
this.profile::collisions.observe(this) { reload = true }
|
||||||
this.profile::outlineColor.observe(this) { reload = true }
|
this.profile::outlineColor.observe(this) { reload = true }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user