use of com.qouteall.immersive_portals.portal.Portal in project ImmersivePortalsMod by qouteall.
the class ViewAreaRenderer method generateTriangleRectangular.
private static void generateTriangleRectangular(Consumer<Vec3d> vertexOutput, Portal portal, float layerWidth, Vec3d posInPlayerCoordinate) {
Vec3d layerOffsest = portal.getNormal().multiply(-layerWidth);
Vec3d[] frontFace = Arrays.stream(portal.getFourVerticesRelativeToCenter(0)).map(pos -> pos.add(posInPlayerCoordinate)).toArray(Vec3d[]::new);
Vec3d[] backFace = Arrays.stream(portal.getFourVerticesRelativeToCenter(0)).map(pos -> pos.add(posInPlayerCoordinate).add(layerOffsest)).toArray(Vec3d[]::new);
// putIntoQuad(
// vertexOutput,
// backFace[0],
// backFace[2],
// backFace[3],
// backFace[1]
// );
putIntoQuad(vertexOutput, frontFace[0], frontFace[2], frontFace[3], frontFace[1]);
}
use of com.qouteall.immersive_portals.portal.Portal in project ImmersivePortalsMod by qouteall.
the class ClientTeleportationManager method changePlayerDimension.
/**
* {@link ClientPlayNetworkHandler#onPlayerRespawn(PlayerRespawnS2CPacket)}
*/
private void changePlayerDimension(ClientPlayerEntity player, ClientWorld fromWorld, ClientWorld toWorld, Vec3d destination) {
DimensionType toDimension = toWorld.dimension.getType();
DimensionType fromDimension = fromWorld.dimension.getType();
ClientPlayNetworkHandler workingNetHandler = ((IEClientWorld) fromWorld).getNetHandler();
ClientPlayNetworkHandler fakedNetHandler = ((IEClientWorld) toWorld).getNetHandler();
((IEClientPlayNetworkHandler) workingNetHandler).setWorld(toWorld);
((IEClientPlayNetworkHandler) fakedNetHandler).setWorld(fromWorld);
((IEClientWorld) fromWorld).setNetHandler(fakedNetHandler);
((IEClientWorld) toWorld).setNetHandler(workingNetHandler);
fromWorld.removeEntity(player.getEntityId());
player.removed = false;
player.world = toWorld;
player.dimension = toDimension;
player.x = destination.x;
player.y = destination.y;
player.z = destination.z;
toWorld.addPlayer(player.getEntityId(), player);
mc.world = toWorld;
mc.worldRenderer = CGlobal.clientWorldLoader.getWorldRenderer(toDimension);
toWorld.setScoreboard(fromWorld.getScoreboard());
if (mc.particleManager != null)
mc.particleManager.setWorld(toWorld);
BlockEntityRenderDispatcher.INSTANCE.setWorld(toWorld);
CGlobal.clientWorldLoader.getDimensionRenderHelper(toDimension).switchToMe();
Helper.log(String.format("Client Changed Dimension from %s to %s time: %s", fromDimension, toDimension, tickTimeForTeleportation));
Helper.log("Portal Number Near Player Now" + McHelper.getEntitiesNearby(mc.player, Portal.class, 10).count());
// because the teleportation may happen before rendering
// but after pre render info being updated
MyRenderHelper.updatePreRenderInfo(MyRenderHelper.partialTicks);
OFInterface.onPlayerTraveled.accept(fromDimension, toDimension);
}
use of com.qouteall.immersive_portals.portal.Portal in project ImmersivePortalsMod by qouteall.
the class ViewAreaRenderer method buildPortalViewAreaTrianglesBuffer.
private static void buildPortalViewAreaTrianglesBuffer(Vec3d fogColor, Portal portal, BufferBuilder bufferbuilder, Vec3d cameraPos, float partialTicks, float layerWidth) {
// if layerWidth is small, the teleportation will not be seamless
// counter-clockwise triangles are front-faced in default
bufferbuilder.begin(GL_TRIANGLES, VertexFormats.POSITION_COLOR);
Vec3d posInPlayerCoordinate = portal.getPos().subtract(cameraPos);
if (portal instanceof Mirror) {
posInPlayerCoordinate = posInPlayerCoordinate.add(portal.getNormal().multiply(-0.001));
}
Consumer<Vec3d> vertexOutput = p -> putIntoVertex(bufferbuilder, p, fogColor);
if (portal.specialShape == null) {
generateTriangleRectangular(vertexOutput, portal, layerWidth, posInPlayerCoordinate);
} else {
generateTriangleSpecial(vertexOutput, portal, layerWidth, posInPlayerCoordinate);
}
if (shouldRenderAdditionalBox(portal, cameraPos)) {
renderAdditionalBox(portal, cameraPos, vertexOutput);
}
}
use of com.qouteall.immersive_portals.portal.Portal in project ImmersivePortalsMod by qouteall.
the class MyGameRenderer method calcClipPlaneEquation.
// invoke this before rendering portal
// its result depends on camra pos
private double[] calcClipPlaneEquation() {
Portal portal = CGlobal.renderer.getRenderingPortal();
Vec3d planeNormal = portal.getNormal().multiply(-1);
// Vec3d cullingPos = portal.getPos()
// .subtract(portal.getNormal().multiply(-0.01))//avoid z fighting
// .subtract(mc.gameRenderer.getCamera().getPos());
Vec3d cameraPos = mc.gameRenderer.getCamera().getPos();
Vec3d cullingPos = portal.getPointInPortalProjection(cameraPos).subtract(cameraPos).subtract(// avoid z fighting
portal.getNormal().multiply(-0.01));
if (OFInterface.isShaders.getAsBoolean() && portal instanceof Mirror) {
planeNormal = planeNormal.multiply(-1);
}
// equation: planeNormal * p + c > 0
// -planeNormal * portalCenter = c
double c = planeNormal.multiply(-1).dotProduct(cullingPos);
return new double[] { planeNormal.x, planeNormal.y, planeNormal.z, c };
}
use of com.qouteall.immersive_portals.portal.Portal in project ImmersivePortalsMod by qouteall.
the class MyCommandServer method completeBiWayBiFacedPortal.
private static void completeBiWayBiFacedPortal(Portal portal, Consumer<Portal> removalInformer, Consumer<Portal> addingInformer) {
Portal oppositeFacedPortal = completeBiFacedPortal(portal, removalInformer);
Portal r1 = completeBiWayPortal(portal, removalInformer);
Portal r2 = completeBiWayPortal(oppositeFacedPortal, removalInformer);
addingInformer.accept(oppositeFacedPortal);
addingInformer.accept(r1);
addingInformer.accept(r2);
}
Aggregations