Skip to content

Instantly share code, notes, and snippets.

@AlexIIL
Created January 31, 2016 13:52
Show Gist options
  • Save AlexIIL/487ece89d9ad36eab04f to your computer and use it in GitHub Desktop.
Save AlexIIL/487ece89d9ad36eab04f to your computer and use it in GitHub Desktop.
package net.minecraftforge.debug;
import java.util.*;
import javax.vecmath.Vector2f;
import javax.vecmath.Vector3f;
import javax.vecmath.Vector4f;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.client.renderer.vertex.VertexFormatElement.EnumUsage;
import net.minecraft.client.resources.model.IBakedModel;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumWorldBlockLayer;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.model.pipeline.LightUtil;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
@Mod(modid = "LedModelTest", name = "LedModelTest", version = "0.0.0", clientSideOnly = true)
public class LedModelTest {
public static LEDBlock testBlock;
public static final VertexFormat ITEM_LMAP = new VertexFormat(DefaultVertexFormats.ITEM);
static {
ITEM_LMAP.addElement(DefaultVertexFormats.TEX_2S);
}
@EventHandler
public void init(FMLInitializationEvent event) {
MinecraftForge.EVENT_BUS.register(this);
GameRegistry.registerBlock(testBlock = new LEDBlock(), "always_on_led");
}
@SubscribeEvent
public void onModelBakeEvent(ModelBakeEvent event) {
event.modelRegistry.putObject(new ModelResourceLocation("ledmodeltest:always_on_led"), new LEDModel());
}
public static class LEDModel implements IBakedModel {
private final List<BakedQuad> quads = new ArrayList<>();
public LEDModel() {
TextureAtlasSprite sprite = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("minecraft:blocks/redstone_block");
float[][] positions = new float[][] {
{0.75f, 0.5f, 0.75f},
{0.75f, 0.5f, 0.25f},
{0.25f, 0.5f, 0.25f},
{0.25f, 0.5f, 0.75f}
};
float[][] uvs = new float[][] {
{1, 0},
{1, 1},
{0, 1},
{0, 0}
};
float[][][] data = new float[4][][];
for (int v = 0; v < 4; v++) {
// Position
data[v] = new float[6][];
data[v][0] = positions[v];
// Colour
data[v][1] = new float[] {1, 1, 1, 1};
// UV
data[v][2] = new float[2];
data[v][2][0] = sprite.getInterpolatedU(16 * uvs[v][0]);
data[v][2][1] = sprite.getInterpolatedV(16 * uvs[v][1]);
// Normal
data[v][3] = new float[] {0, 1, 0};
// Padding
data[v][4] = new float[] {0};
// LightMap
data[v][5] = new float[] {0.015f, 0};
}
quads.add(new UnpackedBakedQuad(data, -1, EnumFacing.UP, ITEM_LMAP));
float[][] positions2 = new float[][] {
{0.6f, 0.6f, 0.6f},
{0.6f, 0.6f, 0.4f},
{0.4f, 0.6f, 0.4f},
{0.4f, 0.6f, 0.6f}
};
float[][][] data2 = new float[4][][];
for (int v = 0; v < 4; v++) {
// Position
data2[v] = new float[6][];
data2[v][0] = positions2[v];
// Colour
data2[v][1] = new float[] {1, 1, 1, 1};
// UV
data2[v][2] = new float[2];
data2[v][2][0] = sprite.getInterpolatedU(16*uvs[v][0]);
data2[v][2][1] = sprite.getInterpolatedV(16*uvs[v][1]);
// Normal
data2[v][3] = new float[] {0, 1, 0};
// Padding
data2[v][4] = new float[] {0};
// Lightmap
data2[v][5] = new float[] {0.0015f, 0};
}
quads.add(new UnpackedBakedQuad(data2, -1, EnumFacing.UP, ITEM_LMAP));
List<BakedQuad> q2 = new ArrayList<>(quads);
quads.clear();
boolean has = false;
for (BakedQuad quad : q2) {
FMLLog.info("\n" +toStringPretty(quad));
quads.add(quad);
}
}
public static String toStringPretty(BakedQuad unpacked) {
StringBuilder builder = new StringBuilder();
int[] data = unpacked.getVertexData();
int stride = data.length / 4;
for (int v = 0; v < 4; v++) {
builder.append("\nV#" + v + "=[");
for (int e = 0; e < stride; e++) {
if (e != 0) builder.append(", ");
int d = data[v * stride + e];
builder.append(Integer.toHexString(d));
}
builder.append("]");
}
String s = builder.toString();
return s;
}
@Override
public List<BakedQuad> getFaceQuads(EnumFacing p_177551_1_) {
return Collections.emptyList();
}
@Override
public List<BakedQuad> getGeneralQuads() {
return quads;
}
@Override
public boolean isAmbientOcclusion() {
return false;
}
@Override
public boolean isGui3d() {
return false;
}
@Override
public boolean isBuiltInRenderer() {
return false;
}
@Override
public TextureAtlasSprite getParticleTexture() {
return null;
}
@Override
public ItemCameraTransforms getItemCameraTransforms() {
return ItemCameraTransforms.DEFAULT;
}
}
public static class LEDBlock extends Block {
public LEDBlock() {
super(Material.glass);
setHardness(7);
setCreativeTab(CreativeTabs.tabBlock);
setUnlocalizedName("led_test");
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean isFullCube() {
return false;
}
@Override
public boolean canRenderInLayer(EnumWorldBlockLayer layer) {
return layer == EnumWorldBlockLayer.SOLID;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment