forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			187 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			187 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.kore.vr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import kha.graphics4.FragmentShader;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.Graphics;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.ConstantLocation;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.TextureUnit;
							 | 
						||
| 
								 | 
							
								import kha.Framebuffer;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.IndexBuffer;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.Program;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.Usage;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexBuffer;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexData;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexShader;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexStructure;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.TextureFormat;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.CullMode;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.BlendingOperation;
							 | 
						||
| 
								 | 
							
								import kha.Image;
							 | 
						||
| 
								 | 
							
								import kha.math.Matrix4;
							 | 
						||
| 
								 | 
							
								import kha.math.Quaternion;
							 | 
						||
| 
								 | 
							
								import kha.math.Vector2;
							 | 
						||
| 
								 | 
							
								import kha.math.Vector3;
							 | 
						||
| 
								 | 
							
								import kha.math.Vector4;
							 | 
						||
| 
								 | 
							
								import kha.vr.Pose;
							 | 
						||
| 
								 | 
							
								import kha.vr.PoseState;
							 | 
						||
| 
								 | 
							
								import kha.vr.SensorState;
							 | 
						||
| 
								 | 
							
								import kha.vr.TimeWarpParms;
							 | 
						||
| 
								 | 
							
								import kha.Loader;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if ANDROID
							 | 
						||
