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;
}
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();
}
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
}
}
}
Aggregations