Skip to content

Commit 19c2e20

Browse files
committed
支持3d全景视频
1 parent 5c2a2e8 commit 19c2e20

9 files changed

Lines changed: 60 additions & 28 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ loader_version=0.16.14
1010
loom_version=1.10-SNAPSHOT
1111

1212
# Mod Properties
13-
mod_version=1.5.6
13+
mod_version=1.5.7
1414
maven_group=com.github.squi2rel.vp
1515
archives_base_name=VideoPlayer
1616

src/client/java/com/github/squi2rel/vp/VideoRenderer.java renamed to src/client/java/com/github/squi2rel/vp/ScreenRenderer.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.squi2rel.vp;
22

3+
import com.github.squi2rel.vp.vivecraft.Vivecraft;
34
import com.mojang.blaze3d.systems.RenderSystem;
45
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
56
import net.minecraft.client.gl.ShaderProgramKeys;
@@ -16,8 +17,8 @@
1617
import static com.github.squi2rel.vp.VideoPlayerClient.*;
1718

1819
@SuppressWarnings({"resource", "DataFlowIssue"})
19-
public class VideoRenderer {
20-
public static final HashMap<Integer, RenderLayer> quadsCache = new HashMap<>();
20+
public class ScreenRenderer {
21+
private static final HashMap<Integer, RenderLayer> quadsCache = new HashMap<>();
2122

2223
private static int triangleId;
2324
private static final RenderLayer VIDEO_TRIANGLES = RenderLayer.of(
@@ -51,7 +52,11 @@ public static void render(WorldRenderContext ctx) {
5152
cameraX = (float) camera.x;
5253
cameraY = (float) camera.y;
5354
cameraZ = (float) camera.z;
54-
ctx.camera().getRotation().invert(rotation);
55+
if (Vivecraft.loaded && Vivecraft.isVRActive()) {
56+
rotation.setFromNormalized(Vivecraft.getRotation()).invert();
57+
} else {
58+
ctx.camera().getRotation().invert(rotation);
59+
}
5560
RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX_COLOR);
5661
RenderSystem.enableDepthTest();
5762
RenderSystem.depthFunc(GL11.GL_LESS);

src/client/java/com/github/squi2rel/vp/VideoPlayerClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,12 @@ public void onInitializeClient() {
127127
screens.clear();
128128
currentLooking = null;
129129
});
130-
if (Vivecraft.isLoaded()) LOGGER.info("Found Vivecraft");
130+
if (Vivecraft.loaded) LOGGER.info("Found Vivecraft");
131131
ClientPlayConnectionEvents.JOIN.register((h, s, c) -> {
132132
if (config.alwaysConnected) ClientPacketHandler.config(VideoPlayerMain.version);
133133
});
134134
WorldRenderEvents.AFTER_SETUP.register(e -> VideoPlayerClient.update());
135-
WorldRenderEvents.AFTER_ENTITIES.register(VideoRenderer::render);
135+
WorldRenderEvents.AFTER_ENTITIES.register(ScreenRenderer::render);
136136
WorldRenderEvents.END.register(e -> VideoPlayerClient.postUpdate());
137137
ClientPlayNetworking.registerGlobalReceiver(VideoPayload.ID, (p, c) -> client.execute(() -> {
138138
ByteBuf buf = Unpooled.wrappedBuffer(p.data());

src/client/java/com/github/squi2rel/vp/mixin/client/WorldRendererMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.squi2rel.vp.mixin.client;
22

33
import com.github.squi2rel.vp.CameraRenderer;
4-
import com.github.squi2rel.vp.VideoRenderer;
4+
import com.github.squi2rel.vp.ScreenRenderer;
55
import net.minecraft.client.MinecraftClient;
66
import net.minecraft.client.render.Camera;
77
import net.minecraft.client.render.Frustum;
@@ -26,6 +26,6 @@ public void addSelf(Camera camera, Frustum frustum, List<Entity> output, Callbac
2626

2727
@Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true)
2828
public void noClouds(CallbackInfo ci) {
29-
if (VideoRenderer.skybox) ci.cancel();
29+
if (ScreenRenderer.skybox) ci.cancel();
3030
}
3131
}

src/client/java/com/github/squi2rel/vp/video/Degree360Player.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
package com.github.squi2rel.vp.video;
22

33
import com.github.squi2rel.vp.ClientVideoScreen;
4-
import com.github.squi2rel.vp.VideoRenderer;
4+
import com.github.squi2rel.vp.ScreenRenderer;
5+
import com.github.squi2rel.vp.vivecraft.Vivecraft;
56
import com.mojang.blaze3d.systems.RenderSystem;
67
import net.minecraft.client.gl.GlUsage;
78
import net.minecraft.client.gl.VertexBuffer;
89
import net.minecraft.client.render.*;
910
import net.minecraft.client.util.math.MatrixStack;
11+
import net.minecraft.util.math.MathHelper;
12+
import org.joml.Quaternionf;
1013
import org.joml.Vector3f;
1114

1215
import static com.github.squi2rel.vp.VideoPlayerClient.config;
1316

1417
public class Degree360Player extends VideoPlayer implements MetaListener {
18+
private static final Quaternionf tmp = new Quaternionf();
1519
protected float[] vertices;
1620
protected int vertexCount;
1721
protected VertexBuffer buffer;
1822
protected boolean dirty = true;
1923
protected int old;
2024
protected float x, y, z;
25+
protected int rot;
2126
protected boolean skybox = false;
2227

2328
public Degree360Player(ClientVideoScreen screen, Vector3f p1, Vector3f p2, Vector3f p3, Vector3f p4) {
@@ -33,14 +38,15 @@ public synchronized void init() {
3338
@Override
3439
public void draw(MatrixStack matrices, VertexConsumerProvider.Immediate immediate, ClientVideoScreen s) {
3540
super.draw(matrices, immediate, s);
41+
if (vertices == null) return;
3642
matrices.push();
37-
VideoRenderer.rotateMatrix(matrices);
43+
ScreenRenderer.rotateMatrix(matrices);
3844
if (skybox) {
39-
VideoRenderer.skybox = true;
45+
ScreenRenderer.skybox = true;
4046
} else {
41-
matrices.translate(x - VideoRenderer.cameraX, y - VideoRenderer.cameraY, z - VideoRenderer.cameraZ);
47+
matrices.translate(x - ScreenRenderer.cameraX, y - ScreenRenderer.cameraY, z - ScreenRenderer.cameraZ);
4248
}
43-
if (vertices == null) return;
49+
if (rot != 0) matrices.multiply(tmp.rotationY((float) Math.toRadians(rot)));
4450
int gray = (int) (config.brightness / 100.0 * 255);
4551
if (old != gray) {
4652
dirty = true;
@@ -57,21 +63,27 @@ public void draw(MatrixStack matrices, VertexConsumerProvider.Immediate immediat
5763
buffer.upload(bufferBuilder.end());
5864
dirty = false;
5965
}
60-
VideoRenderer.drawTriangles(getTextureId(), () -> buffer.draw(matrices.peek().getPositionMatrix(), RenderSystem.getProjectionMatrix(), RenderSystem.getShader()));
66+
if (is3d && Vivecraft.loaded && Vivecraft.isVRActive() && Vivecraft.isRightEye()) {
67+
matrices.multiply(tmp.rotationY(MathHelper.PI));
68+
}
69+
ScreenRenderer.drawTriangles(getTextureId(), () -> buffer.draw(matrices.peek().getPositionMatrix(), RenderSystem.getProjectionMatrix(), RenderSystem.getShader()));
6170
matrices.pop();
6271
}
6372

6473
@Override
6574
public void onMetaChanged() {
75+
super.onMetaChanged();
6676
x = p1.x + Float.intBitsToFloat(screen.meta.getOrDefault("x", 0));
6777
y = p1.y + Float.intBitsToFloat(screen.meta.getOrDefault("y", 0));
6878
z = p1.z + Float.intBitsToFloat(screen.meta.getOrDefault("z", 0));
6979
vertices = genVertices(
7080
screen.meta.getOrDefault("radius", 10),
7181
screen.meta.getOrDefault("lat", 32),
72-
screen.meta.getOrDefault("lon", 32)
82+
screen.meta.getOrDefault("lon", 32),
83+
screen.u1, screen.u2, screen.v1, screen.v2
7384
);
7485
skybox = screen.meta.getOrDefault("skybox", 0) != 0;
86+
rot = screen.meta.getOrDefault("rot", 0);
7587
vertexCount = vertices.length / 5;
7688
dirty = true;
7789
}
@@ -82,7 +94,7 @@ public synchronized void cleanup() {
8294
buffer.close();
8395
}
8496

85-
protected static float[] genVertices(float radius, int latSegments, int lonSegments) {
97+
protected static float[] genVertices(float radius, int latSegments, int lonSegments, float us, float ue, float vs, float ve) {
8698
int vertexCount = latSegments * (lonSegments + 1) * 2;
8799
float[] data = new float[vertexCount * 5];
88100

@@ -100,9 +112,9 @@ protected static float[] genVertices(float radius, int latSegments, int lonSegme
100112
float x2 = (float) (r2 * Math.cos(phi));
101113
float z1 = (float) (r1 * Math.sin(phi));
102114
float z2 = (float) (r2 * Math.sin(phi));
103-
float u = (float) lon / lonSegments;
104-
float v1 = (float) lat / latSegments;
105-
float v2 = (float) (lat + 1) / latSegments;
115+
float u = MathHelper.lerp((float) lon / lonSegments, us, ue);
116+
float v1 = MathHelper.lerp((float) lat / latSegments, vs, ve);
117+
float v2 = MathHelper.lerp((float) (lat + 1) / latSegments, vs, ve);
106118
data[idx++] = x1;
107119
data[idx++] = y1;
108120
data[idx++] = z1;

src/client/java/com/github/squi2rel/vp/video/IVideoPlayer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.squi2rel.vp.video;
22

33
import com.github.squi2rel.vp.ClientVideoScreen;
4-
import com.github.squi2rel.vp.VideoRenderer;
4+
import com.github.squi2rel.vp.ScreenRenderer;
55
import com.github.squi2rel.vp.provider.VideoInfo;
66
import net.minecraft.client.gl.ShaderProgramKeys;
77
import net.minecraft.client.render.*;
@@ -91,11 +91,11 @@ default void draw(MatrixStack matrices, VertexConsumerProvider.Immediate immedia
9191
boolean fx = flippedX();
9292
boolean fy = flippedY();
9393
matrices.push();
94-
matrices.translate(-VideoRenderer.cameraX, -VideoRenderer.cameraY, -VideoRenderer.cameraZ);
94+
matrices.translate(-ScreenRenderer.cameraX, -ScreenRenderer.cameraY, -ScreenRenderer.cameraZ);
9595
Matrix4f mat = matrices.peek().getPositionMatrix();
9696
matrices.pop();
9797
RenderPhase.ShaderProgram program = new RenderPhase.ShaderProgram(ShaderProgramKeys.POSITION_TEX_COLOR);
98-
RenderLayer layer = VideoRenderer.getLayer(getTextureId());
98+
RenderLayer layer = ScreenRenderer.getLayer(getTextureId());
9999
VertexConsumer consumer = immediate.getBuffer(layer);
100100
if (scale == 1) {
101101
draw(mat, consumer, p1, p2, p3, p4, fx ? s.u2 : s.u1, fy ? s.v2 : s.v1, fx ? s.u1 : s.u2, fy ? s.v1 : s.v2);

src/client/java/com/github/squi2rel/vp/video/VideoPlayer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public void draw(Matrix4f mat, VertexConsumer consumer, Vector3f p1, Vector3f p2
178178
}
179179

180180
public void draw3D(Matrix4f mat, VertexConsumer consumer, Vector3f p1, Vector3f p2, Vector3f p3, Vector3f p4, float u1, float v1, float u2, float v2) {
181-
if (Vivecraft.isLoaded() && Vivecraft.isRightEye()) {
181+
if (Vivecraft.loaded && Vivecraft.isRightEye()) {
182182
IVideoPlayer.super.draw(mat, consumer, p1, p2, p3, p4, (u1 + u2) / 2, v1, u2, v2);
183183
} else {
184184
IVideoPlayer.super.draw(mat, consumer, p1, p2, p3, p4, u1, v1, (u1 + u2) / 2, v2);
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package com.github.squi2rel.vp.vivecraft;
22

33
import net.fabricmc.loader.api.FabricLoader;
4+
import org.joml.Matrix4f;
45

56
public class Vivecraft {
6-
private static final boolean loaded = FabricLoader.getInstance().isModLoaded("vivecraft");
7-
8-
public static boolean isLoaded() {
9-
return loaded;
10-
}
7+
public static final boolean loaded = FabricLoader.getInstance().isModLoaded("vivecraft");
118

129
public static boolean isRightEye() {
1310
return VivecraftImpl.isRightEye();
1411
}
12+
13+
public static boolean isVRActive() {
14+
return VivecraftImpl.isVRActive();
15+
}
16+
17+
public static Matrix4f getRotation() {
18+
return VivecraftImpl.getRotation();
19+
}
1520
}

src/client/java/com/github/squi2rel/vp/vivecraft/VivecraftImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.github.squi2rel.vp.vivecraft;
22

3+
import org.joml.Matrix4f;
34
import org.vivecraft.client_vr.ClientDataHolderVR;
5+
import org.vivecraft.client_vr.VRState;
46
import org.vivecraft.client_vr.render.RenderPass;
57

68
class VivecraftImpl {
@@ -9,4 +11,12 @@ class VivecraftImpl {
911
static boolean isRightEye() {
1012
return DATA_HOLDER.currentPass == RenderPass.RIGHT;
1113
}
14+
15+
static boolean isVRActive() {
16+
return VRState.VR_RUNNING;
17+
}
18+
19+
static Matrix4f getRotation() {
20+
return DATA_HOLDER.vrPlayer.getVRDataWorld().getEye(DATA_HOLDER.currentPass).getMatrix();
21+
}
1222
}

0 commit comments

Comments
 (0)