| 
								 | 
							
								@:headerCode('
							 | 
						||
| 
								 | 
							
								#include <Kore/Vr/VrInterface.h>
							 | 
						||
| 
								 | 
							
								')
							 | 
						||
| 
								 | 
							
								#end
							 | 
						||
| 
								 | 
							
								#if VR_CARDBOARD
							 | 
						||
| 
								 | 
							
								class CardboardVrInterfaceTest extends kha.vr.VrInterface {
							 | 
						||
| 
								 | 
							
									// We draw directly to the screen
							 | 
						||
| 
								 | 
							
									public var framebuffer: Framebuffer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private var image: Image;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode('
							 | 
						||
| 
								 | 
							
										return Kore::VrInterface::getGaze();
							 | 
						||
| 
								 | 
							
									')
							 | 
						||
| 
								 | 
							
									private function GetGaze(): Quaternion {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public override function GetSensorState(): SensorState {
							 | 
						||
| 
								 | 
							
										// Return from cardboard api
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var s: SensorState = new SensorState();
							 | 
						||
| 
								 | 
							
										s.Predicted = s.Recorded = new PoseState();
							 | 
						||
| 
								 | 
							
										s.Predicted.Pose = new Pose();
							 | 
						||
| 
								 | 
							
										s.Predicted.Pose.Orientation = GetGaze();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return s;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public override function GetPredictedSensorState(time: Float): SensorState {
							 | 
						||
| 
								 | 
							
										// Return using cardboard api
							 | 
						||
| 
								 | 
							
										return GetSensorState();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public override function WarpSwapBlack(): Void {
							 | 
						||
| 
								 | 
							
										// Oculus-specific
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public override function WarpSwapLoadingIcon(): Void {
							 | 
						||
| 
								 | 
							
										// Oculus-specific
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public override function WarpSwap(parms: TimeWarpParms): Void {
							 | 
						||
| 
								 | 
							
										// Draw the two images, side-by-side
							 | 
						||
| 
								 | 
							
										// parms.LeftImage.Image = Loader.the.getImage("use.png");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (image == null) {
							 | 
						||
| 
								 | 
							
											image = Image.createRenderTarget(Sys.pixelWidth, Sys.pixelHeight, TextureFormat.RGBA32);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var g: Graphics = image.g4;
							 | 
						||
| 
								 | 
							
										g.begin();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										g.clear(Color.Orange);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										g.setCullMode(CullMode.None);
							 | 
						||
| 
								 | 
							
										// g.setBlendingMode(BlendingOperation.BlendOne, BlendingOperation.BlendZero);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										g.setProgram(program);
							 | 
						||
| 
								 | 
							
										g.setVertexBuffer(vb);
							 | 
						||
| 
								 | 
							
										g.setIndexBuffer(ib);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var texture: TextureUnit = program.getTextureUnit("tex");
							 | 
						||
| 
								 | 
							
										var matrixLocation: ConstantLocation = program.getConstantLocation("projectionMatrix");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var t: Matrix4 = Matrix4.translation(-0.5, 0, 0);
							 | 
						||
| 
								 | 
							
										var s: Matrix4 = Matrix4.scale(0.5, 1, 1);
							 | 
						||
| 
								 | 
							
										var m: Matrix4 = s.multmat(t);
							 | 
						||
| 
								 | 
							
										g.setMatrix(matrixLocation, m);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										g.setTexture(texture, parms.LeftImage.Image);
							 | 
						||
| 
								 | 
							
										g.drawIndexedVertices();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										t = Matrix4.translation(0.5, 0, 0);
							 | 
						||
| 
								 | 
							
										m = s.multmat(t);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										g.setMatrix(matrixLocation, m);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										g.setTexture(texture, parms.RightImage.Image);
							 | 
						||
| 
								 | 
							
										g.drawIndexedVertices();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										g.end();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										framebuffer.g4.begin();
							 | 
						||
| 
								 | 
							
										SendTextureToDistortion(image);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										framebuffer.g4.end();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode('Kore::VrInterface::DistortTexture(image.mPtr);')
							 | 
						||
| 
								 | 
							
									private function SendTextureToDistortion(image: Image) {
							 | 
						||
| 
								 | 
							
										// TODO: Add a function to CPP VrInterface
							 | 
						||
| 
								 | 
							
										// TODO: Check how large the texture should be
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public override function GetTimeInSeconds(): Float {
							 | 
						||
| 
								 | 
							
										return Sys.getTime();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var vb: VertexBuffer;
							 | 
						||
| 
								 | 
							
									var ib: IndexBuffer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var program: Program;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private function setVertex(a: Array<Float>, index: Int, pos: Vector3, uv: Vector2, color: Vector4) {
							 | 
						||
| 
								 | 
							
										var base: Int = index * 9;
							 | 
						||
| 
								 | 
							
										a[base + 0] = pos.x;
							 | 
						||
| 
								 | 
							
										a[base + 1] = pos.y;
							 | 
						||
| 
								 | 
							
										a[base + 2] = pos.z;
							 | 
						||
| 
								 | 
							
										base += 3;
							 | 
						||
| 
								 | 
							
										a[base + 0] = uv.x;
							 | 
						||
| 
								 | 
							
										a[base + 1] = uv.y;
							 | 
						||
| 
								 | 
							
										base += 2;
							 | 
						||
| 
								 | 
							
										for (i in 0...4) {
							 | 
						||
| 
								 | 
							
											a[base + i] = color.get(i);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new() {
							 | 
						||
| 
								 | 
							
										super();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var structure: VertexStructure = new VertexStructure();
							 | 
						||
| 
								 | 
							
										structure.add("vertexPosition", VertexData.Float3);
							 | 
						||
| 
								 | 
							
										structure.add("vertexUV", VertexData.Float2);
							 | 
						||
| 
								 | 
							
										structure.add("vertexColor", VertexData.Float4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										vb = new VertexBuffer(4, structure, Usage.StaticUsage);
							 | 
						||
| 
								 | 
							
										var verts: Array<Float> = vb.lock();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										setVertex(verts, 0, new Vector3(-1, -1, 0), new Vector2(0, 0), new Vector4(1, 1, 1, 1));
							 | 
						||
| 
								 | 
							
										setVertex(verts, 1, new Vector3(-1, 1, 0), new Vector2(0, 1), new Vector4(1, 1, 1, 1));
							 | 
						||
| 
								 | 
							
										setVertex(verts, 2, new Vector3(1, -1, 0), new Vector2(1, 0), new Vector4(1, 1, 1, 1));
							 | 
						||
| 
								 | 
							
										setVertex(verts, 3, new Vector3(1, 1, 0), new Vector2(1, 1), new Vector4(1, 1, 1, 1));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										vb.unlock();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										ib = new IndexBuffer(6, Usage.StaticUsage);
							 | 
						||
| 
								 | 
							
										var indices: Array<Int> = ib.lock();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										indices[0] = 0;
							 | 
						||
| 
								 | 
							
										indices[1] = 1;
							 | 
						||
| 
								 | 
							
										indices[2] = 2;
							 | 
						||
| 
								 | 
							
										indices[3] = 1;
							 | 
						||
| 
								 | 
							
										indices[4] = 3;
							 | 
						||
| 
								 | 
							
										indices[5] = 2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										ib.unlock();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										program = new Program();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										program.setVertexShader(new VertexShader(Loader.the.getShader("painter-image.vert")));
							 | 
						||
| 
								 | 
							
										program.setFragmentShader(new FragmentShader(Loader.the.getShader("painter-image.frag")));
							 | 
						||
| 
								 | 
							
										program.link(structure);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#end
							 |