Search in sources :

Example 1 with BlockStateRenderer

use of com.cleanroommc.multiblocked.client.renderer.impl.BlockStateRenderer in project Multiblocked by CleanroomMC.

the class TemplateBuilderWidget method getComponentDefinition.

public static ComponentDefinition getComponentDefinition(ComponentDefinition definition, Set<BlockInfo> candidates) {
    if (candidates.size() == 1) {
        definition = new PartDefinition(new ResourceLocation(Multiblocked.MODID, "i_renderer"));
        definition.baseRenderer = new BlockStateRenderer(candidates.toArray(new BlockInfo[0])[0]);
    } else if (!candidates.isEmpty()) {
        definition = new PartDefinition(new ResourceLocation(Multiblocked.MODID, "i_renderer"));
        definition.baseRenderer = new CycleBlockStateRenderer(candidates.toArray(new BlockInfo[0]));
    }
    return definition;
}
Also used : CycleBlockStateRenderer(com.cleanroommc.multiblocked.client.renderer.impl.CycleBlockStateRenderer) BlockStateRenderer(com.cleanroommc.multiblocked.client.renderer.impl.BlockStateRenderer) CycleBlockStateRenderer(com.cleanroommc.multiblocked.client.renderer.impl.CycleBlockStateRenderer) BlockInfo(com.cleanroommc.multiblocked.api.pattern.util.BlockInfo) ResourceLocation(net.minecraft.util.ResourceLocation) PartDefinition(com.cleanroommc.multiblocked.api.definition.PartDefinition)

Example 2 with BlockStateRenderer

use of com.cleanroommc.multiblocked.client.renderer.impl.BlockStateRenderer in project Multiblocked by CleanroomMC.

the class ControllerWidget method updateScene.

@SideOnly(Side.CLIENT)
private void updateScene(JsonBlockPattern jsonPattern) {
    if (thread != null) {
        thread.interrupt();
        thread = null;
    }
    TrackedDummyWorld world = new TrackedDummyWorld();
    tiles.clear();
    sceneWidget.createScene(world);
    ImageWidget imageWidget;
    sceneWidget.addWidget(imageWidget = new ImageWidget(0, 0, sceneWidget.getSize().width, sceneWidget.getSize().height));
    imageWidget.setVisible(jsonPattern.pattern.length * jsonPattern.pattern[0].length * jsonPattern.pattern[0][0].length() > 1000);
    thread = new Thread(() -> {
        int[] centerOffset = jsonPattern.getCenterOffset();
        String[][] pattern = jsonPattern.pattern;
        Set<BlockPos> posSet = new HashSet<>();
        int offset = Math.max(pattern.length, Math.max(pattern[0].length, pattern[0][0].length()));
        int sum = jsonPattern.pattern.length * jsonPattern.pattern[0].length * jsonPattern.pattern[0][0].length();
        AtomicDouble progress = new AtomicDouble(0);
        imageWidget.setImage(new TextTexture("building scene!").setSupplier(() -> "building scene! " + String.format("%.1f", progress.get()) + "%%").setWidth(sceneWidget.getSize().width));
        int count = 0;
        for (int i = 0; i < pattern.length; i++) {
            for (int j = 0; j < pattern[0].length; j++) {
                for (int k = 0; k < pattern[0][0].length(); k++) {
                    if (Thread.interrupted()) {
                        sceneWidget.waitToRemoved(imageWidget);
                        return;
                    }
                    count++;
                    progress.set(count * 100.0 / sum);
                    char symbol = pattern[i][j].charAt(k);
                    BlockPos pos = jsonPattern.getActualPosOffset(k - centerOffset[2], j - centerOffset[1], i - centerOffset[0], EnumFacing.NORTH).add(offset, offset, offset);
                    world.addBlock(pos, new BlockInfo(MbdComponents.DummyComponentBlock));
                    DummyComponentTileEntity tileEntity = (DummyComponentTileEntity) world.getTileEntity(pos);
                    ComponentDefinition definition = null;
                    assert tileEntity != null;
                    boolean disableFormed = false;
                    if (jsonPattern.symbolMap.containsKey(symbol)) {
                        Set<BlockInfo> candidates = new HashSet<>();
                        for (String s : jsonPattern.symbolMap.get(symbol)) {
                            SimplePredicate predicate = jsonPattern.predicates.get(s);
                            if (predicate instanceof PredicateComponent && ((PredicateComponent) predicate).definition != null) {
                                definition = ((PredicateComponent) predicate).definition;
                                disableFormed |= predicate.disableRenderFormed;
                                break;
                            } else if (predicate != null && predicate.candidates != null) {
                                candidates.addAll(Arrays.asList(predicate.candidates.get()));
                                disableFormed |= predicate.disableRenderFormed;
                            }
                        }
                        definition = TemplateBuilderWidget.getComponentDefinition(definition, candidates);
                    }
                    if (definition != null) {
                        tileEntity.setDefinition(definition);
                        if (disableFormed) {
                            definition.formedRenderer = new BlockStateRenderer(Blocks.AIR.getDefaultState());
                        }
                    }
                    tileEntity.isFormed = isFormed;
                    tileEntity.setWorld(world);
                    tileEntity.validate();
                    posSet.add(pos);
                    tiles.add(tileEntity);
                }
            }
        }
        Minecraft.getMinecraft().addScheduledTask(() -> {
            sceneWidget.setRenderedCore(posSet, null);
            sceneWidget.waitToRemoved(imageWidget);
        });
        thread = null;
    });
    thread.start();
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) AtomicDouble(com.google.common.util.concurrent.AtomicDouble) TrackedDummyWorld(com.cleanroommc.multiblocked.client.util.TrackedDummyWorld) PredicateComponent(com.cleanroommc.multiblocked.api.pattern.predicates.PredicateComponent) SimplePredicate(com.cleanroommc.multiblocked.api.pattern.predicates.SimplePredicate) BlockStateRenderer(com.cleanroommc.multiblocked.client.renderer.impl.BlockStateRenderer) BlockInfo(com.cleanroommc.multiblocked.api.pattern.util.BlockInfo) BlockPos(net.minecraft.util.math.BlockPos) DummyComponentTileEntity(com.cleanroommc.multiblocked.api.tile.DummyComponentTileEntity) ComponentDefinition(com.cleanroommc.multiblocked.api.definition.ComponentDefinition) SideOnly(net.minecraftforge.fml.relauncher.SideOnly)

