Skip to content

Commit 7e0272b

Browse files
committed
Fix more portal issues
1 parent 6215252 commit 7e0272b

File tree

11 files changed

+157
-59
lines changed

11 files changed

+157
-59
lines changed

src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/PortalSpell.java

+44-10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
import java.util.UUID;
55

66
import org.jetbrains.annotations.Nullable;
7+
import org.joml.Matrix4f;
8+
import org.joml.Quaternionf;
9+
import org.joml.Vector3f;
10+
import org.joml.Vector4f;
711

812
import com.minelittlepony.unicopia.USounds;
913
import com.minelittlepony.unicopia.ability.magic.Caster;
@@ -22,6 +26,7 @@
2226
import com.minelittlepony.unicopia.util.shape.*;
2327

2428
import net.minecraft.block.Block;
29+
import net.minecraft.block.BlockState;
2530
import net.minecraft.block.Blocks;
2631
import net.minecraft.entity.Entity;
2732
import net.minecraft.nbt.NbtCompound;
@@ -31,6 +36,7 @@
3136
import net.minecraft.server.network.ServerPlayerEntity;
3237
import net.minecraft.server.world.ServerWorld;
3338
import net.minecraft.util.math.BlockPos;
39+
import net.minecraft.util.math.Direction.Axis;
3440
import net.minecraft.util.math.MathHelper;
3541
import net.minecraft.util.math.Vec3d;
3642
import net.minecraft.world.WorldEvents;
@@ -139,21 +145,28 @@ public boolean tick(Caster<?> source, Situation situation) {
139145
});
140146
}
141147
} else {
148+
targetPortalPitch.set(targetEntry.getPitch());
149+
targetPortalYaw.set(targetEntry.getYaw());
150+
142151
tickActive(source, targetEntry);
143152
}
144153
}
145-
}
146154

147-
var entry = Ether.get(source.asWorld()).getOrCreate(this, source);
148-
entry.setPitch(pitch.get());
149-
entry.setYaw(yaw.get());
155+
ownEntry.setPitch(getPitch());
156+
ownEntry.setYaw(getYaw());
157+
}
150158
}
151159

152160
return !isDead();
153161
}
154162

