Show teleportation location and phase-through blocks

This commit is contained in:
DBotThePony 2022-10-13 07:51:46 +07:00
parent 6e90378656
commit 3fa0933ac8
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 185 additions and 21 deletions

View File

@ -2,9 +2,9 @@ package ru.dbotthepony.mc.otm.android.feature
import com.mojang.blaze3d.systems.RenderSystem
import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.math.Quaternion
import com.mojang.math.Vector3f
import net.minecraft.ChatFormatting
import net.minecraft.client.renderer.LevelRenderer
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.nbt.CompoundTag
@ -15,11 +15,11 @@ import net.minecraft.sounds.SoundSource
import net.minecraft.world.level.ClipContext
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.material.Material
import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.phys.HitResult
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraftforge.client.event.RenderLevelStageEvent
import net.minecraftforge.event.entity.living.LivingDeathEvent
import org.lwjgl.opengl.GL11.GL_ALWAYS
import org.lwjgl.opengl.GL11.GL_LESS
import ru.dbotthepony.mc.otm.NULLABLE_MINECRAFT_SERVER
import ru.dbotthepony.mc.otm.OverdriveThatMatters
@ -29,8 +29,12 @@ import ru.dbotthepony.mc.otm.android.AndroidResearchManager
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
import ru.dbotthepony.mc.otm.capability.extractEnergyInnerExact
import ru.dbotthepony.mc.otm.capability.matteryPlayer
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.client.render.DynamicBufferSource
import ru.dbotthepony.mc.otm.client.render.ResearchIcons
import ru.dbotthepony.mc.otm.client.render.element
import ru.dbotthepony.mc.otm.client.render.linesIgnoreZRenderType
import ru.dbotthepony.mc.otm.core.ImmutableList
import ru.dbotthepony.mc.otm.core.Vector
import ru.dbotthepony.mc.otm.core.asVector
import ru.dbotthepony.mc.otm.core.component1
@ -86,7 +90,13 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
return false
}
private fun trace(): BlockPos? {
private data class TraceResult(val pos: BlockPos? = null, val phasedBlocks: Collection<BlockPos> = listOf()) {
companion object {
val EMPTY = TraceResult()
}
}
private fun trace(): TraceResult {
val headPosition = ply.eyePosition
val aimVector = ply.getViewVector(1f)
@ -99,7 +109,7 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
))
if (result.isInside || result.type == HitResult.Type.MISS) {
return null
return TraceResult.EMPTY
}
if (
@ -107,18 +117,18 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
isValidPosition(result.blockPos.above()) &&
shortestDistanceBetween(ply.genericPositions(), result.blockPos.above().asVector()) <= ServerConfig.EnderTeleporter.MAX_DISTANCE
) {
return result.blockPos.above()
return TraceResult(result.blockPos.above())
}
for (y in 0 .. ServerConfig.EnderTeleporter.MAX_PHASE_DISTANCE) {
val pos = result.blockPos + BlockPos(0, y + 1, 0)
if (isValidPosition(pos) && shortestDistanceBetween(ply.genericPositions(), pos.asVector()) <= ServerConfig.EnderTeleporter.MAX_DISTANCE) {
return pos
return TraceResult(pos, if (y != 0) ImmutableList(y + 1) { result.blockPos + BlockPos(0, it, 0) } else listOf())
}
}
return null
return TraceResult.EMPTY
}
override fun activate(isClient: Boolean): Boolean {
@ -126,7 +136,8 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
return false
}
val blockPos = trace() ?: return false
val (blockPos) = trace()
blockPos ?: return false
cooldown = ServerConfig.EnderTeleporter.COOLDOWN
@ -152,14 +163,19 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
}
}
override val previewRenderStage: RenderLevelStageEvent.Stage
get() = RenderLevelStageEvent.Stage.AFTER_PARTICLES
override fun renderPreview(event: RenderLevelStageEvent) {
if (!canUse()) return
val pos = trace()
val (pos, phasedBlocks) = trace()
if (pos != null) {
val (x, y, z) = pos.asVector()
val (vx, vy, vz) = event.camera.position
//event.poseStack.translate(x, y, z)
if (phasedBlocks.isNotEmpty())
event.poseStack.pushPose()
event.poseStack.translate(x - vx, y - vy, z - vz)
event.poseStack.mulPose(Vector3f.YP.rotationDegrees(-event.camera.yRot))
@ -168,12 +184,36 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
val size = 1f + sin((System.nanoTime() / 1_000_000) / 250.0).toFloat() * 0.2f
val half = size / -2f
RenderSystem.enableDepthTest()
RenderSystem.depthFunc(GL_LESS)
RenderSystem.disableDepthTest()
RenderSystem.setShaderColor(1f, 1f, 1f, 0.5f)
SPRITE.render(event.poseStack, x = half, y = half, width = size, height = size)
RenderSystem.setShaderColor(1f, 1f, 1f, 1f)
if (phasedBlocks.isNotEmpty()) {
event.poseStack.popPose()
val collisionContext = CollisionContext.of(ply)
val builder = source.getBuffer(linesIgnoreZRenderType)
for (blockPos in phasedBlocks) {
val blockState = ply.level.getBlockState(blockPos)
val shape = blockState.getShape(ply.level, blockPos, collisionContext)
LevelRenderer.renderShape(
event.poseStack,
builder,
shape,
blockPos.x - vx,
blockPos.y - vy,
blockPos.z - vz,
1f, 1f, 1f, 1f
)
}
source.endBatch(linesIgnoreZRenderType)
}
RenderSystem.enableDepthTest()
}
}
@ -190,6 +230,10 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
}
companion object {
private val source by lazy {
DynamicBufferSource(maximalInitialBufferSize = 256)
}
val SPRITE = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/item/black_hole.png").element(0f, 0f, 16f, 16f, 16f, 16f)
val POWER_COST_DESCRIPTION =

View File

@ -62,7 +62,12 @@ private fun equals(existing: ImmutableList<RenderType>?, types: ImmutableList<Re
*
* Allows to batch OTM's geometry
*/
class DynamicBufferSource(val minimalBufferSize: Int = 0) : MultiBufferSource {
class DynamicBufferSource(val minimalInitialBufferSize: Int = 0, val maximalInitialBufferSize: Int = Int.MAX_VALUE) : MultiBufferSource {
init {
require(minimalInitialBufferSize >= 0) { "Invalid minimal buffer size $minimalInitialBufferSize" }
require(maximalInitialBufferSize >= minimalInitialBufferSize) { "Maximal buffer size $maximalInitialBufferSize must be greater or equal to minimal buffer size $minimalInitialBufferSize" }
}
private inner class State(
val type: RenderType,
var after: ImmutableList<RenderType>? = null,
@ -95,7 +100,7 @@ class DynamicBufferSource(val minimalBufferSize: Int = 0) : MultiBufferSource {
var priority = -1
var dirty: Boolean = false
val builder by lazy(LazyThreadSafetyMode.NONE) {
BufferBuilder(type.bufferSize().coerceAtLeast(minimalBufferSize))
BufferBuilder(type.bufferSize().coerceAtLeast(minimalInitialBufferSize).coerceAtMost(maximalInitialBufferSize))
}
}
@ -387,8 +392,8 @@ class DynamicBufferSource(val minimalBufferSize: Int = 0) : MultiBufferSource {
}
companion object {
val GUI = DynamicBufferSource()
val WORLD = DynamicBufferSource(2 shl 16)
val GUI = DynamicBufferSource(maximalInitialBufferSize = 2 shl 8)
val WORLD = DynamicBufferSource(minimalInitialBufferSize = 2 shl 12)
/**
* Called from LevelRenderer

View File

@ -6,13 +6,15 @@ import com.mojang.blaze3d.vertex.*
import com.mojang.math.Matrix4f
import net.minecraft.client.renderer.GameRenderer
import net.minecraft.client.renderer.RenderStateShard
import net.minecraft.client.renderer.RenderStateShard.LineStateShard
import net.minecraft.client.renderer.RenderType
import net.minecraft.client.renderer.texture.TextureAtlasSprite
import org.lwjgl.opengl.GL11
import org.lwjgl.opengl.GL11.GL_ALWAYS
import org.lwjgl.opengl.GL11.GL_LESS
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.core.RGBAColor
import java.util.*
import kotlin.collections.ArrayDeque
import kotlin.math.PI
import kotlin.math.acos
import kotlin.math.cos
@ -692,6 +694,28 @@ val coloredRectRenderType by lazy {
builder.createCompositeState(false)) as RenderType
}
val linesIgnoreZRenderType by lazy {
@Suppress("INACCESSIBLE_TYPE")
RenderType.create(
"lines_ignore_z",
DefaultVertexFormat.POSITION_COLOR_NORMAL,
VertexFormat.Mode.LINES,
256,
false,
false,
RenderType.CompositeState.builder()
.setShaderState(RenderStateShard.RENDERTYPE_LINES_SHADER)
.setLineState(LineStateShard(OptionalDouble.empty()))
.setLayeringState(RenderStateShard.VIEW_OFFSET_Z_LAYERING)
.setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY)
.setOutputState(RenderStateShard.ITEM_ENTITY_TARGET)
.setWriteMaskState(RenderStateShard.COLOR_DEPTH_WRITE)
.setCullState(RenderStateShard.NO_CULL)
.setDepthTestState(RenderStateShard.NO_DEPTH_TEST)
.createCompositeState(false)
) as RenderType
}
fun VertexConsumer.quad(
pose: PoseStack,
x: Float,

View File

@ -22,6 +22,7 @@ import ru.dbotthepony.mc.otm.NULLABLE_MINECRAFT_SERVER
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.entity.matter.MatterReplicatorBlockEntity
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.client.render.DynamicBufferSource
import ru.dbotthepony.mc.otm.client.render.lockBlendFunc
import ru.dbotthepony.mc.otm.client.render.popScissorRect
import ru.dbotthepony.mc.otm.client.render.pushScissorRect
@ -37,6 +38,7 @@ class MatterReplicatorRenderer(private val context: BlockEntityRendererProvider.
companion object {
private val smoke = DustParticleOptions(Vector3f(1f, 1f, 1f), 1f)
private val rand = XoroshiroRandomSource(System.nanoTime(), System.currentTimeMillis())
private val source = DynamicBufferSource(maximalInitialBufferSize = 2 shl 10)
}
override fun render(
@ -85,10 +87,6 @@ class MatterReplicatorRenderer(private val context: BlockEntityRendererProvider.
0
)
val source = minecraft.renderBuffers().bufferSource()
source.endBatch()
context.itemRenderer.render(
item,
ItemTransforms.TransformType.NONE,

View File

@ -79,3 +79,96 @@ public com.mojang.math.Matrix3f f_8142_ # m22
public-f net.minecraft.world.inventory.Slot f_40220_ # x
public-f net.minecraft.world.inventory.Slot f_40221_ # y
public net.minecraft.client.renderer.LevelRenderer m_109782_(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lnet/minecraft/world/phys/shapes/VoxelShape;DDDFFFF)V # renderShape
public net.minecraft.client.renderer.RenderStateShard f_110135_ # ADDITIVE_TRANSPARENCY
public net.minecraft.client.renderer.RenderStateShard f_173097_ # BLOCK_SHADER
public net.minecraft.client.renderer.RenderStateShard f_110146_ # BLOCK_SHEET
public net.minecraft.client.renderer.RenderStateShard f_110145_ # BLOCK_SHEET_MIPPED
public net.minecraft.client.renderer.RenderStateShard f_110128_ # CLOUDS_TARGET
public net.minecraft.client.renderer.RenderStateShard f_110114_ # COLOR_DEPTH_WRITE
public net.minecraft.client.renderer.RenderStateShard f_110115_ # COLOR_WRITE
public net.minecraft.client.renderer.RenderStateShard f_110138_ # CRUMBLING_TRANSPARENCY
public net.minecraft.client.renderer.RenderStateShard f_110158_ # CULL
public net.minecraft.client.renderer.RenderStateShard f_110130_ # DEFAULT_LINE
public net.minecraft.client.renderer.RenderStateShard f_110148_ # DEFAULT_TEXTURING
public net.minecraft.client.renderer.RenderStateShard f_110116_ # DEPTH_WRITE
public net.minecraft.client.renderer.RenderStateShard f_110151_ # ENTITY_GLINT_TEXTURING
public net.minecraft.client.renderer.RenderStateShard f_110112_ # EQUAL_DEPTH_TEST
public net.minecraft.client.renderer.RenderStateShard f_110150_ # GLINT_TEXTURING
public net.minecraft.client.renderer.RenderStateShard f_110137_ # GLINT_TRANSPARENCY
public net.minecraft.client.renderer.RenderStateShard f_110129_ # ITEM_ENTITY_TARGET
public net.minecraft.client.renderer.RenderStateShard f_110113_ # LEQUAL_DEPTH_TEST
public net.minecraft.client.renderer.RenderStateShard f_110152_ # LIGHTMAP
public net.minecraft.client.renderer.RenderStateShard f_110136_ # LIGHTNING_TRANSPARENCY
public net.minecraft.client.renderer.RenderStateShard f_110123_ # MAIN_TARGET
public net.minecraft.client.renderer.RenderStateShard f_173098_ # NEW_ENTITY_SHADER
public net.minecraft.client.renderer.RenderStateShard f_110110_ # NO_CULL
public net.minecraft.client.renderer.RenderStateShard f_110111_ # NO_DEPTH_TEST
public net.minecraft.client.renderer.RenderStateShard f_110117_ # NO_LAYERING
public net.minecraft.client.renderer.RenderStateShard f_110153_ # NO_LIGHTMAP
public net.minecraft.client.renderer.RenderStateShard f_110155_ # NO_OVERLAY
public net.minecraft.client.renderer.RenderStateShard f_173096_ # NO_SHADER
public net.minecraft.client.renderer.RenderStateShard f_110147_ # NO_TEXTURE
public net.minecraft.client.renderer.RenderStateShard f_110134_ # NO_TRANSPARENCY
public net.minecraft.client.renderer.RenderStateShard f_110124_ # OUTLINE_TARGET
public net.minecraft.client.renderer.RenderStateShard f_110154_ # OVERLAY
public net.minecraft.client.renderer.RenderStateShard f_110126_ # PARTICLES_TARGET
public net.minecraft.client.renderer.RenderStateShard f_110118_ # POLYGON_OFFSET_LAYERING
public net.minecraft.client.renderer.RenderStateShard f_173099_ # POSITION_COLOR_LIGHTMAP_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173104_ # POSITION_COLOR_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173103_ # POSITION_COLOR_TEX_LIGHTMAP_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173101_ # POSITION_COLOR_TEX_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173100_ # POSITION_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173102_ # POSITION_TEX_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173111_ # RENDERTYPE_ARMOR_CUTOUT_NO_CULL_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173079_ # RENDERTYPE_ARMOR_ENTITY_GLINT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173078_ # RENDERTYPE_ARMOR_GLINT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173068_ # RENDERTYPE_BEACON_BEAM_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173085_ # RENDERTYPE_CRUMBLING_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173106_ # RENDERTYPE_CUTOUT_MIPPED_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173107_ # RENDERTYPE_CUTOUT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173094_ # RENDERTYPE_END_GATEWAY_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173093_ # RENDERTYPE_END_PORTAL_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173074_ # RENDERTYPE_ENERGY_SWIRL_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173072_ # RENDERTYPE_ENTITY_ALPHA_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173114_ # RENDERTYPE_ENTITY_CUTOUT_NO_CULL_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173063_ # RENDERTYPE_ENTITY_CUTOUT_NO_CULL_Z_OFFSET_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173113_ # RENDERTYPE_ENTITY_CUTOUT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173069_ # RENDERTYPE_ENTITY_DECAL_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173084_ # RENDERTYPE_ENTITY_GLINT_DIRECT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173083_ # RENDERTYPE_ENTITY_GLINT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173070_ # RENDERTYPE_ENTITY_NO_OUTLINE_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173071_ # RENDERTYPE_ENTITY_SHADOW_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173067_ # RENDERTYPE_ENTITY_SMOOTH_CUTOUT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173112_ # RENDERTYPE_ENTITY_SOLID_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173065_ # RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER
public net.minecraft.client.renderer.RenderStateShard f_234323_ # RENDERTYPE_ENTITY_TRANSLUCENT_EMISSIVE_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173066_ # RENDERTYPE_ENTITY_TRANSLUCENT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173073_ # RENDERTYPE_EYES_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173082_ # RENDERTYPE_GLINT_DIRECT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173081_ # RENDERTYPE_GLINT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173080_ # RENDERTYPE_GLINT_TRANSLUCENT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173064_ # RENDERTYPE_ITEM_ENTITY_TRANSLUCENT_CULL_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173075_ # RENDERTYPE_LEASH_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173091_ # RENDERTYPE_LIGHTNING_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173095_ # RENDERTYPE_LINES_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173077_ # RENDERTYPE_OUTLINE_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173105_ # RENDERTYPE_SOLID_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173090_ # RENDERTYPE_TEXT_INTENSITY_SEE_THROUGH_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173087_ # RENDERTYPE_TEXT_INTENSITY_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173088_ # RENDERTYPE_TEXT_SEE_THROUGH_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173086_ # RENDERTYPE_TEXT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173109_ # RENDERTYPE_TRANSLUCENT_MOVING_BLOCK_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173110_ # RENDERTYPE_TRANSLUCENT_NO_CRUMBLING_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173108_ # RENDERTYPE_TRANSLUCENT_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173092_ # RENDERTYPE_TRIPWIRE_SHADER
public net.minecraft.client.renderer.RenderStateShard f_173076_ # RENDERTYPE_WATER_MASK_SHADER
public net.minecraft.client.renderer.RenderStateShard f_110125_ # TRANSLUCENT_TARGET
public net.minecraft.client.renderer.RenderStateShard f_110139_ # TRANSLUCENT_TRANSPARENCY
public net.minecraft.client.renderer.RenderStateShard f_110119_ # VIEW_OFFSET_Z_LAYERING
public net.minecraft.client.renderer.RenderStateShard f_173089_ # VIEW_SCALE_Z_EPSILON
public net.minecraft.client.renderer.RenderStateShard f_110127_ # WEATHER_TARGET
public net.minecraft.client.renderer.RenderStateShard$LineStateShard