package Ġopen vr . hello Vr _ OpenGL Ċ Ċ import Ġglm _. mat 4 x 4 . Mat 4 Ċ import Ġglm _. vec 2 . Vec 2 Ċ import Ġglm _. vec 4 . Vec 4 Ċ import Ġg ln . misc . Gl Debug Severity Ċ import Ġg ln . misc . gl Clear Color Buffer Ċ import Ġg ln . misc . gl Clear Depth Buffer Ċ import Ġg ln . misc . gl Debug Message Callback Ċ import Ġk ool . getValue Ċ import Ġk ool . setValue Ċ import Ġopen vr . lib .* Ċ import Ġopen vr . lib . V RE vent Type Ċ import Ġopen vr . lib . vr Render Models . free Native Ċ import Ġorg . lwjgl . opengl . GL 1 1 .* Ċ import Ġorg . lwjgl . opengl . KHR Debug . GL _ DEBUG _ OUTPUT _ SYN CH RON O US Ċ import Ġorg . lwjgl . opengl . KHR Debug . gl Debug Message Control Ċ import Ġorg . lwjgl . open vr . Tracked Device Pose Ċ import Ġorg . lwjgl . open vr . V RE vent Ċ import Ġorg . lwjgl . system . Memory Util . NULL Ċ import Ġuno . glfw . G lfw Window . Cursor Mode Ċ import Ġuno . glfw . Key Ċ import Ġuno . glfw . glfw Ċ import Ġuno . glfw . window Hint . Profile Ċ import Ġjava . nio . Int Buffer Ċ import Ġjava . nio . file . Paths Ċ import Ġkotlin . reflect . K Mutable Property 0 Ċ import Ġopen vr . lib . Tracked Device Class Ġas ĠT DC Ċ Ċ fun Ġmain () Ġ{ ĊĊĠĠĠ Ġif Ġ( System . getenv (" TR AV IS ") Ġ== Ġ" true ") Ġ// Ġfor Ġtravis ĊĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠ ĠApplication (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Main Loop () ĊĠĠĠĠĠĠĠ Ġshutdown () ĊĠĠĠ Ġ} Ċ } Ċ Ċ const Ġval Ġdebug OpenGL Ġ= Ġtrue Ċ const Ġval Ġv Blank Ġ= Ġtrue Ċ const Ġval Ġgl Finish Hack Ġ= Ġtrue Ċ Ċ // ĠLoading Ġthe ĠSteam VR ĠRuntime Ċ val Ġh md Ġ= Ġvr System Ċ late init Ġvar Ġscene : ĠScene Ċ Ċ late init Ġvar Ġeye Desc : ĠArray < Frame Buffer Desc > Ċ Ċ enum Ġclass ĠHand Ġ{ ĠLeft , ĠRight Ġ} Ċ Ċ val Ġclear Color Ġ= ĠVec 4 ( 0 , Ġ 0 , Ġ 0 , Ġ 1 ) Ċ Ċ var Ġshow C ubes Ġ= Ġtrue Ċ Ċ late init Ġvar Ġprojection : ĠArray < Mat 4 > Ċ late init Ġvar Ġeye Pos : ĠArray < Mat 4 > Ċ Ċ var Ġh md Pose Ġ= ĠMat 4 () Ċ Ċ var Ġtracked Controller Count Ġ= Ġ 0 Ċ var Ġtracked Controller Count _ Last Ġ= Ġ- 1 Ċ Ċ class ĠController Info Ġ{ ĊĠĠĠ Ġvar Ġsource Ġ= Ġvr . invalid Input Value Handle ĊĠĠĠ Ġvar Ġaction Pose Ġ= Ġvr . invalid Action Handle ĊĠĠĠ Ġvar Ġaction H aptic Ġ= Ġvr . invalid Action Handle ĊĠĠĠ Ġval Ġr mat 4 Pose Ġ= ĠMat 4 () ĊĠĠĠ Ġvar Ġrender Model : ĠC GL Render Model ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġrender ModelName Ġ= Ġ"" ĊĠĠĠ Ġvar Ġshow Controller Ġ= Ġfalse Ċ } Ċ Ċ val Ġr Hand Ġ= ĠArray ( 2 ) Ġ{ ĠController Info () Ġ} Ċ operator Ġfun ĠArray < Controller Info >. get ( hand : ĠHand ) Ġ= Ġget ( hand . ordinal ) ĊĊ Ċ class ĠApplication Ġ{ ĊĊĠĠĠ Ġval Ġtracked Device Pose Ġ= ĠTrack ed Device Pose . calloc ( vr . max Tracked Device Count ) ĊĊĠĠĠ Ġval Ġr mat 4 Device Pose Ġ= ĠArray ( vr . max Tracked Device Count ) Ġ{ ĠMat 4 () Ġ} ĊĊĠĠĠ Ġvar Ġaction Hide C ubes Ġ= Ġvr . invalid Action Handle ĊĠĠĠ Ġvar Ġaction Hide This Controller Ġ= Ġvr . invalid Action Handle ĊĠĠĠ Ġvar Ġaction Trigger H aptic Ġ= Ġvr . invalid Action Handle ĊĠĠĠ Ġvar Ġaction An along Input Ġ= Ġvr . invalid Action Handle ĊĊĠĠĠ Ġvar Ġaction set Demo Ġ= Ġvr . invalid Action Set Handle ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( glfw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Hint Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . version Ġ= Ġ" 4 . 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠProfile . core ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ= Ġdebug OpenGL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoading Ġthe ĠSteam VR ĠRuntime ĊĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġvr . init () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( err Ġ!= ĠVR Init Error . None ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Unable Ġto Ġinit ĠVR Ġruntime : Ġ${ err . as English Description }") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! vr Comp ositor . is Interface Version Valid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Application :: init Ġ- ĠFailed Ġto Ġinitialize ĠVR ĠComp ositor !") ĊĊĠĠĠĠĠĠĠ Ġvr Input . apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Action Manifest Path ( java Class . class Loader . getResource (" hello vr _ actions . json ") !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Hide C ubes Ġ= Ġget Action Handle ("/ actions / demo / in / Hide C ubes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Hide This Controller Ġ= Ġget Action Handle ("/ actions / demo / in / Hide This Controller ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Trigger H aptic Ġ= Ġget Action Handle ("/ actions / demo / in / Trigger H aptic ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction An along Input Ġ= Ġget Action Handle ("/ actions / demo / in / Analog Input ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction set Demo Ġ= Ġget Action Set Handle ("/ actions / demo ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġr Hand [ Hand . Left ]. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction H aptic Ġ= Ġget Action Handle ("/ actions / demo / out / H aptic _ Left ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġget Input Source Handle ("/ user / hand / left ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Pose Ġ= Ġget Action Handle ("/ actions / demo / in / Hand _ Left ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr Hand [ Hand . Right ]. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction H aptic Ġ= Ġget Action Handle ("/ actions / demo / out / H aptic _ Right ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġget Input Source Handle ("/ user / hand / right ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Pose Ġ= Ġget Action Handle ("/ actions / demo / in / Hand _ Right ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnear Clip Ġ= Ġ 0 . 1 f ĊĠĠĠĠĠĠĠ Ġval Ġfar Clip Ġ= Ġ 3 0 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠGets Ġa ĠMatrix ĠProjection ĠE ye Ġwith Ġrespect Ġto Ġn Eye . ĊĠĠĠĠĠĠĠ Ġprojection Ġ= ĠArray ( 2 ) Ġ{ Ġh md . get Projection Matrix ( V RE ye Ġof Ġit , Ġnear Clip , Ġfar Clip ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPurpose : ĠGets Ġan ĠH MD Matrix Pose Eye Ġwith Ġrespect Ġto Ġn Eye . ĊĠĠĠĠĠĠĠ Ġeye Pos Ġ= ĠArray ( 2 ) Ġ{ Ġh md . get Eye To Head Transform ( V RE ye Ġof Ġit ). inverse () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGLFW Ġbook keep ing ĊĠĠĠ Ġval Ġcompanion Window Ġ= ĠComp anion Window () Ġ// Ġgl Ġresources ĊĊĠĠĠ Ġval Ġwindow ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcompanion Window . window ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug OpenGL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Debug Message Callback Ġ{ Ġsource , Ġtype , Ġseverity , Ġid , Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġ"$ id : Ġ$ type Ġof Ġ$ severity Ġseverity , Ġraised Ġfrom Ġ$ source : Ġ$ message " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( severity Ġ== ĠGl Debug Severity . HIGH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError ( string ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( string ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Debug Message Control ( GL _ D ONT _ C ARE , ĠGL _ D ONT _ C ARE , ĠGL _ D ONT _ C ARE , Ġnull Ġas ĠInt Buffer ?, Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Enable ( GL _ DEBUG _ OUTPUT _ SYN CH RON O US ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscene Ġ= ĠScene () Ġ// Ġgl Ġresources ĊĠĠĠĠĠĠĠ Ġeye Desc Ġ= ĠArray ( 2 ) Ġ{ ĠFrame Buffer Desc ( h md . recommended RenderTarget Size ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġvalid Pose Count Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġvalid Pose Count _ Last Ġ= Ġ 0 ĊĠĠĠ Ġval Ġanalog Value Ġ= ĠVec 2 () ĊĊĠĠĠ Ġ/** Ġwhat Ġclasses Ġwe Ġsaw Ġpo ses Ġfor Ġthis Ġframe Ġ*/ ĊĠĠĠ Ġvar Ġstr Pose Classes Ġ= Ġ"" ĊĠĠĠ Ġ/** Ġfor Ġeach Ġdevice , Ġa Ġcharacter Ġrepresenting Ġits Ġclass Ġ*/ ĊĠĠĠ Ġval Ġdev Class Char Ġ= ĠChar Array ( vr . max Tracked Device Count ) ĊĊĠĠĠ Ġval Ġrender Models Ġ= ĠArrayList < C GL Render Model >() ĊĊĠĠĠ Ġfun Ġrun Main Loop () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwindow . cursor Mode Ġ= ĠCursor Mode . hidden ĊĊĠĠĠĠĠĠĠ Ġwindow . loop Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Input () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Frame () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġh aptic Device : ĠVR Input Value Handle Ġ= ĠNULL ĊĠĠĠ Ġvar Ġhide Device : ĠVR Input Value Handle Ġ= ĠNULL ĊĊĠĠĠ Ġfun Ġhandle Input () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwindow . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Pressed ( Key . ESCAPE ) Ġ|| Ġis Pressed ( Key . Q )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Close Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( is Pressed ( Key . C )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow C ubes Ġ= Ġ! show C ubes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠProcess ĠSteam VR Ġevents ĊĠĠĠĠĠĠĠ Ġh md . polling Events Ġ{ Ġevent Ġ-> Ġevent . process () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠProcess ĠSteam VR Ġaction Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate Action State Ġis Ġcalled Ġeach Ġframe Ġto Ġupdate Ġthe Ġstate Ġof Ġthe Ġactions Ġthemselves . ĠThe Ġapplication ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrols Ġwhich Ġaction Ġsets Ġare Ġactive Ġwith Ġthe Ġprovided Ġarray Ġof ĠVR Active Action Set _ t Ġstructs . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġaction Set Ġ= Ġvr . VR Active Action Set (). apply Ġ{ Ġaction Set Ġ= Ġaction set Demo Ġ} ĊĠĠĠĠĠĠĠ Ġvr Input Ġupdate Action State Ġaction Set ĊĊĠĠĠĠĠĠĠ Ġshow C ubes Ġ= Ġ! get Digital Action State ( action Hide C ubes ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( get Digital Action R ising Edge ( action Trigger H aptic , Ġ:: h aptic Device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( h aptic Device Ġ== Ġr Hand [ Hand . Left ]. source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvr Input . trigger H aptic V ibration Action ( r Hand [ Hand . Left ]. action H aptic , Ġ 0 f , Ġ 1 f , Ġ 4 f , Ġ 1 f , Ġvr . invalid Input Value Handle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( h aptic Device Ġ== Ġr Hand [ Hand . Right ]. source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvr Input . trigger H aptic V ibration Action ( r Hand [ Hand . Right ]. action H aptic , Ġ 0 f , Ġ 1 f , Ġ 4 f , Ġ 1 f , Ġvr . invalid Input Value Handle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġanalog Data Ġ= Ġvr . Input Analog Action Data () ĊĠĠĠĠĠĠĠ Ġif Ġ( vr Input . get Analog Action Data ( action An along Input , Ġanalog Data , Ġvr . invalid Input Value Handle ) Ġ== Ġvr Input . Error . None Ġ&& Ġanalog Data . active ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalog Value . put ( an alog Data . x , Ġanalog Data . y ) Ċ // ĠĠĠĠĠĠĠ Ġanalog Value . println (" an alog Value : Ġ") ĊĊĠĠĠĠĠĠĠ Ġr Hand [ Hand . Left ]. show Controller Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġr Hand [ Hand . Right ]. show Controller Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( get Digital Action State ( action Hide This Controller , Ġ:: hide Device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hide Device Ġ== Ġr Hand [ Hand . Left ]. source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Hand [ Hand . Left ]. show Controller Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hide Device Ġ== Ġr Hand [ Hand . Right ]. source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Hand [ Hand . Right ]. show Controller Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( hand Ġin ĠHand . values ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpose Data Ġ= Ġvr . Input Pose Action Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġvr Input . get Pose Action Data For Next Frame ( r Hand [ hand ]. action Pose , ĠTracking Un iverse Origin . Stand ing , Ġpose Data , Ġvr . invalid Input Value Handle ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ err Ġ!= Ġvr Input . Error . None } Ġ|| Ġ${ ! pose Data . active } Ġ|| Ġ${ ! pose Data . pose . pose IsValid }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( err Ġ!= Ġvr Input . Error . None Ġ|| Ġ! pose Data . active Ġ|| Ġ! pose Data . pose . pose IsValid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Hand [ hand ]. show Controller Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Hand [ hand ]. r mat 4 Pose Ġput Ġpose Data . pose . device To Absolute Tracking ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Info Ġ= Ġvr . Input Origin Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vr Input . get Origin Tracked DeviceInfo ( pose Data . active Origin , Ġorigin Info ) Ġ== Ġvr Input . Error . None ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġorigin Info . tracked Device Index Ġ!= Ġvr . tracked Device Index Invalid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrender ModelName Ġ= Ġh md . getString Tracked Device Property ( origin Info . tracked Device Index , ĠTrack ed Device Property . Render ModelName _ String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( render ModelName Ġ!= Ġr Hand [ hand ]. render ModelName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Hand [ hand ]. render Model Ġ= Ġfind Or Load Render Model ( render ModelName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠPurpose : ĠPro cesses Ġa Ġsingle ĠVR Ġevent Ġ*/ ĊĠĠĠ Ġfun ĠV RE vent . process () Ġ= Ġwhen Ġ( eventType ) Ġ{ ĊĠĠĠĠĠĠĠ ĠV RE vent Type . Tracked Device De activated Ġ-> Ġprintln (" Device Ġ$ tracked Device Index Ġdet ached .") ĊĠĠĠĠĠĠĠ ĠV RE vent Type . Tracked Device Updated Ġ-> Ġprintln (" Device Ġ$ tracked Device Index Ġupdated .") ĊĠĠĠĠĠĠĠ ĠV RE vent Type . Tracked Device Activated Ġ-> Ġprintln (" Device Ġ$ tracked Device Index Ġactivated .") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠPurpose : ĠReturns Ġtrue Ġif Ġthe Ġaction Ġis Ġactive Ġand Ġhad Ġa Ġr ising Ġedge Ġ*/ ĊĠĠĠ Ġfun Ġget Digital Action R ising Edge ( action : ĠVR Action Handle , Ġp Device Path : ĠK Mutable Property 0 < VR Input Value Handle >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Data Ġ= Ġvr . Input Digital Action Data () ĊĠĠĠĠĠĠĠ Ġvr Input . get Digital Action Data ( action , Ġaction Data , Ġvr . invalid Input Value Handle ) ĊĠĠĠĠĠĠĠ Ġp Device Path ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdevice Path Ġby Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Path Ġ= Ġvr . invalid Input Value Handle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Data . active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Info Ġ= Ġvr . Input Origin Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vr Input . Error . None Ġ== Ġvr Input . get Origin Tracked DeviceInfo ( action Data . active Origin , Ġorigin Info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Path Ġ= Ġorigin Info . device Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġaction Data . active Ġ&& Ġaction Data . changed Ġ&& Ġaction Data . state ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠPurpose : ĠReturns Ġtrue Ġif Ġthe Ġaction Ġis Ġactive Ġand Ġhad Ġa Ġfalling Ġedge Ġ*/ ĊĠĠĠ Ġfun Ġget Digital Action Fall ing Edge ( action : ĠVR Action Handle , Ġp Device Path : ĠK Mutable Property 0 < VR Input Value Handle >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Data Ġ= Ġvr . Input Digital Action Data () ĊĠĠĠĠĠĠĠ Ġvr Input . get Digital Action Data ( action , Ġaction Data , Ġvr . invalid Input Value Handle ) ĊĠĠĠĠĠĠĠ Ġp Device Path ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdevice Path Ġby Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Path Ġ= Ġvr . invalid Input Value Handle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Data . active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Info Ġ= Ġvr . Input Origin Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vr Input . Error . None Ġ== Ġvr Input . get Origin Tracked DeviceInfo ( action Data . active Origin , Ġorigin Info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Path Ġ= Ġorigin Info . device Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġaction Data . active Ġ&& Ġaction Data . changed Ġ&& Ġ! action Data . state ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠPurpose : ĠReturns Ġtrue Ġif Ġthe Ġaction Ġis Ġactive Ġand Ġits Ġstate Ġis Ġtrue Ġ*/ ĊĠĠĠ Ġfun Ġget Digital Action State ( action : ĠVR Action Handle , Ġp Device Path : ĠK Mutable Property 0 < VR Input Value Handle >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Data Ġ= Ġvr . Input Digital Action Data () ĊĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġvr Input . get Digital Action Data ( action , Ġaction Data , Ġvr . invalid Input Value Handle ) ĊĠĠĠĠĠĠĠ Ġp Device Path ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdevice Path Ġby Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Path Ġ= Ġvr . invalid Input Value Handle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Data . active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Info Ġ= Ġvr . Input Origin Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vr Input . Error . None Ġ== Ġvr Input . get Origin Tracked DeviceInfo ( action Data . active Origin , Ġorigin Info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Path Ġ= Ġorigin Info . device Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġaction Data . active Ġ&& Ġaction Data . state ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠPurpose : ĠFinds Ġa Ġrender Ġmodel Ġwe 've Ġalready Ġloaded Ġor Ġloads Ġa Ġnew Ġone Ġ*/ ĊĠĠĠ Ġfun Ġfind Or Load Render Model ( render ModelName : ĠString ): ĠC GL Render Model ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Models . find Ġ{ Ġit . model Name Ġ== Ġrender ModelName Ġ} Ġ?: Ġrun Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġthe Ġmodel Ġif Ġwe Ġdidn 't Ġfind Ġone ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġvr Render Models . load Render Model ( render ModelName ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Unable Ġto Ġload Ġrender Ġmodel Ġ$ render ModelName Ġ- Ġ${ vr Render Models . error }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull Ġ// Ġmove Ġon Ġto Ġthe Ġnext Ġtracked Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtexture Ġ= Ġvr Render Models . load Texture ( model . diffuse Texture Id ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Unable Ġto Ġload Ġrender Ġtexture Ġid :${ model . diffuse Texture Id } Ġfor Ġrender Ġmodel Ġ$ render ModelName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . free Native () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull Ġ// Ġmove Ġon Ġto Ġthe Ġnext Ġtracked Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC GL Render Model ( render ModelName , Ġmodel , Ġtexture ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Models Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . free Native () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtexture . free Native () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender Frame () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġnow Ġas Ġfast Ġas Ġpossible ĊĠĠĠĠĠĠĠ Ġrender Ster eo Targets () ĊĠĠĠĠĠĠĠ Ġcompanion Window . render () ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Eye Texture Ġ= Ġvr . Texture ( eye Desc [ 0 ]. texture Name [ Frame Buffer Desc . Target . RESOL VE ], ĠTexture Type . OpenGL , ĠColor Space . Gamma ) ĊĠĠĠĠĠĠĠ Ġvr Comp ositor . submit ( V RE ye . Left , Ġleft Eye Texture ) ĊĠĠĠĠĠĠĠ Ġval Ġright Eye Texture Ġ= Ġvr . Texture ( eye Desc [ 1 ]. texture Name [ Frame Buffer Desc . Target . RESOL VE ], ĠTexture Type . OpenGL , ĠColor Space . Gamma ) ĊĠĠĠĠĠĠĠ Ġvr Comp ositor . submit ( V RE ye . Right , Ġright Eye Texture ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( v Blank Ġ&& Ġgl Finish Hack ) ĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠH ACK H ACK . ĠFrom Ġgpu view Ġprofiling , Ġit Ġlooks Ġlike Ġthere Ġis Ġa Ġbug Ġwhere Ġtwo Ġrenders Ġand Ġa Ġpresent Ġhappen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġbefore Ġand Ġafter Ġthe Ġv sync Ġcausing Ġall Ġkinds Ġof Ġj itter ing Ġissues . ĠThis Ġgl Finish () Ġappears Ġto Ġclear ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthat Ġup . ĠTemporary Ġfix Ġwhile ĠI Ġtry Ġto Ġget Ġn vidia Ġto Ġinvestigate Ġthis Ġproblem . ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 / 2 9 / 2 0 1 4 Ġm ikes art Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Finish () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSwap Window ĊĠĠĠĠĠĠĠ Ġwindow . present () ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠClear ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWe Ġwant Ġto Ġmake Ġsure Ġthe Ġgl Finish Ġwaits Ġfor Ġthe Ġentire Ġpresent Ġto Ġcomplete , Ġnot Ġjust Ġthe Ġsubmission ĊĠĠĠĠĠĠĠĠĠĠĠ Ġof Ġthe Ġcommand . ĠSo , Ġwe Ġdo Ġa Ġclear Ġhere Ġright Ġhere Ġso Ġthe Ġgl Finish Ġwill Ġwait Ġfully Ġfor Ġthe Ġswap . ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġgl Clear Color Buffer ( clear Color ) ĊĠĠĠĠĠĠĠ Ġgl Clear Depth Buffer () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFlush Ġand Ġwait Ġfor Ġswap . ĊĠĠĠĠĠĠĠ Ġif Ġ( v Blank ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSpe w Ġout Ġthe Ġcontroller Ġand Ġpose Ġcount Ġwhenever Ġthey Ġchange . ĊĠĠĠĠĠĠĠ Ġif Ġ( tracked Controller Count Ġ!= Ġtracked Controller Count _ Last Ġ|| Ġvalid Pose Count Ġ!= Ġvalid Pose Count _ Last ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Pose Count _ Last Ġ= Ġvalid Pose Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Controller Count _ Last Ġ= Ġtracked Controller Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Pose Count : Ġ$ valid Pose Count ($ str Pose Classes ) ĠCont rollers : Ġ$ tracked Controller Count ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate H MD Matrix Pose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender Ster eo Targets () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġgl Clear Color Buffer () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( eye Ġin ĠV RE ye . values ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeye Desc [ eye . i ]. render ( eye ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate H MD Matrix Pose () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvr Comp ositor . wait Get Po ses ( tracked Device Pose ) ĊĊĠĠĠĠĠĠĠ Ġvalid Pose Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġstr Pose Classes Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ( device Ġin Ġ 0 Ġuntil Ġvr . max Tracked Device Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracked Device Pose [ device ]. pose IsValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Pose Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr mat 4 Device Pose [ device ] Ġ= Ġtracked Device Pose [ device ]. device To Absolute Tracking ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dev Class Char [ device ] Ġ== ĠN UL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdev Class Char [ device ] Ġ= Ġwhen Ġ( h md Ġget Tracked Device Class Ġdevice ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT DC . Controller Ġ-> Ġ' C ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT DC . H MD Ġ-> Ġ' H ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT DC . Invalid Ġ-> Ġ' I ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT DC . Generic Tracker Ġ-> Ġ' G ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT DC . Tracking Reference Ġ-> Ġ' T ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ' ?' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr Pose Classes Ġ+= Ġdev Class Char [ device ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tracked Device Pose [ vr . tracked Device Index _ H md ]. pose IsValid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr mat 4 Device Pose [ vr . tracked Device Index _ H md ] Ġinverse Ġh md Pose ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshutdown () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvr . shutdown () ĊĊĠĠĠĠĠĠĠ Ġrender Models . forEach Ġ{ Ġit . dispose () Ġ} ĊĊĠĠĠĠĠĠĠ Ġscene . dispose () ĊĊĠĠĠĠĠĠĠ Ġeye Desc . forEach Ġ{ Ġit . dispose () Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Window . dispose () ĊĊĠĠĠĠĠĠĠ Ġglfw . terminate () ĊĠĠĠ Ġ} Ċ } Ċ Ċ val Ġasset Path Ġ= ĠPaths . get (" "). to AbsolutePath (). toString () Ġ+ Ġ"/ src / main / resources "