Search in sources :

Example 1 with ModelStateComposition

use of net.minecraftforge.client.model.ModelStateComposition in project Charset by CharsetMC.

the class RendererGate method bake.

@Override
public IBakedModel bake(PartGate gate, boolean isItem, BlockRenderLayer blockRenderLayer) {
    SimpleBakedModel result = new SimpleBakedModel(this);
    ModelStateComposition transform = new ModelStateComposition(new TRSRTransformation(ROTATIONS_SIDE[gate.getSide().ordinal()]), new TRSRTransformation(ROTATIONS_TOP[gate.getTop().ordinal()]));
    if (gate.mirrored) {
        transform = new ModelStateComposition(transform, new TRSRTransformation(null, null, new Vector3f(-1.0f, 1.0f, 1.0f), null));
    }
    GateLogic logic = gate.logic;
    GateRenderDefinitions.Definition definition = GateRenderDefinitions.INSTANCE.getGateDefinition(SimpleLogicGates.getId(logic));
    if (definition == null) {
        result.addModel(ModelLoaderRegistry.getMissingModel().bake(transform, DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()));
        return result;
    }
    GateRenderDefinitions.BaseDefinition base = GateRenderDefinitions.INSTANCE.base;
    IModel model = definition.getModel(gate.getModelName());
    if (model != null) {
        result.addModel(model.bake(transform, DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()));
    }
    IModel layerModel = definition.getModel("layer");
    int i = 0;
    for (GateRenderDefinitions.Layer layer : definition.layers) {
        GateLogic.State state = gate.logic.getLayerState(i++);
        if (state == GateLogic.State.NO_RENDER) {
            continue;
        }
        IModelState layerTransform = transform;
        if (layer.height != 0) {
            layerTransform = new ModelStateComposition(new TRSRTransformation(new Vector3f(0, (float) layer.height / 16f, 0), null, null, null), transform);
        }
        if ("color".equals(layer.type) && layer.texture != null) {
            model = layerModels.get(layer.texture);
            if (model == null) {
                model = layerModel.retexture(ImmutableMap.of("layer", layer.texture));
                layerModels.put(layer.texture, model);
            }
            IBakedModel bakedModel = model.bake(layerTransform, DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter());
            int color = state == GateLogic.State.ON ? base.colorMul.get("on") : (state == GateLogic.State.OFF ? base.colorMul.get("off") : base.colorMul.get("disabled"));
            result.addModel(ModelTransformer.transform(bakedModel, SimpleLogicGates.blockGate.getDefaultState(), 0, ((quad, element, data) -> {
                if (element.getUsage() == VertexFormatElement.EnumUsage.COLOR) {
                    return new float[] { ((color) & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, ((color >> 16) & 0xFF) / 255.0f, 1 };
                } else {
                    return data;
                }
            })));
        } else if ("map".equals(layer.type) && layer.textures != null) {
            String texture = layer.textures.get(state.name().toLowerCase(Locale.ENGLISH));
            if (texture == null) {
                texture = layer.textures.get("off");
                if (texture == null) {
                    texture = layer.textures.get("disabled");
                }
            }
            if (texture != null) {
                model = layerModels.get(texture);
                if (model == null) {
                    model = layerModel.retexture(ImmutableMap.of("layer", texture));
                    layerModels.put(texture, model);
                }
                result.addModel(model.bake(layerTransform, DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()));
            }
        }
    }
    Set<EnumFacing> invertedSides = EnumSet.noneOf(EnumFacing.class);
    i = 0;
    for (GateRenderDefinitions.Torch torch : definition.torches) {
        GateLogic.State state = gate.logic.getTorchState(i++);
        if (state == GateLogic.State.NO_RENDER) {
            continue;
        }
        if (torch.inverter != null) {
            EnumFacing inverter = EnumFacing.byName(torch.inverter);
            if (gate.logic.isSideInverted(inverter)) {
                invertedSides.add(inverter);
            } else {
                continue;
            }
        }
        result.addModel(definition.getModel(state == GateLogic.State.ON ? (torch.model_on == null ? "torch_on" : torch.model_on) : (torch.model_off == null ? "torch_off" : torch.model_off)).bake(new ModelStateComposition(transform, new TRSRTransformation(new Vector3f((torch.pos[0] - 7.5f) / 16.0f, 0f, (torch.pos[1] - 7.5f) / 16.0f), null, null, null)), DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()));
    }
    for (EnumFacing facing : EnumFacing.HORIZONTALS) {
        if (gate.logic.isSideInverted(facing) && !invertedSides.contains(facing)) {
            result.addModel(definition.getModel(gate.getInverterState(facing) ? "torch_on" : "torch_off").bake(new ModelStateComposition(transform, new TRSRTransformation(new Vector3f(((facing.getFrontOffsetX() * 6.9875f)) / 16.0f, 0f, ((facing.getFrontOffsetZ() * 6.9875f)) / 16.0f), null, null, null)), DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()));
        }
    }
    return result;
}
Also used : TRSRTransformation(net.minecraftforge.common.model.TRSRTransformation) IModel(net.minecraftforge.client.model.IModel) EnumFacing(net.minecraft.util.EnumFacing) IModelState(net.minecraftforge.common.model.IModelState) SimpleBakedModel(pl.asie.charset.lib.render.model.SimpleBakedModel) GateLogic(pl.asie.simplelogic.gates.logic.GateLogic) ModelStateComposition(net.minecraftforge.client.model.ModelStateComposition) Vector3f(javax.vecmath.Vector3f) IBakedModel(net.minecraft.client.renderer.block.model.IBakedModel)

Example 2 with ModelStateComposition

use of net.minecraftforge.client.model.ModelStateComposition in project ForestryMC by ForestryMC.

the class ModelButterflyItem method bakeModel.

private IBakedModel bakeModel(IAlleleButterflySpecies species, float size) {
    ImmutableMap<String, String> textures = ImmutableMap.of("butterfly", species.getItemTexture());
    if (modelButterfly == null) {
        try {
            modelButterfly = ModelLoaderRegistry.getModel(new ResourceLocation(Constants.MOD_ID, "item/butterfly_ge"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    IModel model = modelButterfly.retexture(textures);
    IBakedModel bakedModel = model.bake(ModelRotation.X0_Y0, DefaultVertexFormats.ITEM, DefaultTextureGetter.INSTANCE);
    float scale = 1F / 16F;
    IModelState state = ModelUtil.loadModelState(new ResourceLocation(Constants.MOD_ID, "models/item/butterfly_ge"));
    state = new ModelStateComposition(state, new SimpleModelState(getTransformations(size)));
    return new PerspectiveMapWrapper(new TRSRBakedModel(bakedModel, -0.03125F, 0.25F - size * 0.37F, -0.03125F + size * scale, size * 1.4F), state);
}
Also used : IModel(net.minecraftforge.client.model.IModel) SimpleModelState(net.minecraftforge.client.model.SimpleModelState) TRSRBakedModel(forestry.core.models.TRSRBakedModel) IModelState(net.minecraftforge.common.model.IModelState) PerspectiveMapWrapper(net.minecraftforge.client.model.PerspectiveMapWrapper) ModelStateComposition(net.minecraftforge.client.model.ModelStateComposition) ResourceLocation(net.minecraft.util.ResourceLocation) IBakedModel(net.minecraft.client.renderer.block.model.IBakedModel)

Example 3 with ModelStateComposition

use of net.minecraftforge.client.model.ModelStateComposition in project ForestryMC by ForestryMC.

the class ModelGreenhouseWindow method bakeBlock.

@Override
protected IBakedModel bakeBlock(BlockGreenhouseWindow block, Key key, boolean inventory) {
    ImmutableMap.Builder<String, String> textures = ImmutableMap.builder();
    String texture = GreenhouseManager.helper.getGlassTexture(key.glassName);
    textures.put("texture", texture);
    textures.put("particle", texture);
    IModel model = null;
    IModelState state = null;
    String stateName = "forestry:models/item/greenhouse_window";
    String modelName = "forestry:block/greenhouse_window_";
    if (block.isRoofWindow()) {
        stateName += "_up";
        modelName += "up_";
    }
    modelName += key.isOpen ? "open" : "closed";
    try {
        model = ModelLoaderRegistry.getModel(new ResourceLocation(modelName));
        state = ModelUtil.loadModelState(new ResourceLocation(stateName));
    } catch (Exception e) {
        Throwables.propagate(e);
    }
    if (model == null || state == null) {
        throw new IllegalArgumentException("Could not bake greenhouse window model");
    }
    EnumFacing facing = key.facing;
    if (facing == EnumFacing.EAST) {
        state = new ModelStateComposition(state, ModelRotation.X0_Y270);
    } else if (facing == EnumFacing.WEST) {
        state = new ModelStateComposition(state, ModelRotation.X0_Y90);
    } else if (facing == EnumFacing.NORTH) {
        state = new ModelStateComposition(state, ModelRotation.X0_Y180);
    }
    IModel retexturedModel = model.retexture(textures.build());
    return retexturedModel.bake(state, key.inventory ? DefaultVertexFormats.ITEM : DefaultVertexFormats.BLOCK, DefaultTextureGetter.INSTANCE);
}
Also used : ModelStateComposition(net.minecraftforge.client.model.ModelStateComposition) IModel(net.minecraftforge.client.model.IModel) ResourceLocation(net.minecraft.util.ResourceLocation) EnumFacing(net.minecraft.util.EnumFacing) IModelState(net.minecraftforge.common.model.IModelState) ImmutableMap(com.google.common.collect.ImmutableMap)

Example 4 with ModelStateComposition

use of net.minecraftforge.client.model.ModelStateComposition in project Charset by CharsetMC.

the class ProxyClient method onModelBake.

@SubscribeEvent
public void onModelBake(ModelBakeEvent event) {
    IBakedModel origModel = event.getModelRegistry().getObject(bmLoc);
    ModelCompressionCrafter result = new ModelCompressionCrafter(origModel);
    event.getModelRegistry().putObject(bmLoc, result);
    ProgressManager.ProgressBar bar = ProgressManager.push("Compression Crafter", 6 + (4 * 12));
    IModel modelRod = RenderUtils.getModel(new ResourceLocation("charset:block/compression_crafter_rod"));
    for (EnumFacing side : EnumFacing.VALUES) {
        bar.step("rod " + side.name());
        rodModels[side.ordinal()] = modelRod.bake(ROTATIONS[side.ordinal()], DefaultVertexFormats.ITEM, ModelLoader.defaultTextureGetter());
    }
    IModel model = RenderUtils.getModel(new ResourceLocation("charset:block/compression_crafter_block"));
    IBlockState defState = CharsetCraftingCompression.blockCompressionCrafter.getDefaultState();
    for (int i = 0; i < 4; i++) {
        IModel retexModel = model.retexture(ImmutableMap.of("top", "charset:blocks/compact/compact_inner#" + i, "bottom", "charset:blocks/compact/compact_bottom#" + i, "side_x", "charset:blocks/compact/compact_side#" + i, "side_z", "charset:blocks/compact/compact_side#" + i));
        for (int k = 0; k < 12; k++) {
            bar.step("crafter " + (i * 4 + k + 1) + "/48");
            if (i == 0 && k >= 6) {
                for (EnumFacing side : EnumFacing.VALUES) {
                    result.quads[k][side.ordinal()][i] = result.quads[k - 6][side.ordinal()][i];
                }
                continue;
            }
            EnumFacing facing = EnumFacing.getFront(k % 6);
            IModelState modelState = ROTATIONS[k % 6];
            if (k >= 6) {
                modelState = new ModelStateComposition(modelState, ModelRotation.X0_Y90);
            }
            IBakedModel bakedModel = retexModel.bake(modelState, DefaultVertexFormats.ITEM, ModelLoader.defaultTextureGetter());
            for (EnumFacing side : EnumFacing.VALUES) {
                List<BakedQuad> list = bakedModel.getQuads(defState, side, 0);
                int j = i;
                if ((facing == EnumFacing.DOWN && (side == EnumFacing.SOUTH || side == EnumFacing.WEST)) || (facing == EnumFacing.UP && (side == EnumFacing.NORTH || side == EnumFacing.EAST)) || ((facing == EnumFacing.SOUTH || facing == EnumFacing.WEST) && (side.getAxis() == EnumFacing.Axis.Y || (side.getAxis() == facing.getAxis() && k < 8))) || (facing == EnumFacing.DOWN && side == EnumFacing.UP && k >= 6) || (facing.getAxis() != EnumFacing.Axis.Y && k >= 8 && side == facing.rotateY())) {
                    if (j == 1)
                        j = 2;
                    else if (j == 2)
                        j = 1;
                }
                result.quads[k][side.ordinal()][j] = list.get(0);
            }
        }
    }
    ProgressManager.pop(bar);
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) IModel(net.minecraftforge.client.model.IModel) IBlockState(net.minecraft.block.state.IBlockState) EnumFacing(net.minecraft.util.EnumFacing) IModelState(net.minecraftforge.common.model.IModelState) ModelStateComposition(net.minecraftforge.client.model.ModelStateComposition) ProgressManager(net.minecraftforge.fml.common.ProgressManager) ModelResourceLocation(net.minecraft.client.renderer.block.model.ModelResourceLocation) ResourceLocation(net.minecraft.util.ResourceLocation) IBakedModel(net.minecraft.client.renderer.block.model.IBakedModel) SubscribeEvent(net.minecraftforge.fml.common.eventhandler.SubscribeEvent)

Example 5 with ModelStateComposition

use of net.minecraftforge.client.model.ModelStateComposition in project Charset by CharsetMC.

the class ModelShelf method bake.

@Override
public IBakedModel bake(ShelfCacheInfo info, boolean isItem, BlockRenderLayer layer) {
    IModel retexturedModel = (shelfModel.retexture(ImmutableMap.of("plank", info.plank.getIconName()))).uvlock(false);
    IModelState state = ModelRotation.getModelRotation(0, (int) info.facing.getHorizontalAngle());
    if (info.back) {
        state = new ModelStateComposition(state, STATE_BACK);
    }
    return new WrappedBakedModel(retexturedModel.bake(state, DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()), info.plank).addDefaultBlockTransforms();
}
Also used : ModelStateComposition(net.minecraftforge.client.model.ModelStateComposition) IModel(net.minecraftforge.client.model.IModel) IModelState(net.minecraftforge.common.model.IModelState) WrappedBakedModel(pl.asie.charset.lib.render.model.WrappedBakedModel)

Aggregations

IModel (net.minecraftforge.client.model.IModel)5 ModelStateComposition (net.minecraftforge.client.model.ModelStateComposition)5 IModelState (net.minecraftforge.common.model.IModelState)5 IBakedModel (net.minecraft.client.renderer.block.model.IBakedModel)3 EnumFacing (net.minecraft.util.EnumFacing)3 ResourceLocation (net.minecraft.util.ResourceLocation)3 ImmutableMap (com.google.common.collect.ImmutableMap)1 TRSRBakedModel (forestry.core.models.TRSRBakedModel)1 Vector3f (javax.vecmath.Vector3f)1 IBlockState (net.minecraft.block.state.IBlockState)1 BakedQuad (net.minecraft.client.renderer.block.model.BakedQuad)1 ModelResourceLocation (net.minecraft.client.renderer.block.model.ModelResourceLocation)1 PerspectiveMapWrapper (net.minecraftforge.client.model.PerspectiveMapWrapper)1 SimpleModelState (net.minecraftforge.client.model.SimpleModelState)1 TRSRTransformation (net.minecraftforge.common.model.TRSRTransformation)1 ProgressManager (net.minecraftforge.fml.common.ProgressManager)1 SubscribeEvent (net.minecraftforge.fml.common.eventhandler.SubscribeEvent)1 SimpleBakedModel (pl.asie.charset.lib.render.model.SimpleBakedModel)1 WrappedBakedModel (pl.asie.charset.lib.render.model.WrappedBakedModel)1 GateLogic (pl.asie.simplelogic.gates.logic.GateLogic)1