155163
private void tickActive(Caster<?> source, Ether.Entry<?> destination) {
156164
destination.entity.getTarget().ifPresent(target -> {
165+
Quaternionf rotationChange = getOrientationChange();
166+
var matrix = getPositionMatrix(source, source.asEntity().getPos(), rotationChange, new Matrix4f());
167+
168+
float yawDifference = getYawDifference();
169+
157170
source.findAllEntitiesInRange(1).forEach(entity -> {
158171
if (!entity.hasPortalCooldown()) {
159172

@@ -162,13 +175,16 @@ private void tickActive(Caster<?> source, Ether.Entry<?> destination) {
162175
return;
163176
}
164177

165-
Vec3d offset = entity.getPos().subtract(source.asEntity().getPos())
166-
.add(new Vec3d(0, 0, -0.7F).rotateY(-getTargetYaw() * MathHelper.RADIANS_PER_DEGREE));
167-
float yawDifference = getYawDifference();
168-
Vec3d dest = target.pos().add(offset.rotateY(yawDifference * MathHelper.RADIANS_PER_DEGREE)).add(0, 0.1, 0);
178+
var dest4f = matrix.transform(new Vector4f(entity.getPos().toVector3f(), 1));
179+
Vec3d dest = new Vec3d(dest4f.x, dest4f.y - 0.5, dest4f.z).add(new Vec3d(0, 0, -0.7F).rotateY(-getTargetYaw() * MathHelper.RADIANS_PER_DEGREE));
169180

170-
if (entity.getWorld().isTopSolid(BlockPos.ofFloored(dest).up(), entity)) {
171-
dest = dest.add(0, 1, 0);
181+
for (int i = 0; i < 2; i++) {
182+
BlockPos destBlock = BlockPos.ofFloored(dest);
183+
BlockState state = entity.getWorld().getBlockState(destBlock);
184+
if (entity.getWorld().isTopSolid(destBlock, entity)) {
185+
double maxY = state.getCollisionShape(entity.getWorld(), destBlock).getMax(Axis.Y);
186+
dest = new Vec3d(dest.x, destBlock.getY() + maxY, dest.z);
187+
}
172188
}
173189

174190
entity.resetPortalCooldown();
@@ -193,6 +209,24 @@ private void tickActive(Caster<?> source, Ether.Entry<?> destination) {
193209
});
194210
}
195211

212+
public Matrix4f getPositionMatrix(Caster<?> source, Vec3d pos, Quaternionf orientationChange, Matrix4f matrix) {
213+
getDestinationReference().getTarget().ifPresent(destEntity -> {
214+
Vector3f destPos = destEntity.pos().toVector3f();
215+
Vector3f sourcePos = pos.toVector3f();
216+
217+
matrix.rotateAround(orientationChange.conjugate(), destPos.x, destPos.y, destPos.z);
218+
matrix.translate(destPos.sub(sourcePos));
219+
});
220+
return matrix;
221+
}
222+
223+
public Quaternionf getOrientationChange() {
224+
return new Quaternionf().rotateTo(
225+
Vec3d.fromPolar(getPitch(), getYaw()).toVector3f(),
226+
Vec3d.fromPolar(getTargetPitch(), getTargetYaw()).toVector3f()
227+
);
228+
}
229+
196230
@Override
197231
public void setOrientation(Caster<?> caster, float pitch, float yaw) {
198232
this.pitch.set(90 - pitch);

src/main/java/com/minelittlepony/unicopia/client/render/entity/CastSpellEntityRenderer.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@
99
import com.minelittlepony.unicopia.client.render.spell.SpellRenderer;
1010
import com.minelittlepony.unicopia.entity.mob.CastSpellEntity;
1111

12+
import net.minecraft.client.MinecraftClient;
13+
import net.minecraft.client.render.OverlayTexture;
1214
import net.minecraft.client.render.RenderLayer;
1315
import net.minecraft.client.render.VertexConsumer;
1416
import net.minecraft.client.render.VertexConsumerProvider;
1517
import net.minecraft.client.render.entity.EntityRenderer;
1618
import net.minecraft.client.render.entity.EntityRendererFactory;
1719
import net.minecraft.client.util.math.MatrixStack;
1820
import net.minecraft.screen.PlayerScreenHandler;
21+
import net.minecraft.util.Colors;
1922
import net.minecraft.util.Identifier;
2023
import net.minecraft.util.math.ColorHelper.Argb;
2124
import net.minecraft.util.math.RotationAxis;
@@ -41,6 +44,10 @@ public Identifier getTexture(CastSpellEntity entity) {
4144

4245
@Override
4346
public void render(CastSpellEntity entity, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertices, int light) {
47+
MinecraftClient client = MinecraftClient.getInstance();
48+
if (client.cameraEntity instanceof CastSpellEntity) {
49+
return;
50+
}
4451
matrices.push();
4552
matrices.translate(0, 0.001, 0);
4653
final float height = entity.getHeight();
@@ -52,7 +59,6 @@ public void render(CastSpellEntity entity, float yaw, float tickDelta, MatrixSta
5259
float animationProgress = getAnimationProgress(entity, tickDelta);
5360
renderAmbientEffects(matrices, vertices, entity, entity.getSpellSlot().get().orElse(null), light, animationProgress, tickDelta);
5461
SpellEffectsRenderDispatcher.INSTANCE.render(matrices, vertices, light, entity, entity.getScale(tickDelta), 0, tickDelta, animationProgress, yaw, pitch);
55-
5662
matrices.pop();
5763
}
5864

@@ -69,7 +75,7 @@ protected void renderAmbientEffects(MatrixStack matrices, VertexConsumerProvider
6975

7076
float angle = (animationProgress / 9F) % 360;
7177

72-
int color = spell == null ? 0 : spell.getTypeAndTraits().type().getColor();
78+
int color = spell == null ? Colors.WHITE : spell.getTypeAndTraits().type().getColor();
7379

7480
@Nullable
7581
SpellRenderer<?> renderer = spell == null ? null : SpellEffectsRenderDispatcher.INSTANCE.getRenderer(spell);
@@ -87,7 +93,7 @@ protected void renderAmbientEffects(MatrixStack matrices, VertexConsumerProvider
8793
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(angle * ringSpeed));
8894
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(angle * ringSpeed * dim));
8995
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(angle * ringSpeed * dim));
90-
PlaneModel.INSTANCE.render(matrices, buffer, light, 0, 1, Argb.withAlpha(color, (int)(255 * (scale / ((float)(dim * 3) + 1)))));
96+
PlaneModel.INSTANCE.render(matrices, buffer, light, OverlayTexture.DEFAULT_UV, 1, Argb.withAlpha(color, (int)(255 * (scale / ((float)(dim * 3) + 1)))));
9197
matrices.pop();
9298
}
9399
}

src/main/java/com/minelittlepony/unicopia/client/render/spell/PortalFrameBuffer.java

+34-33
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.jetbrains.annotations.Nullable;
88
import org.joml.Matrix4f;
99
import org.joml.Quaternionf;
10+
import org.joml.Vector4f;
1011

1112
import com.google.common.cache.CacheBuilder;
1213
import com.google.common.cache.CacheLoader;
@@ -42,6 +43,7 @@
4243
import net.minecraft.entity.Entity;
4344
import net.minecraft.screen.PlayerScreenHandler;
4445
import net.minecraft.util.Colors;
46+
import net.minecraft.util.math.ChunkSectionPos;
4547
import net.minecraft.util.math.MathHelper;
4648
import net.minecraft.util.math.Vec3d;
4749

@@ -92,14 +94,10 @@ public void draw(MatrixStack matrices, VertexConsumerProvider vertices) {
9294

9395
if (!(closed || framebuffer == null)) {
9496
Tessellator tessellator = RenderSystem.renderThreadTesselator();
95-
float uScale = (float)framebuffer.viewportWidth / (float)framebuffer.textureWidth;
96-
float vScale = (float)framebuffer.viewportHeight / (float)framebuffer.textureHeight;
9797
RenderSystem.setShader(UShaders.RENDER_TYPE_PORTAL_SURFACE);
9898
RenderSystem._setShaderTexture(0, framebuffer.getColorAttachment());
9999
BufferBuilder buffer = tessellator.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR);
100-
SphereModel.DISK.scaleUV(uScale, vScale);
101100

102-
RenderSystem.setTextureMatrix(SphereModel.DISK.getTextureMatrix());
103101
SphereModel.DISK.render(matrices, buffer, 1, 2F, Colors.WHITE);
104102
BufferRenderer.drawWithGlobalProgram(buffer.end());
105103

@@ -115,6 +113,7 @@ public void draw(MatrixStack matrices, VertexConsumerProvider vertices) {
115113
}
116114

117115
public void build(PortalSpell spell, Caster<?> caster, EntityReference.EntityValues<Entity> target) {
116+
closed = false;
118117

119118
long refreshRate = Unicopia.getConfig().fancyPortalRefreshRate.get();
120119
if (refreshRate > 0 && framebuffer != null && System.currentTimeMillis() % refreshRate != 0) {
@@ -146,6 +145,8 @@ private void innerBuild(PortalSpell spell, Caster<?> caster, EntityReference.Ent
146145
}
147146
recursionCount++;
148147

148+
Entity globalCameraEntity = client.cameraEntity;
149+
149150
try {
150151
if (closed || client.interactionManager == null) {
151152
close();
@@ -155,17 +156,21 @@ private void innerBuild(PortalSpell spell, Caster<?> caster, EntityReference.Ent
155156
Camera camera = client.gameRenderer.getCamera();
156157

157158
Entity cameraEntity = UEntities.CAST_SPELL.create(caster.asWorld());
158-
Vec3d offset = new Vec3d(0, 1, -0.1F).rotateY(-spell.getTargetYaw() * MathHelper.RADIANS_PER_DEGREE);
159159

160-
float yaw = spell.getTargetYaw() + camera.getYaw() - spell.getYaw();
161-
float pitch = spell.getTargetPitch();//MathHelper.clamp(spell.getTargetPitch() + (camera.getPitch() - spell.getPitch()) * 0.65F, -90, 90) + 90;
160+
Vec3d pos = target.pos();
161+
162+
Quaternionf orientationChange = spell.getOrientationChange();
163+
Matrix4f positionMatrix = spell.getPositionMatrix(caster, target.pos(), orientationChange, new Matrix4f());
162164

163-
cameraEntity.setPosition(target.pos().add(offset));
164-
cameraEntity.setPitch(pitch % 180);
165-
cameraEntity.setYaw((yaw + 180) % 360);
165+
Vector4f transformedPos = positionMatrix.transform(new Vector4f(pos.toVector3f(), 1));
166+
cameraEntity.setPosition(transformedPos.x, transformedPos.y + 0.5F, transformedPos.z);
167+
cameraEntity.setPitch(MathHelper.clamp(camera.getPitch() - spell.getTargetPitch() + spell.getPitch(), -90, 90));
168+
cameraEntity.setYaw(MathHelper.wrapDegrees(camera.getYaw() + spell.getYawDifference()));
166169

170+
client.cameraEntity = cameraEntity;
167171
drawWorld(cameraEntity, 400, 400);
168172
} finally {
173+
client.cameraEntity = globalCameraEntity;
169174
recursionCount--;
170175
}
171176
}
@@ -198,44 +203,38 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
198203
BackgroundRenderer.clearFog();
199204
RenderSystem.enableCull();
200205

201-
if (renderer == null) {
202-
renderer = new WorldRenderer(client, client.getEntityRenderDispatcher(), client.getBlockEntityRenderDispatcher(), client.getBufferBuilders());
203-
}
204206
if (cameraEntity.getWorld() != world) {
205207
world = (ClientWorld)cameraEntity.getWorld();
206-
renderer.setWorld(world);
207208
}
208-
//((MixinMinecraftClient)client).setWorldRenderer(renderer);
209209

210-
var tickCounter = client.getRenderTickCounter();
210+
if (renderer == null) {
211+
renderer = new WorldRenderer(client, client.getEntityRenderDispatcher(), client.getBlockEntityRenderDispatcher(), client.getBufferBuilders());
212+
renderer.setWorld(world);
213+
renderer.scheduleBlockRenders(
214+
ChunkSectionPos.getSectionCoord((int)cameraEntity.getX()),
215+
ChunkSectionPos.getSectionCoord((int)cameraEntity.getY()),
216+
ChunkSectionPos.getSectionCoord((int)cameraEntity.getZ())
217+
);
218+
}
211219

212220
camera.update(world, cameraEntity, false, false, 1);
213221

214-
double fov = 110;
222+
double fov = 120;
215223
Matrix4f projectionMatrix = client.gameRenderer.getBasicProjectionMatrix(fov);
216224
Matrix4f cameraTransform = new Matrix4f().rotation(camera.getRotation().conjugate(new Quaternionf()));
217225

218226
client.gameRenderer.loadProjectionMatrix(projectionMatrix);
219-
/*renderer.scheduleBlockRenders(
220-
ChunkSectionPos.getSectionCoord((int)cameraEntity.getX()),
221-
ChunkSectionPos.getSectionCoord((int)cameraEntity.getY()),
222-
ChunkSectionPos.getSectionCoord((int)cameraEntity.getZ())
223-
);*/
227+
224228
renderer.setupFrustum(
225229
camera.getPos(),
226230
cameraTransform,
227-
client.gameRenderer.getBasicProjectionMatrix(Math.max(fov, this.client.options.getFov().getValue().intValue()))
231+
client.gameRenderer.getBasicProjectionMatrix(Math.max(fov, client.options.getFov().getValue().intValue()))
232+
);
233+
renderer.render(client.getRenderTickCounter(), false, camera, client.gameRenderer,
234+
client.gameRenderer.getLightmapTextureManager(),
235+
cameraTransform,
236+
projectionMatrix
228237
);
229-
try {
230-
renderer.render(tickCounter, false, camera, client.gameRenderer,
231-
client.gameRenderer.getLightmapTextureManager(),
232-
cameraTransform,
233-
projectionMatrix
234-
);
235-
} catch (Throwable t) {
236-
close();
237-
}
238-
239238
// Strip transparency
240239
RenderSystem.colorMask(false, false, false, true);
241240
RenderSystem.clearColor(1, 1, 1, 1);
@@ -246,6 +245,7 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
246245
} finally {
247246
client.getFramebuffer().beginWrite(true);
248247
client.gameRenderer.loadProjectionMatrix(proj);
248+
client.getBlockEntityRenderDispatcher().setWorld(client.world);
249249

250250
window.setFramebufferWidth(globalFramebufferWidth);
251251
window.setFramebufferHeight(globalFramebufferHeight);
@@ -264,6 +264,7 @@ public void close() {
264264
if (renderer != null) {
265265
renderer.getChunkBuilder().stop();
266266
renderer.close();
267+
renderer = null;
267268
}
268269
}
269270
}

src/main/java/com/minelittlepony/unicopia/client/render/spell/PortalSpellRenderer.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.minelittlepony.unicopia.client.render.RenderLayers;
77
import com.minelittlepony.unicopia.client.render.model.SphereModel;
88
import com.minelittlepony.unicopia.entity.EntityReference;
9+
import com.minelittlepony.unicopia.entity.mob.CastSpellEntity;
10+
911
import net.minecraft.client.MinecraftClient;
1012
import net.minecraft.client.render.VertexConsumer;
1113
import net.minecraft.client.render.VertexConsumerProvider;
@@ -42,11 +44,14 @@ public void render(MatrixStack matrices, VertexConsumerProvider vertices, Portal
4244
return;
4345
}
4446

45-
if (caster.asEntity().distanceTo(client.cameraEntity) > 50) {
46-
return; // don't bother rendering if too far away
47-
}
48-
if (client.cameraEntity == caster.asEntity()) {
49-
return;
47+
if (client.cameraEntity instanceof CastSpellEntity) {
48+
double distance = caster.asEntity().distanceTo(client.cameraEntity);
49+
if (distance > 50) {
50+
return; // don't bother rendering if too far away
51+
}
52+
if (distance < 2) {
53+
return; // don't render ourselves
54+
}
5055
}
5156

5257
matrices.push();

src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -788,8 +788,8 @@ private void applyTurbulance(MutableVector velocity) {
788788
Vec3d airflow = WeatherConditions.getAirflow(entity.getBlockPos(), entity.getWorld())
789789
.multiply(0.04F * effectStrength)
790790
.add(Vec3d.fromPolar(
791-
(entity.getPitch() + (float)gust.getY()) * MathHelper.RADIANS_PER_DEGREE,
792-
(entity.getYaw() + (float)gust.getZ()) * MathHelper.RADIANS_PER_DEGREE
791+
(entity.getPitch() + (float)gust.getY()),
792+
(entity.getYaw() + (float)gust.getZ())
793793
).multiply(effectStrength * (float)gust.getX() / weight));
794794

795795
windStrength.update((float)airflow.length(), airflow.length() > windStrength.getValue() ? 1000 : 500);

src/main/java/com/minelittlepony/unicopia/mixin/client/MixinMinecraftClient.java

-6
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,12 @@
33
import java.util.Queue;
44

55
import org.spongepowered.asm.mixin.Mixin;
6-
import org.spongepowered.asm.mixin.Mutable;
76
import org.spongepowered.asm.mixin.gen.Accessor;
87

98
import net.minecraft.client.MinecraftClient;
10-
import net.minecraft.client.render.WorldRenderer;
119

1210
@Mixin(MinecraftClient.class)
1311
public interface MixinMinecraftClient {
1412
@Accessor("renderTaskQueue")
1513
Queue<Runnable> getRenderTaskQueue();
16-
17-
@Mutable
18-
@Accessor("worldRenderer")
19-
void setWorldRenderer(WorldRenderer worldRenderer);
2014
}

0 commit comments

Comments
 (0)