Nova-Committee / Re-Avaritia

MIT License
16 stars 14 forks source link

[Enhancement/功能请求] Strange border lines appear in Cosmic Render #74

Closed NOBTG closed 1 month ago

NOBTG commented 1 month ago

Checks/检查

Description/描述

This is a suggestion and doesn't have to be done, but I hope it can be fixed. 這是一個建議,並不一定要做,但我希望能修復。

NOBTG commented 1 month ago

當前版本有此狀況 image

1.18.2的原版也有 image

1.12.2的似乎沒有 image

cnlimiter commented 1 month ago

这是shader不一样的原因,1.18.2以上cosmic shader改变了

NOBTG commented 1 month ago

提個建議: RenderStateShard不用at,直接 `private static class RenderStateShardAccess extends RenderStateShard { private static final RenderStateShard.DepthTestStateShard EQUAL_DEPTH_TEST = RenderStateShard.EQUAL_DEPTH_TEST; private static final RenderStateShard.LightmapStateShard LIGHT_MAP = RenderStateShard.LIGHTMAP; private static final RenderStateShard.TransparencyStateShard TRANSLUCENT_TRANSPARENCY = RenderStateShard.TRANSLUCENT_TRANSPARENCY; private static final RenderStateShard.TextureStateShard BLOCK_SHEET_MIPPED = RenderStateShard.BLOCK_SHEET_MIPPED;

    private RenderStateShardAccess(String pName, Runnable pSetupState, Runnable pClearState) {
        super(pName, pSetupState, pClearState);
    }
}`

**即可訪問,用at會導致兼容性降低,能不用則不用。**
所以看起來像這樣

`package committee.nova.mods.avaritia.client.shader;

import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import committee.nova.mods.avaritia.Avaritia; import committee.nova.mods.avaritia.api.client.shader.CCShaderInstance; import committee.nova.mods.avaritia.api.client.shader.CCUniform; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterShadersEvent; import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod;

import java.lang.reflect.Field; import java.util.Objects;

@Mod.EventBusSubscriber(modid = Avaritia.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) public final class AvaritiaShaders { private static class RenderStateShardAccess extends RenderStateShard { private static final RenderStateShard.DepthTestStateShard EQUAL_DEPTH_TEST = RenderStateShard.EQUAL_DEPTH_TEST; private static final RenderStateShard.LightmapStateShard LIGHT_MAP = RenderStateShard.LIGHTMAP; private static final RenderStateShard.TransparencyStateShard TRANSLUCENT_TRANSPARENCY = RenderStateShard.TRANSLUCENT_TRANSPARENCY; private static final RenderStateShard.TextureStateShard BLOCK_SHEET_MIPPED = RenderStateShard.BLOCK_SHEET_MIPPED;

    private RenderStateShardAccess(String pName, Runnable pSetupState, Runnable pClearState) {
        super(pName, pSetupState, pClearState);
    }
}

public static final float[] COSMIC_UVS = new float[40];
public static boolean inventoryRender = false;
public static int renderTime;
public static float renderFrame;
public static CCShaderInstance cosmicShader;
public static CCUniform cosmicTime;
public static CCUniform cosmicYaw;
public static CCUniform cosmicPitch;
public static CCUniform cosmicExternalScale;
public static CCUniform cosmicOpacity;
public static CCUniform cosmicUVs;
public static final RenderType COSMIC_RENDER_TYPE = RenderType.create(Avaritia.MOD_ID + ":cosmic", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 2097152, true, false, RenderType.CompositeState.builder().setShaderState(new RenderStateShard.ShaderStateShard(() -> cosmicShader)).setDepthTestState(RenderStateShardAccess.EQUAL_DEPTH_TEST).setLightmapState(RenderStateShardAccess.LIGHT_MAP).setTransparencyState(RenderStateShardAccess.TRANSLUCENT_TRANSPARENCY).setTextureState(RenderStateShardAccess.BLOCK_SHEET_MIPPED).createCompositeState(true));

public static void onRegisterShaders(RegisterShadersEvent event) {
    event.registerShader(CCShaderInstance.create(event.getResourceProvider(), new ResourceLocation(Avaritia.MOD_ID, "cosmic"), DefaultVertexFormat.BLOCK), e -> {
        cosmicShader = (CCShaderInstance) e;
        cosmicTime = Objects.requireNonNull(cosmicShader.getUniform("time"));
        cosmicYaw = Objects.requireNonNull(cosmicShader.getUniform("yaw"));
        cosmicPitch = Objects.requireNonNull(cosmicShader.getUniform("pitch"));
        cosmicExternalScale = Objects.requireNonNull(cosmicShader.getUniform("externalScale"));
        cosmicOpacity = Objects.requireNonNull(cosmicShader.getUniform("opacity"));
        cosmicUVs = Objects.requireNonNull(cosmicShader.getUniform("cosmicuvs"));
        cosmicTime.set((float) renderTime + renderFrame);
        cosmicShader.onApply(() -> cosmicTime.set((float) renderTime + renderFrame));
    });
}

@SubscribeEvent
public static void renderTick(TickEvent.RenderTickEvent event) {
    if (!Minecraft.getInstance().isPaused() && event.phase == TickEvent.Phase.START) {
        renderFrame = event.renderTickTime;
    }
}

@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public static void drawScreenPre(final ScreenEvent.Render.Pre e) {
    AvaritiaShaders.inventoryRender = true;
}

@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public static void drawScreenPost(final ScreenEvent.Render.Post e) {
    AvaritiaShaders.inventoryRender = false;
}

}`

NOBTG commented 1 month ago

另外,建議有空完善一下 https://github.com/Nova-Committee/Re-Avaritia/community