7
7
import org .jetbrains .annotations .Nullable ;
8
8
import org .joml .Matrix4f ;
9
9
import org .joml .Quaternionf ;
10
+ import org .joml .Vector4f ;
10
11
11
12
import com .google .common .cache .CacheBuilder ;
12
13
import com .google .common .cache .CacheLoader ;
42
43
import net .minecraft .entity .Entity ;
43
44
import net .minecraft .screen .PlayerScreenHandler ;
44
45
import net .minecraft .util .Colors ;
46
+ import net .minecraft .util .math .ChunkSectionPos ;
45
47
import net .minecraft .util .math .MathHelper ;
46
48
import net .minecraft .util .math .Vec3d ;
47
49
@@ -92,14 +94,10 @@ public void draw(MatrixStack matrices, VertexConsumerProvider vertices) {
92
94
93
95
if (!(closed || framebuffer == null )) {
94
96
Tessellator tessellator = RenderSystem .renderThreadTesselator ();
95
- float uScale = (float )framebuffer .viewportWidth / (float )framebuffer .textureWidth ;
96
- float vScale = (float )framebuffer .viewportHeight / (float )framebuffer .textureHeight ;
97
97
RenderSystem .setShader (UShaders .RENDER_TYPE_PORTAL_SURFACE );
98
98
RenderSystem ._setShaderTexture (0 , framebuffer .getColorAttachment ());
99
99
BufferBuilder buffer = tessellator .begin (VertexFormat .DrawMode .QUADS , VertexFormats .POSITION_TEXTURE_COLOR );
100
- SphereModel .DISK .scaleUV (uScale , vScale );
101
100
102
- RenderSystem .setTextureMatrix (SphereModel .DISK .getTextureMatrix ());
103
101
SphereModel .DISK .render (matrices , buffer , 1 , 2F , Colors .WHITE );
104
102
BufferRenderer .drawWithGlobalProgram (buffer .end ());
105
103
@@ -115,6 +113,7 @@ public void draw(MatrixStack matrices, VertexConsumerProvider vertices) {
115
113
}
116
114
117
115
public void build (PortalSpell spell , Caster <?> caster , EntityReference .EntityValues <Entity > target ) {
116
+ closed = false ;
118
117
119
118
long refreshRate = Unicopia .getConfig ().fancyPortalRefreshRate .get ();
120
119
if (refreshRate > 0 && framebuffer != null && System .currentTimeMillis () % refreshRate != 0 ) {
@@ -146,6 +145,8 @@ private void innerBuild(PortalSpell spell, Caster<?> caster, EntityReference.Ent
146
145
}
147
146
recursionCount ++;
148
147
148
+ Entity globalCameraEntity = client .cameraEntity ;
149
+
149
150
try {
150
151
if (closed || client .interactionManager == null ) {
151
152
close ();
@@ -155,17 +156,21 @@ private void innerBuild(PortalSpell spell, Caster<?> caster, EntityReference.Ent
155
156
Camera camera = client .gameRenderer .getCamera ();
156
157
157
158
Entity cameraEntity = UEntities .CAST_SPELL .create (caster .asWorld ());
158
- Vec3d offset = new Vec3d (0 , 1 , -0.1F ).rotateY (-spell .getTargetYaw () * MathHelper .RADIANS_PER_DEGREE );
159
159
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 ());
162
164
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 ()));
166
169
170
+ client .cameraEntity = cameraEntity ;
167
171
drawWorld (cameraEntity , 400 , 400 );
168
172
} finally {
173
+ client .cameraEntity = globalCameraEntity ;
169
174
recursionCount --;
170
175
}
171
176
}
@@ -198,44 +203,38 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
198
203
BackgroundRenderer .clearFog ();
199
204
RenderSystem .enableCull ();
200
205
201
- if (renderer == null ) {
202
- renderer = new WorldRenderer (client , client .getEntityRenderDispatcher (), client .getBlockEntityRenderDispatcher (), client .getBufferBuilders ());
203
- }
204
206
if (cameraEntity .getWorld () != world ) {
205
207
world = (ClientWorld )cameraEntity .getWorld ();
206
- renderer .setWorld (world );
207
208
}
208
- //((MixinMinecraftClient)client).setWorldRenderer(renderer);
209
209
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
+ }
211
219
212
220
camera .update (world , cameraEntity , false , false , 1 );
213
221
214
- double fov = 110 ;
222
+ double fov = 120 ;
215
223
Matrix4f projectionMatrix = client .gameRenderer .getBasicProjectionMatrix (fov );
216
224
Matrix4f cameraTransform = new Matrix4f ().rotation (camera .getRotation ().conjugate (new Quaternionf ()));
217
225
218
226
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
+
224
228
renderer .setupFrustum (
225
229
camera .getPos (),
226
230
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
228
237
);
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
-
239
238
// Strip transparency
240
239
RenderSystem .colorMask (false , false , false , true );
241
240
RenderSystem .clearColor (1 , 1 , 1 , 1 );
@@ -246,6 +245,7 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
246
245
} finally {
247
246
client .getFramebuffer ().beginWrite (true );
248
247
client .gameRenderer .loadProjectionMatrix (proj );
248
+ client .getBlockEntityRenderDispatcher ().setWorld (client .world );
249
249
250
250
window .setFramebufferWidth (globalFramebufferWidth );
251
251
window .setFramebufferHeight (globalFramebufferHeight );
@@ -264,6 +264,7 @@ public void close() {
264
264
if (renderer != null ) {
265
265
renderer .getChunkBuilder ().stop ();
266
266
renderer .close ();
267
+ renderer = null ;
267
268
}
268
269
}
269
270
}
0 commit comments