Jump to content

Render custom model as a tile entity


Flenix

Recommended Posts

Hey guys,

 

I'm trying to make a tile entity with a custom model. However, in-game I just get a standard block with "Missing Texture", and this spammed in the console:

 

2013-06-12 21:45:50 [sEVERE] [Minecraft-Client] ########## GL ERROR ##########
2013-06-12 21:45:50 [sEVERE] [Minecraft-Client] @ Post render
2013-06-12 21:45:50 [sEVERE] [Minecraft-Client] 1283: Stack overflow

 

 

Anyone got any ideas?

My TileEntitySpecialRenderer class:

http://pastebin.com/T48pVFus

 

Let me know if you need to see other classes.

 

I've fixed the above, but a new issue now. The block simply isn't rendering... just an empty bounding box!

 

My code (updated)

package co.uk.silvania.roads.tileentities;

import org.lwjgl.opengl.GL11;

import co.uk.silvania.roads.Roads;
import co.uk.silvania.roads.client.TrafficLightModel;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class TileEntityTrafficLightRenderer extends TileEntitySpecialRenderer {

TrafficLightModel model;

public TileEntityTrafficLightRenderer() {
	model = new TrafficLightModel();
}

@Override
public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) {

	GL11.glPushMatrix();

	GL11.glTranslatef((float)d, (float)d1, (float)d2);
	TileEntity te = (TileEntityTrafficLightEntity)tileentity;

	renderBlock(te, tileentity.worldObj, tileentity.xCoord, tileentity.yCoord, tileentity.zCoord, Roads.trafficLight);
	GL11.glPopMatrix();
}

public void renderBlock(TileEntity te, World world, int i, int j, int k, Block block) {

	Tessellator tessellator = Tessellator.instance;

	float f = block.getBlockBrightness(world, i, j, k);
	int l = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
	int l1 = l % 65536;
	int l2 = l / 65536;
	tessellator.setColorOpaque_F(f, f, f);
	OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)l1, (float)l2);

	int dir = world.getBlockMetadata(i, j, k);

	GL11.glPushMatrix();
	GL11.glTranslatef(0.5F, 0F, 0.5F);
	GL11.glRotatef(dir * (-90F), 0F, 1F, 0F);
	GL11.glTranslatef(-0.5F, 0F, -0.5F);
	bindTextureByName("/mods/roads/textures/blocks/TrafficLightPoleRed.png");
	GL11.glPopMatrix();
}


}

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Link to comment
Share on other sites

You....are not doing things the way I'm doing them, and it does not appear that your....renderer has any quads or a model to draw.

 

Here's mine:

 

package draco18s.traps.client;

import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.tileentity.TileEntity;

public class SpikesRenderer extends TileEntitySpecialRenderer {
private SpikesModel spikes = new SpikesModel();

@Override
public void renderTileEntityAt(TileEntity tileentity, double d0, double d1, double d2, float f) {
	spikes.render(tileentity, d0, d1, d2);
}
}

 

SpikesModel

 

// Date: 6/9/2013 12:58:24 AM
// Template version 1.1
// Java generated by Techne
// Keep in mind that you still need to fill in some blanks
// - ZeuX

package draco18s.traps.client;

import org.lwjgl.opengl.GL11;

import cpw.mods.fml.client.FMLClientHandler;
import draco18s.traps.entities.EntitySpikes;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.tileentity.TileEntity;

