Skip to content

Instantly share code, notes, and snippets.

@StillManic
Created July 31, 2015 21:32
Show Gist options
  • Save StillManic/57dad4e8500e0493a878 to your computer and use it in GitHub Desktop.
Save StillManic/57dad4e8500e0493a878 to your computer and use it in GitHub Desktop.
public static class CustomTileEntity8Renderer extends TileEntitySpecialRenderer
{
public CustomTileEntity8Renderer() {}
@Override
public void renderTileEntityAt(TileEntity tile, double posX, double posY, double posZ, float partialTicks, int destroyStage)
{
if (tile instanceof CustomTileEntity8)
{
this.bindTexture(new ResourceLocation(MODID.toLowerCase() + ":" + "textures/eye128.png"));
try
{
IModel model = ModelLoaderRegistry.getModel(new ResourceLocation(MODID.toLowerCase() + ":" + "block/eye.obj"));
Function<ResourceLocation, TextureAtlasSprite> textureGetter = new Function<ResourceLocation, TextureAtlasSprite>()
{
public TextureAtlasSprite apply(ResourceLocation location)
{
return Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(location.toString());
}
};
// look vector = target-self; yaw = atan2(look.z,look.x), pitch = atan2(y, sqrt(x*x+z*z))
// FMLLog.info("X: %f, Y: %f, Z: %f", posX, posY, posZ);
// FMLLog.info("X: %d, Y: %d, Z: %d", tile.getPos().getX(), tile.getPos().getY(), tile.getPos().getZ());
// Vector3d teLoc = new Vector3d(posX, posY, posZ);
Vector3d teLoc = new Vector3d(tile.getPos().getX(), tile.getPos().getY(), tile.getPos().getZ());
Vector3d playerLoc = new Vector3d();
playerLoc.setX(Minecraft.getMinecraft().thePlayer.getPositionVector().xCoord);
playerLoc.setY(Minecraft.getMinecraft().thePlayer.getPositionVector().yCoord);
playerLoc.setZ(Minecraft.getMinecraft().thePlayer.getPositionVector().zCoord);
// FMLLog.info("player: X: %f, Y: %f, Z: %f", playerLoc.x, playerLoc.y, playerLoc.z);
// FMLLog.info("passed: X: %f, Y: %f, Z: %f", posX, posY, posZ);
double angleYaw = teLoc.angle(new Vector3d(playerLoc.getX(), teLoc.getY(), playerLoc.getZ()));
// double angleYaw = teLoc.angle(new Vector3d(playerLoc.getX(), posY, playerLoc.getZ()));
FMLLog.info("yaw angle: %f", angleYaw);
double anglePitch = teLoc.angle(new Vector3d(teLoc.getX(), playerLoc.getY(), playerLoc.getZ()));
// double anglePitch = teLoc.angle(new Vector3d(posX, playerLoc.getY(), playerLoc.getZ()));
FMLLog.info("pitch angle: %f", anglePitch);
// AxisAngle4d yaw = new AxisAngle4d(teLoc, angleYaw);
// AxisAngle4d pitch = new AxisAngle4d(teLoc, anglePitch);
AxisAngle4d yaw = new AxisAngle4d(0, 1, 0, angleYaw);
AxisAngle4d pitch = new AxisAngle4d(1, 0, 0, anglePitch);
Quat4f leftRot = new Quat4f(0, 0, 0, 1);
Quat4f yawQuat = new Quat4f();
Quat4f pitchQuat = new Quat4f();
yawQuat.set(yaw);
leftRot.mul(yawQuat);
pitchQuat.set(pitch);
leftRot.mul(pitchQuat);
Matrix4f matrix = new Matrix4f();
matrix.setIdentity();
matrix.setRotation(leftRot);
TRSRTransformation transform = new TRSRTransformation(matrix);
OBJModel.OBJState state = new OBJModel.OBJState(Lists.newArrayList(OBJModel.Group.ALL), true, transform, (OBJModel) model);
((CustomTileEntity8) tile).state = state;
IFlexibleBakedModel modelBaked = model.bake(state, Attributes.DEFAULT_BAKED_FORMAT, textureGetter);
// OBJBakedModel modelBaked = (OBJBakedModel) model.bake(state, Attributes.DEFAULT_BAKED_FORMAT, textureGetter);
// modelBaked.scheduleRebake();
// boolean success = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelRenderer().renderModel(tile.getWorld(), modelBaked, tile.getBlockType().getDefaultState(), tile.getPos(), Tessellator.getInstance().getWorldRenderer());
// FMLLog.info("rendered: %b", success);
// FMLLog.info("mat lib size: %d", ((OBJModel) model).getMatLib().getMaterialNames().size());
// FMLLog.info("generalQuads: %d", modelBaked.getGeneralQuads().size());
Tessellator.getInstance().getWorldRenderer().setVertexFormat(Attributes.DEFAULT_BAKED_FORMAT);
Tessellator.getInstance().getWorldRenderer().startDrawingQuads();
for (Iterator iter = modelBaked.getGeneralQuads().iterator(); iter.hasNext(); Tessellator.getInstance().getWorldRenderer().putPosition((double) tile.getPos().getX(), (double) tile.getPos().getY(), (double) tile.getPos().getZ()))
{
BakedQuad quad = (BakedQuad)iter.next();
// Tessellator.getInstance().getWorldRenderer().startDrawingQuads();
Tessellator.getInstance().getWorldRenderer().addVertexData(quad.getVertexData());
Tessellator.getInstance().draw();
}
}
catch (IOException e)
{
FMLLog.info("failed to find the model");
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment