Created
January 31, 2016 13:52
-
-
Save AlexIIL/487ece89d9ad36eab04f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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