public class SpikesModel extends ModelBase
{
//fields
ModelRenderer Base;
ModelRenderer SpikeLower2;
ModelRenderer SpikeUpper2;
ModelRenderer SpikeLower4;
ModelRenderer SpikeUpper4;
ModelRenderer SpikeLower1;
ModelRenderer SpikeUpper1;
ModelRenderer SpikeLower3;
ModelRenderer SpikeUpper3;

public SpikesModel()
{
	textureWidth = 64;
	textureHeight = 32;

	Base = new ModelRenderer(this, 0, 0);
	Base.addBox(0F, 0F, 0F, 16, 1, 16);
	Base.setRotationPoint(-8F, 8F, -8F);
	Base.setTextureSize(64, 32);
	Base.mirror = true;
	setRotation(Base, 0F, 0F, 0F);
	/*SpikeLower2 = new ModelRenderer(this, 32, 17);
	SpikeLower2.addBox(-2F, 0F, -2F, 4, 5, 4);
	SpikeLower2.setRotationPoint(-4F, 14F, 4F);
	SpikeLower2.setTextureSize(64, 32);
	SpikeLower2.mirror = true;
	setRotation(SpikeLower2, 0F, 0F, 0F);
	SpikeUpper2 = new ModelRenderer(this, 24, 17);
	SpikeUpper2.addBox(-1F, 0F, -1F, 2, 8, 2);
	SpikeUpper2.setRotationPoint(-4F, 22F, 4F);
	SpikeUpper2.setTextureSize(64, 32);
	SpikeUpper2.mirror = true;
	setRotation(SpikeUpper2, 0F, 0F, 0F);*/
	SpikeLower4 = new ModelRenderer(this, 0, 17);
	SpikeLower4.addBox(0F, 0F, 0F, 4, 5, 4);
	SpikeLower4.setRotationPoint(2F, 14F, -2F);
	SpikeLower4.setTextureSize(64, 32);
	SpikeLower4.mirror = true;
	setRotation(SpikeLower4, 0F, 0F, 0F);
	SpikeUpper4 = new ModelRenderer(this, 16, 17);
	SpikeUpper4.addBox(0F, 0F, 0F, 2, 8, 2);
	SpikeUpper4.setRotationPoint(3F, 22F, -3F);
	SpikeUpper4.setTextureSize(64, 32);
	SpikeUpper4.mirror = true;
	setRotation(SpikeUpper4, 0F, 0F, 0F);
	SpikeLower1 = new ModelRenderer(this, 0, 17);
	SpikeLower1.addBox(-2F, 0F, -2F, 4, 5, 4);
	SpikeLower1.setRotationPoint(-4F, 14F, -4F);
	SpikeLower1.setTextureSize(64, 32);
	SpikeLower1.mirror = true;
	setRotation(SpikeLower1, 0F, 0F, 0F);
	SpikeUpper1 = new ModelRenderer(this, 16, 17);
	SpikeUpper1.addBox(-1F, 0F, -1F, 2, 8, 2);
	SpikeUpper1.setRotationPoint(-4F, 22F, -4F);
	SpikeUpper1.setTextureSize(64, 32);
	SpikeUpper1.mirror = true;
	setRotation(SpikeUpper1, 0F, 0F, 0F);
	SpikeLower3 = new ModelRenderer(this, 0, 17);
	SpikeLower3.addBox(-2F, 0F, -2F, 4, 5, 4);
	SpikeLower3.setRotationPoint(4F, 14F, 4F);
	SpikeLower3.setTextureSize(64, 32);
	SpikeLower3.mirror = true;
	setRotation(SpikeLower3, 0F, 0F, 0F);
	SpikeUpper3 = new ModelRenderer(this, 16, 17);
	SpikeUpper3.addBox(-1F, 0F, -1F, 2, 8, 2);
	SpikeUpper3.setRotationPoint(4F, 22F, 4F);
	SpikeUpper3.setTextureSize(64, 32);
	SpikeUpper3.mirror = true;
	setRotation(SpikeUpper3, 0F, 0F, 0F);
}

public void render(TileEntity te, double x, double y, double z) {
	EntitySpikes es = (EntitySpikes)te;
	setBlood(es.isBloody);
	GL11.glPushMatrix();
	GL11.glTranslatef((float)x + 0.5f, (float)y - 0.5f, (float)z + 0.5f);
	//GL11.glScalef(0.5f, 0.5f, 0.5f);
	FMLClientHandler.instance().getClient().renderEngine.bindTexture("/mods/Traps/textures/entities/spike.png");
	this.render();
    GL11.glPopMatrix();
}

private void render() {
	setRotation(SpikeLower1, 3.1415F, 0, 0);
	setRotation(SpikeLower2, 3.1415F, 0, 0);
	setRotation(SpikeLower3, 3.1415F, 0, 0);
	setRotation(SpikeLower4, 3.1415F, 0, 0);
	setRotation(SpikeUpper1, 3.1415F, 0, 0);
	setRotation(SpikeUpper2, 3.1415F, 0, 0);
	setRotation(SpikeUpper3, 3.1415F, 0, 0);
	setRotation(SpikeUpper4, 3.1415F, 0, 0);
	Base.render(0.0625F);
	SpikeLower1.render(0.0625F);
	SpikeLower2.render(0.0625F);
	SpikeLower3.render(0.0625F);
	SpikeLower4.render(0.0625F);
	SpikeUpper1.render(0.0625F);
	SpikeUpper2.render(0.0625F);
	SpikeUpper3.render(0.0625F);
	SpikeUpper4.render(0.0625F);
}

private void setRotation(ModelRenderer model, float x, float y, float z)
{
	model.rotateAngleX = x;
	model.rotateAngleY = y;
	model.rotateAngleZ = z;
}

public void setBlood(int t) {
	if(t == 2) {
		SpikeLower2 = new ModelRenderer(this, 0, 0);
		SpikeUpper2 = new ModelRenderer(this, 48, 0);
	}
	else if(t == 1) {
		SpikeLower2 = new ModelRenderer(this, 32, 17);
		SpikeUpper2 = new ModelRenderer(this, 24, 17);
	}
	else {
		SpikeLower2 = new ModelRenderer(this, 0, 17);
		SpikeUpper2 = new ModelRenderer(this, 16, 17);
	}
	SpikeLower2.addBox(-2F, 0F, -2F, 4, 5, 4);
	SpikeLower2.setRotationPoint(-4F, 14F, 4F);
	SpikeLower2.setTextureSize(64, 32);
	SpikeLower2.mirror = true;
	setRotation(SpikeLower2, 0F, 0F, 0F);
	SpikeUpper2.addBox(-1F, 0F, -1F, 2, 8, 2);
	SpikeUpper2.setRotationPoint(-4F, 22F, 4F);
	SpikeUpper2.setTextureSize(64, 32);
	SpikeUpper2.mirror = true;
	setRotation(SpikeUpper2, 0F, 0F, 0F);
}
}

 

 

