Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ sourceSets {
"heckerpowered/matrix/mixin/GameRendererStandaloneMixin.java",
"heckerpowered/matrix/mixin/KeyboardMixin.java",
"heckerpowered/matrix/mixin/LevelMixin.java",
"heckerpowered/matrix/mixin/LevelRendererStandaloneMixin.java",
"heckerpowered/matrix/mixin/LivingEntityMixin.java",
"heckerpowered/matrix/mixin/MinecraftMixin.java",
"heckerpowered/matrix/mixin/MinecraftServerMixin.java",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* SPDX-License-Identifier: MIT
* Copyright (c) 2026 heckerpowered
*/

package heckerpowered.matrix.mixin;

import com.mojang.blaze3d.buffers.GpuBufferSlice;
import com.mojang.blaze3d.resource.ResourceHandle;
import heckerpowered.matrix.client.render.ScreenEffectRenderer;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.chunk.ChunkSectionsToRender;
import net.minecraft.client.renderer.feature.FeatureRenderDispatcher.PreparedFrame;
import net.minecraft.client.renderer.state.level.LevelRenderState;
import net.minecraft.util.profiling.ProfilerFiller;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(LevelRenderer.class)
class LevelRendererStandaloneMixin {
private LevelRendererStandaloneMixin() {
}

@Inject(
method = "lambda$addMainPass$0",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher$PreparedFrame;executeSolid()V",
shift = At.Shift.BEFORE
)
)
private void matrix$beginRenderEntityEffects(
GpuBufferSlice gpuBufferSlice,
LevelRenderState levelRenderState,
ProfilerFiller profiler,
ChunkSectionsToRender sectionsToRender,
ResourceHandle resourceHandle,
PreparedFrame preparedFrame,
ResourceHandle resourceHandle2,
ResourceHandle resourceHandle3,
ResourceHandle resourceHandle4,
ResourceHandle resourceHandle5,
CallbackInfo ci
) {
ScreenEffectRenderer.beginRenderEntity();
}

@Inject(
method = "lambda$addMainPass$0",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher$PreparedFrame;executeTranslucentAfterTerrain()V",
shift = At.Shift.AFTER
)
)
private void matrix$endRenderEntityEffects(
GpuBufferSlice gpuBufferSlice,
LevelRenderState levelRenderState,
ProfilerFiller profiler,
ChunkSectionsToRender sectionsToRender,
ResourceHandle resourceHandle,
PreparedFrame preparedFrame,
ResourceHandle resourceHandle2,
ResourceHandle resourceHandle3,
ResourceHandle resourceHandle4,
ResourceHandle resourceHandle5,
CallbackInfo ci
) {
ScreenEffectRenderer.endRenderEntity();
}
}
29 changes: 29 additions & 0 deletions common/src/main/kotlin/heckerpowered/matrix/client/MatrixClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ package heckerpowered.matrix.client
import heckerpowered.matrix.Matrix
import heckerpowered.matrix.client.network.MatrixClientPlayNetworking
import heckerpowered.matrix.client.render.ChannelSequenceRenderer
import heckerpowered.matrix.client.render.MatrixGuiPipelines
import heckerpowered.matrix.client.render.MatrixPointSpriteParticles
import heckerpowered.matrix.client.render.MatrixRenderSystem
import heckerpowered.matrix.client.render.MatrixShaderPipelines
import heckerpowered.matrix.client.render.ScreenEffectRenderer
import heckerpowered.matrix.client.render.TargetGuideRenderer
import heckerpowered.matrix.client.render.entity.DevEntityRenderer
Expand All @@ -30,8 +33,13 @@ import heckerpowered.matrix.common.magic.core.Magic
import heckerpowered.matrix.common.magic.system.Magics
import heckerpowered.matrix.core.isInfiniteMana
import net.fabricmc.api.ClientModInitializer
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry
import net.fabricmc.fabric.api.resource.ResourceManagerHelper
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener
import org.joml.Matrix4f
import net.minecraft.server.packs.PackType
import net.minecraft.server.packs.resources.ResourceManager
import java.time.Duration

val projectionMatrix: Matrix4f
Expand Down Expand Up @@ -72,10 +80,12 @@ class MatrixClient : ClientModInitializer {
MatrixClientPlayNetworking.onInitialize()
DamageNumberHud.onInitialize()
ScreenEffectRenderer.onInitialize()
MatrixPointSpriteParticles.onInitialize()
ChannelSequenceRenderer.onInitialize()
TargetGuideRenderer.onInitialize()
ShockwaveRenderer.onInitialize()
MatrixKeyBindings.onInitialize()
registerShaderReloadListener()
registerEntityRenderers()
onWindowInitialization()
}
Expand All @@ -87,6 +97,23 @@ class MatrixClient : ClientModInitializer {
EntityRendererRegistry.register<DevEntity>(ModEntityTypes.devEntity) { context -> DevEntityRenderer(context) }
}

private fun registerShaderReloadListener() {
ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener(
object : SimpleSynchronousResourceReloadListener {
override fun getFabricId() = Matrix.identifier("shader_pipeline_reload")

override fun onResourceManagerReload(resourceManager: ResourceManager) {
MatrixShaderPipelines.requestPostPipelinePrecompile()
MatrixGuiPipelines.requestGuiPipelinePrecompile()
}
}
)
ClientTickEvents.END_CLIENT_TICK.register {
MatrixShaderPipelines.runRequestedPrecompileIfPossible()
MatrixGuiPipelines.runRequestedPrecompileIfPossible()
}
}

companion object {
private var lastNonEmptyMagicList: List<Magic>? = null
private var shaderPipelinesInitialized = false
Expand All @@ -112,6 +139,8 @@ class MatrixClient : ClientModInitializer {
shaderPipelinesInitialized = true
ShaderStageStore.Default.discoverFiles()
ShaderStageStore.Default.precompileAll()
MatrixShaderPipelines.registerKnownPostPipelines()
MatrixGuiPipelines.registerKnownGuiPipelines()
}
}
}
17 changes: 16 additions & 1 deletion common/src/main/kotlin/heckerpowered/matrix/client/MatrixHud.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import heckerpowered.matrix.client.core.ClientOptions.aimAssistMaxDistance
import heckerpowered.matrix.client.event.KeyEvent
import heckerpowered.matrix.client.event.MouseButtonEvent
import heckerpowered.matrix.client.render.PostProcessRenderer
import heckerpowered.matrix.client.render.MatrixGuiPipelines
import heckerpowered.matrix.client.shader.BlitProgram
import heckerpowered.matrix.client.shader.ResourceShader
import heckerpowered.matrix.client.ui.element.ManaBar
Expand Down Expand Up @@ -158,6 +159,7 @@ object MatrixHud {
private val manaOverclockAnimation = SimpleDoubleAnimation(initValue = 1.0)
private val magicOverclockAnimation = SimpleDoubleAnimation(initValue = 1.0)
private val grayscaleIntensityAnimation = SimpleDoubleAnimation(initValue = .0)
private val dissolveAnimation = SimpleDoubleAnimation(initValue = 1.0)
private val crosshairX = SimpleDoubleAnimation(initValue = .0)
private val crosshairY = SimpleDoubleAnimation(initValue = .0)
private val magicHudTimeScale = TimeController.allocateTimeController()
Expand Down Expand Up @@ -666,6 +668,9 @@ object MatrixHud {
magicShownOpacityAnimation.value = 1.0
manaShownAnimation.value = .0
manaOpacityAnimation.value = 1.0
dissolveAnimation.duration = Duration.ofMillis(1000)
dissolveAnimation.startTime = Duration.ZERO
dissolveAnimation.value = .0
entityDescriptionOpacityAnimation.value = if (targetedEntity != null) 1.0 else .0
descriptionYOffsetAnimation.value = if (targetedEntity != null) .0 else -35.0
AimAssist.resetAnimation()
Expand All @@ -687,6 +692,8 @@ object MatrixHud {
entityDescriptionOpacityAnimation.value = .0
descriptionYOffsetAnimation.value = -35.0
fovAnimation.value = 1.0
dissolveAnimation.duration = Duration.ofMillis(300)
dissolveAnimation.value = 1.0

// takeScreenShot = true
manaBar.onHudVisibilityChanged(false)
Expand Down Expand Up @@ -990,7 +997,15 @@ object MatrixHud {
val top = (height / 2.0 - 100.0 - offsetY / 2.0).roundToInt()
val bottom = (height / 2.0 + 100.0 + offsetY / 2.0).roundToInt()

drawContext.fill(left, top, right, bottom, color((alpha * 127.5).roundToInt(), 255, 255, 255))
MatrixGuiPipelines.drawDissolveRect(
drawContext,
left,
top,
right,
bottom,
color((alpha * 127.5).roundToInt(), 255, 255, 255),
dissolveAnimation.animatedValue.toFloat(),
)

val target = cachedTargetedEntity
val descriptionAlpha = min(alpha, entityDescriptionOpacityAnimation.animatedValue)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* SPDX-License-Identifier: MIT
* Copyright (c) 2026 heckerpowered
*/

package heckerpowered.matrix.client.render

import com.mojang.blaze3d.systems.RenderSystem

object MatrixGraphicsBackend {
private val deviceClassName: String?
get() = RenderSystem.tryGetDevice()?.javaClass?.name

fun isVulkan(): Boolean {
return deviceClassName?.contains("vulkan", ignoreCase = true) == true
}

fun isOpenGl(): Boolean {
val name = deviceClassName ?: return false
return name.contains("opengl", ignoreCase = true) || name.contains(".Gl", ignoreCase = false)
}
}
Loading
Loading