Example 3 with BlockStateRenderer

use of com.cleanroommc.multiblocked.client.renderer.impl.BlockStateRenderer in project Multiblocked by CleanroomMC.

the class ControllerBuilderWidget method onBuildTemplate.

@Override
protected void onBuildTemplate(ClickData clickData) {
    if (clickData.isRemote) {
        if (pos != null && facing != null && selected != null && facing.getAxis() != EnumFacing.Axis.Y) {
            BlockPos[] poses = ItemBlueprint.getPos(selected);
            if (poses != null) {
                World world = table.getWorld();
                ResourceLocation location = new ResourceLocation("mod_id:component_id");
                ControllerDefinition controllerDefinition = new ControllerDefinition(location);
                controllerDefinition.baseRenderer = new BlockStateRenderer(world.getBlockState(pos));
                new ControllerWidget(this, controllerDefinition, new JsonBlockPattern(world, location, pos, facing, poses[0].getX(), poses[0].getY(), poses[0].getZ(), poses[1].getX(), poses[1].getY(), poses[1].getZ()), "empty", jsonObject -> {
                    if (jsonObject != null) {
                        FileUtility.saveJson(new File(Multiblocked.location, "definition/controller/" + jsonObject.get("location").getAsString().replace(":", "_") + ".json"), jsonObject);
                        updateList();
                    }
                });
            }
        } else {
        // TODO
        }
    }
}
Also used : BlockStateRenderer(com.cleanroommc.multiblocked.client.renderer.impl.BlockStateRenderer) JsonBlockPattern(com.cleanroommc.multiblocked.api.pattern.JsonBlockPattern) ControllerDefinition(com.cleanroommc.multiblocked.api.definition.ControllerDefinition) ControllerWidget(com.cleanroommc.multiblocked.api.gui.widget.imp.blueprint_table.components.ControllerWidget) ResourceLocation(net.minecraft.util.ResourceLocation) BlockPos(net.minecraft.util.math.BlockPos) TrackedDummyWorld(com.cleanroommc.multiblocked.client.util.TrackedDummyWorld) World(net.minecraft.world.World) File(java.io.File)

Aggregations

BlockStateRenderer (com.cleanroommc.multiblocked.client.renderer.impl.BlockStateRenderer)3 BlockInfo (com.cleanroommc.multiblocked.api.pattern.util.BlockInfo)2 TrackedDummyWorld (com.cleanroommc.multiblocked.client.util.TrackedDummyWorld)2 ResourceLocation (net.minecraft.util.ResourceLocation)2 BlockPos (net.minecraft.util.math.BlockPos)2 ComponentDefinition (com.cleanroommc.multiblocked.api.definition.ComponentDefinition)1 ControllerDefinition (com.cleanroommc.multiblocked.api.definition.ControllerDefinition)1 PartDefinition (com.cleanroommc.multiblocked.api.definition.PartDefinition)1 ControllerWidget (com.cleanroommc.multiblocked.api.gui.widget.imp.blueprint_table.components.ControllerWidget)1 JsonBlockPattern (com.cleanroommc.multiblocked.api.pattern.JsonBlockPattern)1 PredicateComponent (com.cleanroommc.multiblocked.api.pattern.predicates.PredicateComponent)1 SimplePredicate (com.cleanroommc.multiblocked.api.pattern.predicates.SimplePredicate)1 DummyComponentTileEntity (com.cleanroommc.multiblocked.api.tile.DummyComponentTileEntity)1 CycleBlockStateRenderer (com.cleanroommc.multiblocked.client.renderer.impl.CycleBlockStateRenderer)1 AtomicDouble (com.google.common.util.concurrent.AtomicDouble)1 File (java.io.File)1 HashSet (java.util.HashSet)1 Set (java.util.Set)1 World (net.minecraft.world.World)1 SideOnly (net.minecraftforge.fml.relauncher.SideOnly)1