use of gregtech.client.renderer.scene.FBOWorldSceneRenderer in project GregTech by GregTechCEu.
the class MachineSceneWidget method updateScene.
private void updateScene() {
if (!mte.isValid())
return;
World world = mte.getWorld();
if (worldSceneRenderer != null) {
worldSceneRenderer.releaseFBO();
}
worldSceneRenderer = new FBOWorldSceneRenderer(world, 1080, 1080);
worldSceneRenderer.setAfterWorldRender(this::renderBlockOverLay);
cores = new HashSet<>();
around = new HashSet<>();
cores.add(pos);
if (mte instanceof MultiblockControllerBase) {
PatternMatchContext context = ((MultiblockControllerBase) mte).structurePattern.checkPatternFastAt(world, pos, mte.getFrontFacing().getOpposite());
if (context != null) {
List<BlockPos> validPos = ((MultiblockControllerBase) mte).structurePattern.cache.keySet().stream().map(BlockPos::fromLong).collect(Collectors.toList());
Set<IMultiblockPart> parts = context.getOrCreate("MultiblockParts", HashSet::new);
for (IMultiblockPart part : parts) {
if (part instanceof MetaTileEntity) {
cores.add(((MetaTileEntity) part).getPos());
}
}
for (EnumFacing facing : EnumFacing.VALUES) {
cores.forEach(pos -> around.add(pos.offset(facing)));
}
int minX = Integer.MAX_VALUE;
int minY = Integer.MAX_VALUE;
int minZ = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int maxY = Integer.MIN_VALUE;
int maxZ = Integer.MIN_VALUE;
for (BlockPos vPos : validPos) {
around.add(vPos);
minX = Math.min(minX, vPos.getX());
minY = Math.min(minY, vPos.getY());
minZ = Math.min(minZ, vPos.getZ());
maxX = Math.max(maxX, vPos.getX());
maxY = Math.max(maxY, vPos.getY());
maxZ = Math.max(maxZ, vPos.getZ());
}
around.removeAll(cores);
center = new Vector3f((minX + maxX) / 2f, (minY + maxY) / 2f, (minZ + maxZ) / 2f);
} else {
for (EnumFacing facing : EnumFacing.VALUES) {
around.add(pos.offset(facing));
}
center = new Vector3f(pos.getX() + 0.5f, pos.getY() + 0.5f, pos.getZ() + 0.5f);
}
} else {
for (EnumFacing facing : EnumFacing.VALUES) {
around.add(pos.offset(facing));
}
center = new Vector3f(pos.getX() + 0.5f, pos.getY() + 0.5f, pos.getZ() + 0.5f);
}
worldSceneRenderer.addRenderedBlocks(cores, null);
worldSceneRenderer.addRenderedBlocks(around, this::aroundBlocksRenderHook);
worldSceneRenderer.setCameraLookAt(center, zoom, Math.toRadians(rotationPitch), Math.toRadians(rotationYaw));
}
use of gregtech.client.renderer.scene.FBOWorldSceneRenderer in project GregTech by GregTechCEu.
the class AdvancedMonitorPluginBehavior method createWorldScene.
@SideOnly(Side.CLIENT)
private void createWorldScene() {
if (this.screen == null || this.screen.getWorld() == null)
return;
isValid = true;
World world = this.screen.getWorld();
int minX = Integer.MAX_VALUE;
int minY = Integer.MAX_VALUE;
int minZ = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int maxY = Integer.MIN_VALUE;
int maxZ = Integer.MIN_VALUE;
for (BlockPos pos : validPos) {
minX = Math.min(minX, pos.getX());
minY = Math.min(minY, pos.getY());
minZ = Math.min(minZ, pos.getZ());
maxX = Math.max(maxX, pos.getX());
maxY = Math.max(maxY, pos.getY());
maxZ = Math.max(maxZ, pos.getZ());
}
if (FBO == null) {
FBO = new Framebuffer(RESOLUTION, RESOLUTION, true);
}
TrackedDummyWorld dummyWorld = new TrackedDummyWorld(world);
dummyWorld.setRenderFilter(pos -> validPos.contains(pos));
worldSceneRenderer = new FBOWorldSceneRenderer(dummyWorld, FBO);
worldSceneRenderer.addRenderedBlocks(validPos, null);
center = new Vector3f((minX + maxX) / 2f + 0.5f, (minY + maxY) / 2f + 0.5f, (minZ + maxZ) / 2f + 0.5f);
worldSceneRenderer.setCameraLookAt(center, 10 / scale, Math.toRadians(rotationPitch), Math.toRadians(rotationYaw));
worldSceneRenderer.setBeforeWorldRender(this::renderBefore);
worldSceneRenderer.setAfterWorldRender(this::renderAfter);
worldSceneRenderer.setOnLookingAt(rayTrace -> renderBlockOverLay(rayTrace.getBlockPos()));
}
Aggregations