Model was exported from Techne and minorly tweaked.*

 

*Imports and oddly, the model came in upside down and I had to figure out how to flip it back over.

 

 

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

I've been getting some help on #MinecraftForgeTuts, and mine does import now but always with some sort of render bug.

 

It's usually upside down, but I've got it tweaked so it's been inside the player, moving around depending on the players position, or even inside-out. I can't get it to go the right way up, and stay there.

 

What did you do to fix it?

Here's my current code:

 

package co.uk.silvania.roads.tileentities;

import org.lwjgl.opengl.GL11;


import co.uk.silvania.roads.Roads;
import co.uk.silvania.roads.client.TrafficLightModel;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;


public class TileEntityTrafficLightRenderer extends TileEntitySpecialRenderer {

private final TrafficLightModel model;

public TileEntityTrafficLightRenderer() {
	this.model = new TrafficLightModel();
}

@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale) {
	GL11.glPushMatrix();
	GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
	bindTextureByName("/mods/roads/textures/blocks/TrafficLightPoleRed.png");
	this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
	GL11.glPopMatrix();
}

private void adjustRotatePivotViaMeta(World world, int x, int y, int z) {
	int meta = world.getBlockMetadata(x, y, z);
	GL11.glRotatef(meta * (90), 0.0F, 1.0F, 0.0F);
}

private void adjustLightFixture(World world, int i, int j, int k, Block block) {
	Tessellator tess = Tessellator.instance;
	float brightness = block.getBlockBrightness(world, i, j, k);
	int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
	int modulousModifier = skyLight % 65536;
	int divModifier = skyLight / 65536;
	tess.setColorOpaque_F(brightness, brightness, brightness);
	OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit,  (float) modulousModifier,  divModifier);
}
}

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Link to comment
Share on other sites

I went in and rotated each cube of my model in the model code and repositioned them by hand.  Not the easiest or most elegant way to do it, but it worked.

 

And if you think rendering it inside the player is weird, try this:

 

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

That's certainly... interesting.

 

Anyways, figured it out now. Here's the working code:

 

package co.uk.silvania.roads.tileentities;

import org.lwjgl.opengl.GL11;


import co.uk.silvania.roads.Roads;
import co.uk.silvania.roads.client.TrafficLightModel;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;


public class TileEntityTrafficLightRenderer extends TileEntitySpecialRenderer {

private final TrafficLightModel model;

    private final boolean powered;

public TileEntityTrafficLightRenderer(boolean par2) {
	this.model = new TrafficLightModel();
    this.powered = par2;
}

@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale) {
	GL11.glPushMatrix();
	GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
	if (this.powered) {
		bindTextureByName("/mods/roads/textures/blocks/TrafficLightPoleGreen.png");
	} else {
		bindTextureByName("/mods/roads/textures/blocks/TrafficLightPoleRed.png");			
	}
	GL11.glPushMatrix();
	GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); //This was the important bit. But you need the extra Push/Pop!
	this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
	GL11.glPopMatrix();
	GL11.glPopMatrix();
}

private void adjustRotatePivotViaMeta(World world, int x, int y, int z) {
	int meta = world.getBlockMetadata(x, y, z);
	GL11.glPushMatrix();
	GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
	GL11.glPopMatrix();
}

private void adjustLightFixture(World world, int i, int j, int k, Block block) {
	Tessellator tess = Tessellator.instance;
	float brightness = block.getBlockBrightness(world, i, j, k);
	int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
	int modulousModifier = skyLight % 65536;
	int divModifier = skyLight / 65536;
	tess.setColorOpaque_F(brightness, brightness, brightness);
	OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit,  (float) modulousModifier,  divModifier);
}
}

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Link to comment
Share on other sites

I'm on my phone ATM sorry :P

If you go on google and search FlenixRoads one of the first results is my GitHub repo.

 

In there, you need to find my Tileentities package. Pick one of the block names (TileEntityTrafficLight is a good example) and copy the block, entity and renderer classes.

 

Then go to my client package and get TrafficLightModel (just for now). Also look in the client proxy and copy the one line for the traffic light.

 

After that just do registerblock as normal for TileEntityTrafficLightBlock. Test it and all should be working, so then you can edit it as required.

 

Ill write a wiki on it when I'm home :)

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Link to comment
Share on other sites

I GOT IT TO RENDER! :D (sorry for caps, very exciting!)

 

I just changed my block to extend BlockContainer instead of Block, and it works! :D

 

Thank you so much!

 

Please write the wiki page too, because I'm sure there are lots of people still trying to get this correct for the new versions.

Link to comment
Share on other sites

That's a lot more important than you think it is ;)

 

I'll write the wiki when I've got a few hours free, so it'll be sunday or monday. It's one of those things that's really underdocumented (same as liquids which I wrote the 1.4.7 wiki page on... I should update that...)

 

As we've both got it working I'll lock this now. Anyone else who gets stuck can use my code as mentioned above, or PM me :)

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

Announcements



×
×
  • Create New...

Important Information

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