forked from LeenkxTeam/LNXSDK
		
	Merge pull request 't3du [ Repe ] - VR Code' (#93) from Onek8/LNXSDK:main into main
Reviewed-on: LeenkxTeam/LNXSDK#93
This commit is contained in:
		@ -518,12 +518,44 @@ class RenderPath {
 | 
				
			|||||||
		return Reflect.field(kha.Shaders, handle + "_comp");
 | 
							return Reflect.field(kha.Shaders, handle + "_comp");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#if (kha_krom && lnx_vr)
 | 
						#if lnx_vr
 | 
				
			||||||
	public function drawStereo(drawMeshes: Int->Void) {
 | 
						public function drawStereo(drawMeshes: Void->Void) {
 | 
				
			||||||
		for (eye in 0...2) {
 | 
							var vr = kha.vr.VrInterface.instance;
 | 
				
			||||||
			Krom.vrBeginRender(eye);
 | 
							var appw = iron.App.w();
 | 
				
			||||||
			drawMeshes(eye);
 | 
							var apph = iron.App.h();
 | 
				
			||||||
			Krom.vrEndRender(eye);
 | 
							var halfw = Std.int(appw / 2);
 | 
				
			||||||
 | 
							var g = currentG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (vr != null && vr.IsPresenting()) {
 | 
				
			||||||
 | 
								// Left eye
 | 
				
			||||||
 | 
								Scene.active.camera.V.setFrom(Scene.active.camera.leftV);
 | 
				
			||||||
 | 
								Scene.active.camera.P.self = vr.GetProjectionMatrix(0);
 | 
				
			||||||
 | 
								g.viewport(0, 0, halfw, apph);
 | 
				
			||||||
 | 
								drawMeshes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Right eye
 | 
				
			||||||
 | 
								begin(g, additionalTargets);
 | 
				
			||||||
 | 
								Scene.active.camera.V.setFrom(Scene.active.camera.rightV);
 | 
				
			||||||
 | 
								Scene.active.camera.P.self = vr.GetProjectionMatrix(1);
 | 
				
			||||||
 | 
								g.viewport(halfw, 0, halfw, apph);
 | 
				
			||||||
 | 
								drawMeshes();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else { // Simulate
 | 
				
			||||||
 | 
								Scene.active.camera.buildProjection(halfw / apph);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Left eye
 | 
				
			||||||
 | 
								g.viewport(0, 0, halfw, apph);
 | 
				
			||||||
 | 
								drawMeshes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Right eye
 | 
				
			||||||
 | 
								begin(g, additionalTargets);
 | 
				
			||||||
 | 
								Scene.active.camera.transform.move(Scene.active.camera.right(), 0.032);
 | 
				
			||||||
 | 
								Scene.active.camera.buildMatrix();
 | 
				
			||||||
 | 
								g.viewport(halfw, 0, halfw, apph);
 | 
				
			||||||
 | 
								drawMeshes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Scene.active.camera.transform.move(Scene.active.camera.right(), -0.032);
 | 
				
			||||||
 | 
								Scene.active.camera.buildMatrix();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	#end
 | 
						#end
 | 
				
			||||||
 | 
				
			|||||||
@ -30,12 +30,22 @@ class CameraObject extends Object {
 | 
				
			|||||||
	static var sphereCenter = new Vec4();
 | 
						static var sphereCenter = new Vec4();
 | 
				
			||||||
	static var vcenter = new Vec4();
 | 
						static var vcenter = new Vec4();
 | 
				
			||||||
	static var vup = new Vec4();
 | 
						static var vup = new Vec4();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						#if lnx_vr
 | 
				
			||||||
 | 
						var helpMat = Mat4.identity();
 | 
				
			||||||
 | 
						public var leftV = Mat4.identity();
 | 
				
			||||||
 | 
						public var rightV = Mat4.identity();
 | 
				
			||||||
 | 
						#end
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	public function new(data: CameraData) {
 | 
						public function new(data: CameraData) {
 | 
				
			||||||
		super();
 | 
							super();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this.data = data;
 | 
							this.data = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#if lnx_vr
 | 
				
			||||||
 | 
							iron.system.VR.initButton();
 | 
				
			||||||
 | 
							#end
 | 
				
			||||||
 | 
							
 | 
				
			||||||
		buildProjection();
 | 
							buildProjection();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		V = Mat4.identity();
 | 
							V = Mat4.identity();
 | 
				
			||||||
@ -117,6 +127,26 @@ class CameraObject extends Object {
 | 
				
			|||||||
		V.getInverse(transform.world);
 | 
							V.getInverse(transform.world);
 | 
				
			||||||
		VP.multmats(P, V);
 | 
							VP.multmats(P, V);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#if lnx_vr
 | 
				
			||||||
 | 
							var vr = kha.vr.VrInterface.instance;
 | 
				
			||||||
 | 
							if (vr != null && vr.IsPresenting()) {
 | 
				
			||||||
 | 
								leftV.setFrom(V);
 | 
				
			||||||
 | 
								helpMat.self = vr.GetViewMatrix(0);
 | 
				
			||||||
 | 
								leftV.multmat(helpMat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								rightV.setFrom(V);
 | 
				
			||||||
 | 
								helpMat.self = vr.GetViewMatrix(1);
 | 
				
			||||||
 | 
								rightV.multmat(helpMat);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								leftV.setFrom(V);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							VP.multmats(P, leftV);
 | 
				
			||||||
 | 
							#else
 | 
				
			||||||
 | 
							VP.multmats(P, V);
 | 
				
			||||||
 | 
							#end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (data.raw.frustum_culling) {
 | 
							if (data.raw.frustum_culling) {
 | 
				
			||||||
			buildViewFrustum(VP, frustumPlanes);
 | 
								buildViewFrustum(VP, frustumPlanes);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -155,8 +155,13 @@ class LightObject extends Object {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public function setCascade(camera: CameraObject, cascade: Int) {
 | 
						public function setCascade(camera: CameraObject, cascade: Int) {
 | 
				
			||||||
		m.setFrom(camera.V);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#if lnx_vr
 | 
				
			||||||
 | 
							m.setFrom(camera.leftV);
 | 
				
			||||||
 | 
							#else
 | 
				
			||||||
 | 
							m.setFrom(camera.V);
 | 
				
			||||||
 | 
							#end
 | 
				
			||||||
 | 
							
 | 
				
			||||||
		#if lnx_csm
 | 
							#if lnx_csm
 | 
				
			||||||
		if (camSlicedP == null) {
 | 
							if (camSlicedP == null) {
 | 
				
			||||||
			camSlicedP = [];
 | 
								camSlicedP = [];
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										52
									
								
								leenkx/Sources/iron/system/VR.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								leenkx/Sources/iron/system/VR.hx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					package iron.system;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import iron.math.Mat4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if lnx_vr
 | 
				
			||||||
 | 
					class VR {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						static var undistortionMatrix: Mat4 = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public function new() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static function getUndistortionMatrix(): Mat4 {
 | 
				
			||||||
 | 
							if (undistortionMatrix == null) {
 | 
				
			||||||
 | 
								undistortionMatrix = Mat4.identity();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return undistortionMatrix;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static function getMaxRadiusSq(): Float {
 | 
				
			||||||
 | 
							return 0.0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static function initButton() {
 | 
				
			||||||
 | 
							function vrDownListener(index: Int, x: Float, y: Float) {
 | 
				
			||||||
 | 
								var vr = kha.vr.VrInterface.instance;
 | 
				
			||||||
 | 
								if (vr == null || !vr.IsVrEnabled() || vr.IsPresenting()) return;
 | 
				
			||||||
 | 
								var w: Float = iron.App.w();
 | 
				
			||||||
 | 
								var h: Float = iron.App.h();
 | 
				
			||||||
 | 
								if (x < w - 150 || y < h - 150) return;
 | 
				
			||||||
 | 
								vr.onVRRequestPresent();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							function vrRender2D(g: kha.graphics2.Graphics) {
 | 
				
			||||||
 | 
								var vr = kha.vr.VrInterface.instance;
 | 
				
			||||||
 | 
								if (vr == null || !vr.IsVrEnabled() || vr.IsPresenting()) return;
 | 
				
			||||||
 | 
								var w: Float = iron.App.w();
 | 
				
			||||||
 | 
								var h: Float = iron.App.h();
 | 
				
			||||||
 | 
								g.color = 0xffff0000;
 | 
				
			||||||
 | 
								g.fillRect(w - 150, h - 150, 140, 140);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							kha.input.Mouse.get().notify(vrDownListener, null, null, null);
 | 
				
			||||||
 | 
							iron.App.notifyOnRender2D(vrRender2D);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var vr = kha.vr.VrInterface.instance; // Straight to VR (Oculus Carmel)
 | 
				
			||||||
 | 
							if (vr != null && vr.IsVrEnabled()) {
 | 
				
			||||||
 | 
								vr.onVRRequestPresent();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#end
 | 
				
			||||||
		Reference in New Issue
	
	Block a user