Jump to content

[Solved] Trouble using RenderBlocks and a TileEntitySpecialRenderer


itsonlydan

Recommended Posts

I am attempting to make a block that will appear as another block in the game, depending on the id passed into it. To do this I am using a TileEntitySpecialRenderer, and calling RenderBlocks.renderBlockByRenderType, as shown below. This works perfectly for all 1mx1mx1m blocks, but it renders everything else at that size. For items that are not full blocks, but are using textures that are from full block (e.g. half slabs and fences), this just renders a full block using that texture (so a fence appears as oak planks). For other blocks (such as a cactus), there are just gaps between the textures. I don't have much experience with custom rendering in minecraft/forge, and was hoping that somebody could help.

 

From my TileEntitySpecialRenderer subclass:

 
@Override
public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) {
   TileEntityCamouflaged te = (TileEntityCamouflaged)tileEntity;
   Block block = te.getTextureBlock();
   RenderBlocks renderBlocks = new RenderBlocks(tileEntity.worldObj);
   renderBlocks.renderBlockByRenderType(block, te.xCoord, te.yCoord, te.zCoord);
}

 

Methods overwritten in my block class:

        @Override
public boolean renderAsNormalBlock() {
	return false;
}

@Override
public boolean isOpaqueCube() {
	return false;
}

@Override
public boolean shouldSideBeRendered(IBlockAccess blockAccess, int x, int y, int z, int side) {
	System.out.println("shouldSideBeRendered at " + x + ", " + y + ", " + z + " on side " + side);
	int newX = x;
	int newY = y;
	int newZ = z;

	//The x, y and z coordinates appear to change because of the side
	switch (side) {
	case 0:
		++newY;
		break;
	case 1:
		--newY;
		break;
	case 2:
		++newZ;
		break;
	case 3:
		--newZ;
		break;
	case 4:
		++newX;
		break;
	case 5:
		--newX;
		break;
	}

	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(newX, newY, newZ);
	if (tileEntity == null) return false;
	return tileEntity.getTextureBlock().shouldSideBeRendered(blockAccess, x, y, z, side);
}

@Override
public Icon getBlockTexture(IBlockAccess blockAccess, int x, int y, int z, int side) {
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	return tileEntity.getTextureBlock().getBlockTexture(blockAccess, x, y, z, side);
}

@Override
public boolean isBlockSolid(IBlockAccess blockAccess, int x, int y, int z, int side) {
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	return tileEntity.getTextureBlock().isBlockSolid(blockAccess, x, y, z, side);
}

@Override
public int colorMultiplier(IBlockAccess blockAccess, int x, int y, int z) {
	System.out.println("colorMultiplier at " + x + ", " + y + ", " + z);
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	return tileEntity.getTextureBlock().colorMultiplier(blockAccess, x, y, z);
}

@Override
public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int x, int y, int z) {
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	tileEntity.getTextureBlock().setBlockBoundsBasedOnState(blockAccess, x, y, z);
}

@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.getCollisionBoundingBoxFromPool(world, x, y, z);
}

@Override
public int getLightOpacity(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.getLightOpacity(world, x, y, z);
}

@Override
 public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.getSelectedBoundingBoxFromPool(world, x, y, z);
}

@Override
public boolean isBlockNormalCube(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.isBlockNormalCube(world, x, y, z);
}

@Override
public boolean isBlockSolidOnSide(World world, int x, int y, int z, ForgeDirection side) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.isBlockSolidOnSide(world, x, y, z, side);
}

//I am not sure about this one, though it fixes the rendering of ice, and doesn't appear to cause problems with anything that already worked.
@Override
public int getRenderBlockPass() {
	return 1;
}

Link to comment
Share on other sites

How about these methods:

@Override
public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int x, int y, int z) {
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	tileEntity.getTextureBlock().setBlockBoundsBasedOnState(blockAccess, x, y, z);
}

@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.getCollisionBoundingBoxFromPool(world, x, y, z);
}

If you guys dont get it.. then well ya.. try harder...

Link to comment
Share on other sites

renderBlocks.renderBlockByRenderType(block, te.xCoord, te.yCoord, te.zCoord);

This is the problem. Check what this method does.

 

It gets the render type of the block passed in, and then goes on to add vertexes to the tessellator instance based on the block passed in as the first parameter. It does call the right method (e.g. if I pass in a cobweb, then it calls the renderCrossedSquares function), and the methods are being called to add coordinates to the tessellator. I'm still not sure what I'm doing wrong.

Link to comment
Share on other sites

Thank you! That was a stupid oversight on my part. I've got it working now.

 

That wasn't the only step to fixing this, so just in case anyone in the future is having trouble doing a similar thing, my rendering code now looks like this:

 

        @Override
public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) {
	TileEntityCamouflaged te = (TileEntityCamouflaged)tileEntity;
	Block block = te.getTextureBlock();

	Minecraft.getMinecraft().renderEngine.func_110577_a(TextureMap.field_110575_b);

	//Disable standard lighting. This is done the same as in TileEntityRendererPiston.
	RenderHelper.disableStandardItemLighting();
                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                GL11.glEnable(GL11.GL_BLEND);
                //GL11.glDisable(GL11.GL_CULL_FACE); This was initially part of the code that was taken from the piston, but it was causing some of the rendering to look of, e.g. with a cobweb (it would look thicker as both sides were rendering due to this being disabled).

        if (Minecraft.isAmbientOcclusionEnabled())
        {
            GL11.glShadeModel(GL11.GL_SMOOTH);
        }
        else
        {
            GL11.glShadeModel(GL11.GL_FLAT);
        }
	GL11.glPushMatrix();
	GL11.glTranslated(d0, d1, d2);
	Tessellator tessellator = Tessellator.instance;
	tessellator.startDrawingQuads();
	RenderBlocks renderBlocks = new RenderBlocks(tileEntity.worldObj);

                //To get the block to render in the right place, I had to pass in 0, 0, 0 as the coordinates for renderBlockByRenderType. This however means that it will use the properties of the block at 0, 0, 0 for some things. This translation allows for the actual block coordinates to be passed in.
	tessellator.setTranslation(-te.xCoord, -te.yCoord, -te.zCoord);
	renderBlocks.renderBlockByRenderType(block, te.xCoord, te.yCoord, te.zCoord);
	tessellator.draw();
	tessellator.setTranslation(0, 0, 0);
	GL11.glPopMatrix();

	//Reset to standard lighting
	RenderHelper.enableStandardItemLighting();
}

Link to comment
Share on other sites

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...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

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