Jump to content

Recommended Posts

Posted

Hello,

 

I have this simple texture for my Block (which is not a TileEntity), that is going to be the interior Block of a MultiBlock structure.

What I want to achieve is, that the block changes its color and animation speed while the Multiblock is doing its job.

 

So I have said Texture (16x16) with transparent pixels, and I want to merge that with a couple of other textures (depending on the state of the controller block) for the animation, those are 16x320px pngs with different colors, and animation speeds.

 

Now, how can I combine these textures, so that the main texture is the top layer, and you can see the color change through the transparent pixels?

Sure, I could just copy&paste the transparent top layer to all colored animations, but the interior block is supposed to have connected textures,

so that would result in a massive amount of png files. Not the way I'd like to go.

 

I've been reading all day about Tessellator, ISBRH and that stuff, but all tutorials where either outdated, didn't work for me (No doubt i derped somewhere), or it was way to complicated for me to understand.

Can someone guide me here please? All this rendering stuff is to complicated for my brain somehow.  :-[

 

 

-Namikon

Posted

Blocks can have multiple render layers.

These are also called rendering passes.

In your iicon register method, register icons for all layers.

Now, there's big good method getIICon with world, position and render layer parameters. Here you can check if your block is forming multiblock, and return textures based on rendering pass...

Note: you have to override some methods in order for multiple layers to work...

Posted

Ok, so in my getIIcon method I already have around 20 textures being registered, for all possible combinations of the connected texture feature.

But I must be blind, to me it looks like neither the IIconRegister.registerIcon, nor the IIcon has has a function or property to define the Layer for the texture...?

Same for the Block class. There are a bunch of methods that relate to rendering, but for most of them (Those I let google search for) lead me to the ISBR thing.

Is that the way to go?

Posted

Ok, so in my getIIcon method I already have around 20 textures being registered, for all possible combinations of the connected texture feature.

But I must be blind, to me it looks like neither the IIconRegister.registerIcon, nor the IIcon has has a function or property to define the Layer for the texture...?

Same for the Block class. There are a bunch of methods that relate to rendering, but for most of them (Those I let google search for) lead me to the ISBR thing.

Is that the way to go?

No.

First, there will be no registerIICon method with layer param, here you just register ALL your textures for ALL layers.

Second, here's excact methods that you have to use...

 

Actually, sorry, it is not possible in 1.7.10 without TESR or ISBR...

Altough, mutli layer rendering is possible with items (1.7.10&1.8) and with blocks in 1.8 without TESR or ISBR...

Posted

Aha,  good. I thought I derped hard on this. Well, not a problem. Can you recommend some tutorials for TESR and ISBR? For this case, I'll need something for non tile entities, as only the controller block will be one. So I guess I need ISBR then..?

 

 

Ok, I got it to the point where I managed to have a custom renderer for my Block. (Found the "Diamond in ice" tutorial).

But now I have a problem, the Block does render in both pass 0 and 1, but the Texture that is rendered in pass 1, is always the one that is visible.

My idea was, to draw the background texture in pass 0, and the Texture with transparent pixels on top of that, in pass 1.

But the texture from pass 0 is overwritten with the one from pass 1; The transparent areas show the grass below it, it's completely replaced.

 

 

This is my (messy..) function to render the Block:

CoreBlock tBlock = (CoreBlock)block;

FMLLog.log(Level.INFO, "RenderPass: %d start", tProxy.renderPass);
if(tProxy.renderPass == 0)
{
IIcon tBackL = tBlock.getNormalIcon();
float u = tBackL.getMinU();
float v = tBackL.getMinV();
float U = tBackL.getMaxU();
float V = tBackL.getMaxV();

Tessellator tes = Tessellator.instance;
tes.addTranslation(x, y, z);

tes.addVertexWithUV(0, 1, 1, u, v);
tes.addVertexWithUV(1, 1, 1, u, V);
tes.addVertexWithUV(1, 1, 0, U, V);
tes.addVertexWithUV(0, 1, 0, U, v);

tes.addTranslation(-x, -y, -z);
FMLLog.log(Level.INFO, "RenderPass 0 done");
}
else                    
{
IIcon tTopL = tBlock.getAlpaIcon();
float u = tTopL.getMinU();
float v = tTopL.getMinV();
float U = tTopL.getMaxU();
float V = tTopL.getMaxV();

Tessellator tes = Tessellator.instance;
tes.addTranslation(x, y, z);

tes.addVertexWithUV(0, 1, 1, u, v);
tes.addVertexWithUV(1, 1, 1, u, V);
tes.addVertexWithUV(1, 1, 0, U, V);
tes.addVertexWithUV(0, 1, 0, U, v);

tes.addTranslation(-x, -y, -z);
FMLLog.log(Level.INFO, "RenderPass 1 done");
}

 

This is the actual result:

 

Also, I wonder if that will work with an animated texture. (The one i've tried is not).

The renderer is only called when I place/break something around it, I assume it needs to redraw the texture to

"animate" the background layer?

Posted

Heh, it's always good when you find the solution yourself.

 

Ok, for anyone who is struggling with the same Problem, here is the solution: (Improvements are welcome!)

 

Goal:

A block that has an animated texture as background (That can be swapped dynamically; For example in a multiblock),

and a second texture on top of that, with transparent areas. (Good if you want to fade something in and out)

 

First, you should read this tutorial; It's working with 1.7.10 and explains a lot: http://www.minecraftforge.net/wiki/Multiple_Pass_Render_Blocks

Second, you don't need that "drawDiamond" function:

 

- Set the animated texture as default icon (getIIcon()) in your Block

- In your ISBRH Class, for Render pass 0, let Minecraft render the Block itself (And the animation!) with renderStandardBlockWithAmbientOcclusion

- Then, retrieve the texture with your alpha channel areas, and tell the renderer to draw every face of that Block again, but this time with your new texture.

- Done! There you have your animated block :)

 

 

This is the actual function i'm using now:

@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {

	ClientProxy tProxy = (ClientProxy)MyMod.proxy;

	CoreBlock tBlock = (CoreBlock)block;
	if(tProxy.renderPass == 0)
	{
		renderer.renderStandardBlockWithAmbientOcclusion(block, x, y, z, 1, 1, 1);

		IIcon ico = tBlock.getAlpaIcon();
		renderer.renderFaceXNeg(block, x, y, z, ico);
		renderer.renderFaceXPos(block, x, y, z, ico);

		renderer.renderFaceYNeg(block, x, y, z, ico);
		renderer.renderFaceYPos(block, x, y, z, ico);

		renderer.renderFaceZNeg(block, x, y, z, ico);
		renderer.renderFaceZPos(block, x, y, z, ico);
	}

	return false;
}

 

If it's a terrible way to do it, please tell me. But it seems to work fine :)

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.