Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

Hi,

 

I'm trying to draw a cube in the world. It's being rendered, but in the wrong position. When the player moves, so does the cube, even if the translation part of the following code is commented out. There must be an offset I'm missing to get the positioning correct.

 

@SubscribeEvent
	public void onRenderWorldLast(RenderWorldLastEvent event)
	{
	    double x_fix = mc.player.lastTickPosX + (mc.player.posX - mc.player.lastTickPosX) * event.getPartialTicks();
	    double y_fix = mc.player.lastTickPosY + (mc.player.posY - mc.player.lastTickPosY) * event.getPartialTicks();
	    double z_fix = mc.player.lastTickPosZ + (mc.player.posZ - mc.player.lastTickPosZ) * event.getPartialTicks();
	    GL11.glPushMatrix();
	    
	    GL11.glTranslated(-x_fix, -y_fix, -z_fix);
	    GL11.glDisable(GL11.GL_DEPTH_TEST);
	    GL11.glDisable(GL11.GL_LIGHTING);
	    GL11.glEnable(GL11.GL_BLEND);
	    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
	    GL11.glDisable(GL11.GL_TEXTURE_2D);
	    
	    for (BlockPos pos : blocks)
	    {
	    	int x = pos.getX();
	    	int y = pos.getY();
	    	int z = pos.getZ();
	    	
	    	GL11.glColor4f(1.0F, 0.0F, 0.0F, 0.5F);
	    	box(new AxisAlignedBB(x, y, z, x + 1, y + 1, z + 1));
	    	//GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.75F);
	    	//lines(new AxisAlignedBB(x, z, y, x + 1, z + 1, y + 1));
	    	GL11.glColor4f(1F, 1F, 1F, 1F);
	    }
	    
	    GL11.glEnable(GL11.GL_TEXTURE_2D);
	    GL11.glDisable(GL11.GL_BLEND);
	    GL11.glEnable(GL11.GL_LIGHTING);
	    GL11.glEnable(GL11.GL_DEPTH_TEST);
	    GL11.glPopMatrix();
	}
	
	public void box(AxisAlignedBB aabb)
	{
        Tessellator tessellator = Tessellator.getInstance();
        BufferBuilder worldrenderer = tessellator.getBuffer();

        // top
        worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION);
        worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex();
        worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex();
        tessellator.draw();

        // bottom
        worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION);
        worldrenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex();
        tessellator.draw();

        // north
        worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION);
        worldrenderer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex();
        tessellator.draw();
        
        // south
        worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION);
        worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex();
        worldrenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex();
        tessellator.draw();
        
        // west
        worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION);
        worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex();
        tessellator.draw();
        
        // east
        worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION);
        worldrenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex();
        worldrenderer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex();
        worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex();
        tessellator.draw();
    }

 

Edited by AntiRix

33 minutes ago, AntiRix said:

There must be an offset I'm missing to get the positioning correct.

You have to offset based on the players position because that's where 0,0,0 is considered to be.

 

OP is already doing it.

Edited by Animefan8888
Can't see what is blatently in front of myself.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

2 minutes ago, AntiRix said:

Isn't that already what the code is doing?

Also don't use GL calls directly switch it all to the GLStateManager variant.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

25 minutes ago, AntiRix said:

GL11

Don't use GL11 directly, use GlStateManager otherwise you are screwing up minecraft's state machine.

 

26 minutes ago, AntiRix said:

double x_fix = mc.player.lastTickPosX + (mc.player.posX - mc.player.lastTickPosX) * event.getPartialTicks();

Well, what if the player isn't the camera? What if the player spectates as a zombie? Use Minecraft#getRenderViewEntity instead.

 

28 minutes ago, AntiRix said:

public void box(AxisAlignedBB aabb)

Any reason you are rendering your box in 6 passes? Do it in one. Draw calls are expensive.

 

6 minutes ago, Animefan8888 said:

You have to offset based on the players position because that's where 0,0,0 is considered to be.

That's what the OP is doing:

29 minutes ago, AntiRix said:

double x_fix = mc.player.lastTickPosX + (mc.player.posX - mc.player.lastTickPosX) * event.getPartialTicks();

 double y_fix = mc.player.lastTickPosY + (mc.player.posY - mc.player.lastTickPosY) * event.getPartialTicks();

double z_fix = mc.player.lastTickPosZ + (mc.player.posZ - mc.player.lastTickPosZ) * event.getPartialTicks(); GL11.glPushMatrix();

GL11.glTranslated(-x_fix, -y_fix, -z_fix);

If you translate by -camerapos then you get the world's 0,0,0 origin.

 

I am actually unable to replicate the issue with the code provided, the cube renders in the correct spot for me...

  • Author

Ah, a silly mistake with how I was storing the block positions to be rendered.

 

BlockPos.getAllInBoxMutable(centre.add(-radius, -radius, -radius), centre.add(radius, radius, radius)).forEach(pos ->
        {
        	Block block = world.getBlockState(pos).getBlock();
        	String material = block.getLocalizedName();
        	
        	if (!material.startsWith("tile.skull")) return;
        	
        	//TileEntitySkull skull = (TileEntitySkull)world.getTileEntity(pos);
        	blocks.add(pos);
        	mc.player.sendMessage(new TextComponentString(pos.toString()));
        });

 

Changing the method to getAllInBox fixed it. I have no clue why because the output in chat was the same for both. That means the position in the list was being altered by the time the cube was rendered.

 

After a bit of trial and error, I've also managed to make that other code efficient and it's working nicely now

Edited by AntiRix

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.