BadCodeBuilder
BadCodeBuilder

Reputation: 94

How to draw a line in Minecraft with Fabric

Final target: draw a line in sky

Env

Config in build.properties

    minecraft_version=1.18.2
    yarn_mappings=1.18.2+build.3
    loader_version=0.13.3
    fabric_version=0.51.1+1.18.2

Development environment:

Code

SkyRenderer code

@Environment(EnvType.CLIENT)
public class OverworldSkyRenderer implements DimensionRenderingRegistry.SkyRenderer {
    @Override
    public void render(WorldRenderContext context) {
        RenderSystem.disableTexture();
        RenderSystem.enableDepthTest();
        RenderSystem.depthFunc(515);
        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.depthMask(false);

        Tessellator tessellator = Tessellator.getInstance();
        BufferBuilder bufferBuilder = tessellator.getBuffer();

        RenderSystem.setShader(GameRenderer::getPositionColorShader);
        bufferBuilder.begin(VertexFormat.DrawMode.LINES, VertexFormats.POSITION_COLOR);
        bufferBuilder.vertex(0f,0f,0f).color(255,255,255,255).next();
        bufferBuilder.vertex(3f,3f,3f).color(255,255,255,255).next();
        tessellator.draw();

        RenderSystem.enableCull();
        RenderSystem.depthMask(true);
        RenderSystem.disableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.enableTexture();
    }
}

And Mod initialization code

public class MainMod implements ModInitializer {
    @Override
    public void onInitialize() {
        // Register sky renderer
        DimensionRenderingRegistry.registerSkyRenderer(
                RegistryKey.of(Registry.WORLD_KEY, new Identifier("overworld")),
                new OverworldSkyRenderer()
        );
        DimensionRenderingRegistry.registerDimensionEffects(
                new Identifier("overworld"),
                new DimensionEffects.End()
        );
    }
}

Result and Assumption

But it did not work, at least I did not find any line in my view(F5 has been used).

I consulted some code of fabric-carpet

There are some difference, but I think these are not the key point

Here are some of my assumptions:

If anyone can help me?

Upvotes: 2

Views: 3384

Answers (1)

BadCodeBuilder
BadCodeBuilder

Reputation: 94

My solution is using VertexFormat.Mode.DEBUG_LINES

Here I found an issue related to this question, although it is Forge, not Fabric.

In this issue, it found that LINES, LINE_STRIP cannot be rendered for that they do not pass correct mode argument when invoking glDrawElements, so it cannot be rendered correctly. And DEBUG_LINES and DEBUG_LINE_STRIP have correct mode.

Before I found this issue, I tried some code in ChunkBoarderDebugRenderer, which uses VertexFormat.Mode.DEBUG_LINE_STRIP, and it did work!

So what I did was changing:

bufferBuilder.begin(VertexFormat.DrawMode.LINES, VertexFormats.POSITION_COLOR);

to

bufferBuilder.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR);

And the vertex of second point(Camera looks at Z-negative, which means you can only see the point with negative z. I am noob for opengl T_T)

So here is my changed code

@Environment(EnvType.CLIENT)
public class OverworldSkyRenderer implements DimensionRenderingRegistry.SkyRenderer {
    @Override
    public void render(WorldRenderContext context) {
        // ...
        RenderSystem.setShader(GameRenderer::getPositionColorShader);
        bufferBuilder.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR);
        bufferBuilder.vertex(1f,0f,-3f).color(255,0,0,255).next();
        bufferBuilder.vertex(1f,3f,-3f).color(255,0,0,255).next();
        tessellator.draw();
        // ...
    }
}

And the screenshot

After changed code

However, TRIANGLE cannot work, although it has correct mode value. I am trying to figure it out.

Upvotes: 1

Related Questions